DIR : /home/kozerus/public_html/jaxgrididx.html

/home/kozerus/public_html

<html>
<head>
	<title>jaxgrid.html 20200503_2200</title>
<!--
	<link href="../_assets/css/shared.css" rel="stylesheet" type="text/css"/>
	<link href="../_assets/css/examples.css" rel="stylesheet" type="text/css"/>
	-->
<!--
	<script src="../_assets/js/examples.js"></script>
	-->

	<style id="style_jasgrid_gridbox" >
		.gridBox {
			float: left;
			width: 150px;
			height: 112px;
			background-color: #363535;
			border-width: thin;
			color: #FFF0EE;
			margin: 1px;
			overflow: hidden;
		}

		.gridBox:hover {
			background-color: #111111;
		}

		.gridBox.error {
			background-color: #992222;
		}

		.gridBox.error LABEL {
			color: #ffffff !important;
		}

		#imageGrid {
			width: 960px;
		}

		#controls {
			height: 25px;
			padding: 5px;
			background-color: rgba(255, 255, 255, 0.2);
		}

		LABEL {
			position: relative;
			top: 10px;
			left: 10px;
			font-family: sans-serif;
			font-size: 12px;
			word-wrap: break-word;
		}

		XMP {
			color: #ffffff;
			font-size: 10px;
		}
	</style>




<!--
	<script type="text/javascript" src="../_assets/libs/soundjs-NEXT.min.js"></script>
	-->

	<script id="script_soundjs_next_min_js" 
src="data:/text/plain;base64,LyohCiogQGxpY2Vuc2UgU291bmRKUwoqIFZpc2l0IGh0dHA6Ly9jcmVhdGVqcy5jb20vIGZvciBkb2N1bWVudGF0aW9uLCB1cGRhdGVzIGFuZCBleGFtcGxlcy4KKgoqIENvcHlyaWdodCAoYykgMjAxMS0yMDEzIGdza2lubmVyLmNvbSwgaW5jLgoqCiogRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBNSVQgbGljZW5zZS4KKiBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL21pdC1saWNlbnNlLmh0bWwKKgoqIFRoaXMgbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgoqLwoKLyoqIQogKiBTb3VuZEpTIEZsYXNoQXVkaW9QbHVnaW4gYWxzbyBpbmNsdWRlcyBzd2ZvYmplY3QgKGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9zd2ZvYmplY3QvKQogKi8KCnRoaXMuY3JlYXRlanM9dGhpcy5jcmVhdGVqc3x8e30sZnVuY3Rpb24oKXt2YXIgYT1jcmVhdGVqcy5Tb3VuZEpTPWNyZWF0ZWpzLlNvdW5kSlN8fHt9O2EudmVyc2lvbj0iTkVYVCIsYS5idWlsZERhdGU9IlRodSwgMTEgRGVjIDIwMTQgMjM6MTY6MTUgR01UIn0oKSx0aGlzLmNyZWF0ZWpzPXRoaXMuY3JlYXRlanN8fHt9LGNyZWF0ZWpzLmV4dGVuZD1mdW5jdGlvbihhLGIpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBjKCl7dGhpcy5jb25zdHJ1Y3Rvcj1hfXJldHVybiBjLnByb3RvdHlwZT1iLnByb3RvdHlwZSxhLnByb3RvdHlwZT1uZXcgY30sdGhpcy5jcmVhdGVqcz10aGlzLmNyZWF0ZWpzfHx7fSxjcmVhdGVqcy5wcm9tb3RlPWZ1bmN0aW9uKGEsYil7InVzZSBzdHJpY3QiO3ZhciBjPWEucHJvdG90eXBlLGQ9T2JqZWN0LmdldFByb3RvdHlwZU9mJiZPYmplY3QuZ2V0UHJvdG90eXBlT2YoYyl8fGMuX19wcm90b19fO2lmKGQpe2NbKGIrPSJfIikrImNvbnN0cnVjdG9yIl09ZC5jb25zdHJ1Y3Rvcjtmb3IodmFyIGUgaW4gZCljLmhhc093blByb3BlcnR5KGUpJiYiZnVuY3Rpb24iPT10eXBlb2YgZFtlXSYmKGNbYitlXT1kW2VdKX1yZXR1cm4gYX0sdGhpcy5jcmVhdGVqcz10aGlzLmNyZWF0ZWpzfHx7fSxjcmVhdGVqcy5pbmRleE9mPWZ1bmN0aW9uKGEsYil7InVzZSBzdHJpY3QiO2Zvcih2YXIgYz0wLGQ9YS5sZW5ndGg7ZD5jO2MrKylpZihiPT09YVtjXSlyZXR1cm4gYztyZXR1cm4tMX0sdGhpcy5jcmVhdGVqcz10aGlzLmNyZWF0ZWpzfHx7fSxmdW5jdGlvbigpeyJ1c2Ugc3RyaWN0IjtjcmVhdGVqcy5wcm94eT1mdW5jdGlvbihhLGIpe3ZhciBjPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywyKTtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gYS5hcHBseShiLEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywwKS5jb25jYXQoYykpfX19KCksdGhpcy5jcmVhdGVqcz10aGlzLmNyZWF0ZWpzfHx7fSxmdW5jdGlvbigpeyJ1c2Ugc3RyaWN0Ijt2YXIgYT1PYmplY3QuZGVmaW5lUHJvcGVydHk/ITA6ITEsYj17fTt0cnl7T2JqZWN0LmRlZmluZVByb3BlcnR5KGIsImJhciIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9iYXJ9LHNldDpmdW5jdGlvbihhKXt0aGlzLl9iYXI9YX19KX1jYXRjaChjKXthPSExfWNyZWF0ZWpzLmRlZmluZVByb3BlcnR5U3VwcG9ydGVkPWF9KCksdGhpcy5jcmVhdGVqcz10aGlzLmNyZWF0ZWpzfHx7fSxmdW5jdGlvbigpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBhKCl7dGhyb3ciQnJvd3NlckRldGVjdCBjYW5ub3QgYmUgaW5zdGFudGlhdGVkIn12YXIgYj1hLmFnZW50PXdpbmRvdy5uYXZpZ2F0b3IudXNlckFnZW50O2EuaXNXaW5kb3dQaG9uZT1iLmluZGV4T2YoIklFTW9iaWxlIik+LTF8fGIuaW5kZXhPZigiV2luZG93cyBQaG9uZSIpPi0xLGEuaXNGaXJlZm94PWIuaW5kZXhPZigiRmlyZWZveCIpPi0xLGEuaXNPcGVyYT1udWxsIT13aW5kb3cub3BlcmEsYS5pc0Nocm9tZT1iLmluZGV4T2YoIkNocm9tZSIpPi0xLGEuaXNJT1M9KGIuaW5kZXhPZigiaVBvZCIpPi0xfHxiLmluZGV4T2YoImlQaG9uZSIpPi0xfHxiLmluZGV4T2YoImlQYWQiKT4tMSkmJiFhLmlzV2luZG93UGhvbmUsYS5pc0FuZHJvaWQ9Yi5pbmRleE9mKCJBbmRyb2lkIik+LTEmJiFhLmlzV2luZG93UGhvbmUsYS5pc0JsYWNrYmVycnk9Yi5pbmRleE9mKCJCbGFja2JlcnJ5Iik+LTEsY3JlYXRlanMuQnJvd3NlckRldGVjdD1hfSgpLHRoaXMuY3JlYXRlanM9dGhpcy5jcmVhdGVqc3x8e30sZnVuY3Rpb24oKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gYSgpe3RoaXMuX2xpc3RlbmVycz1udWxsLHRoaXMuX2NhcHR1cmVMaXN0ZW5lcnM9bnVsbH12YXIgYj1hLnByb3RvdHlwZTthLmluaXRpYWxpemU9ZnVuY3Rpb24oYSl7YS5hZGRFdmVudExpc3RlbmVyPWIuYWRkRXZlbnRMaXN0ZW5lcixhLm9uPWIub24sYS5yZW1vdmVFdmVudExpc3RlbmVyPWEub2ZmPWIucmVtb3ZlRXZlbnRMaXN0ZW5lcixhLnJlbW92ZUFsbEV2ZW50TGlzdGVuZXJzPWIucmVtb3ZlQWxsRXZlbnRMaXN0ZW5lcnMsYS5oYXNFdmVudExpc3RlbmVyPWIuaGFzRXZlbnRMaXN0ZW5lcixhLmRpc3BhdGNoRXZlbnQ9Yi5kaXNwYXRjaEV2ZW50LGEuX2Rpc3BhdGNoRXZlbnQ9Yi5fZGlzcGF0Y2hFdmVudCxhLndpbGxUcmlnZ2VyPWIud2lsbFRyaWdnZXJ9LGIuYWRkRXZlbnRMaXN0ZW5lcj1mdW5jdGlvbihhLGIsYyl7dmFyIGQ7ZD1jP3RoaXMuX2NhcHR1cmVMaXN0ZW5lcnM9dGhpcy5fY2FwdHVyZUxpc3RlbmVyc3x8e306dGhpcy5fbGlzdGVuZXJzPXRoaXMuX2xpc3RlbmVyc3x8e307dmFyIGU9ZFthXTtyZXR1cm4gZSYmdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKGEsYixjKSxlPWRbYV0sZT9lLnB1c2goYik6ZFthXT1bYl0sYn0sYi5vbj1mdW5jdGlvbihhLGIsYyxkLGUsZil7cmV0dXJuIGIuaGFuZGxlRXZlbnQmJihjPWN8fGIsYj1iLmhhbmRsZUV2ZW50KSxjPWN8fHRoaXMsdGhpcy5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7Yi5jYWxsKGMsYSxlKSxkJiZhLnJlbW92ZSgpfSxmKX0sYi5yZW1vdmVFdmVudExpc3RlbmVyPWZ1bmN0aW9uKGEsYixjKXt2YXIgZD1jP3RoaXMuX2NhcHR1cmVMaXN0ZW5lcnM6dGhpcy5fbGlzdGVuZXJzO2lmKGQpe3ZhciBlPWRbYV07aWYoZSlmb3IodmFyIGY9MCxnPWUubGVuZ3RoO2c+ZjtmKyspaWYoZVtmXT09Yil7MT09Zz9kZWxldGUgZFthXTplLnNwbGljZShmLDEpO2JyZWFrfX19LGIub2ZmPWIucmVtb3ZlRXZlbnRMaXN0ZW5lcixiLnJlbW92ZUFsbEV2ZW50TGlzdGVuZXJzPWZ1bmN0aW9uKGEpe2E/KHRoaXMuX2xpc3RlbmVycyYmZGVsZXRlIHRoaXMuX2xpc3RlbmVyc1thXSx0aGlzLl9jYXB0dXJlTGlzdGVuZXJzJiZkZWxldGUgdGhpcy5fY2FwdHVyZUxpc3RlbmVyc1thXSk6dGhpcy5fbGlzdGVuZXJzPXRoaXMuX2NhcHR1cmVMaXN0ZW5lcnM9bnVsbH0sYi5kaXNwYXRjaEV2ZW50PWZ1bmN0aW9uKGEpe2lmKCJzdHJpbmciPT10eXBlb2YgYSl7dmFyIGI9dGhpcy5fbGlzdGVuZXJzO2lmKCFifHwhYlthXSlyZXR1cm4hMTthPW5ldyBjcmVhdGVqcy5FdmVudChhKX1lbHNlIGEudGFyZ2V0JiZhLmNsb25lJiYoYT1hLmNsb25lKCkpO3RyeXthLnRhcmdldD10aGlzfWNhdGNoKGMpe31pZihhLmJ1YmJsZXMmJnRoaXMucGFyZW50KXtmb3IodmFyIGQ9dGhpcyxlPVtkXTtkLnBhcmVudDspZS5wdXNoKGQ9ZC5wYXJlbnQpO3ZhciBmLGc9ZS5sZW5ndGg7Zm9yKGY9Zy0xO2Y+PTAmJiFhLnByb3BhZ2F0aW9uU3RvcHBlZDtmLS0pZVtmXS5fZGlzcGF0Y2hFdmVudChhLDErKDA9PWYpKTtmb3IoZj0xO2c+ZiYmIWEucHJvcGFnYXRpb25TdG9wcGVkO2YrKyllW2ZdLl9kaXNwYXRjaEV2ZW50KGEsMyl9ZWxzZSB0aGlzLl9kaXNwYXRjaEV2ZW50KGEsMik7cmV0dXJuIGEuZGVmYXVsdFByZXZlbnRlZH0sYi5oYXNFdmVudExpc3RlbmVyPWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuX2xpc3RlbmVycyxjPXRoaXMuX2NhcHR1cmVMaXN0ZW5lcnM7cmV0dXJuISEoYiYmYlthXXx8YyYmY1thXSl9LGIud2lsbFRyaWdnZXI9ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXRoaXM7Yjspe2lmKGIuaGFzRXZlbnRMaXN0ZW5lcihhKSlyZXR1cm4hMDtiPWIucGFyZW50fXJldHVybiExfSxiLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIltFdmVudERpc3BhdGNoZXJdIn0sYi5fZGlzcGF0Y2hFdmVudD1mdW5jdGlvbihhLGIpe3ZhciBjLGQ9MT09Yj90aGlzLl9jYXB0dXJlTGlzdGVuZXJzOnRoaXMuX2xpc3RlbmVycztpZihhJiZkKXt2YXIgZT1kW2EudHlwZV07aWYoIWV8fCEoYz1lLmxlbmd0aCkpcmV0dXJuO3RyeXthLmN1cnJlbnRUYXJnZXQ9dGhpc31jYXRjaChmKXt9dHJ5e2EuZXZlbnRQaGFzZT1ifWNhdGNoKGYpe31hLnJlbW92ZWQ9ITEsZT1lLnNsaWNlKCk7Zm9yKHZhciBnPTA7Yz5nJiYhYS5pbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQ7ZysrKXt2YXIgaD1lW2ddO2guaGFuZGxlRXZlbnQ/aC5oYW5kbGVFdmVudChhKTpoKGEpLGEucmVtb3ZlZCYmKHRoaXMub2ZmKGEudHlwZSxoLDE9PWIpLGEucmVtb3ZlZD0hMSl9fX0sY3JlYXRlanMuRXZlbnREaXNwYXRjaGVyPWF9KCksdGhpcy5jcmVhdGVqcz10aGlzLmNyZWF0ZWpzfHx7fSxmdW5jdGlvbigpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBhKGEsYixjKXt0aGlzLnR5cGU9YSx0aGlzLnRhcmdldD1udWxsLHRoaXMuY3VycmVudFRhcmdldD1udWxsLHRoaXMuZXZlbnRQaGFzZT0wLHRoaXMuYnViYmxlcz0hIWIsdGhpcy5jYW5jZWxhYmxlPSEhYyx0aGlzLnRpbWVTdGFtcD0obmV3IERhdGUpLmdldFRpbWUoKSx0aGlzLmRlZmF1bHRQcmV2ZW50ZWQ9ITEsdGhpcy5wcm9wYWdhdGlvblN0b3BwZWQ9ITEsdGhpcy5pbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQ9ITEsdGhpcy5yZW1vdmVkPSExfXZhciBiPWEucHJvdG90eXBlO2IucHJldmVudERlZmF1bHQ9ZnVuY3Rpb24oKXt0aGlzLmRlZmF1bHRQcmV2ZW50ZWQ9dGhpcy5jYW5jZWxhYmxlJiYhMH0sYi5zdG9wUHJvcGFnYXRpb249ZnVuY3Rpb24oKXt0aGlzLnByb3BhZ2F0aW9uU3RvcHBlZD0hMH0sYi5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb249ZnVuY3Rpb24oKXt0aGlzLmltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZD10aGlzLnByb3BhZ2F0aW9uU3RvcHBlZD0hMH0sYi5yZW1vdmU9ZnVuY3Rpb24oKXt0aGlzLnJlbW92ZWQ9ITB9LGIuY2xvbmU9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IGEodGhpcy50eXBlLHRoaXMuYnViYmxlcyx0aGlzLmNhbmNlbGFibGUpfSxiLnNldD1mdW5jdGlvbihhKXtmb3IodmFyIGIgaW4gYSl0aGlzW2JdPWFbYl07cmV0dXJuIHRoaXN9LGIudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4iW0V2ZW50ICh0eXBlPSIrdGhpcy50eXBlKyIpXSJ9LGNyZWF0ZWpzLkV2ZW50PWF9KCksdGhpcy5jcmVhdGVqcz10aGlzLmNyZWF0ZWpzfHx7fSxmdW5jdGlvbigpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBhKGEsYixjKXt0aGlzLkV2ZW50X2NvbnN0cnVjdG9yKCJlcnJvciIpLHRoaXMudGl0bGU9YSx0aGlzLm1lc3NhZ2U9Yix0aGlzLmRhdGE9Y312YXIgYj1jcmVhdGVqcy5leHRlbmQoYSxjcmVhdGVqcy5FdmVudCk7Yi5jbG9uZT1mdW5jdGlvbigpe3JldHVybiBuZXcgY3JlYXRlanMuRXJyb3JFdmVudCh0aGlzLnRpdGxlLHRoaXMubWVzc2FnZSx0aGlzLmRhdGEpfSxjcmVhdGVqcy5FcnJvckV2ZW50PWNyZWF0ZWpzLnByb21vdGUoYSwiRXZlbnQiKX0oKSx0aGlzLmNyZWF0ZWpzPXRoaXMuY3JlYXRlanN8fHt9LGZ1bmN0aW9uKCl7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIGEoYSxiKXt0aGlzLkV2ZW50X2NvbnN0cnVjdG9yKCJwcm9ncmVzcyIpLHRoaXMubG9hZGVkPWEsdGhpcy50b3RhbD1udWxsPT1iPzE6Yix0aGlzLnByb2dyZXNzPTA9PWI/MDp0aGlzLmxvYWRlZC90aGlzLnRvdGFsfXZhciBiPWNyZWF0ZWpzLmV4dGVuZChhLGNyZWF0ZWpzLkV2ZW50KTtiLmNsb25lPWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBjcmVhdGVqcy5Qcm9ncmVzc0V2ZW50KHRoaXMubG9hZGVkLHRoaXMudG90YWwpfSxjcmVhdGVqcy5Qcm9ncmVzc0V2ZW50PWNyZWF0ZWpzLnByb21vdGUoYSwiRXZlbnQiKX0od2luZG93KSx0aGlzLmNyZWF0ZWpzPXRoaXMuY3JlYXRlanN8fHt9LGZ1bmN0aW9uKCl7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIGEoKXt0aGlzLnNyYz1udWxsLHRoaXMudHlwZT1udWxsLHRoaXMuaWQ9bnVsbCx0aGlzLm1haW50YWluT3JkZXI9ITEsdGhpcy5jYWxsYmFjaz1udWxsLHRoaXMuZGF0YT1udWxsLHRoaXMubWV0aG9kPWNyZWF0ZWpzLkxvYWRJdGVtLkdFVCx0aGlzLnZhbHVlcz1udWxsLHRoaXMuaGVhZGVycz1udWxsLHRoaXMud2l0aENyZWRlbnRpYWxzPSExLHRoaXMubWltZVR5cGU9bnVsbCx0aGlzLmNyb3NzT3JpZ2luPSJBbm9ueW1vdXMiLHRoaXMubG9hZFRpbWVvdXQ9OGUzfXZhciBiPWEucHJvdG90eXBlPXt9LGM9YTtjLmNyZWF0ZT1mdW5jdGlvbihiKXtpZigic3RyaW5nIj09dHlwZW9mIGIpe3ZhciBkPW5ldyBhO3JldHVybiBkLnNyYz1iLGR9aWYoYiBpbnN0YW5jZW9mIGMpcmV0dXJuIGI7aWYoYiBpbnN0YW5jZW9mIE9iamVjdClyZXR1cm4gYjt0aHJvdyBuZXcgRXJyb3IoIlR5cGUgbm90IHJlY29nbml6ZWQuIil9LGIuc2V0PWZ1bmN0aW9uKGEpe2Zvcih2YXIgYiBpbiBhKXRoaXNbYl09YVtiXTtyZXR1cm4gdGhpc30sY3JlYXRlanMuTG9hZEl0ZW09Y30oKSxmdW5jdGlvbigpe3ZhciBhPXt9O2EuQUJTT0xVVEVfUEFUVD0vXig/Olx3KzopP1wvezJ9L2ksYS5SRUxBVElWRV9QQVRUPS9eWy4vXSo/XC8vaSxhLkVYVEVOU0lPTl9QQVRUPS9cLz9bXi9dK1wuKFx3ezEsNX0pJC9pLGEucGFyc2VVUkk9ZnVuY3Rpb24oYil7dmFyIGM9e2Fic29sdXRlOiExLHJlbGF0aXZlOiExfTtpZihudWxsPT1iKXJldHVybiBjO3ZhciBkPWIuaW5kZXhPZigiPyIpO2Q+LTEmJihiPWIuc3Vic3RyKDAsZCkpO3ZhciBlO3JldHVybiBhLkFCU09MVVRFX1BBVFQudGVzdChiKT9jLmFic29sdXRlPSEwOmEuUkVMQVRJVkVfUEFUVC50ZXN0KGIpJiYoYy5yZWxhdGl2ZT0hMCksKGU9Yi5tYXRjaChhLkVYVEVOU0lPTl9QQVRUKSkmJihjLmV4dGVuc2lvbj1lWzFdLnRvTG93ZXJDYXNlKCkpLGN9LGEuZm9ybWF0UXVlcnlTdHJpbmc9ZnVuY3Rpb24oYSxiKXtpZihudWxsPT1hKXRocm93IG5ldyBFcnJvcigiWW91IG11c3Qgc3BlY2lmeSBkYXRhLiIpO3ZhciBjPVtdO2Zvcih2YXIgZCBpbiBhKWMucHVzaChkKyI9Iitlc2NhcGUoYVtkXSkpO3JldHVybiBiJiYoYz1jLmNvbmNhdChiKSksYy5qb2luKCImIil9LGEuYnVpbGRQYXRoPWZ1bmN0aW9uKGEsYil7aWYobnVsbD09YilyZXR1cm4gYTt2YXIgYz1bXSxkPWEuaW5kZXhPZigiPyIpO2lmKC0xIT1kKXt2YXIgZT1hLnNsaWNlKGQrMSk7Yz1jLmNvbmNhdChlLnNwbGl0KCImIikpfXJldHVybi0xIT1kP2Euc2xpY2UoMCxkKSsiPyIrdGhpcy5fZm9ybWF0UXVlcnlTdHJpbmcoYixjKTphKyI/Iit0aGlzLl9mb3JtYXRRdWVyeVN0cmluZyhiLGMpfSxhLmlzQ3Jvc3NEb21haW49ZnVuY3Rpb24oYSl7dmFyIGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiYSIpO2IuaHJlZj1hLnNyYzt2YXIgYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJhIik7Yy5ocmVmPWxvY2F0aW9uLmhyZWY7dmFyIGQ9IiIhPWIuaG9zdG5hbWUmJihiLnBvcnQhPWMucG9ydHx8Yi5wcm90b2NvbCE9Yy5wcm90b2NvbHx8Yi5ob3N0bmFtZSE9Yy5ob3N0bmFtZSk7cmV0dXJuIGR9LGEuaXNMb2NhbD1mdW5jdGlvbihhKXt2YXIgYj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJhIik7cmV0dXJuIGIuaHJlZj1hLnNyYywiIj09Yi5ob3N0bmFtZSYmImZpbGU6Ij09Yi5wcm90b2NvbH0sYS5pc0JpbmFyeT1mdW5jdGlvbihhKXtzd2l0Y2goYSl7Y2FzZSBjcmVhdGVqcy5BYnN0cmFjdExvYWRlci5JTUFHRTpjYXNlIGNyZWF0ZWpzLkFic3RyYWN0TG9hZGVyLkJJTkFSWTpyZXR1cm4hMDtkZWZhdWx0OnJldHVybiExfX0sYS5pc0ltYWdlVGFnPWZ1bmN0aW9uKGEpe3JldHVybiBhIGluc3RhbmNlb2YgSFRNTEltYWdlRWxlbWVudH0sYS5pc0F1ZGlvVGFnPWZ1bmN0aW9uKGEpe3JldHVybiB3aW5kb3cuSFRNTEF1ZGlvRWxlbWVudD9hIGluc3RhbmNlb2YgSFRNTEF1ZGlvRWxlbWVudDohMX0sYS5pc1ZpZGVvVGFnPWZ1bmN0aW9uKGEpe3JldHVybiB3aW5kb3cuSFRNTFZpZGVvRWxlbWVudD9hIGluc3RhbmNlb2YgSFRNTFZpZGVvRWxlbWVudDp2b2lkIDB9LGEuaXNUZXh0PWZ1bmN0aW9uKGEpe3N3aXRjaChhKXtjYXNlIGNyZWF0ZWpzLkFic3RyYWN0TG9hZGVyLlRFWFQ6Y2FzZSBjcmVhdGVqcy5BYnN0cmFjdExvYWRlci5KU09OOmNhc2UgY3JlYXRlanMuQWJzdHJhY3RMb2FkZXIuTUFOSUZFU1Q6Y2FzZSBjcmVhdGVqcy5BYnN0cmFjdExvYWRlci5YTUw6Y2FzZSBjcmVhdGVqcy5BYnN0cmFjdExvYWRlci5DU1M6Y2FzZSBjcmVhdGVqcy5BYnN0cmFjdExvYWRlci5TVkc6Y2FzZSBjcmVhdGVqcy5BYnN0cmFjdExvYWRlci5KQVZBU0NSSVBUOnJldHVybiEwO2RlZmF1bHQ6cmV0dXJuITF9fSxhLmdldFR5cGVCeUV4dGVuc2lvbj1mdW5jdGlvbihhKXtpZihudWxsPT1hKXJldHVybiBjcmVhdGVqcy5BYnN0cmFjdExvYWRlci5URVhUO3N3aXRjaChhLnRvTG93ZXJDYXNlKCkpe2Nhc2UianBlZyI6Y2FzZSJqcGciOmNhc2UiZ2lmIjpjYXNlInBuZyI6Y2FzZSJ3ZWJwIjpjYXNlImJtcCI6cmV0dXJuIGNyZWF0ZWpzLkFic3RyYWN0TG9hZGVyLklNQUdFO2Nhc2Uib2dnIjpjYXNlIm1wMyI6Y2FzZSJ3ZWJtIjpyZXR1cm4gY3JlYXRlanMuQWJzdHJhY3RMb2FkZXIuU09VTkQ7Y2FzZSJtcDQiOmNhc2Uid2VibSI6Y2FzZSJ0cyI6cmV0dXJuIGNyZWF0ZWpzLkFic3RyYWN0TG9hZGVyLlZJREVPO2Nhc2UianNvbiI6cmV0dXJuIGNyZWF0ZWpzLkFic3RyYWN0TG9hZGVyLkpTT047Y2FzZSJ4bWwiOnJldHVybiBjcmVhdGVqcy5BYnN0cmFjdExvYWRlci5YTUw7Y2FzZSJjc3MiOnJldHVybiBjcmVhdGVqcy5BYnN0cmFjdExvYWRlci5DU1M7Y2FzZSJqcyI6cmV0dXJuIGNyZWF0ZWpzLkFic3RyYWN0TG9hZGVyLkpBVkFTQ1JJUFQ7Y2FzZSJzdmciOnJldHVybiBjcmVhdGVqcy5BYnN0cmFjdExvYWRlci5TVkc7ZGVmYXVsdDpyZXR1cm4gY3JlYXRlanMuQWJzdHJhY3RMb2FkZXIuVEVYVH19LGNyZWF0ZWpzLlJlcXVlc3RVdGlscz1hfSgpLHRoaXMuY3JlYXRlanM9dGhpcy5jcmVhdGVqc3x8e30sZnVuY3Rpb24oKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gYShhLGIsYyl7dGhpcy5FdmVudERpc3BhdGNoZXJfY29uc3RydWN0b3IoKSx0aGlzLmxvYWRlZD0hMSx0aGlzLmNhbmNlbGVkPSExLHRoaXMucHJvZ3Jlc3M9MCx0aGlzLnR5cGU9Yyx0aGlzLnJlc3VsdEZvcm1hdHRlcj1udWxsLHRoaXMuX2l0ZW09YT9jcmVhdGVqcy5Mb2FkSXRlbS5jcmVhdGUoYSk6bnVsbCx0aGlzLl9wcmVmZXJYSFI9Yix0aGlzLl9yZXN1bHQ9bnVsbCx0aGlzLl9yYXdSZXN1bHQ9bnVsbCx0aGlzLl9sb2FkZWRJdGVtcz1udWxsLHRoaXMuX3RhZ1NyY0F0dHJpYnV0ZT1udWxsLHRoaXMuX3RhZz1udWxsfXZhciBiPWNyZWF0ZWpzLmV4dGVuZChhLGNyZWF0ZWpzLkV2ZW50RGlzcGF0Y2hlciksYz1hO2MuUE9TVD0iUE9TVCIsYy5HRVQ9IkdFVCIsYy5CSU5BUlk9ImJpbmFyeSIsYy5DU1M9ImNzcyIsYy5JTUFHRT0iaW1hZ2UiLGMuSkFWQVNDUklQVD0iamF2YXNjcmlwdCIsYy5KU09OPSJqc29uIixjLkpTT05QPSJqc29ucCIsYy5NQU5JRkVTVD0ibWFuaWZlc3QiLGMuU09VTkQ9InNvdW5kIixjLlZJREVPPSJ2aWRlbyIsYy5TUFJJVEVTSEVFVD0ic3ByaXRlc2hlZXQiLGMuU1ZHPSJzdmciLGMuVEVYVD0idGV4dCIsYy5YTUw9InhtbCIsYi5nZXRJdGVtPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2l0ZW19LGIuZ2V0UmVzdWx0PWZ1bmN0aW9uKGEpe3JldHVybiBhP3RoaXMuX3Jhd1Jlc3VsdDp0aGlzLl9yZXN1bHR9LGIuZ2V0VGFnPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3RhZ30sYi5zZXRUYWc9ZnVuY3Rpb24oYSl7dGhpcy5fdGFnPWF9LGIubG9hZD1mdW5jdGlvbigpe3RoaXMuX2NyZWF0ZVJlcXVlc3QoKSx0aGlzLl9yZXF1ZXN0Lm9uKCJjb21wbGV0ZSIsdGhpcyx0aGlzKSx0aGlzLl9yZXF1ZXN0Lm9uKCJwcm9ncmVzcyIsdGhpcyx0aGlzKSx0aGlzLl9yZXF1ZXN0Lm9uKCJsb2FkU3RhcnQiLHRoaXMsdGhpcyksdGhpcy5fcmVxdWVzdC5vbigiYWJvcnQiLHRoaXMsdGhpcyksdGhpcy5fcmVxdWVzdC5vbigidGltZW91dCIsdGhpcyx0aGlzKSx0aGlzLl9yZXF1ZXN0Lm9uKCJlcnJvciIsdGhpcyx0aGlzKTt2YXIgYT1uZXcgY3JlYXRlanMuRXZlbnQoImluaXRpYWxpemUiKTthLmxvYWRlcj10aGlzLl9yZXF1ZXN0LHRoaXMuZGlzcGF0Y2hFdmVudChhKSx0aGlzLl9yZXF1ZXN0LmxvYWQoKX0sYi5jYW5jZWw9ZnVuY3Rpb24oKXt0aGlzLmNhbmNlbGVkPSEwLHRoaXMuZGVzdHJveSgpfSxiLmRlc3Ryb3k9ZnVuY3Rpb24oKXt0aGlzLl9yZXF1ZXN0JiYodGhpcy5fcmVxdWVzdC5yZW1vdmVBbGxFdmVudExpc3RlbmVycygpLHRoaXMuX3JlcXVlc3QuZGVzdHJveSgpKSx0aGlzLl9yZXF1ZXN0PW51bGwsdGhpcy5faXRlbT1udWxsLHRoaXMuX3Jhd1Jlc3VsdD1udWxsLHRoaXMuX3Jlc3VsdD1udWxsLHRoaXMuX2xvYWRJdGVtcz1udWxsLHRoaXMucmVtb3ZlQWxsRXZlbnRMaXN0ZW5lcnMoKX0sYi5nZXRMb2FkZWRJdGVtcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9sb2FkZWRJdGVtc30sYi5fY3JlYXRlUmVxdWVzdD1mdW5jdGlvbigpe3RoaXMuX3JlcXVlc3Q9dGhpcy5fcHJlZmVyWEhSP25ldyBjcmVhdGVqcy5YSFJSZXF1ZXN0KHRoaXMuX2l0ZW0pOm5ldyBjcmVhdGVqcy5UYWdSZXF1ZXN0KHRoaXMuX2l0ZW0sdGhpcy5fdGFnfHx0aGlzLl9jcmVhdGVUYWcoKSx0aGlzLl90YWdTcmNBdHRyaWJ1dGUpfSxiLl9jcmVhdGVUYWc9ZnVuY3Rpb24oKXtyZXR1cm4gbnVsbH0sYi5fc2VuZExvYWRTdGFydD1mdW5jdGlvbigpe3RoaXMuX2lzQ2FuY2VsZWQoKXx8dGhpcy5kaXNwYXRjaEV2ZW50KCJsb2Fkc3RhcnQiKX0sYi5fc2VuZFByb2dyZXNzPWZ1bmN0aW9uKGEpe2lmKCF0aGlzLl9pc0NhbmNlbGVkKCkpe3ZhciBiPW51bGw7Im51bWJlciI9PXR5cGVvZiBhPyh0aGlzLnByb2dyZXNzPWEsYj1uZXcgY3JlYXRlanMuUHJvZ3Jlc3NFdmVudCh0aGlzLnByb2dyZXNzKSk6KGI9YSx0aGlzLnByb2dyZXNzPWEubG9hZGVkL2EudG90YWwsYi5wcm9ncmVzcz10aGlzLnByb2dyZXNzLChpc05hTih0aGlzLnByb2dyZXNzKXx8MS8wPT10aGlzLnByb2dyZXNzKSYmKHRoaXMucHJvZ3Jlc3M9MCkpLHRoaXMuaGFzRXZlbnRMaXN0ZW5lcigicHJvZ3Jlc3MiKSYmdGhpcy5kaXNwYXRjaEV2ZW50KGIpfX0sYi5fc2VuZENvbXBsZXRlPWZ1bmN0aW9uKCl7aWYoIXRoaXMuX2lzQ2FuY2VsZWQoKSl7dGhpcy5sb2FkZWQ9ITA7dmFyIGE9bmV3IGNyZWF0ZWpzLkV2ZW50KCJjb21wbGV0ZSIpO2EucmF3UmVzdWx0PXRoaXMuX3Jhd1Jlc3VsdCxudWxsIT10aGlzLl9yZXN1bHQmJihhLnJlc3VsdD10aGlzLl9yZXN1bHQpLHRoaXMuZGlzcGF0Y2hFdmVudChhKX19LGIuX3NlbmRFcnJvcj1mdW5jdGlvbihhKXshdGhpcy5faXNDYW5jZWxlZCgpJiZ0aGlzLmhhc0V2ZW50TGlzdGVuZXIoImVycm9yIikmJihudWxsPT1hJiYoYT1uZXcgY3JlYXRlanMuRXJyb3JFdmVudCgiUFJFTE9BRF9FUlJPUl9FTVBUWSIpKSx0aGlzLmRpc3BhdGNoRXZlbnQoYSkpfSxiLl9pc0NhbmNlbGVkPWZ1bmN0aW9uKCl7cmV0dXJuIG51bGw9PXdpbmRvdy5jcmVhdGVqc3x8dGhpcy5jYW5jZWxlZD8hMDohMX0sYi5yZXN1bHRGb3JtYXR0ZXI9bnVsbCxiLmhhbmRsZUV2ZW50PWZ1bmN0aW9uKGEpe3N3aXRjaChhLnR5cGUpe2Nhc2UiY29tcGxldGUiOnRoaXMuX3Jhd1Jlc3VsdD1hLnRhcmdldC5fcmVzcG9uc2U7dmFyIGI9dGhpcy5yZXN1bHRGb3JtYXR0ZXImJnRoaXMucmVzdWx0Rm9ybWF0dGVyKHRoaXMpLGM9dGhpcztiIGluc3RhbmNlb2YgRnVuY3Rpb24/YihmdW5jdGlvbihhKXtjLl9yZXN1bHQ9YSxjLl9zZW5kQ29tcGxldGUoKX0pOih0aGlzLl9yZXN1bHQ9Ynx8dGhpcy5fcmF3UmVzdWx0LHRoaXMuX3NlbmRDb21wbGV0ZSgpKTticmVhaztjYXNlInByb2dyZXNzIjp0aGlzLl9zZW5kUHJvZ3Jlc3MoYSk7YnJlYWs7Y2FzZSJlcnJvciI6dGhpcy5fc2VuZEVycm9yKGEpO2JyZWFrO2Nhc2UibG9hZHN0YXJ0Ijp0aGlzLl9zZW5kTG9hZFN0YXJ0KCk7YnJlYWs7Y2FzZSJhYm9ydCI6Y2FzZSJ0aW1lb3V0Ijp0aGlzLl9pc0NhbmNlbGVkKCl8fHRoaXMuZGlzcGF0Y2hFdmVudChhLnR5cGUpfX0sYi5idWlsZFBhdGg9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gY3JlYXRlanMuUmVxdWVzdFV0aWxzLmJ1aWxkUGF0aChhLGIpfSxiLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIltQcmVsb2FkSlMgQWJzdHJhY3RMb2FkZXJdIn0sY3JlYXRlanMuQWJzdHJhY3RMb2FkZXI9Y3JlYXRlanMucHJvbW90ZShhLCJFdmVudERpc3BhdGNoZXIiKX0oKSx0aGlzLmNyZWF0ZWpzPXRoaXMuY3JlYXRlanN8fHt9LGZ1bmN0aW9uKCl7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIGEoYSxiLGMpe3RoaXMuQWJzdHJhY3RMb2FkZXJfY29uc3RydWN0b3IoYSxiLGMpLHRoaXMucmVzdWx0Rm9ybWF0dGVyPXRoaXMuX2Zvcm1hdFJlc3VsdCx0aGlzLl90YWdTcmNBdHRyaWJ1dGU9InNyYyJ9dmFyIGI9Y3JlYXRlanMuZXh0ZW5kKGEsY3JlYXRlanMuQWJzdHJhY3RMb2FkZXIpO2IubG9hZD1mdW5jdGlvbigpe3RoaXMuX3RhZ3x8KHRoaXMuX3RhZz10aGlzLl9jcmVhdGVUYWcodGhpcy5faXRlbS5zcmMpKSx0aGlzLl90YWcucHJlbG9hZD0iYXV0byIsdGhpcy5fdGFnLmxvYWQoKSx0aGlzLkFic3RyYWN0TG9hZGVyX2xvYWQoKX0sYi5fY3JlYXRlVGFnPWZ1bmN0aW9uKCl7fSxiLl9jcmVhdGVSZXF1ZXN0PWZ1bmN0aW9uKCl7dGhpcy5fcmVxdWVzdD10aGlzLl9wcmVmZXJYSFI/bmV3IGNyZWF0ZWpzLlhIUlJlcXVlc3QodGhpcy5faXRlbSk6bmV3IGNyZWF0ZWpzLk1lZGlhVGFnUmVxdWVzdCh0aGlzLl9pdGVtLHRoaXMuX3RhZ3x8dGhpcy5fY3JlYXRlVGFnKCksdGhpcy5fdGFnU3JjQXR0cmlidXRlKX0sYi5fZm9ybWF0UmVzdWx0PWZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLl90YWcucmVtb3ZlRXZlbnRMaXN0ZW5lciYmdGhpcy5fdGFnLnJlbW92ZUV2ZW50TGlzdGVuZXIoImNhbnBsYXl0aHJvdWdoIix0aGlzLl9sb2FkZWRIYW5kbGVyKSx0aGlzLl90YWcub25zdGFsbGVkPW51bGwsdGhpcy5fcHJlZmVyWEhSJiYoYS5nZXRUYWcoKS5zcmM9YS5nZXRSZXN1bHQoITApKSxhLmdldFRhZygpfSxjcmVhdGVqcy5BYnN0cmFjdE1lZGlhTG9hZGVyPWNyZWF0ZWpzLnByb21vdGUoYSwiQWJzdHJhY3RMb2FkZXIiKX0oKSx0aGlzLmNyZWF0ZWpzPXRoaXMuY3JlYXRlanN8fHt9LGZ1bmN0aW9uKCl7InVzZSBzdHJpY3QiO3ZhciBhPWZ1bmN0aW9uKGEpe3RoaXMuX2l0ZW09YX0sYj1jcmVhdGVqcy5leHRlbmQoYSxjcmVhdGVqcy5FdmVudERpc3BhdGNoZXIpO2IubG9hZD1mdW5jdGlvbigpe30sYi5kZXN0cm95PWZ1bmN0aW9uKCl7fSxiLmNhbmNlbD1mdW5jdGlvbigpe30sY3JlYXRlanMuQWJzdHJhY3RSZXF1ZXN0PWNyZWF0ZWpzLnByb21vdGUoYSwiRXZlbnREaXNwYXRjaGVyIil9KCksdGhpcy5jcmVhdGVqcz10aGlzLmNyZWF0ZWpzfHx7fSxmdW5jdGlvbigpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBhKGEsYixjKXt0aGlzLkFic3RyYWN0UmVxdWVzdF9jb25zdHJ1Y3RvcihhKSx0aGlzLl90YWc9Yix0aGlzLl90YWdTcmNBdHRyaWJ1dGU9Yyx0aGlzLl9sb2FkZWRIYW5kbGVyPWNyZWF0ZWpzLnByb3h5KHRoaXMuX2hhbmRsZVRhZ0NvbXBsZXRlLHRoaXMpLHRoaXMuX2FkZGVkVG9ET009ITEsdGhpcy5fc3RhcnRUYWdWaXNpYmlsaXR5PW51bGx9dmFyIGI9Y3JlYXRlanMuZXh0ZW5kKGEsY3JlYXRlanMuQWJzdHJhY3RSZXF1ZXN0KTtiLmxvYWQ9ZnVuY3Rpb24oKXtudWxsPT10aGlzLl90YWcucGFyZW50Tm9kZSYmKHdpbmRvdy5kb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuX3RhZyksdGhpcy5fYWRkZWRUb0RPTT0hMCksdGhpcy5fdGFnLm9ubG9hZD1jcmVhdGVqcy5wcm94eSh0aGlzLl9oYW5kbGVUYWdDb21wbGV0ZSx0aGlzKSx0aGlzLl90YWcub25yZWFkeXN0YXRlY2hhbmdlPWNyZWF0ZWpzLnByb3h5KHRoaXMuX2hhbmRsZVJlYWR5U3RhdGVDaGFuZ2UsdGhpcyk7dmFyIGE9bmV3IGNyZWF0ZWpzLkV2ZW50KCJpbml0aWFsaXplIik7YS5sb2FkZXI9dGhpcy5fdGFnLHRoaXMuZGlzcGF0Y2hFdmVudChhKSx0aGlzLl9oaWRlVGFnKCksdGhpcy5fdGFnW3RoaXMuX3RhZ1NyY0F0dHJpYnV0ZV09dGhpcy5faXRlbS5zcmN9LGIuZGVzdHJveT1mdW5jdGlvbigpe3RoaXMuX2NsZWFuKCksdGhpcy5fdGFnPW51bGwsdGhpcy5BYnN0cmFjdFJlcXVlc3RfZGVzdHJveSgpfSxiLl9oYW5kbGVSZWFkeVN0YXRlQ2hhbmdlPWZ1bmN0aW9uKCl7Y2xlYXJUaW1lb3V0KHRoaXMuX2xvYWRUaW1lb3V0KTt2YXIgYT10aGlzLl90YWc7KCJsb2FkZWQiPT1hLnJlYWR5U3RhdGV8fCJjb21wbGV0ZSI9PWEucmVhZHlTdGF0ZSkmJnRoaXMuX2hhbmRsZVRhZ0NvbXBsZXRlKCl9LGIuX2hhbmRsZVRhZ0NvbXBsZXRlPWZ1bmN0aW9uKCl7dGhpcy5fcmF3UmVzdWx0PXRoaXMuX3RhZyx0aGlzLl9yZXN1bHQ9dGhpcy5yZXN1bHRGb3JtYXR0ZXImJnRoaXMucmVzdWx0Rm9ybWF0dGVyKHRoaXMpfHx0aGlzLl9yYXdSZXN1bHQsdGhpcy5fY2xlYW4oKSx0aGlzLl9zaG93VGFnKCksdGhpcy5kaXNwYXRjaEV2ZW50KCJjb21wbGV0ZSIpfSxiLl9jbGVhbj1mdW5jdGlvbigpe3RoaXMuX3RhZy5vbmxvYWQ9bnVsbCx0aGlzLl90YWcub25yZWFkeXN0YXRlY2hhbmdlPW51bGwsdGhpcy5fYWRkZWRUb0RPTSYmbnVsbCE9dGhpcy5fdGFnLnBhcmVudE5vZGUmJnRoaXMuX3RhZy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuX3RhZyl9LGIuX2hpZGVUYWc9ZnVuY3Rpb24oKXt0aGlzLl9zdGFydFRhZ1Zpc2liaWxpdHk9dGhpcy5fdGFnLnN0eWxlLnZpc2liaWxpdHksdGhpcy5fdGFnLnN0eWxlLnZpc2liaWxpdHk9ImhpZGRlbiJ9LGIuX3Nob3dUYWc9ZnVuY3Rpb24oKXt0aGlzLl90YWcuc3R5bGUudmlzaWJpbGl0eT10aGlzLl9zdGFydFRhZ1Zpc2liaWxpdHl9LGIuX2hhbmRsZVN0YWxsZWQ9ZnVuY3Rpb24oKXt9LGNyZWF0ZWpzLlRhZ1JlcXVlc3Q9Y3JlYXRlanMucHJvbW90ZShhLCJBYnN0cmFjdFJlcXVlc3QiKX0oKSx0aGlzLmNyZWF0ZWpzPXRoaXMuY3JlYXRlanN8fHt9LGZ1bmN0aW9uKCl7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIGEoYSxiLGMpe3RoaXMuQWJzdHJhY3RSZXF1ZXN0X2NvbnN0cnVjdG9yKGEpLHRoaXMuX3RhZz1iLHRoaXMuX3RhZ1NyY0F0dHJpYnV0ZT1jLHRoaXMuX2xvYWRlZEhhbmRsZXI9Y3JlYXRlanMucHJveHkodGhpcy5faGFuZGxlVGFnQ29tcGxldGUsdGhpcyl9dmFyIGI9Y3JlYXRlanMuZXh0ZW5kKGEsY3JlYXRlanMuVGFnUmVxdWVzdCk7Yi5sb2FkPWZ1bmN0aW9uKCl7dGhpcy5fdGFnLm9uc3RhbGxlZD1jcmVhdGVqcy5wcm94eSh0aGlzLl9oYW5kbGVTdGFsbGVkLHRoaXMpLHRoaXMuX3RhZy5vbnByb2dyZXNzPWNyZWF0ZWpzLnByb3h5KHRoaXMuX2hhbmRsZVByb2dyZXNzLHRoaXMpLHRoaXMuX3RhZy5hZGRFdmVudExpc3RlbmVyJiZ0aGlzLl90YWcuYWRkRXZlbnRMaXN0ZW5lcigiY2FucGxheXRocm91Z2giLHRoaXMuX2xvYWRlZEhhbmRsZXIsITEpLHRoaXMuVGFnUmVxdWVzdF9sb2FkKCl9LGIuX2hhbmRsZVJlYWR5U3RhdGVDaGFuZ2U9ZnVuY3Rpb24oKXtjbGVhclRpbWVvdXQodGhpcy5fbG9hZFRpbWVvdXQpO3ZhciBhPXRoaXMuX3RhZzsoImxvYWRlZCI9PWEucmVhZHlTdGF0ZXx8ImNvbXBsZXRlIj09YS5yZWFkeVN0YXRlKSYmdGhpcy5faGFuZGxlVGFnQ29tcGxldGUoKX0sYi5faGFuZGxlU3RhbGxlZD1mdW5jdGlvbigpe30sYi5faGFuZGxlUHJvZ3Jlc3M9ZnVuY3Rpb24oYSl7aWYoYSYmIShhLmxvYWRlZD4wJiYwPT1hLnRvdGFsKSl7dmFyIGI9bmV3IGNyZWF0ZWpzLlByb2dyZXNzRXZlbnQoYS5sb2FkZWQsYS50b3RhbCk7dGhpcy5kaXNwYXRjaEV2ZW50KGIpfX0sYi5fY2xlYW49ZnVuY3Rpb24oKXt0aGlzLl90YWcucmVtb3ZlRXZlbnRMaXN0ZW5lciYmdGhpcy5fdGFnLnJlbW92ZUV2ZW50TGlzdGVuZXIoImNhbnBsYXl0aHJvdWdoIix0aGlzLl9sb2FkZWRIYW5kbGVyKSx0aGlzLl90YWcub25zdGFsbGVkPW51bGwsdGhpcy5fdGFnLm9ucHJvZ3Jlc3M9bnVsbCx0aGlzLlRhZ1JlcXVlc3RfX2NsZWFuKCl9LGNyZWF0ZWpzLk1lZGlhVGFnUmVxdWVzdD1jcmVhdGVqcy5wcm9tb3RlKGEsIlRhZ1JlcXVlc3QiKX0oKSx0aGlzLmNyZWF0ZWpzPXRoaXMuY3JlYXRlanN8fHt9LGZ1bmN0aW9uKCl7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIGEoYSl7dGhpcy5BYnN0cmFjdFJlcXVlc3RfY29uc3RydWN0b3IoYSksdGhpcy5fcmVxdWVzdD1udWxsLHRoaXMuX2xvYWRUaW1lb3V0PW51bGwsdGhpcy5feGhyTGV2ZWw9MSx0aGlzLl9yZXNwb25zZT1udWxsLHRoaXMuX3Jhd1Jlc3BvbnNlPW51bGwsdGhpcy5fY2FuY2VsZWQ9ITEsdGhpcy5faGFuZGxlTG9hZFN0YXJ0UHJveHk9Y3JlYXRlanMucHJveHkodGhpcy5faGFuZGxlTG9hZFN0YXJ0LHRoaXMpLHRoaXMuX2hhbmRsZVByb2dyZXNzUHJveHk9Y3JlYXRlanMucHJveHkodGhpcy5faGFuZGxlUHJvZ3Jlc3MsdGhpcyksdGhpcy5faGFuZGxlQWJvcnRQcm94eT1jcmVhdGVqcy5wcm94eSh0aGlzLl9oYW5kbGVBYm9ydCx0aGlzKSx0aGlzLl9oYW5kbGVFcnJvclByb3h5PWNyZWF0ZWpzLnByb3h5KHRoaXMuX2hhbmRsZUVycm9yLHRoaXMpLHRoaXMuX2hhbmRsZVRpbWVvdXRQcm94eT1jcmVhdGVqcy5wcm94eSh0aGlzLl9oYW5kbGVUaW1lb3V0LHRoaXMpLHRoaXMuX2hhbmRsZUxvYWRQcm94eT1jcmVhdGVqcy5wcm94eSh0aGlzLl9oYW5kbGVMb2FkLHRoaXMpLHRoaXMuX2hhbmRsZVJlYWR5U3RhdGVDaGFuZ2VQcm94eT1jcmVhdGVqcy5wcm94eSh0aGlzLl9oYW5kbGVSZWFkeVN0YXRlQ2hhbmdlLHRoaXMpLCF0aGlzLl9jcmVhdGVYSFIoYSl9dmFyIGI9Y3JlYXRlanMuZXh0ZW5kKGEsY3JlYXRlanMuQWJzdHJhY3RSZXF1ZXN0KTthLkFDVElWRVhfVkVSU0lPTlM9WyJNc3htbDIuWE1MSFRUUC42LjAiLCJNc3htbDIuWE1MSFRUUC41LjAiLCJNc3htbDIuWE1MSFRUUC40LjAiLCJNU1hNTDIuWE1MSFRUUC4zLjAiLCJNU1hNTDIuWE1MSFRUUCIsIk1pY3Jvc29mdC5YTUxIVFRQIl0sYi5nZXRSZXN1bHQ9ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJnRoaXMuX3Jhd1Jlc3BvbnNlP3RoaXMuX3Jhd1Jlc3BvbnNlOnRoaXMuX3Jlc3BvbnNlfSxiLmNhbmNlbD1mdW5jdGlvbigpe3RoaXMuY2FuY2VsZWQ9ITAsdGhpcy5fY2xlYW4oKSx0aGlzLl9yZXF1ZXN0LmFib3J0KCl9LGIubG9hZD1mdW5jdGlvbigpe2lmKG51bGw9PXRoaXMuX3JlcXVlc3QpcmV0dXJuIHZvaWQgdGhpcy5faGFuZGxlRXJyb3IoKTt0aGlzLl9yZXF1ZXN0LmFkZEV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsdGhpcy5faGFuZGxlTG9hZFN0YXJ0UHJveHksITEpLHRoaXMuX3JlcXVlc3QuYWRkRXZlbnRMaXN0ZW5lcigicHJvZ3Jlc3MiLHRoaXMuX2hhbmRsZVByb2dyZXNzUHJveHksITEpLHRoaXMuX3JlcXVlc3QuYWRkRXZlbnRMaXN0ZW5lcigiYWJvcnQiLHRoaXMuX2hhbmRsZUFib3J0UHJveHksITEpLHRoaXMuX3JlcXVlc3QuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLHRoaXMuX2hhbmRsZUVycm9yUHJveHksITEpLHRoaXMuX3JlcXVlc3QuYWRkRXZlbnRMaXN0ZW5lcigidGltZW91dCIsdGhpcy5faGFuZGxlVGltZW91dFByb3h5LCExKSx0aGlzLl9yZXF1ZXN0LmFkZEV2ZW50TGlzdGVuZXIoImxvYWQiLHRoaXMuX2hhbmRsZUxvYWRQcm94eSwhMSksdGhpcy5fcmVxdWVzdC5hZGRFdmVudExpc3RlbmVyKCJyZWFkeXN0YXRlY2hhbmdlIix0aGlzLl9oYW5kbGVSZWFkeVN0YXRlQ2hhbmdlUHJveHksITEpLDE9PXRoaXMuX3hockxldmVsJiYodGhpcy5fbG9hZFRpbWVvdXQ9c2V0VGltZW91dChjcmVhdGVqcy5wcm94eSh0aGlzLl9oYW5kbGVUaW1lb3V0LHRoaXMpLHRoaXMuX2l0ZW0ubG9hZFRpbWVvdXQpKTt0cnl7dGhpcy5faXRlbS52YWx1ZXMmJnRoaXMuX2l0ZW0ubWV0aG9kIT1jcmVhdGVqcy5BYnN0cmFjdExvYWRlci5HRVQ/dGhpcy5faXRlbS5tZXRob2Q9PWNyZWF0ZWpzLkFic3RyYWN0TG9hZGVyLlBPU1QmJnRoaXMuX3JlcXVlc3Quc2VuZChjcmVhdGVqcy5SZXF1ZXN0VXRpbHMuZm9ybWF0UXVlcnlTdHJpbmcodGhpcy5faXRlbS52YWx1ZXMpKTp0aGlzLl9yZXF1ZXN0LnNlbmQoKX1jYXRjaChhKXt0aGlzLmRpc3BhdGNoRXZlbnQobmV3IGNyZWF0ZWpzLkVycm9yRXZlbnQoIlhIUl9TRU5EIixudWxsLGEpKX19LGIuc2V0UmVzcG9uc2VUeXBlPWZ1bmN0aW9uKGEpe3RoaXMuX3JlcXVlc3QucmVzcG9uc2VUeXBlPWF9LGIuZ2V0QWxsUmVzcG9uc2VIZWFkZXJzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3JlcXVlc3QuZ2V0QWxsUmVzcG9uc2VIZWFkZXJzIGluc3RhbmNlb2YgRnVuY3Rpb24/dGhpcy5fcmVxdWVzdC5nZXRBbGxSZXNwb25zZUhlYWRlcnMoKTpudWxsfSxiLmdldFJlc3BvbnNlSGVhZGVyPWZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLl9yZXF1ZXN0LmdldFJlc3BvbnNlSGVhZGVyIGluc3RhbmNlb2YgRnVuY3Rpb24/dGhpcy5fcmVxdWVzdC5nZXRSZXNwb25zZUhlYWRlcihhKTpudWxsfSxiLl9oYW5kbGVQcm9ncmVzcz1mdW5jdGlvbihhKXtpZihhJiYhKGEubG9hZGVkPjAmJjA9PWEudG90YWwpKXt2YXIgYj1uZXcgY3JlYXRlanMuUHJvZ3Jlc3NFdmVudChhLmxvYWRlZCxhLnRvdGFsKTt0aGlzLmRpc3BhdGNoRXZlbnQoYil9fSxiLl9oYW5kbGVMb2FkU3RhcnQ9ZnVuY3Rpb24oKXtjbGVhclRpbWVvdXQodGhpcy5fbG9hZFRpbWVvdXQpLHRoaXMuZGlzcGF0Y2hFdmVudCgibG9hZHN0YXJ0Iil9LGIuX2hhbmRsZUFib3J0PWZ1bmN0aW9uKGEpe3RoaXMuX2NsZWFuKCksdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBjcmVhdGVqcy5FcnJvckV2ZW50KCJYSFJfQUJPUlRFRCIsbnVsbCxhKSl9LGIuX2hhbmRsZUVycm9yPWZ1bmN0aW9uKGEpe3RoaXMuX2NsZWFuKCksdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBjcmVhdGVqcy5FcnJvckV2ZW50KGEubWVzc2FnZSkpfSxiLl9oYW5kbGVSZWFkeVN0YXRlQ2hhbmdlPWZ1bmN0aW9uKCl7ND09dGhpcy5fcmVxdWVzdC5yZWFkeVN0YXRlJiZ0aGlzLl9oYW5kbGVMb2FkKCl9LGIuX2hhbmRsZUxvYWQ9ZnVuY3Rpb24oKXtpZighdGhpcy5sb2FkZWQpe3RoaXMubG9hZGVkPSEwO3ZhciBhPXRoaXMuX2NoZWNrRXJyb3IoKTtpZihhKXJldHVybiB2b2lkIHRoaXMuX2hhbmRsZUVycm9yKGEpO3RoaXMuX3Jlc3BvbnNlPXRoaXMuX2dldFJlc3BvbnNlKCksdGhpcy5fY2xlYW4oKSx0aGlzLmRpc3BhdGNoRXZlbnQobmV3IGNyZWF0ZWpzLkV2ZW50KCJjb21wbGV0ZSIpKX19LGIuX2hhbmRsZVRpbWVvdXQ9ZnVuY3Rpb24oYSl7dGhpcy5fY2xlYW4oKSx0aGlzLmRpc3BhdGNoRXZlbnQobmV3IGNyZWF0ZWpzLkVycm9yRXZlbnQoIlBSRUxPQURfVElNRU9VVCIsbnVsbCxhKSl9LGIuX2NoZWNrRXJyb3I9ZnVuY3Rpb24oKXt2YXIgYT1wYXJzZUludCh0aGlzLl9yZXF1ZXN0LnN0YXR1cyk7c3dpdGNoKGEpe2Nhc2UgNDA0OmNhc2UgMDpyZXR1cm4gbmV3IEVycm9yKGEpfXJldHVybiBudWxsfSxiLl9nZXRSZXNwb25zZT1mdW5jdGlvbigpe2lmKG51bGwhPXRoaXMuX3Jlc3BvbnNlKXJldHVybiB0aGlzLl9yZXNwb25zZTtpZihudWxsIT10aGlzLl9yZXF1ZXN0LnJlc3BvbnNlKXJldHVybiB0aGlzLl9yZXF1ZXN0LnJlc3BvbnNlO3RyeXtpZihudWxsIT10aGlzLl9yZXF1ZXN0LnJlc3BvbnNlVGV4dClyZXR1cm4gdGhpcy5fcmVxdWVzdC5yZXNwb25zZVRleHR9Y2F0Y2goYSl7fXRyeXtpZihudWxsIT10aGlzLl9yZXF1ZXN0LnJlc3BvbnNlWE1MKXJldHVybiB0aGlzLl9yZXF1ZXN0LnJlc3BvbnNlWE1MfWNhdGNoKGEpe31yZXR1cm4gbnVsbH0sYi5fY3JlYXRlWEhSPWZ1bmN0aW9uKGEpe3ZhciBiPWNyZWF0ZWpzLlJlcXVlc3RVdGlscy5pc0Nyb3NzRG9tYWluKGEpLGM9e30sZD1udWxsO2lmKHdpbmRvdy5YTUxIdHRwUmVxdWVzdClkPW5ldyBYTUxIdHRwUmVxdWVzdCxiJiZ2b2lkIDA9PT1kLndpdGhDcmVkZW50aWFscyYmd2luZG93LlhEb21haW5SZXF1ZXN0JiYoZD1uZXcgWERvbWFpblJlcXVlc3QpO2Vsc2V7Zm9yKHZhciBlPTAsZj1zLkFDVElWRVhfVkVSU0lPTlMubGVuZ3RoO2Y+ZTtlKyspe3tzLkFDVElWRVhfVkVSU0lPTlNbZV19dHJ5e2Q9bmV3IEFjdGl2ZVhPYmplY3QoYXhWZXJzaW9ucyk7YnJlYWt9Y2F0Y2goZyl7fX1pZihudWxsPT1kKXJldHVybiExfWEubWltZVR5cGUmJmQub3ZlcnJpZGVNaW1lVHlwZSYmZC5vdmVycmlkZU1pbWVUeXBlKGEubWltZVR5cGUpLHRoaXMuX3hockxldmVsPSJzdHJpbmciPT10eXBlb2YgZC5yZXNwb25zZVR5cGU/MjoxO3ZhciBoPW51bGw7aWYoaD1hLm1ldGhvZD09Y3JlYXRlanMuQWJzdHJhY3RMb2FkZXIuR0VUP2NyZWF0ZWpzLlJlcXVlc3RVdGlscy5idWlsZFBhdGgoYS5zcmMsYS52YWx1ZXMpOmEuc3JjLGQub3BlbihhLm1ldGhvZHx8Y3JlYXRlanMuQWJzdHJhY3RMb2FkZXIuR0VULGgsITApLGImJmQgaW5zdGFuY2VvZiBYTUxIdHRwUmVxdWVzdCYmMT09dGhpcy5feGhyTGV2ZWwmJihjLk9yaWdpbj1sb2NhdGlvbi5vcmlnaW4pLGEudmFsdWVzJiZhLm1ldGhvZD09Y3JlYXRlanMuQWJzdHJhY3RMb2FkZXIuUE9TVCYmKGNbIkNvbnRlbnQtVHlwZSJdPSJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSxifHxjWyJYLVJlcXVlc3RlZC1XaXRoIl18fChjWyJYLVJlcXVlc3RlZC1XaXRoIl09IlhNTEh0dHBSZXF1ZXN0IiksYS5oZWFkZXJzKWZvcih2YXIgaSBpbiBhLmhlYWRlcnMpY1tpXT1hLmhlYWRlcnNbaV07Zm9yKGkgaW4gYylkLnNldFJlcXVlc3RIZWFkZXIoaSxjW2ldKTtyZXR1cm4gZCBpbnN0YW5jZW9mIFhNTEh0dHBSZXF1ZXN0JiZ2b2lkIDAhPT1hLndpdGhDcmVkZW50aWFscyYmKGQud2l0aENyZWRlbnRpYWxzPWEud2l0aENyZWRlbnRpYWxzKSx0aGlzLl9yZXF1ZXN0PWQsITB9LGIuX2NsZWFuPWZ1bmN0aW9uKCl7Y2xlYXJUaW1lb3V0KHRoaXMuX2xvYWRUaW1lb3V0KSx0aGlzLl9yZXF1ZXN0LnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsdGhpcy5faGFuZGxlTG9hZFN0YXJ0UHJveHkpLHRoaXMuX3JlcXVlc3QucmVtb3ZlRXZlbnRMaXN0ZW5lcigicHJvZ3Jlc3MiLHRoaXMuX2hhbmRsZVByb2dyZXNzUHJveHkpLHRoaXMuX3JlcXVlc3QucmVtb3ZlRXZlbnRMaXN0ZW5lcigiYWJvcnQiLHRoaXMuX2hhbmRsZUFib3J0UHJveHkpLHRoaXMuX3JlcXVlc3QucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZXJyb3IiLHRoaXMuX2hhbmRsZUVycm9yUHJveHkpLHRoaXMuX3JlcXVlc3QucmVtb3ZlRXZlbnRMaXN0ZW5lcigidGltZW91dCIsdGhpcy5faGFuZGxlVGltZW91dFByb3h5KSx0aGlzLl9yZXF1ZXN0LnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWQiLHRoaXMuX2hhbmRsZUxvYWRQcm94eSksdGhpcy5fcmVxdWVzdC5yZW1vdmVFdmVudExpc3RlbmVyKCJyZWFkeXN0YXRlY2hhbmdlIix0aGlzLl9oYW5kbGVSZWFkeVN0YXRlQ2hhbmdlUHJveHkpfSxiLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIltQcmVsb2FkSlMgWEhSUmVxdWVzdF0ifSxjcmVhdGVqcy5YSFJSZXF1ZXN0PWNyZWF0ZWpzLnByb21vdGUoYSwiQWJzdHJhY3RSZXF1ZXN0Iil9KCksdGhpcy5jcmVhdGVqcz10aGlzLmNyZWF0ZWpzfHx7fSxmdW5jdGlvbigpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBhKGEsYil7dGhpcy5BYnN0cmFjdE1lZGlhTG9hZGVyX2NvbnN0cnVjdG9yKGEsYixjcmVhdGVqcy5BYnN0cmFjdExvYWRlci5TT1VORCksY3JlYXRlanMuUmVxdWVzdFV0aWxzLmlzQXVkaW9UYWcoYSk/dGhpcy5fdGFnPWE6Y3JlYXRlanMuUmVxdWVzdFV0aWxzLmlzQXVkaW9UYWcoYS5zcmMpP3RoaXMuX3RhZz1hOmNyZWF0ZWpzLlJlcXVlc3RVdGlscy5pc0F1ZGlvVGFnKGEudGFnKSYmKHRoaXMuX3RhZz1jcmVhdGVqcy5SZXF1ZXN0VXRpbHMuaXNBdWRpb1RhZyhhKT9hOmEuc3JjKSxudWxsIT10aGlzLl90YWcmJih0aGlzLl9wcmVmZXJYSFI9ITEpfXZhciBiPWNyZWF0ZWpzLmV4dGVuZChhLGNyZWF0ZWpzLkFic3RyYWN0TWVkaWFMb2FkZXIpLGM9YTtjLmNhbkxvYWRJdGVtPWZ1bmN0aW9uKGEpe3JldHVybiBhLnR5cGU9PWNyZWF0ZWpzLkFic3RyYWN0TG9hZGVyLlNPVU5EfSxiLl9jcmVhdGVUYWc9ZnVuY3Rpb24oYSl7dmFyIGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiYXVkaW8iKTtyZXR1cm4gYi5hdXRvcGxheT0hMSxiLnByZWxvYWQ9Im5vbmUiLGIuc3JjPWEsYn0sY3JlYXRlanMuU291bmRMb2FkZXI9Y3JlYXRlanMucHJvbW90ZShhLCJBYnN0cmFjdE1lZGlhTG9hZGVyIil9KCksdGhpcy5jcmVhdGVqcz10aGlzLmNyZWF0ZWpzfHx7fSxmdW5jdGlvbigpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBhKCl7dGhyb3ciU291bmQgY2Fubm90IGJlIGluc3RhbnRpYXRlZCJ9ZnVuY3Rpb24gYihhLGIpe3RoaXMuaW5pdChhLGIpfXZhciBjPWE7Yy5JTlRFUlJVUFRfQU5ZPSJhbnkiLGMuSU5URVJSVVBUX0VBUkxZPSJlYXJseSIsYy5JTlRFUlJVUFRfTEFURT0ibGF0ZSIsYy5JTlRFUlJVUFRfTk9ORT0ibm9uZSIsYy5QTEFZX0lOSVRFRD0icGxheUluaXRlZCIsYy5QTEFZX1NVQ0NFRURFRD0icGxheVN1Y2NlZWRlZCIsYy5QTEFZX0lOVEVSUlVQVEVEPSJwbGF5SW50ZXJydXB0ZWQiLGMuUExBWV9GSU5JU0hFRD0icGxheUZpbmlzaGVkIixjLlBMQVlfRkFJTEVEPSJwbGF5RmFpbGVkIixjLlNVUFBPUlRFRF9FWFRFTlNJT05TPVsibXAzIiwib2dnIiwibXBlZyIsIndhdiIsIm00YSIsIm1wNCIsImFpZmYiLCJ3bWEiLCJtaWQiXSxjLkVYVEVOU0lPTl9NQVA9e200YToibXA0In0sYy5GSUxFX1BBVFRFUk49L14oPzooXHcrOilcL3syfShcdysoPzpcLlx3KykqXC8/KSk/KFsvLl0qPyg/OlteP10rKT9cLyk/KCg/OlteLz9dKylcLihcdyspKSg/Olw/KFxTKyk/KT8kLyxjLmRlZmF1bHRJbnRlcnJ1cHRCZWhhdmlvcj1jLklOVEVSUlVQVF9OT05FLGMuYWx0ZXJuYXRlRXh0ZW5zaW9ucz1bXSxjLmFjdGl2ZVBsdWdpbj1udWxsLGMuX3BsdWdpbnNSZWdpc3RlcmVkPSExLGMuX2xhc3RJRD0wLGMuX21hc3RlclZvbHVtZT0xLGMuX21hc3Rlck11dGU9ITEsYy5faW5zdGFuY2VzPVtdLGMuX2lkSGFzaD17fSxjLl9wcmVsb2FkSGFzaD17fSxjLmFkZEV2ZW50TGlzdGVuZXI9bnVsbCxjLnJlbW92ZUV2ZW50TGlzdGVuZXI9bnVsbCxjLnJlbW92ZUFsbEV2ZW50TGlzdGVuZXJzPW51bGwsYy5kaXNwYXRjaEV2ZW50PW51bGwsYy5oYXNFdmVudExpc3RlbmVyPW51bGwsYy5fbGlzdGVuZXJzPW51bGwsY3JlYXRlanMuRXZlbnREaXNwYXRjaGVyLmluaXRpYWxpemUoYyksYy5nZXRQcmVsb2FkSGFuZGxlcnM9ZnVuY3Rpb24oKXtyZXR1cm57Y2FsbGJhY2s6Y3JlYXRlanMucHJveHkoYy5pbml0TG9hZCxjKSx0eXBlczpbInNvdW5kIl0sZXh0ZW5zaW9uczpjLlNVUFBPUlRFRF9FWFRFTlNJT05TfX0sYy5faGFuZGxlTG9hZENvbXBsZXRlPWZ1bmN0aW9uKGEpe3ZhciBiPWEudGFyZ2V0LmdldEl0ZW0oKS5zcmM7aWYoYy5fcHJlbG9hZEhhc2hbYl0pZm9yKHZhciBkPTAsZT1jLl9wcmVsb2FkSGFzaFtiXS5sZW5ndGg7ZT5kO2QrKyl7dmFyIGY9Yy5fcHJlbG9hZEhhc2hbYl1bZF07aWYoYy5fcHJlbG9hZEhhc2hbYl1bZF09ITAsYy5oYXNFdmVudExpc3RlbmVyKCJmaWxlbG9hZCIpKXt2YXIgYT1uZXcgY3JlYXRlanMuRXZlbnQoImZpbGVsb2FkIik7YS5zcmM9Zi5zcmMsYS5pZD1mLmlkLGEuZGF0YT1mLmRhdGEsYS5zcHJpdGU9Zi5zcHJpdGUsYy5kaXNwYXRjaEV2ZW50KGEpfX19LGMuX2hhbmRsZUxvYWRFcnJvcj1mdW5jdGlvbihhKXt2YXIgYj1hLnRhcmdldC5nZXRJdGVtKCkuc3JjO2lmKGMuX3ByZWxvYWRIYXNoW2JdKWZvcih2YXIgZD0wLGU9Yy5fcHJlbG9hZEhhc2hbYl0ubGVuZ3RoO2U+ZDtkKyspe3ZhciBmPWMuX3ByZWxvYWRIYXNoW2JdW2RdO2lmKGMuX3ByZWxvYWRIYXNoW2JdW2RdPSExLGMuaGFzRXZlbnRMaXN0ZW5lcigiZmlsZWVycm9yIikpe3ZhciBhPW5ldyBjcmVhdGVqcy5FdmVudCgiZmlsZWVycm9yIik7YS5zcmM9Zi5zcmMsYS5pZD1mLmlkLGEuZGF0YT1mLmRhdGEsYS5zcHJpdGU9Zi5zcHJpdGUsYy5kaXNwYXRjaEV2ZW50KGEpfX19LGMuX3JlZ2lzdGVyUGx1Z2luPWZ1bmN0aW9uKGEpe3JldHVybiBhLmlzU3VwcG9ydGVkKCk/KGMuYWN0aXZlUGx1Z2luPW5ldyBhLCEwKTohMX0sYy5yZWdpc3RlclBsdWdpbnM9ZnVuY3Rpb24oYSl7Yy5fcGx1Z2luc1JlZ2lzdGVyZWQ9ITA7Zm9yKHZhciBiPTAsZD1hLmxlbmd0aDtkPmI7YisrKWlmKGMuX3JlZ2lzdGVyUGx1Z2luKGFbYl0pKXJldHVybiEwO3JldHVybiExfSxjLmluaXRpYWxpemVEZWZhdWx0UGx1Z2lucz1mdW5jdGlvbigpe3JldHVybiBudWxsIT1jLmFjdGl2ZVBsdWdpbj8hMDpjLl9wbHVnaW5zUmVnaXN0ZXJlZD8hMTpjLnJlZ2lzdGVyUGx1Z2lucyhbY3JlYXRlanMuV2ViQXVkaW9QbHVnaW4sY3JlYXRlanMuSFRNTEF1ZGlvUGx1Z2luXSk/ITA6ITF9LGMuaXNSZWFkeT1mdW5jdGlvbigpe3JldHVybiBudWxsIT1jLmFjdGl2ZVBsdWdpbn0sYy5nZXRDYXBhYmlsaXRpZXM9ZnVuY3Rpb24oKXtyZXR1cm4gbnVsbD09Yy5hY3RpdmVQbHVnaW4/bnVsbDpjLmFjdGl2ZVBsdWdpbi5fY2FwYWJpbGl0aWVzfSxjLmdldENhcGFiaWxpdHk9ZnVuY3Rpb24oYSl7cmV0dXJuIG51bGw9PWMuYWN0aXZlUGx1Z2luP251bGw6Yy5hY3RpdmVQbHVnaW4uX2NhcGFiaWxpdGllc1thXX0sYy5pbml0TG9hZD1mdW5jdGlvbihhKXtyZXR1cm4gYy5fcmVnaXN0ZXJTb3VuZChhKX0sYy5fcmVnaXN0ZXJTb3VuZD1mdW5jdGlvbihhKXtpZighYy5pbml0aWFsaXplRGVmYXVsdFBsdWdpbnMoKSlyZXR1cm4hMTt2YXIgZD1jLl9wYXJzZVBhdGgoYS5zcmMpO2lmKG51bGw9PWQpcmV0dXJuITE7YS5zcmM9ZC5zcmMsYS50eXBlPSJzb3VuZCI7dmFyIGU9YS5kYXRhLGY9Yy5hY3RpdmVQbHVnaW4uZGVmYXVsdE51bUNoYW5uZWxzfHxudWxsO2lmKG51bGwhPWUmJihpc05hTihlLmNoYW5uZWxzKT9pc05hTihlKXx8KGY9cGFyc2VJbnQoZSkpOmY9cGFyc2VJbnQoZS5jaGFubmVscyksZS5hdWRpb1Nwcml0ZSkpZm9yKHZhciBnLGg9ZS5hdWRpb1Nwcml0ZS5sZW5ndGg7aC0tOylnPWUuYXVkaW9TcHJpdGVbaF0sYy5faWRIYXNoW2cuaWRdPXtzcmM6YS5zcmMsc3RhcnRUaW1lOnBhcnNlSW50KGcuc3RhcnRUaW1lKSxkdXJhdGlvbjpwYXJzZUludChnLmR1cmF0aW9uKX07bnVsbCE9YS5pZCYmKGMuX2lkSGFzaFthLmlkXT17c3JjOmEuc3JjfSk7dmFyIGk9Yy5hY3RpdmVQbHVnaW4ucmVnaXN0ZXIoYSxmKTtyZXR1cm4gYi5jcmVhdGUoYS5zcmMsZiksbnVsbCE9ZSYmaXNOYU4oZSk/YS5kYXRhLmNoYW5uZWxzPWZ8fGIubWF4UGVyQ2hhbm5lbCgpOmEuZGF0YT1mfHxiLm1heFBlckNoYW5uZWwoKSxpLnR5cGUmJihhLnR5cGU9aS50eXBlKSxpfSxjLnJlZ2lzdGVyU291bmQ9ZnVuY3Rpb24oYSxiLGQsZSl7dmFyIGY9e3NyYzphLGlkOmIsZGF0YTpkfTthIGluc3RhbmNlb2YgT2JqZWN0JiYoZT1iLGY9YSksZj1jcmVhdGVqcy5Mb2FkSXRlbS5jcmVhdGUoZiksbnVsbCE9ZSYmKGYuc3JjPWUrYSk7dmFyIGc9Yy5fcmVnaXN0ZXJTb3VuZChmKTtpZighZylyZXR1cm4hMTtpZihjLl9wcmVsb2FkSGFzaFtmLnNyY118fChjLl9wcmVsb2FkSGFzaFtmLnNyY109W10pLGMuX3ByZWxvYWRIYXNoW2Yuc3JjXS5wdXNoKGYpLDE9PWMuX3ByZWxvYWRIYXNoW2Yuc3JjXS5sZW5ndGgpZy5vbigiY29tcGxldGUiLGNyZWF0ZWpzLnByb3h5KHRoaXMuX2hhbmRsZUxvYWRDb21wbGV0ZSx0aGlzKSksZy5vbigiZXJyb3IiLGNyZWF0ZWpzLnByb3h5KHRoaXMuX2hhbmRsZUxvYWRFcnJvcix0aGlzKSksYy5hY3RpdmVQbHVnaW4ucHJlbG9hZChnKTtlbHNlIGlmKDE9PWMuX3ByZWxvYWRIYXNoW2Yuc3JjXVswXSlyZXR1cm4hMDtyZXR1cm4gZn0sYy5yZWdpc3RlclNvdW5kcz1mdW5jdGlvbihhLGIpe3ZhciBjPVtdO2EucGF0aCYmKGI/Yis9YS5wYXRoOmI9YS5wYXRoKTtmb3IodmFyIGQ9MCxlPWEubGVuZ3RoO2U+ZDtkKyspY1tkXT1jcmVhdGVqcy5Tb3VuZC5yZWdpc3RlclNvdW5kKGFbZF0uc3JjLGFbZF0uaWQsYVtkXS5kYXRhLGIpO3JldHVybiBjfSxjLnJlZ2lzdGVyTWFuaWZlc3Q9ZnVuY3Rpb24oYSxiKXt0cnl7Y29uc29sZS5sb2coImNyZWF0ZWpzLlNvdW5kLnJlZ2lzdGVyTWFuaWZlc3QgaXMgZGVwcmVjYXRlZCwgcGxlYXNlIHVzZSBjcmVhdGVqcy5Tb3VuZC5yZWdpc3RlclNvdW5kcy4iKX1jYXRjaChjKXt9cmV0dXJuIHRoaXMucmVnaXN0ZXJTb3VuZHMoYSxiKX0sYy5yZW1vdmVTb3VuZD1mdW5jdGlvbihhLGQpe2lmKG51bGw9PWMuYWN0aXZlUGx1Z2luKXJldHVybiExO2EgaW5zdGFuY2VvZiBPYmplY3QmJihhPWEuc3JjKSxhPWMuX2dldFNyY0J5SWQoYSkuc3JjLG51bGwhPWQmJihhPWQrYSk7dmFyIGU9Yy5fcGFyc2VQYXRoKGEpO2lmKG51bGw9PWUpcmV0dXJuITE7YT1lLnNyYztmb3IodmFyIGYgaW4gYy5faWRIYXNoKWMuX2lkSGFzaFtmXS5zcmM9PWEmJmRlbGV0ZSBjLl9pZEhhc2hbZl07cmV0dXJuIGIucmVtb3ZlU3JjKGEpLGRlbGV0ZSBjLl9wcmVsb2FkSGFzaFthXSxjLmFjdGl2ZVBsdWdpbi5yZW1vdmVTb3VuZChhKSwhMH0sYy5yZW1vdmVTb3VuZHM9ZnVuY3Rpb24oYSxiKXt2YXIgYz1bXTthLnBhdGgmJihiP2IrPWEucGF0aDpiPWEucGF0aCk7Zm9yKHZhciBkPTAsZT1hLmxlbmd0aDtlPmQ7ZCsrKWNbZF09Y3JlYXRlanMuU291bmQucmVtb3ZlU291bmQoYVtkXS5zcmMsYik7cmV0dXJuIGN9LGMucmVtb3ZlTWFuaWZlc3Q9ZnVuY3Rpb24oYSxiKXt0cnl7Y29uc29sZS5sb2coImNyZWF0ZWpzLlNvdW5kLnJlbW92ZU1hbmlmZXN0IGlzIGRlcHJlY2F0ZWQsIHBsZWFzZSB1c2UgY3JlYXRlanMuU291bmQucmVtb3ZlU291bmRzLiIpfWNhdGNoKGQpe31yZXR1cm4gYy5yZW1vdmVTb3VuZHMoYSxiKX0sYy5yZW1vdmVBbGxTb3VuZHM9ZnVuY3Rpb24oKXtjLl9pZEhhc2g9e30sYy5fcHJlbG9hZEhhc2g9e30sYi5yZW1vdmVBbGwoKSxjLmFjdGl2ZVBsdWdpbiYmYy5hY3RpdmVQbHVnaW4ucmVtb3ZlQWxsU291bmRzKCl9LGMubG9hZENvbXBsZXRlPWZ1bmN0aW9uKGEpe2lmKCFjLmlzUmVhZHkoKSlyZXR1cm4hMTt2YXIgYj1jLl9wYXJzZVBhdGgoYSk7cmV0dXJuIGE9Yj9jLl9nZXRTcmNCeUlkKGIuc3JjKS5zcmM6Yy5fZ2V0U3JjQnlJZChhKS5zcmMsMT09Yy5fcHJlbG9hZEhhc2hbYV1bMF19LGMuX3BhcnNlUGF0aD1mdW5jdGlvbihhKXsic3RyaW5nIiE9dHlwZW9mIGEmJihhPWEudG9TdHJpbmcoKSk7dmFyIGI9YS5tYXRjaChjLkZJTEVfUEFUVEVSTik7aWYobnVsbD09YilyZXR1cm4hMTtmb3IodmFyIGQ9Yls0XSxlPWJbNV0sZj1jLmdldENhcGFiaWxpdGllcygpLGc9MDshZltlXTspaWYoZT1jLmFsdGVybmF0ZUV4dGVuc2lvbnNbZysrXSxnPmMuYWx0ZXJuYXRlRXh0ZW5zaW9ucy5sZW5ndGgpcmV0dXJuIG51bGw7YT1hLnJlcGxhY2UoIi4iK2JbNV0sIi4iK2UpO3ZhciBoPXtuYW1lOmQsc3JjOmEsZXh0ZW5zaW9uOmV9O3JldHVybiBofSxjLnBsYXk9ZnVuY3Rpb24oYSxiLGQsZSxmLGcsaCxpLGope2IgaW5zdGFuY2VvZiBPYmplY3QmJihkPWIuZGVsYXksZT1iLm9mZnNldCxmPWIubG9vcCxnPWIudm9sdW1lLGg9Yi5wYW4saT1iLnN0YXJ0VGltZSxqPWIuZHVyYXRpb24sYj1iLmludGVycnVwdCk7dmFyIGs9Yy5jcmVhdGVJbnN0YW5jZShhLGksaiksbD1jLl9wbGF5SW5zdGFuY2UoayxiLGQsZSxmLGcsaCk7cmV0dXJuIGx8fGsuX3BsYXlGYWlsZWQoKSxrfSxjLmNyZWF0ZUluc3RhbmNlPWZ1bmN0aW9uKGEsZCxlKXtpZighYy5pbml0aWFsaXplRGVmYXVsdFBsdWdpbnMoKSlyZXR1cm4gbmV3IGNyZWF0ZWpzLkRlZmF1bHRTb3VuZEluc3RhbmNlKGEsZCxlKTthPWMuX2dldFNyY0J5SWQoYSk7dmFyIGY9Yy5fcGFyc2VQYXRoKGEuc3JjKSxnPW51bGw7cmV0dXJuIG51bGwhPWYmJm51bGwhPWYuc3JjPyhiLmNyZWF0ZShmLnNyYyksbnVsbD09ZCYmKGQ9YS5zdGFydFRpbWUpLGc9Yy5hY3RpdmVQbHVnaW4uY3JlYXRlKGYuc3JjLGQsZXx8YS5kdXJhdGlvbikpOmc9bmV3IGNyZWF0ZWpzLkRlZmF1bHRTb3VuZEluc3RhbmNlKGEsZCxlKSxnLnVuaXF1ZUlkPWMuX2xhc3RJRCsrLGd9LGMuc2V0Vm9sdW1lPWZ1bmN0aW9uKGEpe2lmKG51bGw9PU51bWJlcihhKSlyZXR1cm4hMTtpZihhPU1hdGgubWF4KDAsTWF0aC5taW4oMSxhKSksYy5fbWFzdGVyVm9sdW1lPWEsIXRoaXMuYWN0aXZlUGx1Z2lufHwhdGhpcy5hY3RpdmVQbHVnaW4uc2V0Vm9sdW1lfHwhdGhpcy5hY3RpdmVQbHVnaW4uc2V0Vm9sdW1lKGEpKWZvcih2YXIgYj10aGlzLl9pbnN0YW5jZXMsZD0wLGU9Yi5sZW5ndGg7ZT5kO2QrKyliW2RdLnNldE1hc3RlclZvbHVtZShhKX0sYy5nZXRWb2x1bWU9ZnVuY3Rpb24oKXtyZXR1cm4gYy5fbWFzdGVyVm9sdW1lfSxjLnNldE11dGU9ZnVuY3Rpb24oYSl7aWYobnVsbD09YSlyZXR1cm4hMTtpZih0aGlzLl9tYXN0ZXJNdXRlPWEsIXRoaXMuYWN0aXZlUGx1Z2lufHwhdGhpcy5hY3RpdmVQbHVnaW4uc2V0TXV0ZXx8IXRoaXMuYWN0aXZlUGx1Z2luLnNldE11dGUoYSkpZm9yKHZhciBiPXRoaXMuX2luc3RhbmNlcyxjPTAsZD1iLmxlbmd0aDtkPmM7YysrKWJbY10uc2V0TWFzdGVyTXV0ZShhKTtyZXR1cm4hMH0sYy5nZXRNdXRlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX21hc3Rlck11dGV9LGMuc3RvcD1mdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLl9pbnN0YW5jZXMsYj1hLmxlbmd0aDtiLS07KWFbYl0uc3RvcCgpfSxjLl9wbGF5SW5zdGFuY2U9ZnVuY3Rpb24oYSxiLGQsZSxmLGcsaCl7aWYoYiBpbnN0YW5jZW9mIE9iamVjdCYmKGQ9Yi5kZWxheSxlPWIub2Zmc2V0LGY9Yi5sb29wLGc9Yi52b2x1bWUsaD1iLnBhbixiPWIuaW50ZXJydXB0KSxiPWJ8fGMuZGVmYXVsdEludGVycnVwdEJlaGF2aW9yLG51bGw9PWQmJihkPTApLG51bGw9PWUmJihlPWEuZ2V0UG9zaXRpb24oKSksbnVsbD09ZiYmKGY9YS5sb29wKSxudWxsPT1nJiYoZz1hLnZvbHVtZSksbnVsbD09aCYmKGg9YS5wYW4pLDA9PWQpe3ZhciBpPWMuX2JlZ2luUGxheWluZyhhLGIsZSxmLGcsaCk7aWYoIWkpcmV0dXJuITF9ZWxzZXt2YXIgaj1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Yy5fYmVnaW5QbGF5aW5nKGEsYixlLGYsZyxoKX0sZCk7YS5kZWxheVRpbWVvdXRJZD1qfXJldHVybiB0aGlzLl9pbnN0YW5jZXMucHVzaChhKSwhMH0sYy5fYmVnaW5QbGF5aW5nPWZ1bmN0aW9uKGEsYyxkLGUsZixnKXtpZighYi5hZGQoYSxjKSlyZXR1cm4hMTt2YXIgaD1hLl9iZWdpblBsYXlpbmcoZCxlLGYsZyk7aWYoIWgpe3ZhciBpPWNyZWF0ZWpzLmluZGV4T2YodGhpcy5faW5zdGFuY2VzLGEpO3JldHVybiBpPi0xJiZ0aGlzLl9pbnN0YW5jZXMuc3BsaWNlKGksMSksITF9cmV0dXJuITB9LGMuX2dldFNyY0J5SWQ9ZnVuY3Rpb24oYSl7cmV0dXJuIGMuX2lkSGFzaFthXXx8e3NyYzphfX0sYy5fcGxheUZpbmlzaGVkPWZ1bmN0aW9uKGEpe2IucmVtb3ZlKGEpO3ZhciBjPWNyZWF0ZWpzLmluZGV4T2YodGhpcy5faW5zdGFuY2VzLGEpO2M+LTEmJnRoaXMuX2luc3RhbmNlcy5zcGxpY2UoYywxKX0sY3JlYXRlanMuU291bmQ9YSxiLmNoYW5uZWxzPXt9LGIuY3JlYXRlPWZ1bmN0aW9uKGEsYyl7dmFyIGQ9Yi5nZXQoYSk7cmV0dXJuIG51bGw9PWQ/KGIuY2hhbm5lbHNbYV09bmV3IGIoYSxjKSwhMCk6ITF9LGIucmVtb3ZlU3JjPWZ1bmN0aW9uKGEpe3ZhciBjPWIuZ2V0KGEpO3JldHVybiBudWxsPT1jPyExOihjLl9yZW1vdmVBbGwoKSxkZWxldGUgYi5jaGFubmVsc1thXSwhMCl9LGIucmVtb3ZlQWxsPWZ1bmN0aW9uKCl7Zm9yKHZhciBhIGluIGIuY2hhbm5lbHMpYi5jaGFubmVsc1thXS5fcmVtb3ZlQWxsKCk7Yi5jaGFubmVscz17fX0sYi5hZGQ9ZnVuY3Rpb24oYSxjKXt2YXIgZD1iLmdldChhLnNyYyk7cmV0dXJuIG51bGw9PWQ/ITE6ZC5fYWRkKGEsYyl9LGIucmVtb3ZlPWZ1bmN0aW9uKGEpe3ZhciBjPWIuZ2V0KGEuc3JjKTtyZXR1cm4gbnVsbD09Yz8hMTooYy5fcmVtb3ZlKGEpLCEwKX0sYi5tYXhQZXJDaGFubmVsPWZ1bmN0aW9uKCl7cmV0dXJuIGQubWF4RGVmYXVsdH0sYi5nZXQ9ZnVuY3Rpb24oYSl7cmV0dXJuIGIuY2hhbm5lbHNbYV19O3ZhciBkPWIucHJvdG90eXBlO2QuY29uc3RydWN0b3I9YixkLnNyYz1udWxsLGQubWF4PW51bGwsZC5tYXhEZWZhdWx0PTEwMCxkLmxlbmd0aD0wLGQuaW5pdD1mdW5jdGlvbihhLGIpe3RoaXMuc3JjPWEsdGhpcy5tYXg9Ynx8dGhpcy5tYXhEZWZhdWx0LC0xPT10aGlzLm1heCYmKHRoaXMubWF4PXRoaXMubWF4RGVmYXVsdCksdGhpcy5faW5zdGFuY2VzPVtdfSxkLl9nZXQ9ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuX2luc3RhbmNlc1thXX0sZC5fYWRkPWZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMuX2dldFNsb3QoYixhKT8odGhpcy5faW5zdGFuY2VzLnB1c2goYSksdGhpcy5sZW5ndGgrKywhMCk6ITF9LGQuX3JlbW92ZT1mdW5jdGlvbihhKXt2YXIgYj1jcmVhdGVqcy5pbmRleE9mKHRoaXMuX2luc3RhbmNlcyxhKTtyZXR1cm4tMT09Yj8hMToodGhpcy5faW5zdGFuY2VzLnNwbGljZShiLDEpLHRoaXMubGVuZ3RoLS0sITApfSxkLl9yZW1vdmVBbGw9ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5sZW5ndGgtMTthPj0wO2EtLSl0aGlzLl9pbnN0YW5jZXNbYV0uc3RvcCgpfSxkLl9nZXRTbG90PWZ1bmN0aW9uKGIpe3ZhciBjLGQ7aWYoYiE9YS5JTlRFUlJVUFRfTk9ORSYmKGQ9dGhpcy5fZ2V0KDApLG51bGw9PWQpKXJldHVybiEwO2Zvcih2YXIgZT0wLGY9dGhpcy5tYXg7Zj5lO2UrKyl7aWYoYz10aGlzLl9nZXQoZSksbnVsbD09YylyZXR1cm4hMDtpZihjLnBsYXlTdGF0ZT09YS5QTEFZX0ZJTklTSEVEfHxjLnBsYXlTdGF0ZT09YS5QTEFZX0lOVEVSUlVQVEVEfHxjLnBsYXlTdGF0ZT09YS5QTEFZX0ZBSUxFRCl7ZD1jO2JyZWFrfWIhPWEuSU5URVJSVVBUX05PTkUmJihiPT1hLklOVEVSUlVQVF9FQVJMWSYmYy5nZXRQb3NpdGlvbigpPGQuZ2V0UG9zaXRpb24oKXx8Yj09YS5JTlRFUlJVUFRfTEFURSYmYy5nZXRQb3NpdGlvbigpPmQuZ2V0UG9zaXRpb24oKSkmJihkPWMpfXJldHVybiBudWxsIT1kPyhkLl9pbnRlcnJ1cHQoKSx0aGlzLl9yZW1vdmUoZCksITApOiExfSxkLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIltTb3VuZCBTb3VuZENoYW5uZWxdIn19KCksdGhpcy5jcmVhdGVqcz10aGlzLmNyZWF0ZWpzfHx7fSxmdW5jdGlvbigpeyJ1c2Ugc3RyaWN0Ijt2YXIgYT1mdW5jdGlvbihhLGIsYyxkKXt0aGlzLkV2ZW50RGlzcGF0Y2hlcl9jb25zdHJ1Y3RvcigpLHRoaXMuc3JjPWEsdGhpcy51bmlxdWVJZD0tMSx0aGlzLnBsYXlTdGF0ZT1udWxsLHRoaXMuZGVsYXlUaW1lb3V0SWQ9bnVsbCx0aGlzLl9zdGFydFRpbWU9TWF0aC5tYXgoMCxifHwwKSx0aGlzLl92b2x1bWU9MSxjcmVhdGVqcy5kZWZpbmVQcm9wZXJ0eVN1cHBvcnRlZCYmT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsInZvbHVtZSIse2dldDp0aGlzLmdldFZvbHVtZSxzZXQ6dGhpcy5zZXRWb2x1bWV9KSx0aGlzLl9wYW49MCxjcmVhdGVqcy5kZWZpbmVQcm9wZXJ0eVN1cHBvcnRlZCYmT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsInBhbiIse2dldDp0aGlzLmdldFBhbixzZXQ6dGhpcy5zZXRQYW59KSx0aGlzLl9kdXJhdGlvbj1NYXRoLm1heCgwLGN8fDApLGNyZWF0ZWpzLmRlZmluZVByb3BlcnR5U3VwcG9ydGVkJiZPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiZHVyYXRpb24iLHtnZXQ6dGhpcy5nZXREdXJhdGlvbixzZXQ6dGhpcy5zZXREdXJhdGlvbn0pLHRoaXMuX3BsYXliYWNrUmVzb3VyY2U9bnVsbCxjcmVhdGVqcy5kZWZpbmVQcm9wZXJ0eVN1cHBvcnRlZCYmT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsInBsYXliYWNrUmVzb3VyY2UiLHtnZXQ6dGhpcy5nZXRQbGF5YmFja1Jlc291cmNlLHNldDp0aGlzLnNldFBsYXliYWNrUmVzb3VyY2V9KSxkIT09ITEmJmQhPT0hMCYmdGhpcy5zZXRQbGF5YmFja1Jlc291cmNlKGQpLHRoaXMuX3Bvc2l0aW9uPTAsY3JlYXRlanMuZGVmaW5lUHJvcGVydHlTdXBwb3J0ZWQmJk9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJwb3NpdGlvbiIse2dldDp0aGlzLmdldFBvc2l0aW9uLHNldDp0aGlzLnNldFBvc2l0aW9ufSksdGhpcy5fbG9vcD0wLGNyZWF0ZWpzLmRlZmluZVByb3BlcnR5U3VwcG9ydGVkJiZPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywibG9vcCIse2dldDp0aGlzLmdldExvb3Asc2V0OnRoaXMuc2V0TG9vcH0pLHRoaXMuX211dGVkPSExLGNyZWF0ZWpzLmRlZmluZVByb3BlcnR5U3VwcG9ydGVkJiZPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywibXV0ZWQiLHtnZXQ6dGhpcy5nZXRNdXRlZCxzZXQ6dGhpcy5zZXRNdXRlZH0pLHRoaXMuX3BhdXNlZD0hMSxjcmVhdGVqcy5kZWZpbmVQcm9wZXJ0eVN1cHBvcnRlZCYmT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsInBhdXNlZCIse2dldDp0aGlzLmdldFBhdXNlZCxzZXQ6dGhpcy5zZXRQYXVzZWR9KQp9LGI9Y3JlYXRlanMuZXh0ZW5kKGEsY3JlYXRlanMuRXZlbnREaXNwYXRjaGVyKTtiLnBsYXk9ZnVuY3Rpb24oYSxiLGMsZCxlLGYpe3JldHVybiB0aGlzLnBsYXlTdGF0ZT09Y3JlYXRlanMuU291bmQuUExBWV9TVUNDRUVERUQ/KGEgaW5zdGFuY2VvZiBPYmplY3QmJihjPWEub2Zmc2V0LGQ9YS5sb29wLGU9YS52b2x1bWUsZj1hLnBhbiksbnVsbCE9YyYmdGhpcy5zZXRQb3NpdGlvbihjKSxudWxsIT1kJiZ0aGlzLnNldExvb3AoZCksbnVsbCE9ZSYmdGhpcy5zZXRWb2x1bWUoZSksbnVsbCE9ZiYmdGhpcy5zZXRQYW4oZiksdm9pZCh0aGlzLl9wYXVzZWQmJnRoaXMuc2V0UGF1c2VkKCExKSkpOih0aGlzLl9jbGVhblVwKCksY3JlYXRlanMuU291bmQuX3BsYXlJbnN0YW5jZSh0aGlzLGEsYixjLGQsZSxmKSx0aGlzKX0sYi5wYXVzZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9wYXVzZWR8fHRoaXMucGxheVN0YXRlIT1jcmVhdGVqcy5Tb3VuZC5QTEFZX1NVQ0NFRURFRD8hMToodGhpcy5zZXRQYXVzZWQoITApLCEwKX0sYi5yZXN1bWU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcGF1c2VkPyh0aGlzLnNldFBhdXNlZCghMSksITApOiExfSxiLnN0b3A9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcG9zaXRpb249MCx0aGlzLl9wYXVzZWQ9ITEsdGhpcy5faGFuZGxlU3RvcCgpLHRoaXMuX2NsZWFuVXAoKSx0aGlzLnBsYXlTdGF0ZT1jcmVhdGVqcy5Tb3VuZC5QTEFZX0ZJTklTSEVELHRoaXN9LGIuZGVzdHJveT1mdW5jdGlvbigpe3RoaXMuX2NsZWFuVXAoKSx0aGlzLnNyYz1udWxsLHRoaXMucGxheWJhY2tSZXNvdXJjZT1udWxsLHRoaXMucmVtb3ZlQWxsRXZlbnRMaXN0ZW5lcnMoKX0sYi50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiJbQWJzdHJhY3RTb3VuZEluc3RhbmNlXSJ9LGIuZ2V0UGF1c2VkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3BhdXNlZH0sYi5zZXRQYXVzZWQ9ZnVuY3Rpb24oYSl7cmV0dXJuIGEhPT0hMCYmYSE9PSExfHx0aGlzLl9wYXVzZWQ9PWF8fDE9PWEmJnRoaXMucGxheVN0YXRlIT1jcmVhdGVqcy5Tb3VuZC5QTEFZX1NVQ0NFRURFRD92b2lkIDA6KHRoaXMuX3BhdXNlZD1hLGE/dGhpcy5fcGF1c2UoKTp0aGlzLl9yZXN1bWUoKSxjbGVhclRpbWVvdXQodGhpcy5kZWxheVRpbWVvdXRJZCksdGhpcyl9LGIuc2V0Vm9sdW1lPWZ1bmN0aW9uKGEpe3JldHVybiBhPT10aGlzLl92b2x1bWU/dGhpczoodGhpcy5fdm9sdW1lPU1hdGgubWF4KDAsTWF0aC5taW4oMSxhKSksdGhpcy5fbXV0ZWR8fHRoaXMuX3VwZGF0ZVZvbHVtZSgpLHRoaXMpfSxiLmdldFZvbHVtZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl92b2x1bWV9LGIuc2V0TXV0ZT1mdW5jdGlvbihhKXt0aGlzLnNldE11dGVkKGEpfSxiLmdldE11dGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbXV0ZWR9LGIuc2V0TXV0ZWQ9ZnVuY3Rpb24oYSl7cmV0dXJuIGE9PT0hMHx8YT09PSExPyh0aGlzLl9tdXRlZD1hLHRoaXMuX3VwZGF0ZVZvbHVtZSgpLHRoaXMpOnZvaWQgMH0sYi5nZXRNdXRlZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9tdXRlZH0sYi5zZXRQYW49ZnVuY3Rpb24oYSl7cmV0dXJuIGE9PXRoaXMuX3Bhbj90aGlzOih0aGlzLl9wYW49TWF0aC5tYXgoLTEsTWF0aC5taW4oMSxhKSksdGhpcy5fdXBkYXRlUGFuKCksdGhpcyl9LGIuZ2V0UGFuPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3Bhbn0sYi5nZXRQb3NpdGlvbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9wYXVzZWR8fHRoaXMucGxheVN0YXRlIT1jcmVhdGVqcy5Tb3VuZC5QTEFZX1NVQ0NFRURFRD90aGlzLl9wb3NpdGlvbjp0aGlzLl9jYWxjdWxhdGVDdXJyZW50UG9zaXRpb24oKX0sYi5zZXRQb3NpdGlvbj1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5fcG9zaXRpb249TWF0aC5tYXgoMCxhKSx0aGlzLnBsYXlTdGF0ZT09Y3JlYXRlanMuU291bmQuUExBWV9TVUNDRUVERUQmJnRoaXMuX3VwZGF0ZVBvc2l0aW9uKCksdGhpc30sYi5nZXREdXJhdGlvbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9kdXJhdGlvbn0sYi5zZXREdXJhdGlvbj1mdW5jdGlvbihhKXtyZXR1cm4gYT09dGhpcy5fZHVyYXRpb24/dGhpczoodGhpcy5fZHVyYXRpb249TWF0aC5tYXgoMCxhfHwwKSx0aGlzLl91cGRhdGVEdXJhdGlvbigpLHRoaXMpfSxiLnNldFBsYXliYWNrUmVzb3VyY2U9ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuX3BsYXliYWNrUmVzb3VyY2U9YSwwPT10aGlzLl9kdXJhdGlvbiYmdGhpcy5fc2V0RHVyYXRpb25Gcm9tU291cmNlKCksdGhpc30sYi5nZXRQbGF5YmFja1Jlc291cmNlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3BsYXliYWNrUmVzb3VyY2V9LGIuZ2V0TG9vcD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9sb29wfSxiLnNldExvb3A9ZnVuY3Rpb24oYSl7bnVsbCE9dGhpcy5fcGxheWJhY2tSZXNvdXJjZSYmKDAhPXRoaXMuX2xvb3AmJjA9PWEmJnRoaXMuX3JlbW92ZUxvb3BpbmcoYSksMD09dGhpcy5fbG9vcCYmMCE9YSYmdGhpcy5fYWRkTG9vcGluZyhhKSksdGhpcy5fbG9vcD1hfSxiLl9zZW5kRXZlbnQ9ZnVuY3Rpb24oYSl7dmFyIGI9bmV3IGNyZWF0ZWpzLkV2ZW50KGEpO3RoaXMuZGlzcGF0Y2hFdmVudChiKX0sYi5fY2xlYW5VcD1mdW5jdGlvbigpe2NsZWFyVGltZW91dCh0aGlzLmRlbGF5VGltZW91dElkKSx0aGlzLl9oYW5kbGVDbGVhblVwKCksdGhpcy5fcGF1c2VkPSExLGNyZWF0ZWpzLlNvdW5kLl9wbGF5RmluaXNoZWQodGhpcyl9LGIuX2ludGVycnVwdD1mdW5jdGlvbigpe3RoaXMuX2NsZWFuVXAoKSx0aGlzLnBsYXlTdGF0ZT1jcmVhdGVqcy5Tb3VuZC5QTEFZX0lOVEVSUlVQVEVELHRoaXMuX3NlbmRFdmVudCgiaW50ZXJydXB0ZWQiKX0sYi5fYmVnaW5QbGF5aW5nPWZ1bmN0aW9uKGEsYixjLGQpe3JldHVybiB0aGlzLnNldFBvc2l0aW9uKGEpLHRoaXMuc2V0TG9vcChiKSx0aGlzLnNldFZvbHVtZShjKSx0aGlzLnNldFBhbihkKSxudWxsIT10aGlzLl9wbGF5YmFja1Jlc291cmNlJiZ0aGlzLl9wb3NpdGlvbjx0aGlzLl9kdXJhdGlvbj8odGhpcy5fcGF1c2VkPSExLHRoaXMuX2hhbmRsZVNvdW5kUmVhZHkoKSx0aGlzLnBsYXlTdGF0ZT1jcmVhdGVqcy5Tb3VuZC5QTEFZX1NVQ0NFRURFRCx0aGlzLl9zZW5kRXZlbnQoInN1Y2NlZWRlZCIpLCEwKToodGhpcy5fcGxheUZhaWxlZCgpLCExKX0sYi5fcGxheUZhaWxlZD1mdW5jdGlvbigpe3RoaXMuX2NsZWFuVXAoKSx0aGlzLnBsYXlTdGF0ZT1jcmVhdGVqcy5Tb3VuZC5QTEFZX0ZBSUxFRCx0aGlzLl9zZW5kRXZlbnQoImZhaWxlZCIpfSxiLl9oYW5kbGVTb3VuZENvbXBsZXRlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3Bvc2l0aW9uPTAsMCE9dGhpcy5fbG9vcD8odGhpcy5fbG9vcC0tLHRoaXMuX2hhbmRsZUxvb3AoKSx2b2lkIHRoaXMuX3NlbmRFdmVudCgibG9vcCIpKToodGhpcy5fY2xlYW5VcCgpLHRoaXMucGxheVN0YXRlPWNyZWF0ZWpzLlNvdW5kLlBMQVlfRklOSVNIRUQsdm9pZCB0aGlzLl9zZW5kRXZlbnQoImNvbXBsZXRlIikpfSxiLl9oYW5kbGVTb3VuZFJlYWR5PWZ1bmN0aW9uKCl7fSxiLl91cGRhdGVWb2x1bWU9ZnVuY3Rpb24oKXt9LGIuX3VwZGF0ZVBhbj1mdW5jdGlvbigpe30sYi5fdXBkYXRlRHVyYXRpb249ZnVuY3Rpb24oKXt9LGIuX3NldER1cmF0aW9uRnJvbVNvdXJjZT1mdW5jdGlvbigpe30sYi5fY2FsY3VsYXRlQ3VycmVudFBvc2l0aW9uPWZ1bmN0aW9uKCl7fSxiLl91cGRhdGVQb3NpdGlvbj1mdW5jdGlvbigpe30sYi5fcmVtb3ZlTG9vcGluZz1mdW5jdGlvbigpe30sYi5fYWRkTG9vcGluZz1mdW5jdGlvbigpe30sYi5fcGF1c2U9ZnVuY3Rpb24oKXt9LGIuX3Jlc3VtZT1mdW5jdGlvbigpe30sYi5faGFuZGxlU3RvcD1mdW5jdGlvbigpe30sYi5faGFuZGxlQ2xlYW5VcD1mdW5jdGlvbigpe30sYi5faGFuZGxlTG9vcD1mdW5jdGlvbigpe30sY3JlYXRlanMuQWJzdHJhY3RTb3VuZEluc3RhbmNlPWNyZWF0ZWpzLnByb21vdGUoYSwiRXZlbnREaXNwYXRjaGVyIiksY3JlYXRlanMuRGVmYXVsdFNvdW5kSW5zdGFuY2U9Y3JlYXRlanMuQWJzdHJhY3RTb3VuZEluc3RhbmNlfSgpLHRoaXMuY3JlYXRlanM9dGhpcy5jcmVhdGVqc3x8e30sZnVuY3Rpb24oKXsidXNlIHN0cmljdCI7dmFyIGE9ZnVuY3Rpb24oKXt0aGlzLl9jYXBhYmlsaXRpZXM9bnVsbCx0aGlzLl9sb2FkZXJzPXt9LHRoaXMuX2F1ZGlvU291cmNlcz17fSx0aGlzLl9zb3VuZEluc3RhbmNlcz17fSx0aGlzLl9sb2FkZXJDbGFzcyx0aGlzLl9zb3VuZEluc3RhbmNlQ2xhc3N9LGI9YS5wcm90b3R5cGU7YS5fY2FwYWJpbGl0aWVzPW51bGwsYS5pc1N1cHBvcnRlZD1mdW5jdGlvbigpe3JldHVybiEwfSxiLnJlZ2lzdGVyPWZ1bmN0aW9uKGEpe2lmKHRoaXMuX2F1ZGlvU291cmNlc1thLnNyY109ITAsdGhpcy5fc291bmRJbnN0YW5jZXNbYS5zcmNdPVtdLHRoaXMuX2xvYWRlcnNbYS5zcmNdKXJldHVybiB0aGlzLl9sb2FkZXJzW2Euc3JjXTt2YXIgYj1uZXcgdGhpcy5fbG9hZGVyQ2xhc3MoYSk7cmV0dXJuIGIub24oImNvbXBsZXRlIixjcmVhdGVqcy5wcm94eSh0aGlzLl9oYW5kbGVQcmVsb2FkQ29tcGxldGUsdGhpcykpLHRoaXMuX2xvYWRlcnNbYS5zcmNdPWIsYn0sYi5wcmVsb2FkPWZ1bmN0aW9uKGEpe2Eub24oImVycm9yIixjcmVhdGVqcy5wcm94eSh0aGlzLl9oYW5kbGVQcmVsb2FkRXJyb3IsdGhpcykpLGEubG9hZCgpfSxiLmlzUHJlbG9hZFN0YXJ0ZWQ9ZnVuY3Rpb24oYSl7cmV0dXJuIG51bGwhPXRoaXMuX2F1ZGlvU291cmNlc1thXX0sYi5pc1ByZWxvYWRDb21wbGV0ZT1mdW5jdGlvbihhKXtyZXR1cm4hKG51bGw9PXRoaXMuX2F1ZGlvU291cmNlc1thXXx8MT09dGhpcy5fYXVkaW9Tb3VyY2VzW2FdKX0sYi5yZW1vdmVTb3VuZD1mdW5jdGlvbihhKXtpZih0aGlzLl9zb3VuZEluc3RhbmNlc1thXSl7Zm9yKHZhciBiPXRoaXMuX3NvdW5kSW5zdGFuY2VzW2FdLmxlbmd0aDtiLS07KXt2YXIgYz10aGlzLl9zb3VuZEluc3RhbmNlc1thXVtiXTtjLmRlc3Ryb3koKX1kZWxldGUgdGhpcy5fc291bmRJbnN0YW5jZXNbYV0sZGVsZXRlIHRoaXMuX2F1ZGlvU291cmNlc1thXSx0aGlzLl9sb2FkZXJzW2FdJiZ0aGlzLl9sb2FkZXJzW2FdLmRlc3Ryb3koKSxkZWxldGUgdGhpcy5fbG9hZGVyc1thXX19LGIucmVtb3ZlQWxsU291bmRzPWZ1bmN0aW9uKCl7Zm9yKHZhciBhIGluIHRoaXMuX2F1ZGlvU291cmNlcyl0aGlzLnJlbW92ZVNvdW5kKGEpfSxiLmNyZWF0ZT1mdW5jdGlvbihhLGIsYyl7dGhpcy5pc1ByZWxvYWRTdGFydGVkKGEpfHx0aGlzLnByZWxvYWQodGhpcy5yZWdpc3RlcihhKSk7dmFyIGQ9bmV3IHRoaXMuX3NvdW5kSW5zdGFuY2VDbGFzcyhhLGIsYyx0aGlzLl9hdWRpb1NvdXJjZXNbYV0pO3JldHVybiB0aGlzLl9zb3VuZEluc3RhbmNlc1thXS5wdXNoKGQpLGR9LGIuc2V0Vm9sdW1lPWZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLl92b2x1bWU9YSx0aGlzLl91cGRhdGVWb2x1bWUoKSwhMH0sYi5nZXRWb2x1bWU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fdm9sdW1lfSxiLnNldE11dGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fdXBkYXRlVm9sdW1lKCksITB9LGIudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4iW0Fic3RyYWN0UGx1Z2luXSJ9LGIuX2hhbmRsZVByZWxvYWRDb21wbGV0ZT1mdW5jdGlvbihhKXt2YXIgYj1hLnRhcmdldC5nZXRJdGVtKCkuc3JjO3RoaXMuX2F1ZGlvU291cmNlc1tiXT1hLnJlc3VsdDtmb3IodmFyIGM9MCxkPXRoaXMuX3NvdW5kSW5zdGFuY2VzW2JdLmxlbmd0aDtkPmM7YysrKXt2YXIgZT10aGlzLl9zb3VuZEluc3RhbmNlc1tiXVtjXTtlLnNldFBsYXliYWNrUmVzb3VyY2UodGhpcy5fYXVkaW9Tb3VyY2VzW2JdKX19LGIuX2hhbmRsZVByZWxvYWRFcnJvcj1mdW5jdGlvbigpe30sYi5fdXBkYXRlVm9sdW1lPWZ1bmN0aW9uKCl7fSxjcmVhdGVqcy5BYnN0cmFjdFBsdWdpbj1hfSgpLHRoaXMuY3JlYXRlanM9dGhpcy5jcmVhdGVqc3x8e30sZnVuY3Rpb24oKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gYShhKXt0aGlzLkFic3RyYWN0TG9hZGVyX2NvbnN0cnVjdG9yKGEsITAsY3JlYXRlanMuQWJzdHJhY3RMb2FkZXIuU09VTkQpfXZhciBiPWNyZWF0ZWpzLmV4dGVuZChhLGNyZWF0ZWpzLkFic3RyYWN0TG9hZGVyKTthLmNvbnRleHQ9bnVsbCxiLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIltXZWJBdWRpb0xvYWRlcl0ifSxiLl9jcmVhdGVSZXF1ZXN0PWZ1bmN0aW9uKCl7dGhpcy5fcmVxdWVzdD1uZXcgY3JlYXRlanMuWEhSUmVxdWVzdCh0aGlzLl9pdGVtLCExKSx0aGlzLl9yZXF1ZXN0LnNldFJlc3BvbnNlVHlwZSgiYXJyYXlidWZmZXIiKX0sYi5fc2VuZENvbXBsZXRlPWZ1bmN0aW9uKCl7YS5jb250ZXh0LmRlY29kZUF1ZGlvRGF0YSh0aGlzLl9yYXdSZXN1bHQsY3JlYXRlanMucHJveHkodGhpcy5faGFuZGxlQXVkaW9EZWNvZGVkLHRoaXMpLGNyZWF0ZWpzLnByb3h5KHRoaXMuX2hhbmRsZUVycm9yLHRoaXMpKX0sYi5faGFuZGxlQXVkaW9EZWNvZGVkPWZ1bmN0aW9uKGEpe3RoaXMuX3Jlc3VsdD1hLHRoaXMuQWJzdHJhY3RMb2FkZXJfX3NlbmRDb21wbGV0ZSgpfSxjcmVhdGVqcy5XZWJBdWRpb0xvYWRlcj1jcmVhdGVqcy5wcm9tb3RlKGEsIkFic3RyYWN0TG9hZGVyIil9KCksdGhpcy5jcmVhdGVqcz10aGlzLmNyZWF0ZWpzfHx7fSxmdW5jdGlvbigpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBhKGEsYixkLGUpe3RoaXMuQWJzdHJhY3RTb3VuZEluc3RhbmNlX2NvbnN0cnVjdG9yKGEsYixkLGUpLHRoaXMuZ2Fpbk5vZGU9Yy5jb250ZXh0LmNyZWF0ZUdhaW4oKSx0aGlzLnBhbk5vZGU9Yy5jb250ZXh0LmNyZWF0ZVBhbm5lcigpLHRoaXMucGFuTm9kZS5wYW5uaW5nTW9kZWw9Yy5fcGFubmluZ01vZGVsLHRoaXMucGFuTm9kZS5jb25uZWN0KHRoaXMuZ2Fpbk5vZGUpLHRoaXMuc291cmNlTm9kZT1udWxsLHRoaXMuX3NvdW5kQ29tcGxldGVUaW1lb3V0PW51bGwsdGhpcy5fc291cmNlTm9kZU5leHQ9bnVsbCx0aGlzLl9wbGF5YmFja1N0YXJ0VGltZT0wLHRoaXMuX2VuZGVkSGFuZGxlcj1jcmVhdGVqcy5wcm94eSh0aGlzLl9oYW5kbGVTb3VuZENvbXBsZXRlLHRoaXMpfXZhciBiPWNyZWF0ZWpzLmV4dGVuZChhLGNyZWF0ZWpzLkFic3RyYWN0U291bmRJbnN0YW5jZSksYz1hO2MuY29udGV4dD1udWxsLGMuZGVzdGluYXRpb25Ob2RlPW51bGwsYy5fcGFubmluZ01vZGVsPSJlcXVhbHBvd2VyIixiLmRlc3Ryb3k9ZnVuY3Rpb24oKXt0aGlzLkFic3RyYWN0U291bmRJbnN0YW5jZV9kZXN0cm95KCksdGhpcy5wYW5Ob2RlLmRpc2Nvbm5lY3QoMCksdGhpcy5wYW5Ob2RlPW51bGwsdGhpcy5nYWluTm9kZS5kaXNjb25uZWN0KDApLHRoaXMuZ2Fpbk5vZGU9bnVsbH0sYi50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiJbV2ViQXVkaW9Tb3VuZEluc3RhbmNlXSJ9LGIuX3VwZGF0ZVBhbj1mdW5jdGlvbigpe3RoaXMucGFuTm9kZS5zZXRQb3NpdGlvbih0aGlzLl9wYW4sMCwtLjUpfSxiLl9yZW1vdmVMb29waW5nPWZ1bmN0aW9uKCl7dGhpcy5fc291cmNlTm9kZU5leHQ9dGhpcy5fY2xlYW5VcEF1ZGlvTm9kZSh0aGlzLl9zb3VyY2VOb2RlTmV4dCl9LGIuX2FkZExvb3Bpbmc9ZnVuY3Rpb24oKXt0aGlzLnBsYXlTdGF0ZT09Y3JlYXRlanMuU291bmQuUExBWV9TVUNDRUVERUQmJih0aGlzLl9zb3VyY2VOb2RlTmV4dD10aGlzLl9jcmVhdGVBbmRQbGF5QXVkaW9Ob2RlKHRoaXMuX3BsYXliYWNrU3RhcnRUaW1lLDApKX0sYi5fc2V0RHVyYXRpb25Gcm9tU291cmNlPWZ1bmN0aW9uKCl7dGhpcy5fZHVyYXRpb249MWUzKnRoaXMucGxheWJhY2tSZXNvdXJjZS5kdXJhdGlvbn0sYi5faGFuZGxlQ2xlYW5VcD1mdW5jdGlvbigpe3RoaXMuc291cmNlTm9kZSYmdGhpcy5wbGF5U3RhdGU9PWNyZWF0ZWpzLlNvdW5kLlBMQVlfU1VDQ0VFREVEJiYodGhpcy5zb3VyY2VOb2RlPXRoaXMuX2NsZWFuVXBBdWRpb05vZGUodGhpcy5zb3VyY2VOb2RlKSx0aGlzLl9zb3VyY2VOb2RlTmV4dD10aGlzLl9jbGVhblVwQXVkaW9Ob2RlKHRoaXMuX3NvdXJjZU5vZGVOZXh0KSksMCE9dGhpcy5nYWluTm9kZS5udW1iZXJPZk91dHB1dHMmJnRoaXMuZ2Fpbk5vZGUuZGlzY29ubmVjdCgwKSxjbGVhclRpbWVvdXQodGhpcy5fc291bmRDb21wbGV0ZVRpbWVvdXQpLHRoaXMuX3BsYXliYWNrU3RhcnRUaW1lPTB9LGIuX2NsZWFuVXBBdWRpb05vZGU9ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJihhLnN0b3AoMCksYS5kaXNjb25uZWN0KDApLGE9bnVsbCksYX0sYi5faGFuZGxlU291bmRSZWFkeT1mdW5jdGlvbigpe3RoaXMuZ2Fpbk5vZGUuY29ubmVjdChjLmRlc3RpbmF0aW9uTm9kZSk7dmFyIGE9LjAwMSp0aGlzLl9kdXJhdGlvbixiPS4wMDEqdGhpcy5fcG9zaXRpb247dGhpcy5zb3VyY2VOb2RlPXRoaXMuX2NyZWF0ZUFuZFBsYXlBdWRpb05vZGUoYy5jb250ZXh0LmN1cnJlbnRUaW1lLWEsYiksdGhpcy5fcGxheWJhY2tTdGFydFRpbWU9dGhpcy5zb3VyY2VOb2RlLnN0YXJ0VGltZS1iLHRoaXMuX3NvdW5kQ29tcGxldGVUaW1lb3V0PXNldFRpbWVvdXQodGhpcy5fZW5kZWRIYW5kbGVyLDFlMyooYS1iKSksMCE9dGhpcy5fbG9vcCYmKHRoaXMuX3NvdXJjZU5vZGVOZXh0PXRoaXMuX2NyZWF0ZUFuZFBsYXlBdWRpb05vZGUodGhpcy5fcGxheWJhY2tTdGFydFRpbWUsMCkpfSxiLl9jcmVhdGVBbmRQbGF5QXVkaW9Ob2RlPWZ1bmN0aW9uKGEsYil7dmFyIGQ9Yy5jb250ZXh0LmNyZWF0ZUJ1ZmZlclNvdXJjZSgpO2QuYnVmZmVyPXRoaXMucGxheWJhY2tSZXNvdXJjZSxkLmNvbm5lY3QodGhpcy5wYW5Ob2RlKTt2YXIgZT0uMDAxKnRoaXMuX2R1cmF0aW9uO3JldHVybiBkLnN0YXJ0VGltZT1hK2UsZC5zdGFydChkLnN0YXJ0VGltZSxiKy4wMDEqdGhpcy5fc3RhcnRUaW1lLGUtYiksZH0sYi5fcGF1c2U9ZnVuY3Rpb24oKXt0aGlzLl9wb3NpdGlvbj0xZTMqKGMuY29udGV4dC5jdXJyZW50VGltZS10aGlzLl9wbGF5YmFja1N0YXJ0VGltZSksdGhpcy5zb3VyY2VOb2RlPXRoaXMuX2NsZWFuVXBBdWRpb05vZGUodGhpcy5zb3VyY2VOb2RlKSx0aGlzLl9zb3VyY2VOb2RlTmV4dD10aGlzLl9jbGVhblVwQXVkaW9Ob2RlKHRoaXMuX3NvdXJjZU5vZGVOZXh0KSwwIT10aGlzLmdhaW5Ob2RlLm51bWJlck9mT3V0cHV0cyYmdGhpcy5nYWluTm9kZS5kaXNjb25uZWN0KDApLGNsZWFyVGltZW91dCh0aGlzLl9zb3VuZENvbXBsZXRlVGltZW91dCl9LGIuX3Jlc3VtZT1mdW5jdGlvbigpe3RoaXMuX2hhbmRsZVNvdW5kUmVhZHkoKX0sYi5fdXBkYXRlVm9sdW1lPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5fbXV0ZWQ/MDp0aGlzLl92b2x1bWU7YSE9dGhpcy5nYWluTm9kZS5nYWluLnZhbHVlJiYodGhpcy5nYWluTm9kZS5nYWluLnZhbHVlPWEpfSxiLl9jYWxjdWxhdGVDdXJyZW50UG9zaXRpb249ZnVuY3Rpb24oKXtyZXR1cm4gMWUzKihjLmNvbnRleHQuY3VycmVudFRpbWUtdGhpcy5fcGxheWJhY2tTdGFydFRpbWUpfSxiLl91cGRhdGVQb3NpdGlvbj1mdW5jdGlvbigpe3RoaXMuc291cmNlTm9kZT10aGlzLl9jbGVhblVwQXVkaW9Ob2RlKHRoaXMuc291cmNlTm9kZSksdGhpcy5fc291cmNlTm9kZU5leHQ9dGhpcy5fY2xlYW5VcEF1ZGlvTm9kZSh0aGlzLl9zb3VyY2VOb2RlTmV4dCksY2xlYXJUaW1lb3V0KHRoaXMuX3NvdW5kQ29tcGxldGVUaW1lb3V0KSx0aGlzLl9wYXVzZWR8fHRoaXMuX2hhbmRsZVNvdW5kUmVhZHkoKX0sYi5faGFuZGxlTG9vcD1mdW5jdGlvbigpe3RoaXMuX2NsZWFuVXBBdWRpb05vZGUodGhpcy5zb3VyY2VOb2RlKSx0aGlzLnNvdXJjZU5vZGU9dGhpcy5fc291cmNlTm9kZU5leHQsdGhpcy5fcGxheWJhY2tTdGFydFRpbWU9dGhpcy5zb3VyY2VOb2RlLnN0YXJ0VGltZSx0aGlzLl9zb3VyY2VOb2RlTmV4dD10aGlzLl9jcmVhdGVBbmRQbGF5QXVkaW9Ob2RlKHRoaXMuX3BsYXliYWNrU3RhcnRUaW1lLDApLHRoaXMuX3NvdW5kQ29tcGxldGVUaW1lb3V0PXNldFRpbWVvdXQodGhpcy5fZW5kZWRIYW5kbGVyLHRoaXMuX2R1cmF0aW9uKX0sYi5fdXBkYXRlRHVyYXRpb249ZnVuY3Rpb24oKXt0aGlzLl9wYXVzZSgpLHRoaXMuX3Jlc3VtZSgpfSxjcmVhdGVqcy5XZWJBdWRpb1NvdW5kSW5zdGFuY2U9Y3JlYXRlanMucHJvbW90ZShhLCJBYnN0cmFjdFNvdW5kSW5zdGFuY2UiKX0oKSx0aGlzLmNyZWF0ZWpzPXRoaXMuY3JlYXRlanN8fHt9LGZ1bmN0aW9uKCl7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIGEoKXt0aGlzLkFic3RyYWN0UGx1Z2luX2NvbnN0cnVjdG9yKCksdGhpcy5fcGFubmluZ01vZGVsPWMuX3Bhbm5pbmdNb2RlbCx0aGlzLl92b2x1bWU9MSx0aGlzLmNvbnRleHQ9Yy5jb250ZXh0LHRoaXMuZHluYW1pY3NDb21wcmVzc29yTm9kZT10aGlzLmNvbnRleHQuY3JlYXRlRHluYW1pY3NDb21wcmVzc29yKCksdGhpcy5keW5hbWljc0NvbXByZXNzb3JOb2RlLmNvbm5lY3QodGhpcy5jb250ZXh0LmRlc3RpbmF0aW9uKSx0aGlzLmdhaW5Ob2RlPXRoaXMuY29udGV4dC5jcmVhdGVHYWluKCksdGhpcy5nYWluTm9kZS5jb25uZWN0KHRoaXMuZHluYW1pY3NDb21wcmVzc29yTm9kZSksY3JlYXRlanMuV2ViQXVkaW9Tb3VuZEluc3RhbmNlLmRlc3RpbmF0aW9uTm9kZT10aGlzLmdhaW5Ob2RlLHRoaXMuX2NhcGFiaWxpdGllcz1jLl9jYXBhYmlsaXRpZXMsdGhpcy5fbG9hZGVyQ2xhc3M9Y3JlYXRlanMuV2ViQXVkaW9Mb2FkZXIsdGhpcy5fc291bmRJbnN0YW5jZUNsYXNzPWNyZWF0ZWpzLldlYkF1ZGlvU291bmRJbnN0YW5jZSx0aGlzLl9hZGRQcm9wc1RvQ2xhc3NlcygpfXZhciBiPWNyZWF0ZWpzLmV4dGVuZChhLGNyZWF0ZWpzLkFic3RyYWN0UGx1Z2luKSxjPWE7Yy5fY2FwYWJpbGl0aWVzPW51bGwsYy5fcGFubmluZ01vZGVsPSJlcXVhbHBvd2VyIixjLmNvbnRleHQ9bnVsbCxjLmlzU3VwcG9ydGVkPWZ1bmN0aW9uKCl7dmFyIGE9Y3JlYXRlanMuQnJvd3NlckRldGVjdC5pc0lPU3x8Y3JlYXRlanMuQnJvd3NlckRldGVjdC5pc0FuZHJvaWR8fGNyZWF0ZWpzLkJyb3dzZXJEZXRlY3QuaXNCbGFja2JlcnJ5O3JldHVybiJmaWxlOiIhPWxvY2F0aW9uLnByb3RvY29sfHxhfHx0aGlzLl9pc0ZpbGVYSFJTdXBwb3J0ZWQoKT8oYy5fZ2VuZXJhdGVDYXBhYmlsaXRpZXMoKSxudWxsPT1jLmNvbnRleHQ/ITE6ITApOiExfSxjLnBsYXlFbXB0eVNvdW5kPWZ1bmN0aW9uKCl7dmFyIGE9Yy5jb250ZXh0LmNyZWF0ZUJ1ZmZlclNvdXJjZSgpO2EuYnVmZmVyPWMuY29udGV4dC5jcmVhdGVCdWZmZXIoMSwxLDIyMDUwKSxhLmNvbm5lY3QoYy5jb250ZXh0LmRlc3RpbmF0aW9uKSxhLnN0YXJ0KDAsMCwwKX0sYy5faXNGaWxlWEhSU3VwcG9ydGVkPWZ1bmN0aW9uKCl7dmFyIGE9ITAsYj1uZXcgWE1MSHR0cFJlcXVlc3Q7dHJ5e2Iub3BlbigiR0VUIiwiV2ViQXVkaW9QbHVnaW5UZXN0LmZhaWwiLCExKX1jYXRjaChjKXtyZXR1cm4gYT0hMX1iLm9uZXJyb3I9ZnVuY3Rpb24oKXthPSExfSxiLm9ubG9hZD1mdW5jdGlvbigpe2E9NDA0PT10aGlzLnN0YXR1c3x8MjAwPT10aGlzLnN0YXR1c3x8MD09dGhpcy5zdGF0dXMmJiIiIT10aGlzLnJlc3BvbnNlfTt0cnl7Yi5zZW5kKCl9Y2F0Y2goYyl7YT0hMX1yZXR1cm4gYX0sYy5fZ2VuZXJhdGVDYXBhYmlsaXRpZXM9ZnVuY3Rpb24oKXtpZihudWxsPT1jLl9jYXBhYmlsaXRpZXMpe3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImF1ZGlvIik7aWYobnVsbD09YS5jYW5QbGF5VHlwZSlyZXR1cm4gbnVsbDtpZihudWxsPT1jLmNvbnRleHQpaWYod2luZG93LkF1ZGlvQ29udGV4dCljLmNvbnRleHQ9bmV3IEF1ZGlvQ29udGV4dDtlbHNle2lmKCF3aW5kb3cud2Via2l0QXVkaW9Db250ZXh0KXJldHVybiBudWxsO2MuY29udGV4dD1uZXcgd2Via2l0QXVkaW9Db250ZXh0fWMuX2NvbXBhdGliaWxpdHlTZXRVcCgpLGMucGxheUVtcHR5U291bmQoKSxjLl9jYXBhYmlsaXRpZXM9e3Bhbm5pbmc6ITAsdm9sdW1lOiEwLHRyYWNrczotMX07Zm9yKHZhciBiPWNyZWF0ZWpzLlNvdW5kLlNVUFBPUlRFRF9FWFRFTlNJT05TLGQ9Y3JlYXRlanMuU291bmQuRVhURU5TSU9OX01BUCxlPTAsZj1iLmxlbmd0aDtmPmU7ZSsrKXt2YXIgZz1iW2VdLGg9ZFtnXXx8ZztjLl9jYXBhYmlsaXRpZXNbZ109Im5vIiE9YS5jYW5QbGF5VHlwZSgiYXVkaW8vIitnKSYmIiIhPWEuY2FuUGxheVR5cGUoImF1ZGlvLyIrZyl8fCJubyIhPWEuY2FuUGxheVR5cGUoImF1ZGlvLyIraCkmJiIiIT1hLmNhblBsYXlUeXBlKCJhdWRpby8iK2gpfWMuY29udGV4dC5kZXN0aW5hdGlvbi5udW1iZXJPZkNoYW5uZWxzPDImJihjLl9jYXBhYmlsaXRpZXMucGFubmluZz0hMSl9fSxjLl9jb21wYXRpYmlsaXR5U2V0VXA9ZnVuY3Rpb24oKXtpZihjLl9wYW5uaW5nTW9kZWw9ImVxdWFscG93ZXIiLCFjLmNvbnRleHQuY3JlYXRlR2Fpbil7Yy5jb250ZXh0LmNyZWF0ZUdhaW49Yy5jb250ZXh0LmNyZWF0ZUdhaW5Ob2RlO3ZhciBhPWMuY29udGV4dC5jcmVhdGVCdWZmZXJTb3VyY2UoKTthLl9fcHJvdG9fXy5zdGFydD1hLl9fcHJvdG9fXy5ub3RlR3JhaW5PbixhLl9fcHJvdG9fXy5zdG9wPWEuX19wcm90b19fLm5vdGVPZmYsYy5fcGFubmluZ01vZGVsPTB9fSxiLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIltXZWJBdWRpb1BsdWdpbl0ifSxiLl9hZGRQcm9wc1RvQ2xhc3Nlcz1mdW5jdGlvbigpe3ZhciBhPXRoaXMuX3NvdW5kSW5zdGFuY2VDbGFzczthLmNvbnRleHQ9dGhpcy5jb250ZXh0LGEuZGVzdGluYXRpb25Ob2RlPXRoaXMuZ2Fpbk5vZGUsYS5fcGFubmluZ01vZGVsPXRoaXMuX3Bhbm5pbmdNb2RlbCx0aGlzLl9sb2FkZXJDbGFzcy5jb250ZXh0PXRoaXMuY29udGV4dH0sYi5fdXBkYXRlVm9sdW1lPWZ1bmN0aW9uKCl7dmFyIGE9Y3JlYXRlanMuU291bmQuX21hc3Rlck11dGU/MDp0aGlzLl92b2x1bWU7YSE9dGhpcy5nYWluTm9kZS5nYWluLnZhbHVlJiYodGhpcy5nYWluTm9kZS5nYWluLnZhbHVlPWEpfSxjcmVhdGVqcy5XZWJBdWRpb1BsdWdpbj1jcmVhdGVqcy5wcm9tb3RlKGEsIkFic3RyYWN0UGx1Z2luIil9KCksdGhpcy5jcmVhdGVqcz10aGlzLmNyZWF0ZWpzfHx7fSxmdW5jdGlvbigpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBhKGEpe3RoaXMuc3JjPWEsdGhpcy5sZW5ndGg9MCx0aGlzLmF2YWlsYWJsZT0wLHRoaXMudGFncz1bXSx0aGlzLmR1cmF0aW9uPTB9dmFyIGI9YS5wcm90b3R5cGU7Yi5jb25zdHJ1Y3Rvcj1hO3ZhciBjPWE7Yy50YWdzPXt9LGMuZ2V0PWZ1bmN0aW9uKGIpe3ZhciBkPWMudGFnc1tiXTtyZXR1cm4gbnVsbD09ZCYmKGQ9Yy50YWdzW2JdPW5ldyBhKGIpKSxkfSxjLnJlbW92ZT1mdW5jdGlvbihhKXt2YXIgYj1jLnRhZ3NbYV07cmV0dXJuIG51bGw9PWI/ITE6KGIucmVtb3ZlQWxsKCksZGVsZXRlIGMudGFnc1thXSwhMCl9LGMuZ2V0SW5zdGFuY2U9ZnVuY3Rpb24oYSl7dmFyIGI9Yy50YWdzW2FdO3JldHVybiBudWxsPT1iP251bGw6Yi5nZXQoKX0sYy5zZXRJbnN0YW5jZT1mdW5jdGlvbihhLGIpe3ZhciBkPWMudGFnc1thXTtyZXR1cm4gbnVsbD09ZD9udWxsOmQuc2V0KGIpfSxjLmdldER1cmF0aW9uPWZ1bmN0aW9uKGEpe3ZhciBiPWMudGFnc1thXTtyZXR1cm4gbnVsbD09Yj8wOmIuZ2V0RHVyYXRpb24oKX0sYi5hZGQ9ZnVuY3Rpb24oYSl7dGhpcy50YWdzLnB1c2goYSksdGhpcy5sZW5ndGgrKyx0aGlzLmF2YWlsYWJsZSsrfSxiLnJlbW92ZUFsbD1mdW5jdGlvbigpe2Zvcih2YXIgYTt0aGlzLmxlbmd0aC0tOylhPXRoaXMudGFnc1t0aGlzLmxlbmd0aF0sYS5wYXJlbnROb2RlJiZhLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYSksZGVsZXRlIHRoaXMudGFnc1t0aGlzLmxlbmd0aF07dGhpcy5zcmM9bnVsbCx0aGlzLnRhZ3MubGVuZ3RoPTB9LGIuZ2V0PWZ1bmN0aW9uKCl7aWYoMD09dGhpcy50YWdzLmxlbmd0aClyZXR1cm4gbnVsbDt0aGlzLmF2YWlsYWJsZT10aGlzLnRhZ3MubGVuZ3RoO3ZhciBhPXRoaXMudGFncy5wb3AoKTtyZXR1cm4gbnVsbD09YS5wYXJlbnROb2RlJiZkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGEpLGF9LGIuc2V0PWZ1bmN0aW9uKGEpe3ZhciBiPWNyZWF0ZWpzLmluZGV4T2YodGhpcy50YWdzLGEpOy0xPT1iJiZ0aGlzLnRhZ3MucHVzaChhKSx0aGlzLmF2YWlsYWJsZT10aGlzLnRhZ3MubGVuZ3RofSxiLmdldER1cmF0aW9uPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZHVyYXRpb258fCh0aGlzLmR1cmF0aW9uPTFlMyp0aGlzLnRhZ3NbdGhpcy50YWdzLmxlbmd0aC0xXS5kdXJhdGlvbiksdGhpcy5kdXJhdGlvbn0sYi50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiJbSFRNTEF1ZGlvVGFnUG9vbF0ifSxjcmVhdGVqcy5IVE1MQXVkaW9UYWdQb29sPWF9KCksdGhpcy5jcmVhdGVqcz10aGlzLmNyZWF0ZWpzfHx7fSxmdW5jdGlvbigpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBhKGEsYixjLGQpe3RoaXMuQWJzdHJhY3RTb3VuZEluc3RhbmNlX2NvbnN0cnVjdG9yKGEsYixjLGQpLHRoaXMuX2F1ZGlvU3ByaXRlU3RvcFRpbWU9bnVsbCx0aGlzLl9kZWxheVRpbWVvdXRJZD1udWxsLHRoaXMuX2VuZGVkSGFuZGxlcj1jcmVhdGVqcy5wcm94eSh0aGlzLl9oYW5kbGVTb3VuZENvbXBsZXRlLHRoaXMpLHRoaXMuX3JlYWR5SGFuZGxlcj1jcmVhdGVqcy5wcm94eSh0aGlzLl9oYW5kbGVUYWdSZWFkeSx0aGlzKSx0aGlzLl9zdGFsbGVkSGFuZGxlcj1jcmVhdGVqcy5wcm94eSh0aGlzLnBsYXlGYWlsZWQsdGhpcyksdGhpcy5fYXVkaW9TcHJpdGVFbmRIYW5kbGVyPWNyZWF0ZWpzLnByb3h5KHRoaXMuX2hhbmRsZUF1ZGlvU3ByaXRlTG9vcCx0aGlzKSx0aGlzLl9sb29wSGFuZGxlcj1jcmVhdGVqcy5wcm94eSh0aGlzLl9oYW5kbGVTb3VuZENvbXBsZXRlLHRoaXMpLGM/dGhpcy5fYXVkaW9TcHJpdGVTdG9wVGltZT0uMDAxKihiK2MpOnRoaXMuX2R1cmF0aW9uPWNyZWF0ZWpzLkhUTUxBdWRpb1RhZ1Bvb2wuZ2V0RHVyYXRpb24odGhpcy5zcmMpfXZhciBiPWNyZWF0ZWpzLmV4dGVuZChhLGNyZWF0ZWpzLkFic3RyYWN0U291bmRJbnN0YW5jZSk7Yi5zZXRNYXN0ZXJWb2x1bWU9ZnVuY3Rpb24oKXt0aGlzLl91cGRhdGVWb2x1bWUoKX0sYi5zZXRNYXN0ZXJNdXRlPWZ1bmN0aW9uKCl7dGhpcy5fdXBkYXRlVm9sdW1lKCl9LGIudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4iW0hUTUxBdWRpb1NvdW5kSW5zdGFuY2VdIn0sYi5fcmVtb3ZlTG9vcGluZz1mdW5jdGlvbigpe251bGwhPXRoaXMuX3BsYXliYWNrUmVzb3VyY2UmJih0aGlzLl9wbGF5YmFja1Jlc291cmNlLmxvb3A9ITEsdGhpcy5fcGxheWJhY2tSZXNvdXJjZS5yZW1vdmVFdmVudExpc3RlbmVyKGNyZWF0ZWpzLkhUTUxBdWRpb1BsdWdpbi5fQVVESU9fU0VFS0VELHRoaXMuX2xvb3BIYW5kbGVyLCExKSl9LGIuX2FkZExvb3Bpbmc9ZnVuY3Rpb24oKXtudWxsPT10aGlzLl9wbGF5YmFja1Jlc291cmNlfHx0aGlzLl9hdWRpb1Nwcml0ZVN0b3BUaW1lfHwodGhpcy5fcGxheWJhY2tSZXNvdXJjZS5hZGRFdmVudExpc3RlbmVyKGNyZWF0ZWpzLkhUTUxBdWRpb1BsdWdpbi5fQVVESU9fU0VFS0VELHRoaXMuX2xvb3BIYW5kbGVyLCExKSx0aGlzLl9wbGF5YmFja1Jlc291cmNlLmxvb3A9ITApfSxiLl9oYW5kbGVDbGVhblVwPWZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5fcGxheWJhY2tSZXNvdXJjZTtpZihudWxsIT1hKXthLnBhdXNlKCksYS5sb29wPSExLGEucmVtb3ZlRXZlbnRMaXN0ZW5lcihjcmVhdGVqcy5IVE1MQXVkaW9QbHVnaW4uX0FVRElPX0VOREVELHRoaXMuX2VuZGVkSGFuZGxlciwhMSksYS5yZW1vdmVFdmVudExpc3RlbmVyKGNyZWF0ZWpzLkhUTUxBdWRpb1BsdWdpbi5fQVVESU9fUkVBRFksdGhpcy5fcmVhZHlIYW5kbGVyLCExKSxhLnJlbW92ZUV2ZW50TGlzdGVuZXIoY3JlYXRlanMuSFRNTEF1ZGlvUGx1Z2luLl9BVURJT19TVEFMTEVELHRoaXMuX3N0YWxsZWRIYW5kbGVyLCExKSxhLnJlbW92ZUV2ZW50TGlzdGVuZXIoY3JlYXRlanMuSFRNTEF1ZGlvUGx1Z2luLl9BVURJT19TRUVLRUQsdGhpcy5fbG9vcEhhbmRsZXIsITEpLGEucmVtb3ZlRXZlbnRMaXN0ZW5lcihjcmVhdGVqcy5IVE1MQXVkaW9QbHVnaW4uX1RJTUVfVVBEQVRFLHRoaXMuX2F1ZGlvU3ByaXRlRW5kSGFuZGxlciwhMSk7dHJ5e2EuY3VycmVudFRpbWU9dGhpcy5fc3RhcnRUaW1lfWNhdGNoKGIpe31jcmVhdGVqcy5IVE1MQXVkaW9UYWdQb29sLnNldEluc3RhbmNlKHRoaXMuc3JjLGEpLHRoaXMuX3BsYXliYWNrUmVzb3VyY2U9bnVsbH19LGIuX2JlZ2luUGxheWluZz1mdW5jdGlvbihhLGIsYyxkKXtyZXR1cm4gdGhpcy5fcGxheWJhY2tSZXNvdXJjZT1jcmVhdGVqcy5IVE1MQXVkaW9UYWdQb29sLmdldEluc3RhbmNlKHRoaXMuc3JjKSx0aGlzLkFic3RyYWN0U291bmRJbnN0YW5jZV9fYmVnaW5QbGF5aW5nKGEsYixjLGQpfSxiLl9oYW5kbGVTb3VuZFJlYWR5PWZ1bmN0aW9uKCl7aWYoNCE9PXRoaXMuX3BsYXliYWNrUmVzb3VyY2UucmVhZHlTdGF0ZSl7dmFyIGE9dGhpcy5fcGxheWJhY2tSZXNvdXJjZTtyZXR1cm4gYS5hZGRFdmVudExpc3RlbmVyKGNyZWF0ZWpzLkhUTUxBdWRpb1BsdWdpbi5fQVVESU9fUkVBRFksdGhpcy5fcmVhZHlIYW5kbGVyLCExKSxhLmFkZEV2ZW50TGlzdGVuZXIoY3JlYXRlanMuSFRNTEF1ZGlvUGx1Z2luLl9BVURJT19TVEFMTEVELHRoaXMuX3N0YWxsZWRIYW5kbGVyLCExKSxhLnByZWxvYWQ9ImF1dG8iLHZvaWQgYS5sb2FkKCl9dGhpcy5fdXBkYXRlVm9sdW1lKCksdGhpcy5fcGxheWJhY2tSZXNvdXJjZS5jdXJyZW50VGltZT0uMDAxKih0aGlzLl9zdGFydFRpbWUrdGhpcy5fcG9zaXRpb24pLHRoaXMuX2F1ZGlvU3ByaXRlU3RvcFRpbWU/dGhpcy5fcGxheWJhY2tSZXNvdXJjZS5hZGRFdmVudExpc3RlbmVyKGNyZWF0ZWpzLkhUTUxBdWRpb1BsdWdpbi5fVElNRV9VUERBVEUsdGhpcy5fYXVkaW9TcHJpdGVFbmRIYW5kbGVyLCExKToodGhpcy5fcGxheWJhY2tSZXNvdXJjZS5hZGRFdmVudExpc3RlbmVyKGNyZWF0ZWpzLkhUTUxBdWRpb1BsdWdpbi5fQVVESU9fRU5ERUQsdGhpcy5fZW5kZWRIYW5kbGVyLCExKSwwIT10aGlzLl9sb29wJiYodGhpcy5fcGxheWJhY2tSZXNvdXJjZS5hZGRFdmVudExpc3RlbmVyKGNyZWF0ZWpzLkhUTUxBdWRpb1BsdWdpbi5fQVVESU9fU0VFS0VELHRoaXMuX2xvb3BIYW5kbGVyLCExKSx0aGlzLl9wbGF5YmFja1Jlc291cmNlLmxvb3A9ITApKSx0aGlzLl9wbGF5YmFja1Jlc291cmNlLnBsYXkoKX0sYi5faGFuZGxlVGFnUmVhZHk9ZnVuY3Rpb24oKXt0aGlzLl9wbGF5YmFja1Jlc291cmNlLnJlbW92ZUV2ZW50TGlzdGVuZXIoY3JlYXRlanMuSFRNTEF1ZGlvUGx1Z2luLl9BVURJT19SRUFEWSx0aGlzLl9yZWFkeUhhbmRsZXIsITEpLHRoaXMuX3BsYXliYWNrUmVzb3VyY2UucmVtb3ZlRXZlbnRMaXN0ZW5lcihjcmVhdGVqcy5IVE1MQXVkaW9QbHVnaW4uX0FVRElPX1NUQUxMRUQsdGhpcy5fc3RhbGxlZEhhbmRsZXIsITEpLHRoaXMuX2hhbmRsZVNvdW5kUmVhZHkoKX0sYi5fcGF1c2U9ZnVuY3Rpb24oKXt0aGlzLl9wbGF5YmFja1Jlc291cmNlLnBhdXNlKCl9LGIuX3Jlc3VtZT1mdW5jdGlvbigpe3RoaXMuX3BsYXliYWNrUmVzb3VyY2UucGxheSgpfSxiLl91cGRhdGVWb2x1bWU9ZnVuY3Rpb24oKXtpZihudWxsIT10aGlzLl9wbGF5YmFja1Jlc291cmNlKXt2YXIgYT10aGlzLl9tdXRlZHx8Y3JlYXRlanMuU291bmQuX21hc3Rlck11dGU/MDp0aGlzLl92b2x1bWUqY3JlYXRlanMuU291bmQuX21hc3RlclZvbHVtZTthIT10aGlzLl9wbGF5YmFja1Jlc291cmNlLnZvbHVtZSYmKHRoaXMuX3BsYXliYWNrUmVzb3VyY2Uudm9sdW1lPWEpfX0sYi5fY2FsY3VsYXRlQ3VycmVudFBvc2l0aW9uPWZ1bmN0aW9uKCl7cmV0dXJuIDFlMyp0aGlzLl9wbGF5YmFja1Jlc291cmNlLmN1cnJlbnRUaW1lLXRoaXMuX3N0YXJ0VGltZX0sYi5fdXBkYXRlUG9zaXRpb249ZnVuY3Rpb24oKXt0aGlzLl9wbGF5YmFja1Jlc291cmNlLnJlbW92ZUV2ZW50TGlzdGVuZXIoY3JlYXRlanMuSFRNTEF1ZGlvUGx1Z2luLl9BVURJT19TRUVLRUQsdGhpcy5fbG9vcEhhbmRsZXIsITEpLHRoaXMuX3BsYXliYWNrUmVzb3VyY2UuYWRkRXZlbnRMaXN0ZW5lcihjcmVhdGVqcy5IVE1MQXVkaW9QbHVnaW4uX0FVRElPX1NFRUtFRCx0aGlzLl9oYW5kbGVTZXRQb3NpdGlvblNlZWssITEpO3RyeXt0aGlzLl9wbGF5YmFja1Jlc291cmNlLmN1cnJlbnRUaW1lPS4wMDEqKHRoaXMuX3Bvc2l0aW9uK3RoaXMuX3N0YXJ0VGltZSl9Y2F0Y2goYSl7dGhpcy5faGFuZGxlU2V0UG9zaXRpb25TZWVrKG51bGwpfX0sYi5faGFuZGxlU2V0UG9zaXRpb25TZWVrPWZ1bmN0aW9uKCl7bnVsbCE9dGhpcy5fcGxheWJhY2tSZXNvdXJjZSYmKHRoaXMuX3BsYXliYWNrUmVzb3VyY2UucmVtb3ZlRXZlbnRMaXN0ZW5lcihjcmVhdGVqcy5IVE1MQXVkaW9QbHVnaW4uX0FVRElPX1NFRUtFRCx0aGlzLl9oYW5kbGVTZXRQb3NpdGlvblNlZWssITEpLHRoaXMuX3BsYXliYWNrUmVzb3VyY2UuYWRkRXZlbnRMaXN0ZW5lcihjcmVhdGVqcy5IVE1MQXVkaW9QbHVnaW4uX0FVRElPX1NFRUtFRCx0aGlzLl9sb29wSGFuZGxlciwhMSkpfSxiLl9oYW5kbGVBdWRpb1Nwcml0ZUxvb3A9ZnVuY3Rpb24oKXt0aGlzLl9wbGF5YmFja1Jlc291cmNlLmN1cnJlbnRUaW1lPD10aGlzLl9hdWRpb1Nwcml0ZVN0b3BUaW1lfHwodGhpcy5fcGxheWJhY2tSZXNvdXJjZS5wYXVzZSgpLDA9PXRoaXMuX2xvb3A/dGhpcy5faGFuZGxlU291bmRDb21wbGV0ZShudWxsKToodGhpcy5fcG9zaXRpb249MCx0aGlzLl9sb29wLS0sdGhpcy5fcGxheWJhY2tSZXNvdXJjZS5jdXJyZW50VGltZT0uMDAxKnRoaXMuX3N0YXJ0VGltZSx0aGlzLl9wYXVzZWR8fHRoaXMuX3BsYXliYWNrUmVzb3VyY2UucGxheSgpLHRoaXMuX3NlbmRFdmVudCgibG9vcCIpKSl9LGIuX2hhbmRsZUxvb3A9ZnVuY3Rpb24oKXswPT10aGlzLl9sb29wJiYodGhpcy5fcGxheWJhY2tSZXNvdXJjZS5sb29wPSExLHRoaXMuX3BsYXliYWNrUmVzb3VyY2UucmVtb3ZlRXZlbnRMaXN0ZW5lcihjcmVhdGVqcy5IVE1MQXVkaW9QbHVnaW4uX0FVRElPX1NFRUtFRCx0aGlzLl9sb29wSGFuZGxlciwhMSkpfSxiLl91cGRhdGVEdXJhdGlvbj1mdW5jdGlvbigpe3RoaXMuX2F1ZGlvU3ByaXRlU3RvcFRpbWU9LjAwMSooc3RhcnRUaW1lK2R1cmF0aW9uKSx0aGlzLnBsYXlTdGF0ZT09Y3JlYXRlanMuU291bmQuUExBWV9TVUNDRUVERUQmJih0aGlzLl9wbGF5YmFja1Jlc291cmNlLnJlbW92ZUV2ZW50TGlzdGVuZXIoY3JlYXRlanMuSFRNTEF1ZGlvUGx1Z2luLl9BVURJT19FTkRFRCx0aGlzLl9lbmRlZEhhbmRsZXIsITEpLHRoaXMuX3BsYXliYWNrUmVzb3VyY2UuYWRkRXZlbnRMaXN0ZW5lcihjcmVhdGVqcy5IVE1MQXVkaW9QbHVnaW4uX1RJTUVfVVBEQVRFLHRoaXMuX2F1ZGlvU3ByaXRlRW5kSGFuZGxlciwhMSkpfSxjcmVhdGVqcy5IVE1MQXVkaW9Tb3VuZEluc3RhbmNlPWNyZWF0ZWpzLnByb21vdGUoYSwiQWJzdHJhY3RTb3VuZEluc3RhbmNlIil9KCksdGhpcy5jcmVhdGVqcz10aGlzLmNyZWF0ZWpzfHx7fSxmdW5jdGlvbigpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBhKCl7dGhpcy5BYnN0cmFjdFBsdWdpbl9jb25zdHJ1Y3RvcigpLHRoaXMuZGVmYXVsdE51bUNoYW5uZWxzPTIsdGhpcy5fY2FwYWJpbGl0aWVzPWMuX2NhcGFiaWxpdGllcyx0aGlzLl9sb2FkZXJDbGFzcz1jcmVhdGVqcy5Tb3VuZExvYWRlcix0aGlzLl9zb3VuZEluc3RhbmNlQ2xhc3M9Y3JlYXRlanMuSFRNTEF1ZGlvU291bmRJbnN0YW5jZX12YXIgYj1jcmVhdGVqcy5leHRlbmQoYSxjcmVhdGVqcy5BYnN0cmFjdFBsdWdpbiksYz1hO2MuTUFYX0lOU1RBTkNFUz0zMCxjLl9BVURJT19SRUFEWT0iY2FucGxheXRocm91Z2giLGMuX0FVRElPX0VOREVEPSJlbmRlZCIsYy5fQVVESU9fU0VFS0VEPSJzZWVrZWQiLGMuX0FVRElPX1NUQUxMRUQ9InN0YWxsZWQiLGMuX1RJTUVfVVBEQVRFPSJ0aW1ldXBkYXRlIixjLl9jYXBhYmlsaXRpZXM9bnVsbCxjLmVuYWJsZUlPUz0hMSxjLmlzU3VwcG9ydGVkPWZ1bmN0aW9uKCl7cmV0dXJuIGMuX2dlbmVyYXRlQ2FwYWJpbGl0aWVzKCksbnVsbD09Yy5fY2FwYWJpbGl0aWVzPyExOiEwfSxjLl9nZW5lcmF0ZUNhcGFiaWxpdGllcz1mdW5jdGlvbigpe2lmKG51bGw9PWMuX2NhcGFiaWxpdGllcyl7dmFyIGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiYXVkaW8iKTtpZihudWxsPT1hLmNhblBsYXlUeXBlKXJldHVybiBudWxsO2MuX2NhcGFiaWxpdGllcz17cGFubmluZzohMCx2b2x1bWU6ITAsdHJhY2tzOi0xfTtmb3IodmFyIGI9Y3JlYXRlanMuU291bmQuU1VQUE9SVEVEX0VYVEVOU0lPTlMsZD1jcmVhdGVqcy5Tb3VuZC5FWFRFTlNJT05fTUFQLGU9MCxmPWIubGVuZ3RoO2Y+ZTtlKyspe3ZhciBnPWJbZV0saD1kW2ddfHxnO2MuX2NhcGFiaWxpdGllc1tnXT0ibm8iIT1hLmNhblBsYXlUeXBlKCJhdWRpby8iK2cpJiYiIiE9YS5jYW5QbGF5VHlwZSgiYXVkaW8vIitnKXx8Im5vIiE9YS5jYW5QbGF5VHlwZSgiYXVkaW8vIitoKSYmIiIhPWEuY2FuUGxheVR5cGUoImF1ZGlvLyIraCl9fX0sYi5yZWdpc3Rlcj1mdW5jdGlvbihhLGIpe2Zvcih2YXIgYz1jcmVhdGVqcy5IVE1MQXVkaW9UYWdQb29sLmdldChhLnNyYyksZD1udWxsLGU9MDtiPmU7ZSsrKWQ9dGhpcy5fY3JlYXRlVGFnKGEuc3JjKSxjLmFkZChkKTt2YXIgZj10aGlzLkFic3RyYWN0UGx1Z2luX3JlZ2lzdGVyKGEsYik7cmV0dXJuIGYuc2V0VGFnKGQpLGZ9LGIucmVtb3ZlU291bmQ9ZnVuY3Rpb24oYSl7dGhpcy5BYnN0cmFjdFBsdWdpbl9yZW1vdmVTb3VuZChhKSxjcmVhdGVqcy5IVE1MQXVkaW9UYWdQb29sLnJlbW92ZShhKX0sYi5jcmVhdGU9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPXRoaXMuQWJzdHJhY3RQbHVnaW5fY3JlYXRlKGEsYixjKTtyZXR1cm4gZC5zZXRQbGF5YmFja1Jlc291cmNlKG51bGwpLGR9LGIudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4iW0hUTUxBdWRpb1BsdWdpbl0ifSxiLnNldFZvbHVtZT1iLmdldFZvbHVtZT1iLnNldE11dGU9bnVsbCxiLl9jcmVhdGVUYWc9ZnVuY3Rpb24oYSl7dmFyIGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiYXVkaW8iKTtyZXR1cm4gYi5hdXRvcGxheT0hMSxiLnByZWxvYWQ9Im5vbmUiLGIuc3JjPWEsYn0sY3JlYXRlanMuSFRNTEF1ZGlvUGx1Z2luPWNyZWF0ZWpzLnByb21vdGUoYSwiQWJzdHJhY3RQbHVnaW4iKX0oKTs=" ></script>



<!--
	<script type="text/javascript" src="../lib/preloadjs-NEXT.combined.js"></script>
	-->
	<script id="script_preloadjs_next_combined_js" src="data:/text/plain;base64,LyohCiogUHJlbG9hZEpTCiogVmlzaXQgaHR0cDovL2NyZWF0ZWpzLmNvbS8gZm9yIGRvY3VtZW50YXRpb24sIHVwZGF0ZXMgYW5kIGV4YW1wbGVzLgoqCiogQ29weXJpZ2h0IChjKSAyMDEwIGdza2lubmVyLmNvbSwgaW5jLgoqCiogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24KKiBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbgoqIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQKKiByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwKKiBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAoqIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQoqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nCiogY29uZGl0aW9uczoKKgoqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlCiogaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCioKKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMKKiBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAoqIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUCiogSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksCiogV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCiogRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgoqIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKi8KCgovLyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwovLyB2ZXJzaW9uLmpzCi8vIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgp0aGlzLmNyZWF0ZWpzID0gdGhpcy5jcmVhdGVqcyB8fCB7fTsKCihmdW5jdGlvbiAoKSB7CgkidXNlIHN0cmljdCI7CgoJLyoqCgkgKiBTdGF0aWMgY2xhc3MgaG9sZGluZyBsaWJyYXJ5IHNwZWNpZmljIGluZm9ybWF0aW9uIHN1Y2ggYXMgdGhlIHZlcnNpb24gYW5kIGJ1aWxkRGF0ZSBvZiB0aGUgbGlicmFyeS4KCSAqIEBjbGFzcyBQcmVsb2FkSlMKCSAqKi8KCXZhciBzID0gY3JlYXRlanMuUHJlbG9hZEpTID0gY3JlYXRlanMuUHJlbG9hZEpTIHx8IHt9OwoKCS8qKgoJICogVGhlIHZlcnNpb24gc3RyaW5nIGZvciB0aGlzIHJlbGVhc2UuCgkgKiBAcHJvcGVydHkgdmVyc2lvbgoJICogQHR5cGUge1N0cmluZ30KCSAqIEBzdGF0aWMKCSAqKi8KCXMudmVyc2lvbiA9IC8qPXZlcnNpb24qLyJORVhUIjsgLy8gaW5qZWN0ZWQgYnkgYnVpbGQgcHJvY2VzcwoKCS8qKgoJICogVGhlIGJ1aWxkIGRhdGUgZm9yIHRoaXMgcmVsZWFzZSBpbiBVVEMgZm9ybWF0LgoJICogQHByb3BlcnR5IGJ1aWxkRGF0ZQoJICogQHR5cGUge1N0cmluZ30KCSAqIEBzdGF0aWMKCSAqKi8KCXMuYnVpbGREYXRlID0gLyo9ZGF0ZSovIkZyaSwgMDIgSmFuIDIwMTUgMTY6Mjk6NTkgR01UIjsgLy8gaW5qZWN0ZWQgYnkgYnVpbGQgcHJvY2VzcwoKfSkoKTsKCi8vIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi8vIGV4dGVuZC5qcwovLyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKdGhpcy5jcmVhdGVqcyA9IHRoaXMuY3JlYXRlanN8fHt9OwoKLyoqCiAqIEBjbGFzcyBVdGlsaXR5IE1ldGhvZHMKICovCgovKioKICogU2V0cyB1cCB0aGUgcHJvdG90eXBlIGNoYWluIGFuZCBjb25zdHJ1Y3RvciBwcm9wZXJ0eSBmb3IgYSBuZXcgY2xhc3MuCiAqCiAqIFRoaXMgc2hvdWxkIGJlIGNhbGxlZCByaWdodCBhZnRlciBjcmVhdGluZyB0aGUgY2xhc3MgY29uc3RydWN0b3IuCiAqCiAqIAlmdW5jdGlvbiBNeVN1YkNsYXNzKCkge30KICogCWNyZWF0ZWpzLmV4dGVuZChNeVN1YkNsYXNzLCBNeVN1cGVyQ2xhc3MpOwogKiAJQ2xhc3NCLnByb3RvdHlwZS5kb1NvbWV0aGluZyA9IGZ1bmN0aW9uKCkgeyB9CiAqCiAqIAl2YXIgZm9vID0gbmV3IE15U3ViQ2xhc3MoKTsKICogCWNvbnNvbGUubG9nKGZvbyBpbnN0YW5jZW9mIE15U3VwZXJDbGFzcyk7IC8vIHRydWUKICogCWNvbnNvbGUubG9nKGZvby5wcm90b3R5cGUuY29uc3RydWN0b3IgPT09IE15U3ViQ2xhc3MpOyAvLyB0cnVlCiAqCiAqIEBtZXRob2QgZXh0ZW5kCiAqIEBwYXJhbSB7RnVuY3Rpb259IHN1YmNsYXNzIFRoZSBzdWJjbGFzcy4KICogQHBhcmFtIHtGdW5jdGlvbn0gc3VwZXJjbGFzcyBUaGUgc3VwZXJjbGFzcyB0byBleHRlbmQuCiAqIEByZXR1cm4ge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBzdWJjbGFzcydzIG5ldyBwcm90b3R5cGUuCiAqLwpjcmVhdGVqcy5leHRlbmQgPSBmdW5jdGlvbihzdWJjbGFzcywgc3VwZXJjbGFzcykgewoJInVzZSBzdHJpY3QiOwoKCWZ1bmN0aW9uIG8oKSB7IHRoaXMuY29uc3RydWN0b3IgPSBzdWJjbGFzczsgfQoJby5wcm90b3R5cGUgPSBzdXBlcmNsYXNzLnByb3RvdHlwZTsKCXJldHVybiAoc3ViY2xhc3MucHJvdG90eXBlID0gbmV3IG8oKSk7Cn07CgovLyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwovLyBwcm9tb3RlLmpzCi8vIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgp0aGlzLmNyZWF0ZWpzID0gdGhpcy5jcmVhdGVqc3x8e307CgovKioKICogQGNsYXNzIFV0aWxpdHkgTWV0aG9kcwogKi8KCi8qKgogKiBQcm9tb3RlcyBhbnkgbWV0aG9kcyBvbiB0aGUgc3VwZXIgY2xhc3MgdGhhdCB3ZXJlIG92ZXJyaWRkZW4sIGJ5IGNyZWF0aW5nIGFuIGFsaWFzIGluIHRoZSBmb3JtYXQgYHByZWZpeF9tZXRob2ROYW1lYC4KICogSXQgaXMgcmVjb21tZW5kZWQgdG8gdXNlIHRoZSBzdXBlciBjbGFzcydzIG5hbWUgYXMgdGhlIHByZWZpeC4KICogQW4gYWxpYXMgdG8gdGhlIHN1cGVyIGNsYXNzJ3MgY29uc3RydWN0b3IgaXMgYWx3YXlzIGFkZGVkIGluIHRoZSBmb3JtYXQgYHByZWZpeF9jb25zdHJ1Y3RvcmAuCiAqIFRoaXMgYWxsb3dzIHRoZSBzdWJjbGFzcyB0byBjYWxsIHN1cGVyIGNsYXNzIG1ldGhvZHMgd2l0aG91dCB1c2luZyBgZnVuY3Rpb24uY2FsbGAsIHByb3ZpZGluZyBiZXR0ZXIgcGVyZm9ybWFuY2UuCiAqCiAqIEZvciBleGFtcGxlLCBpZiBgTXlTdWJDbGFzc2AgZXh0ZW5kcyBgTXlTdXBlckNsYXNzYCwgYW5kIGJvdGggZGVmaW5lIGEgYGRyYXdgIG1ldGhvZCwgdGhlbiBjYWxsaW5nIGBwcm9tb3RlKE15U3ViQ2xhc3MsICJNeVN1cGVyQ2xhc3MiKWAKICogd291bGQgYWRkIGEgYE15U3VwZXJDbGFzc19jb25zdHJ1Y3RvcmAgbWV0aG9kIHRvIE15U3ViQ2xhc3MgYW5kIHByb21vdGUgdGhlIGBkcmF3YCBtZXRob2Qgb24gYE15U3VwZXJDbGFzc2AgdG8gdGhlCiAqIHByb3RvdHlwZSBvZiBgTXlTdWJDbGFzc2AgYXMgYE15U3VwZXJDbGFzc19kcmF3YC4KICoKICogVGhpcyBzaG91bGQgYmUgY2FsbGVkIGFmdGVyIHRoZSBjbGFzcydzIHByb3RvdHlwZSBpcyBmdWxseSBkZWZpbmVkLgogKgogKiAJZnVuY3Rpb24gQ2xhc3NBKG5hbWUpIHsKICogCQl0aGlzLm5hbWUgPSBuYW1lOwogKiAJfQogKiAJQ2xhc3NBLnByb3RvdHlwZS5ncmVldCA9IGZ1bmN0aW9uKCkgewogKiAJCXJldHVybiAiSGVsbG8gIit0aGlzLm5hbWU7CiAqIAl9CiAqCiAqIAlmdW5jdGlvbiBDbGFzc0IobmFtZSwgcHVuY3R1YXRpb24pIHsKICogCQl0aGlzLkNsYXNzQV9jb25zdHJ1Y3RvcihuYW1lKTsKICogCQl0aGlzLnB1bmN0dWF0aW9uID0gcHVuY3R1YXRpb247CiAqIAl9CiAqIAljcmVhdGVqcy5leHRlbmQoQ2xhc3NCLCBDbGFzc0EpOwogKiAJQ2xhc3NCLnByb3RvdHlwZS5ncmVldCA9IGZ1bmN0aW9uKCkgewogKiAJCXJldHVybiB0aGlzLkNsYXNzQV9ncmVldCgpK3RoaXMucHVuY3R1YXRpb247CiAqIAl9CiAqIAljcmVhdGVqcy5wcm9tb3RlKENsYXNzQiwgIkNsYXNzQSIpOwogKgogKiAJdmFyIGZvbyA9IG5ldyBDbGFzc0IoIldvcmxkIiwgIiE/ISIpOwogKiAJY29uc29sZS5sb2coZm9vLmdyZWV0KCkpOyAvLyBIZWxsbyBXb3JsZCE/IQogKgogKiBAbWV0aG9kIHByb21vdGUKICogQHBhcmFtIHtGdW5jdGlvbn0gc3ViY2xhc3MgVGhlIGNsYXNzIHRvIHByb21vdGUgc3VwZXIgY2xhc3MgbWV0aG9kcyBvbi4KICogQHBhcmFtIHtTdHJpbmd9IHByZWZpeCBUaGUgcHJlZml4IHRvIGFkZCB0byB0aGUgcHJvbW90ZWQgbWV0aG9kIG5hbWVzLiBVc3VhbGx5IHRoZSBuYW1lIG9mIHRoZSBzdXBlcmNsYXNzLgogKiBAcmV0dXJuIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgc3ViY2xhc3MuCiAqLwpjcmVhdGVqcy5wcm9tb3RlID0gZnVuY3Rpb24oc3ViY2xhc3MsIHByZWZpeCkgewoJInVzZSBzdHJpY3QiOwoKCXZhciBzdWJQID0gc3ViY2xhc3MucHJvdG90eXBlLCBzdXBQID0gKE9iamVjdC5nZXRQcm90b3R5cGVPZiYmT2JqZWN0LmdldFByb3RvdHlwZU9mKHN1YlApKXx8c3ViUC5fX3Byb3RvX187CglpZiAoc3VwUCkgewoJCXN1YlBbKHByZWZpeCs9Il8iKSArICJjb25zdHJ1Y3RvciJdID0gc3VwUC5jb25zdHJ1Y3RvcjsgLy8gY29uc3RydWN0b3IgaXMgbm90IGFsd2F5cyBpbm51bWVyYWJsZQoJCWZvciAodmFyIG4gaW4gc3VwUCkgewoJCQlpZiAoc3ViUC5oYXNPd25Qcm9wZXJ0eShuKSAmJiAodHlwZW9mIHN1cFBbbl0gPT0gImZ1bmN0aW9uIikpIHsgc3ViUFtwcmVmaXggKyBuXSA9IHN1cFBbbl07IH0KCQl9Cgl9CglyZXR1cm4gc3ViY2xhc3M7Cn07CgovLyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwovLyBpbmRleE9mLmpzCi8vIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgp0aGlzLmNyZWF0ZWpzID0gdGhpcy5jcmVhdGVqc3x8e307CgovKioKICogQGNsYXNzIFV0aWxpdHkgTWV0aG9kcwogKi8KCi8qKgogKiBGaW5kcyB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBvZiBhIHNwZWNpZmllZCB2YWx1ZSBzZWFyY2hFbGVtZW50IGluIHRoZSBwYXNzZWQgaW4gYXJyYXksIGFuZCByZXR1cm5zIHRoZSBpbmRleCBvZgogKiB0aGF0IHZhbHVlLiAgUmV0dXJucyAtMSBpZiB2YWx1ZSBpcyBub3QgZm91bmQuCiAqCiAqICAgICAgdmFyIGkgPSBjcmVhdGVqcy5pbmRleE9mKG15QXJyYXksIG15RWxlbWVudFRvRmluZCk7CiAqCiAqIEBtZXRob2QgaW5kZXhPZgogKiBAcGFyYW0ge0FycmF5fSBhcnJheSBBcnJheSB0byBzZWFyY2ggZm9yIHNlYXJjaEVsZW1lbnQKICogQHBhcmFtIHNlYXJjaEVsZW1lbnQgRWxlbWVudCB0byBmaW5kIGluIGFycmF5LgogKiBAcmV0dXJuIHtOdW1iZXJ9IFRoZSBmaXJzdCBpbmRleCBvZiBzZWFyY2hFbGVtZW50IGluIGFycmF5LgogKi8KY3JlYXRlanMuaW5kZXhPZiA9IGZ1bmN0aW9uIChhcnJheSwgc2VhcmNoRWxlbWVudCl7CgkidXNlIHN0cmljdCI7CgoJZm9yICh2YXIgaSA9IDAsbD1hcnJheS5sZW5ndGg7IGkgPCBsOyBpKyspIHsKCQlpZiAoc2VhcmNoRWxlbWVudCA9PT0gYXJyYXlbaV0pIHsKCQkJcmV0dXJuIGk7CgkJfQoJfQoJcmV0dXJuIC0xOwp9OwoKLy8jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLy8gcHJveHkuanMKLy8jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCnRoaXMuY3JlYXRlanMgPSB0aGlzLmNyZWF0ZWpzfHx7fTsKCi8qKgogKiBWYXJpb3VzIHV0aWxpdGllcyB0aGF0IHRoZSBDcmVhdGVKUyBTdWl0ZSB1c2VzLiBVdGlsaXRpZXMgYXJlIGNyZWF0ZWQgYXMgc2VwYXJhdGUgZmlsZXMsIGFuZCB3aWxsIGJlIGF2YWlsYWJsZSBvbiB0aGUKICogY3JlYXRlanMgbmFtZXNwYWNlIGRpcmVjdGx5LgogKgogKiA8aDQ+RXhhbXBsZTwvaDQ+CiAqCiAqICAgICAgbXlPYmplY3QuYWRkRXZlbnRMaXN0ZW5lcigiY2hhbmdlIiwgY3JlYXRlanMucHJveHkobXlNZXRob2QsIHNjb3BlKSk7CiAqCiAqIEBjbGFzcyBVdGlsaXR5IE1ldGhvZHMKICogQG1haW4gVXRpbGl0eSBNZXRob2RzCiAqLwoKKGZ1bmN0aW9uKCkgewoJInVzZSBzdHJpY3QiOwoKCS8qKgoJICogQSBmdW5jdGlvbiBwcm94eSBmb3IgbWV0aG9kcy4gQnkgZGVmYXVsdCwgSmF2YVNjcmlwdCBtZXRob2RzIGRvIG5vdCBtYWludGFpbiBzY29wZSwgc28gcGFzc2luZyBhIG1ldGhvZCBhcyBhCgkgKiBjYWxsYmFjayB3aWxsIHJlc3VsdCBpbiB0aGUgbWV0aG9kIGdldHRpbmcgY2FsbGVkIGluIHRoZSBzY29wZSBvZiB0aGUgY2FsbGVyLiBVc2luZyBhIHByb3h5IGVuc3VyZXMgdGhhdCB0aGUKCSAqIG1ldGhvZCBnZXRzIGNhbGxlZCBpbiB0aGUgY29ycmVjdCBzY29wZS4KCSAqCgkgKiBBZGRpdGlvbmFsIGFyZ3VtZW50cyBjYW4gYmUgcGFzc2VkIHRoYXQgd2lsbCBiZSBhcHBsaWVkIHRvIHRoZSBmdW5jdGlvbiB3aGVuIGl0IGlzIGNhbGxlZC4KCSAqCgkgKiA8aDQ+RXhhbXBsZTwvaDQ+CgkgKgoJICogICAgICBteU9iamVjdC5hZGRFdmVudExpc3RlbmVyKCJldmVudCIsIGNyZWF0ZWpzLnByb3h5KG15SGFuZGxlciwgdGhpcywgYXJnMSwgYXJnMikpOwoJICoKCSAqICAgICAgZnVuY3Rpb24gbXlIYW5kbGVyKGFyZzEsIGFyZzIpIHsKCSAqICAgICAgICAgICAvLyBUaGlzIGdldHMgY2FsbGVkIHdoZW4gbXlPYmplY3QubXlDYWxsYmFjayBpcyBleGVjdXRlZC4KCSAqICAgICAgfQoJICoKCSAqIEBtZXRob2QgcHJveHkKCSAqIEBwYXJhbSB7RnVuY3Rpb259IG1ldGhvZCBUaGUgZnVuY3Rpb24gdG8gY2FsbAoJICogQHBhcmFtIHtPYmplY3R9IHNjb3BlIFRoZSBzY29wZSB0byBjYWxsIHRoZSBtZXRob2QgbmFtZSBvbgoJICogQHBhcmFtIHttaXhlZH0gW2FyZ10gKiBBcmd1bWVudHMgdGhhdCBhcmUgYXBwZW5kZWQgdG8gdGhlIGNhbGxiYWNrIGZvciBhZGRpdGlvbmFsIHBhcmFtcy4KCSAqIEBwdWJsaWMKCSAqIEBzdGF0aWMKCSAqLwoJY3JlYXRlanMucHJveHkgPSBmdW5jdGlvbiAobWV0aG9kLCBzY29wZSkgewoJCXZhciBhQXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMik7CgkJcmV0dXJuIGZ1bmN0aW9uICgpIHsKCQkJcmV0dXJuIG1ldGhvZC5hcHBseShzY29wZSwgQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAwKS5jb25jYXQoYUFyZ3MpKTsKCQl9OwoJfQoKfSgpKTsKCi8vIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi8vIEJyb3dzZXJEZXRlY3QuanMKLy8jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCnRoaXMuY3JlYXRlanMgPSB0aGlzLmNyZWF0ZWpzfHx7fTsKCi8qKgogKiBAY2xhc3MgVXRpbGl0eSBNZXRob2RzCiAqLwooZnVuY3Rpb24oKSB7CgkidXNlIHN0cmljdCI7CgoJLyoqCgkgKiBBbiBvYmplY3QgdGhhdCBkZXRlcm1pbmVzIHRoZSBjdXJyZW50IGJyb3dzZXIsIHZlcnNpb24sIG9wZXJhdGluZyBzeXN0ZW0sIGFuZCBvdGhlciBlbnZpcm9ubWVudAoJICogdmFyaWFibGVzIHZpYSB1c2VyIGFnZW50IHN0cmluZy4KCSAqCgkgKiBVc2VkIGZvciBhdWRpbyBiZWNhdXNlIGZlYXR1cmUgZGV0ZWN0aW9uIGlzIHVuYWJsZSB0byBkZXRlY3QgdGhlIG1hbnkgbGltaXRhdGlvbnMgb2YgbW9iaWxlIGRldmljZXMuCgkgKgoJICogPGg0PkV4YW1wbGU8L2g0PgoJICoKCSAqICAgICAgaWYgKGNyZWF0ZWpzLkJyb3dzZXJEZXRlY3QuaXNJT1MpIHsgLy8gZG8gc3R1ZmYgfQoJICoKCSAqIEBwcm9wZXJ0eSBCcm93c2VyRGV0ZWN0CgkgKiBAdHlwZSB7T2JqZWN0fQoJICogQHBhcmFtIHtCb29sZWFufSBpc0ZpcmVmb3ggVHJ1ZSBpZiBvdXIgYnJvd3NlciBpcyBGaXJlZm94LgoJICogQHBhcmFtIHtCb29sZWFufSBpc09wZXJhIFRydWUgaWYgb3VyIGJyb3dzZXIgaXMgb3BlcmEuCgkgKiBAcGFyYW0ge0Jvb2xlYW59IGlzQ2hyb21lIFRydWUgaWYgb3VyIGJyb3dzZXIgaXMgQ2hyb21lLiAgTm90ZSB0aGF0IENocm9tZSBmb3IgQW5kcm9pZCByZXR1cm5zIHRydWUsIGJ1dCBpcyBhCgkgKiBjb21wbGV0ZWx5IGRpZmZlcmVudCBicm93c2VyIHdpdGggZGlmZmVyZW50IGFiaWxpdGllcy4KCSAqIEBwYXJhbSB7Qm9vbGVhbn0gaXNJT1MgVHJ1ZSBpZiBvdXIgYnJvd3NlciBpcyBzYWZhcmkgZm9yIGlPUyBkZXZpY2VzIChpUGFkLCBpUGhvbmUsIGFuZCBpUG9kKS4KCSAqIEBwYXJhbSB7Qm9vbGVhbn0gaXNBbmRyb2lkIFRydWUgaWYgb3VyIGJyb3dzZXIgaXMgQW5kcm9pZC4KCSAqIEBwYXJhbSB7Qm9vbGVhbn0gaXNCbGFja2JlcnJ5IFRydWUgaWYgb3VyIGJyb3dzZXIgaXMgQmxhY2tiZXJyeS4KCSAqIEBjb25zdHJ1Y3RvcgoJICogQHN0YXRpYwoJICovCglmdW5jdGlvbiBCcm93c2VyRGV0ZWN0KCkgewoJCXRocm93ICJCcm93c2VyRGV0ZWN0IGNhbm5vdCBiZSBpbnN0YW50aWF0ZWQiOwoJfTsKCgl2YXIgYWdlbnQgPSBCcm93c2VyRGV0ZWN0LmFnZW50ID0gd2luZG93Lm5hdmlnYXRvci51c2VyQWdlbnQ7CglCcm93c2VyRGV0ZWN0LmlzV2luZG93UGhvbmUgPSAoYWdlbnQuaW5kZXhPZigiSUVNb2JpbGUiKSA+IC0xKSB8fCAoYWdlbnQuaW5kZXhPZigiV2luZG93cyBQaG9uZSIpID4gLTEpOwoJQnJvd3NlckRldGVjdC5pc0ZpcmVmb3ggPSAoYWdlbnQuaW5kZXhPZigiRmlyZWZveCIpID4gLTEpOwoJQnJvd3NlckRldGVjdC5pc09wZXJhID0gKHdpbmRvdy5vcGVyYSAhPSBudWxsKTsKCUJyb3dzZXJEZXRlY3QuaXNDaHJvbWUgPSAoYWdlbnQuaW5kZXhPZigiQ2hyb21lIikgPiAtMSk7ICAvLyBOT1RFIHRoYXQgQ2hyb21lIG9uIEFuZHJvaWQgcmV0dXJucyB0cnVlIGJ1dCBpcyBhIGNvbXBsZXRlbHkgZGlmZmVyZW50IGJyb3dzZXIgd2l0aCBkaWZmZXJlbnQgYWJpbGl0aWVzCglCcm93c2VyRGV0ZWN0LmlzSU9TID0gKGFnZW50LmluZGV4T2YoImlQb2QiKSA+IC0xIHx8IGFnZW50LmluZGV4T2YoImlQaG9uZSIpID4gLTEgfHwgYWdlbnQuaW5kZXhPZigiaVBhZCIpID4gLTEpICYmICFCcm93c2VyRGV0ZWN0LmlzV2luZG93UGhvbmU7CglCcm93c2VyRGV0ZWN0LmlzQW5kcm9pZCA9IChhZ2VudC5pbmRleE9mKCJBbmRyb2lkIikgPiAtMSkgJiYgIUJyb3dzZXJEZXRlY3QuaXNXaW5kb3dQaG9uZTsKCUJyb3dzZXJEZXRlY3QuaXNCbGFja2JlcnJ5ID0gKGFnZW50LmluZGV4T2YoIkJsYWNrYmVycnkiKSA+IC0xKTsKCgljcmVhdGVqcy5Ccm93c2VyRGV0ZWN0ID0gQnJvd3NlckRldGVjdDsKCn0oKSk7CgovLyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwovLyBFdmVudC5qcwovLyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKdGhpcy5jcmVhdGVqcyA9IHRoaXMuY3JlYXRlanN8fHt9OwoKKGZ1bmN0aW9uKCkgewoJInVzZSBzdHJpY3QiOwoKLy8gY29uc3RydWN0b3I6CgkvKioKCSAqIENvbnRhaW5zIHByb3BlcnRpZXMgYW5kIG1ldGhvZHMgc2hhcmVkIGJ5IGFsbCBldmVudHMgZm9yIHVzZSB3aXRoCgkgKiB7eyNjcm9zc0xpbmsgIkV2ZW50RGlzcGF0Y2hlciJ9fXt7L2Nyb3NzTGlua319LgoJICogCgkgKiBOb3RlIHRoYXQgRXZlbnQgb2JqZWN0cyBhcmUgb2Z0ZW4gcmV1c2VkLCBzbyB5b3Ugc2hvdWxkIG5ldmVyCgkgKiByZWx5IG9uIGFuIGV2ZW50IG9iamVjdCdzIHN0YXRlIG91dHNpZGUgb2YgdGhlIGNhbGwgc3RhY2sgaXQgd2FzIHJlY2VpdmVkIGluLgoJICogQGNsYXNzIEV2ZW50CgkgKiBAcGFyYW0ge1N0cmluZ30gdHlwZSBUaGUgZXZlbnQgdHlwZS4KCSAqIEBwYXJhbSB7Qm9vbGVhbn0gYnViYmxlcyBJbmRpY2F0ZXMgd2hldGhlciB0aGUgZXZlbnQgd2lsbCBidWJibGUgdGhyb3VnaCB0aGUgZGlzcGxheSBsaXN0LgoJICogQHBhcmFtIHtCb29sZWFufSBjYW5jZWxhYmxlIEluZGljYXRlcyB3aGV0aGVyIHRoZSBkZWZhdWx0IGJlaGF2aW91ciBvZiB0aGlzIGV2ZW50IGNhbiBiZSBjYW5jZWxsZWQuCgkgKiBAY29uc3RydWN0b3IKCSAqKi8KCWZ1bmN0aW9uIEV2ZW50KHR5cGUsIGJ1YmJsZXMsIGNhbmNlbGFibGUpIHsKCQkKCQoJLy8gcHVibGljIHByb3BlcnRpZXM6CgkJLyoqCgkJICogVGhlIHR5cGUgb2YgZXZlbnQuCgkJICogQHByb3BlcnR5IHR5cGUKCQkgKiBAdHlwZSBTdHJpbmcKCQkgKiovCgkJdGhpcy50eXBlID0gdHlwZTsKCQoJCS8qKgoJCSAqIFRoZSBvYmplY3QgdGhhdCBnZW5lcmF0ZWQgYW4gZXZlbnQuCgkJICogQHByb3BlcnR5IHRhcmdldAoJCSAqIEB0eXBlIE9iamVjdAoJCSAqIEBkZWZhdWx0IG51bGwKCQkgKiBAcmVhZG9ubHkKCQkqLwoJCXRoaXMudGFyZ2V0ID0gbnVsbDsKCQoJCS8qKgoJCSAqIFRoZSBjdXJyZW50IHRhcmdldCB0aGF0IGEgYnViYmxpbmcgZXZlbnQgaXMgYmVpbmcgZGlzcGF0Y2hlZCBmcm9tLiBGb3Igbm9uLWJ1YmJsaW5nIGV2ZW50cywgdGhpcyB3aWxsCgkJICogYWx3YXlzIGJlIHRoZSBzYW1lIGFzIHRhcmdldC4gRm9yIGV4YW1wbGUsIGlmIGNoaWxkT2JqLnBhcmVudCA9IHBhcmVudE9iaiwgYW5kIGEgYnViYmxpbmcgZXZlbnQKCQkgKiBpcyBnZW5lcmF0ZWQgZnJvbSBjaGlsZE9iaiwgdGhlbiBhIGxpc3RlbmVyIG9uIHBhcmVudE9iaiB3b3VsZCByZWNlaXZlIHRoZSBldmVudCB3aXRoCgkJICogdGFyZ2V0PWNoaWxkT2JqICh0aGUgb3JpZ2luYWwgdGFyZ2V0KSBhbmQgY3VycmVudFRhcmdldD1wYXJlbnRPYmogKHdoZXJlIHRoZSBsaXN0ZW5lciB3YXMgYWRkZWQpLgoJCSAqIEBwcm9wZXJ0eSBjdXJyZW50VGFyZ2V0CgkJICogQHR5cGUgT2JqZWN0CgkJICogQGRlZmF1bHQgbnVsbAoJCSAqIEByZWFkb25seQoJCSovCgkJdGhpcy5jdXJyZW50VGFyZ2V0ID0gbnVsbDsKCQoJCS8qKgoJCSAqIEZvciBidWJibGluZyBldmVudHMsIHRoaXMgaW5kaWNhdGVzIHRoZSBjdXJyZW50IGV2ZW50IHBoYXNlOjxPTD4KCQkgKiAJPExJPiBjYXB0dXJlIHBoYXNlOiBzdGFydGluZyBmcm9tIHRoZSB0b3AgcGFyZW50IHRvIHRoZSB0YXJnZXQ8L0xJPgoJCSAqIAk8TEk+IGF0IHRhcmdldCBwaGFzZTogY3VycmVudGx5IGJlaW5nIGRpc3BhdGNoZWQgZnJvbSB0aGUgdGFyZ2V0PC9MST4KCQkgKiAJPExJPiBidWJibGluZyBwaGFzZTogZnJvbSB0aGUgdGFyZ2V0IHRvIHRoZSB0b3AgcGFyZW50PC9MST4KCQkgKiA8L09MPgoJCSAqIEBwcm9wZXJ0eSBldmVudFBoYXNlCgkJICogQHR5cGUgTnVtYmVyCgkJICogQGRlZmF1bHQgMAoJCSAqIEByZWFkb25seQoJCSovCgkJdGhpcy5ldmVudFBoYXNlID0gMDsKCQoJCS8qKgoJCSAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBldmVudCB3aWxsIGJ1YmJsZSB0aHJvdWdoIHRoZSBkaXNwbGF5IGxpc3QuCgkJICogQHByb3BlcnR5IGJ1YmJsZXMKCQkgKiBAdHlwZSBCb29sZWFuCgkJICogQGRlZmF1bHQgZmFsc2UKCQkgKiBAcmVhZG9ubHkKCQkqLwoJCXRoaXMuYnViYmxlcyA9ICEhYnViYmxlczsKCQoJCS8qKgoJCSAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBkZWZhdWx0IGJlaGF2aW91ciBvZiB0aGlzIGV2ZW50IGNhbiBiZSBjYW5jZWxsZWQgdmlhCgkJICoge3sjY3Jvc3NMaW5rICJFdmVudC9wcmV2ZW50RGVmYXVsdCJ9fXt7L2Nyb3NzTGlua319LiBUaGlzIGlzIHNldCB2aWEgdGhlIEV2ZW50IGNvbnN0cnVjdG9yLgoJCSAqIEBwcm9wZXJ0eSBjYW5jZWxhYmxlCgkJICogQHR5cGUgQm9vbGVhbgoJCSAqIEBkZWZhdWx0IGZhbHNlCgkJICogQHJlYWRvbmx5CgkJKi8KCQl0aGlzLmNhbmNlbGFibGUgPSAhIWNhbmNlbGFibGU7CgkKCQkvKioKCQkgKiBUaGUgZXBvY2ggdGltZSBhdCB3aGljaCB0aGlzIGV2ZW50IHdhcyBjcmVhdGVkLgoJCSAqIEBwcm9wZXJ0eSB0aW1lU3RhbXAKCQkgKiBAdHlwZSBOdW1iZXIKCQkgKiBAZGVmYXVsdCAwCgkJICogQHJlYWRvbmx5CgkJKi8KCQl0aGlzLnRpbWVTdGFtcCA9IChuZXcgRGF0ZSgpKS5nZXRUaW1lKCk7CgkKCQkvKioKCQkgKiBJbmRpY2F0ZXMgaWYge3sjY3Jvc3NMaW5rICJFdmVudC9wcmV2ZW50RGVmYXVsdCJ9fXt7L2Nyb3NzTGlua319IGhhcyBiZWVuIGNhbGxlZAoJCSAqIG9uIHRoaXMgZXZlbnQuCgkJICogQHByb3BlcnR5IGRlZmF1bHRQcmV2ZW50ZWQKCQkgKiBAdHlwZSBCb29sZWFuCgkJICogQGRlZmF1bHQgZmFsc2UKCQkgKiBAcmVhZG9ubHkKCQkqLwoJCXRoaXMuZGVmYXVsdFByZXZlbnRlZCA9IGZhbHNlOwoJCgkJLyoqCgkJICogSW5kaWNhdGVzIGlmIHt7I2Nyb3NzTGluayAiRXZlbnQvc3RvcFByb3BhZ2F0aW9uIn19e3svY3Jvc3NMaW5rfX0gb3IKCQkgKiB7eyNjcm9zc0xpbmsgIkV2ZW50L3N0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbiJ9fXt7L2Nyb3NzTGlua319IGhhcyBiZWVuIGNhbGxlZCBvbiB0aGlzIGV2ZW50LgoJCSAqIEBwcm9wZXJ0eSBwcm9wYWdhdGlvblN0b3BwZWQKCQkgKiBAdHlwZSBCb29sZWFuCgkJICogQGRlZmF1bHQgZmFsc2UKCQkgKiBAcmVhZG9ubHkKCQkqLwoJCXRoaXMucHJvcGFnYXRpb25TdG9wcGVkID0gZmFsc2U7CgkKCQkvKioKCQkgKiBJbmRpY2F0ZXMgaWYge3sjY3Jvc3NMaW5rICJFdmVudC9zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24ifX17ey9jcm9zc0xpbmt9fSBoYXMgYmVlbiBjYWxsZWQKCQkgKiBvbiB0aGlzIGV2ZW50LgoJCSAqIEBwcm9wZXJ0eSBpbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQKCQkgKiBAdHlwZSBCb29sZWFuCgkJICogQGRlZmF1bHQgZmFsc2UKCQkgKiBAcmVhZG9ubHkKCQkqLwoJCXRoaXMuaW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkID0gZmFsc2U7CgkJCgkJLyoqCgkJICogSW5kaWNhdGVzIGlmIHt7I2Nyb3NzTGluayAiRXZlbnQvcmVtb3ZlIn19e3svY3Jvc3NMaW5rfX0gaGFzIGJlZW4gY2FsbGVkIG9uIHRoaXMgZXZlbnQuCgkJICogQHByb3BlcnR5IHJlbW92ZWQKCQkgKiBAdHlwZSBCb29sZWFuCgkJICogQGRlZmF1bHQgZmFsc2UKCQkgKiBAcmVhZG9ubHkKCQkqLwoJCXRoaXMucmVtb3ZlZCA9IGZhbHNlOwoJfQoJdmFyIHAgPSBFdmVudC5wcm90b3R5cGU7CgoJLyoqCgkgKiA8c3Ryb25nPlJFTU9WRUQ8L3N0cm9uZz4uIFJlbW92ZWQgaW4gZmF2b3Igb2YgdXNpbmcgYE15U3VwZXJDbGFzc19jb25zdHJ1Y3RvcmAuCgkgKiBTZWUge3sjY3Jvc3NMaW5rICJVdGlsaXR5IE1ldGhvZHMvZXh0ZW5kIn19e3svY3Jvc3NMaW5rfX0gYW5kIHt7I2Nyb3NzTGluayAiVXRpbGl0eSBNZXRob2RzL3Byb21vdGUifX17ey9jcm9zc0xpbmt9fQoJICogZm9yIGRldGFpbHMuCgkgKgoJICogVGhlcmUgaXMgYW4gaW5oZXJpdGFuY2UgdHV0b3JpYWwgZGlzdHJpYnV0ZWQgd2l0aCBFYXNlbEpTIGluIC90dXRvcmlhbHMvSW5oZXJpdGFuY2UuCgkgKgoJICogQG1ldGhvZCBpbml0aWFsaXplCgkgKiBAcHJvdGVjdGVkCgkgKiBAZGVwcmVjYXRlZAoJICovCgkvLyBwLmluaXRpYWxpemUgPSBmdW5jdGlvbigpIHt9OyAvLyBzZWFyY2hhYmxlIGZvciBkZXZzIHdvbmRlcmluZyB3aGVyZSBpdCBpcy4KCQoKLy8gcHVibGljIG1ldGhvZHM6CgkvKioKCSAqIFNldHMge3sjY3Jvc3NMaW5rICJFdmVudC9kZWZhdWx0UHJldmVudGVkIn19e3svY3Jvc3NMaW5rfX0gdG8gdHJ1ZS4KCSAqIE1pcnJvcnMgdGhlIERPTSBldmVudCBzdGFuZGFyZC4KCSAqIEBtZXRob2QgcHJldmVudERlZmF1bHQKCSAqKi8KCXAucHJldmVudERlZmF1bHQgPSBmdW5jdGlvbigpIHsKCQl0aGlzLmRlZmF1bHRQcmV2ZW50ZWQgPSB0aGlzLmNhbmNlbGFibGUmJnRydWU7Cgl9OwoKCS8qKgoJICogU2V0cyB7eyNjcm9zc0xpbmsgIkV2ZW50L3Byb3BhZ2F0aW9uU3RvcHBlZCJ9fXt7L2Nyb3NzTGlua319IHRvIHRydWUuCgkgKiBNaXJyb3JzIHRoZSBET00gZXZlbnQgc3RhbmRhcmQuCgkgKiBAbWV0aG9kIHN0b3BQcm9wYWdhdGlvbgoJICoqLwoJcC5zdG9wUHJvcGFnYXRpb24gPSBmdW5jdGlvbigpIHsKCQl0aGlzLnByb3BhZ2F0aW9uU3RvcHBlZCA9IHRydWU7Cgl9OwoKCS8qKgoJICogU2V0cyB7eyNjcm9zc0xpbmsgIkV2ZW50L3Byb3BhZ2F0aW9uU3RvcHBlZCJ9fXt7L2Nyb3NzTGlua319IGFuZAoJICoge3sjY3Jvc3NMaW5rICJFdmVudC9pbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQifX17ey9jcm9zc0xpbmt9fSB0byB0cnVlLgoJICogTWlycm9ycyB0aGUgRE9NIGV2ZW50IHN0YW5kYXJkLgoJICogQG1ldGhvZCBzdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24KCSAqKi8KCXAuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uID0gZnVuY3Rpb24oKSB7CgkJdGhpcy5pbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQgPSB0aGlzLnByb3BhZ2F0aW9uU3RvcHBlZCA9IHRydWU7Cgl9OwoJCgkvKioKCSAqIENhdXNlcyB0aGUgYWN0aXZlIGxpc3RlbmVyIHRvIGJlIHJlbW92ZWQgdmlhIHJlbW92ZUV2ZW50TGlzdGVuZXIoKTsKCSAqIAoJICogCQlteUJ0bi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsIGZ1bmN0aW9uKGV2dCkgewoJICogCQkJLy8gZG8gc3R1ZmYuLi4KCSAqIAkJCWV2dC5yZW1vdmUoKTsgLy8gcmVtb3ZlcyB0aGlzIGxpc3RlbmVyLgoJICogCQl9KTsKCSAqIAoJICogQG1ldGhvZCByZW1vdmUKCSAqKi8KCXAucmVtb3ZlID0gZnVuY3Rpb24oKSB7CgkJdGhpcy5yZW1vdmVkID0gdHJ1ZTsKCX07CgkKCS8qKgoJICogUmV0dXJucyBhIGNsb25lIG9mIHRoZSBFdmVudCBpbnN0YW5jZS4KCSAqIEBtZXRob2QgY2xvbmUKCSAqIEByZXR1cm4ge0V2ZW50fSBhIGNsb25lIG9mIHRoZSBFdmVudCBpbnN0YW5jZS4KCSAqKi8KCXAuY2xvbmUgPSBmdW5jdGlvbigpIHsKCQlyZXR1cm4gbmV3IEV2ZW50KHRoaXMudHlwZSwgdGhpcy5idWJibGVzLCB0aGlzLmNhbmNlbGFibGUpOwoJfTsKCQoJLyoqCgkgKiBQcm92aWRlcyBhIGNoYWluYWJsZSBzaG9ydGN1dCBtZXRob2QgZm9yIHNldHRpbmcgYSBudW1iZXIgb2YgcHJvcGVydGllcyBvbiB0aGUgaW5zdGFuY2UuCgkgKgoJICogQG1ldGhvZCBzZXQKCSAqIEBwYXJhbSB7T2JqZWN0fSBwcm9wcyBBIGdlbmVyaWMgb2JqZWN0IGNvbnRhaW5pbmcgcHJvcGVydGllcyB0byBjb3B5IHRvIHRoZSBpbnN0YW5jZS4KCSAqIEByZXR1cm4ge0V2ZW50fSBSZXR1cm5zIHRoZSBpbnN0YW5jZSB0aGUgbWV0aG9kIGlzIGNhbGxlZCBvbiAodXNlZnVsIGZvciBjaGFpbmluZyBjYWxscy4pCgkgKiBAY2hhaW5hYmxlCgkqLwoJcC5zZXQgPSBmdW5jdGlvbihwcm9wcykgewoJCWZvciAodmFyIG4gaW4gcHJvcHMpIHsgdGhpc1tuXSA9IHByb3BzW25dOyB9CgkJcmV0dXJuIHRoaXM7Cgl9OwoKCS8qKgoJICogUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIG9iamVjdC4KCSAqIEBtZXRob2QgdG9TdHJpbmcKCSAqIEByZXR1cm4ge1N0cmluZ30gYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIGluc3RhbmNlLgoJICoqLwoJcC50b1N0cmluZyA9IGZ1bmN0aW9uKCkgewoJCXJldHVybiAiW0V2ZW50ICh0eXBlPSIrdGhpcy50eXBlKyIpXSI7Cgl9OwoKCWNyZWF0ZWpzLkV2ZW50ID0gRXZlbnQ7Cn0oKSk7CgovLyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwovLyBFcnJvckV2ZW50LmpzCi8vIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgp0aGlzLmNyZWF0ZWpzID0gdGhpcy5jcmVhdGVqc3x8e307CgooZnVuY3Rpb24oKSB7CgkidXNlIHN0cmljdCI7CgoJLyoqCgkgKiBBIGdlbmVyYWwgZXJyb3Ige3sjY3Jvc3NMaW5rICJFdmVudCJ9fXt7L2Nyb3NzTGlua319LCB0aGF0IGRlc2NyaWJlcyBhbiBlcnJvciB0aGF0IG9jY3VycmVkLCBhcyB3ZWxsIGFzIGFueSBkZXRhaWxzLgoJICogQGNsYXNzIEVycm9yRXZlbnQKCSAqIEBwYXJhbSB7U3RyaW5nfSBbdGl0bGVdIFRoZSBlcnJvciB0aXRsZQoJICogQHBhcmFtIHtTdHJpbmd9IFttZXNzYWdlXSBUaGUgZXJyb3IgZGVzY3JpcHRpb24KCSAqIEBwYXJhbSB7T2JqZWN0fSBbZGF0YV0gQWRkaXRpb25hbCBlcnJvciBkYXRhCgkgKiBAY29uc3RydWN0b3IKCSAqLwoJZnVuY3Rpb24gRXJyb3JFdmVudCh0aXRsZSwgbWVzc2FnZSwgZGF0YSkgewoJCXRoaXMuRXZlbnRfY29uc3RydWN0b3IoImVycm9yIik7CgoJCS8qKgoJCSAqIFRoZSBzaG9ydCBlcnJvciB0aXRsZSwgd2hpY2ggaW5kaWNhdGVzIHRoZSB0eXBlIG9mIGVycm9yIHRoYXQgb2NjdXJyZWQuCgkJICogQHByb3BlcnR5IHRpdGxlCgkJICogQHR5cGUgU3RyaW5nCgkJICovCgkJdGhpcy50aXRsZSA9IHRpdGxlOwoKCQkvKioKCQkgKiBUaGUgdmVyYm9zZSBlcnJvciBtZXNzYWdlLCBjb250YWluaW5nIGRldGFpbHMgYWJvdXQgdGhlIGVycm9yLgoJCSAqIEBwcm9wZXJ0eSBtZXNzYWdlCgkJICogQHR5cGUgU3RyaW5nCgkJICovCgkJdGhpcy5tZXNzYWdlID0gbWVzc2FnZTsKCgkJLyoqCgkJICogQWRkaXRpb25hbCBkYXRhIGF0dGFjaGVkIHRvIGFuIGVycm9yLgoJCSAqIEBwcm9wZXJ0eSBkYXRhCgkJICogQHR5cGUge09iamVjdH0KCQkgKi8KCQl0aGlzLmRhdGEgPSBkYXRhOwoJfQoKCXZhciBwID0gY3JlYXRlanMuZXh0ZW5kKEVycm9yRXZlbnQsIGNyZWF0ZWpzLkV2ZW50KTsKCglwLmNsb25lID0gZnVuY3Rpb24oKSB7CgkJcmV0dXJuIG5ldyBjcmVhdGVqcy5FcnJvckV2ZW50KHRoaXMudGl0bGUsIHRoaXMubWVzc2FnZSwgdGhpcy5kYXRhKTsKCX07CgoJY3JlYXRlanMuRXJyb3JFdmVudCA9IGNyZWF0ZWpzLnByb21vdGUoRXJyb3JFdmVudCwgIkV2ZW50Iik7Cgp9KCkpOwoKLy8jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLy8gRXZlbnREaXNwYXRjaGVyLmpzCi8vIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgp0aGlzLmNyZWF0ZWpzID0gdGhpcy5jcmVhdGVqc3x8e307DQoNCihmdW5jdGlvbigpIHsNCgkidXNlIHN0cmljdCI7DQoNCg0KLy8gY29uc3RydWN0b3I6DQoJLyoqDQoJICogRXZlbnREaXNwYXRjaGVyIHByb3ZpZGVzIG1ldGhvZHMgZm9yIG1hbmFnaW5nIHF1ZXVlcyBvZiBldmVudCBsaXN0ZW5lcnMgYW5kIGRpc3BhdGNoaW5nIGV2ZW50cy4NCgkgKg0KCSAqIFlvdSBjYW4gZWl0aGVyIGV4dGVuZCBFdmVudERpc3BhdGNoZXIgb3IgbWl4IGl0cyBtZXRob2RzIGludG8gYW4gZXhpc3RpbmcgcHJvdG90eXBlIG9yIGluc3RhbmNlIGJ5IHVzaW5nIHRoZQ0KCSAqIEV2ZW50RGlzcGF0Y2hlciB7eyNjcm9zc0xpbmsgIkV2ZW50RGlzcGF0Y2hlci9pbml0aWFsaXplIn19e3svY3Jvc3NMaW5rfX0gbWV0aG9kLg0KCSAqIA0KCSAqIFRvZ2V0aGVyIHdpdGggdGhlIENyZWF0ZUpTIEV2ZW50IGNsYXNzLCBFdmVudERpc3BhdGNoZXIgcHJvdmlkZXMgYW4gZXh0ZW5kZWQgZXZlbnQgbW9kZWwgdGhhdCBpcyBiYXNlZCBvbiB0aGUNCgkgKiBET00gTGV2ZWwgMiBldmVudCBtb2RlbCwgaW5jbHVkaW5nIGFkZEV2ZW50TGlzdGVuZXIsIHJlbW92ZUV2ZW50TGlzdGVuZXIsIGFuZCBkaXNwYXRjaEV2ZW50LiBJdCBzdXBwb3J0cw0KCSAqIGJ1YmJsaW5nIC8gY2FwdHVyZSwgcHJldmVudERlZmF1bHQsIHN0b3BQcm9wYWdhdGlvbiwgc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uLCBhbmQgaGFuZGxlRXZlbnQuDQoJICogDQoJICogRXZlbnREaXNwYXRjaGVyIGFsc28gZXhwb3NlcyBhIHt7I2Nyb3NzTGluayAiRXZlbnREaXNwYXRjaGVyL29uIn19e3svY3Jvc3NMaW5rfX0gbWV0aG9kLCB3aGljaCBtYWtlcyBpdCBlYXNpZXINCgkgKiB0byBjcmVhdGUgc2NvcGVkIGxpc3RlbmVycywgbGlzdGVuZXJzIHRoYXQgb25seSBydW4gb25jZSwgYW5kIGxpc3RlbmVycyB3aXRoIGFzc29jaWF0ZWQgYXJiaXRyYXJ5IGRhdGEuIFRoZSANCgkgKiB7eyNjcm9zc0xpbmsgIkV2ZW50RGlzcGF0Y2hlci9vZmYifX17ey9jcm9zc0xpbmt9fSBtZXRob2QgaXMgbWVyZWx5IGFuIGFsaWFzIHRvDQoJICoge3sjY3Jvc3NMaW5rICJFdmVudERpc3BhdGNoZXIvcmVtb3ZlRXZlbnRMaXN0ZW5lciJ9fXt7L2Nyb3NzTGlua319Lg0KCSAqIA0KCSAqIEFub3RoZXIgYWRkaXRpb24gdG8gdGhlIERPTSBMZXZlbCAyIG1vZGVsIGlzIHRoZSB7eyNjcm9zc0xpbmsgIkV2ZW50RGlzcGF0Y2hlci9yZW1vdmVBbGxFdmVudExpc3RlbmVycyJ9fXt7L2Nyb3NzTGlua319DQoJICogbWV0aG9kLCB3aGljaCBjYW4gYmUgdXNlZCB0byBsaXN0ZW5lcnMgZm9yIGFsbCBldmVudHMsIG9yIGxpc3RlbmVycyBmb3IgYSBzcGVjaWZpYyBldmVudC4gVGhlIEV2ZW50IG9iamVjdCBhbHNvIA0KCSAqIGluY2x1ZGVzIGEge3sjY3Jvc3NMaW5rICJFdmVudC9yZW1vdmUifX17ey9jcm9zc0xpbmt9fSBtZXRob2Qgd2hpY2ggcmVtb3ZlcyB0aGUgYWN0aXZlIGxpc3RlbmVyLg0KCSAqDQoJICogPGg0PkV4YW1wbGU8L2g0Pg0KCSAqIEFkZCBFdmVudERpc3BhdGNoZXIgY2FwYWJpbGl0aWVzIHRvIHRoZSAiTXlDbGFzcyIgY2xhc3MuDQoJICoNCgkgKiAgICAgIEV2ZW50RGlzcGF0Y2hlci5pbml0aWFsaXplKE15Q2xhc3MucHJvdG90eXBlKTsNCgkgKg0KCSAqIEFkZCBhbiBldmVudCAoc2VlIHt7I2Nyb3NzTGluayAiRXZlbnREaXNwYXRjaGVyL2FkZEV2ZW50TGlzdGVuZXIifX17ey9jcm9zc0xpbmt9fSkuDQoJICoNCgkgKiAgICAgIGluc3RhbmNlLmFkZEV2ZW50TGlzdGVuZXIoImV2ZW50TmFtZSIsIGhhbmRsZXJNZXRob2QpOw0KCSAqICAgICAgZnVuY3Rpb24gaGFuZGxlck1ldGhvZChldmVudCkgew0KCSAqICAgICAgICAgIGNvbnNvbGUubG9nKGV2ZW50LnRhcmdldCArICIgV2FzIENsaWNrZWQiKTsNCgkgKiAgICAgIH0NCgkgKg0KCSAqIDxiPk1haW50YWluaW5nIHByb3BlciBzY29wZTwvYj48YnIgLz4NCgkgKiBTY29wZSAoaWUuICJ0aGlzIikgY2FuIGJlIGJlIGEgY2hhbGxlbmdlIHdpdGggZXZlbnRzLiBVc2luZyB0aGUge3sjY3Jvc3NMaW5rICJFdmVudERpc3BhdGNoZXIvb24ifX17ey9jcm9zc0xpbmt9fQ0KCSAqIG1ldGhvZCB0byBzdWJzY3JpYmUgdG8gZXZlbnRzIHNpbXBsaWZpZXMgdGhpcy4NCgkgKg0KCSAqICAgICAgaW5zdGFuY2UuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCBmdW5jdGlvbihldmVudCkgew0KCSAqICAgICAgICAgIGNvbnNvbGUubG9nKGluc3RhbmNlID09IHRoaXMpOyAvLyBmYWxzZSwgc2NvcGUgaXMgYW1iaWd1b3VzLg0KCSAqICAgICAgfSk7DQoJICogICAgICANCgkgKiAgICAgIGluc3RhbmNlLm9uKCJjbGljayIsIGZ1bmN0aW9uKGV2ZW50KSB7DQoJICogICAgICAgICAgY29uc29sZS5sb2coaW5zdGFuY2UgPT0gdGhpcyk7IC8vIHRydWUsICJvbiIgdXNlcyBkaXNwYXRjaGVyIHNjb3BlIGJ5IGRlZmF1bHQuDQoJICogICAgICB9KTsNCgkgKiANCgkgKiBJZiB5b3Ugd2FudCB0byB1c2UgYWRkRXZlbnRMaXN0ZW5lciBpbnN0ZWFkLCB5b3UgbWF5IHdhbnQgdG8gdXNlIGZ1bmN0aW9uLmJpbmQoKSBvciBhIHNpbWlsYXIgcHJveHkgdG8gbWFuYWdlIHNjb3BlLg0KCSAqICAgICAgDQoJICoNCgkgKiBAY2xhc3MgRXZlbnREaXNwYXRjaGVyDQoJICogQGNvbnN0cnVjdG9yDQoJICoqLw0KCWZ1bmN0aW9uIEV2ZW50RGlzcGF0Y2hlcigpIHsNCgkNCgkNCgkvLyBwcml2YXRlIHByb3BlcnRpZXM6DQoJCS8qKg0KCQkgKiBAcHJvdGVjdGVkDQoJCSAqIEBwcm9wZXJ0eSBfbGlzdGVuZXJzDQoJCSAqIEB0eXBlIE9iamVjdA0KCQkgKiovDQoJCXRoaXMuX2xpc3RlbmVycyA9IG51bGw7DQoJCQ0KCQkvKioNCgkJICogQHByb3RlY3RlZA0KCQkgKiBAcHJvcGVydHkgX2NhcHR1cmVMaXN0ZW5lcnMNCgkJICogQHR5cGUgT2JqZWN0DQoJCSAqKi8NCgkJdGhpcy5fY2FwdHVyZUxpc3RlbmVycyA9IG51bGw7DQoJfQ0KCXZhciBwID0gRXZlbnREaXNwYXRjaGVyLnByb3RvdHlwZTsNCg0KCS8qKg0KCSAqIDxzdHJvbmc+UkVNT1ZFRDwvc3Ryb25nPi4gUmVtb3ZlZCBpbiBmYXZvciBvZiB1c2luZyBgTXlTdXBlckNsYXNzX2NvbnN0cnVjdG9yYC4NCgkgKiBTZWUge3sjY3Jvc3NMaW5rICJVdGlsaXR5IE1ldGhvZHMvZXh0ZW5kIn19e3svY3Jvc3NMaW5rfX0gYW5kIHt7I2Nyb3NzTGluayAiVXRpbGl0eSBNZXRob2RzL3Byb21vdGUifX17ey9jcm9zc0xpbmt9fQ0KCSAqIGZvciBkZXRhaWxzLg0KCSAqDQoJICogVGhlcmUgaXMgYW4gaW5oZXJpdGFuY2UgdHV0b3JpYWwgZGlzdHJpYnV0ZWQgd2l0aCBFYXNlbEpTIGluIC90dXRvcmlhbHMvSW5oZXJpdGFuY2UuDQoJICoNCgkgKiBAbWV0aG9kIGluaXRpYWxpemUNCgkgKiBAcHJvdGVjdGVkDQoJICogQGRlcHJlY2F0ZWQNCgkgKi8NCgkvLyBwLmluaXRpYWxpemUgPSBmdW5jdGlvbigpIHt9OyAvLyBzZWFyY2hhYmxlIGZvciBkZXZzIHdvbmRlcmluZyB3aGVyZSBpdCBpcy4NCg0KDQovLyBzdGF0aWMgcHVibGljIG1ldGhvZHM6DQoJLyoqDQoJICogU3RhdGljIGluaXRpYWxpemVyIHRvIG1peCBFdmVudERpc3BhdGNoZXIgbWV0aG9kcyBpbnRvIGEgdGFyZ2V0IG9iamVjdCBvciBwcm90b3R5cGUuDQoJICogDQoJICogCQlFdmVudERpc3BhdGNoZXIuaW5pdGlhbGl6ZShNeUNsYXNzLnByb3RvdHlwZSk7IC8vIGFkZCB0byB0aGUgcHJvdG90eXBlIG9mIHRoZSBjbGFzcw0KCSAqIAkJRXZlbnREaXNwYXRjaGVyLmluaXRpYWxpemUobXlPYmplY3QpOyAvLyBhZGQgdG8gYSBzcGVjaWZpYyBpbnN0YW5jZQ0KCSAqIA0KCSAqIEBtZXRob2QgaW5pdGlhbGl6ZQ0KCSAqIEBzdGF0aWMNCgkgKiBAcGFyYW0ge09iamVjdH0gdGFyZ2V0IFRoZSB0YXJnZXQgb2JqZWN0IHRvIGluamVjdCBFdmVudERpc3BhdGNoZXIgbWV0aG9kcyBpbnRvLiBUaGlzIGNhbiBiZSBhbiBpbnN0YW5jZSBvciBhDQoJICogcHJvdG90eXBlLg0KCSAqKi8NCglFdmVudERpc3BhdGNoZXIuaW5pdGlhbGl6ZSA9IGZ1bmN0aW9uKHRhcmdldCkgew0KCQl0YXJnZXQuYWRkRXZlbnRMaXN0ZW5lciA9IHAuYWRkRXZlbnRMaXN0ZW5lcjsNCgkJdGFyZ2V0Lm9uID0gcC5vbjsNCgkJdGFyZ2V0LnJlbW92ZUV2ZW50TGlzdGVuZXIgPSB0YXJnZXQub2ZmID0gIHAucmVtb3ZlRXZlbnRMaXN0ZW5lcjsNCgkJdGFyZ2V0LnJlbW92ZUFsbEV2ZW50TGlzdGVuZXJzID0gcC5yZW1vdmVBbGxFdmVudExpc3RlbmVyczsNCgkJdGFyZ2V0Lmhhc0V2ZW50TGlzdGVuZXIgPSBwLmhhc0V2ZW50TGlzdGVuZXI7DQoJCXRhcmdldC5kaXNwYXRjaEV2ZW50ID0gcC5kaXNwYXRjaEV2ZW50Ow0KCQl0YXJnZXQuX2Rpc3BhdGNoRXZlbnQgPSBwLl9kaXNwYXRjaEV2ZW50Ow0KCQl0YXJnZXQud2lsbFRyaWdnZXIgPSBwLndpbGxUcmlnZ2VyOw0KCX07DQoJDQoNCi8vIHB1YmxpYyBtZXRob2RzOg0KCS8qKg0KCSAqIEFkZHMgdGhlIHNwZWNpZmllZCBldmVudCBsaXN0ZW5lci4gTm90ZSB0aGF0IGFkZGluZyBtdWx0aXBsZSBsaXN0ZW5lcnMgdG8gdGhlIHNhbWUgZnVuY3Rpb24gd2lsbCByZXN1bHQgaW4NCgkgKiBtdWx0aXBsZSBjYWxsYmFja3MgZ2V0dGluZyBmaXJlZC4NCgkgKg0KCSAqIDxoND5FeGFtcGxlPC9oND4NCgkgKg0KCSAqICAgICAgZGlzcGxheU9iamVjdC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsIGhhbmRsZUNsaWNrKTsNCgkgKiAgICAgIGZ1bmN0aW9uIGhhbmRsZUNsaWNrKGV2ZW50KSB7DQoJICogICAgICAgICAvLyBDbGljayBoYXBwZW5lZC4NCgkgKiAgICAgIH0NCgkgKg0KCSAqIEBtZXRob2QgYWRkRXZlbnRMaXN0ZW5lcg0KCSAqIEBwYXJhbSB7U3RyaW5nfSB0eXBlIFRoZSBzdHJpbmcgdHlwZSBvZiB0aGUgZXZlbnQuDQoJICogQHBhcmFtIHtGdW5jdGlvbiB8IE9iamVjdH0gbGlzdGVuZXIgQW4gb2JqZWN0IHdpdGggYSBoYW5kbGVFdmVudCBtZXRob2QsIG9yIGEgZnVuY3Rpb24gdGhhdCB3aWxsIGJlIGNhbGxlZCB3aGVuDQoJICogdGhlIGV2ZW50IGlzIGRpc3BhdGNoZWQuDQoJICogQHBhcmFtIHtCb29sZWFufSBbdXNlQ2FwdHVyZV0gRm9yIGV2ZW50cyB0aGF0IGJ1YmJsZSwgaW5kaWNhdGVzIHdoZXRoZXIgdG8gbGlzdGVuIGZvciB0aGUgZXZlbnQgaW4gdGhlIGNhcHR1cmUgb3IgYnViYmxpbmcvdGFyZ2V0IHBoYXNlLg0KCSAqIEByZXR1cm4ge0Z1bmN0aW9uIHwgT2JqZWN0fSBSZXR1cm5zIHRoZSBsaXN0ZW5lciBmb3IgY2hhaW5pbmcgb3IgYXNzaWdubWVudC4NCgkgKiovDQoJcC5hZGRFdmVudExpc3RlbmVyID0gZnVuY3Rpb24odHlwZSwgbGlzdGVuZXIsIHVzZUNhcHR1cmUpIHsNCgkJdmFyIGxpc3RlbmVyczsNCgkJaWYgKHVzZUNhcHR1cmUpIHsNCgkJCWxpc3RlbmVycyA9IHRoaXMuX2NhcHR1cmVMaXN0ZW5lcnMgPSB0aGlzLl9jYXB0dXJlTGlzdGVuZXJzfHx7fTsNCgkJfSBlbHNlIHsNCgkJCWxpc3RlbmVycyA9IHRoaXMuX2xpc3RlbmVycyA9IHRoaXMuX2xpc3RlbmVyc3x8e307DQoJCX0NCgkJdmFyIGFyciA9IGxpc3RlbmVyc1t0eXBlXTsNCgkJaWYgKGFycikgeyB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIodHlwZSwgbGlzdGVuZXIsIHVzZUNhcHR1cmUpOyB9DQoJCWFyciA9IGxpc3RlbmVyc1t0eXBlXTsgLy8gcmVtb3ZlIG1heSBoYXZlIGRlbGV0ZWQgdGhlIGFycmF5DQoJCWlmICghYXJyKSB7IGxpc3RlbmVyc1t0eXBlXSA9IFtsaXN0ZW5lcl07ICB9DQoJCWVsc2UgeyBhcnIucHVzaChsaXN0ZW5lcik7IH0NCgkJcmV0dXJuIGxpc3RlbmVyOw0KCX07DQoJDQoJLyoqDQoJICogQSBzaG9ydGN1dCBtZXRob2QgZm9yIHVzaW5nIGFkZEV2ZW50TGlzdGVuZXIgdGhhdCBtYWtlcyBpdCBlYXNpZXIgdG8gc3BlY2lmeSBhbiBleGVjdXRpb24gc2NvcGUsIGhhdmUgYSBsaXN0ZW5lcg0KCSAqIG9ubHkgcnVuIG9uY2UsIGFzc29jaWF0ZSBhcmJpdHJhcnkgZGF0YSB3aXRoIHRoZSBsaXN0ZW5lciwgYW5kIHJlbW92ZSB0aGUgbGlzdGVuZXIuDQoJICogDQoJICogVGhpcyBtZXRob2Qgd29ya3MgYnkgY3JlYXRpbmcgYW4gYW5vbnltb3VzIHdyYXBwZXIgZnVuY3Rpb24gYW5kIHN1YnNjcmliaW5nIGl0IHdpdGggYWRkRXZlbnRMaXN0ZW5lci4NCgkgKiBUaGUgY3JlYXRlZCBhbm9ueW1vdXMgZnVuY3Rpb24gaXMgcmV0dXJuZWQgZm9yIHVzZSB3aXRoIC5yZW1vdmVFdmVudExpc3RlbmVyIChvciAub2ZmKS4NCgkgKiANCgkgKiA8aDQ+RXhhbXBsZTwvaDQ+DQoJICogDQoJICogCQl2YXIgbGlzdGVuZXIgPSBteUJ0bi5vbigiY2xpY2siLCBoYW5kbGVDbGljaywgbnVsbCwgZmFsc2UsIHtjb3VudDozfSk7DQoJICogCQlmdW5jdGlvbiBoYW5kbGVDbGljayhldnQsIGRhdGEpIHsNCgkgKiAJCQlkYXRhLmNvdW50IC09IDE7DQoJICogCQkJY29uc29sZS5sb2codGhpcyA9PSBteUJ0bik7IC8vIHRydWUgLSBzY29wZSBkZWZhdWx0cyB0byB0aGUgZGlzcGF0Y2hlcg0KCSAqIAkJCWlmIChkYXRhLmNvdW50ID09IDApIHsNCgkgKiAJCQkJYWxlcnQoImNsaWNrZWQgMyB0aW1lcyEiKTsNCgkgKiAJCQkJbXlCdG4ub2ZmKCJjbGljayIsIGxpc3RlbmVyKTsNCgkgKiAJCQkJLy8gYWx0ZXJuYXRlbHk6IGV2dC5yZW1vdmUoKTsNCgkgKiAJCQl9DQoJICogCQl9DQoJICogDQoJICogQG1ldGhvZCBvbg0KCSAqIEBwYXJhbSB7U3RyaW5nfSB0eXBlIFRoZSBzdHJpbmcgdHlwZSBvZiB0aGUgZXZlbnQuDQoJICogQHBhcmFtIHtGdW5jdGlvbiB8IE9iamVjdH0gbGlzdGVuZXIgQW4gb2JqZWN0IHdpdGggYSBoYW5kbGVFdmVudCBtZXRob2QsIG9yIGEgZnVuY3Rpb24gdGhhdCB3aWxsIGJlIGNhbGxlZCB3aGVuDQoJICogdGhlIGV2ZW50IGlzIGRpc3BhdGNoZWQuDQoJICogQHBhcmFtIHtPYmplY3R9IFtzY29wZV0gVGhlIHNjb3BlIHRvIGV4ZWN1dGUgdGhlIGxpc3RlbmVyIGluLiBEZWZhdWx0cyB0byB0aGUgZGlzcGF0Y2hlci9jdXJyZW50VGFyZ2V0IGZvciBmdW5jdGlvbiBsaXN0ZW5lcnMsIGFuZCB0byB0aGUgbGlzdGVuZXIgaXRzZWxmIGZvciBvYmplY3QgbGlzdGVuZXJzIChpZS4gdXNpbmcgaGFuZGxlRXZlbnQpLg0KCSAqIEBwYXJhbSB7Qm9vbGVhbn0gW29uY2U9ZmFsc2VdIElmIHRydWUsIHRoZSBsaXN0ZW5lciB3aWxsIHJlbW92ZSBpdHNlbGYgYWZ0ZXIgdGhlIGZpcnN0IHRpbWUgaXQgaXMgdHJpZ2dlcmVkLg0KCSAqIEBwYXJhbSB7Kn0gW2RhdGFdIEFyYml0cmFyeSBkYXRhIHRoYXQgd2lsbCBiZSBpbmNsdWRlZCBhcyB0aGUgc2Vjb25kIHBhcmFtZXRlciB3aGVuIHRoZSBsaXN0ZW5lciBpcyBjYWxsZWQuDQoJICogQHBhcmFtIHtCb29sZWFufSBbdXNlQ2FwdHVyZT1mYWxzZV0gRm9yIGV2ZW50cyB0aGF0IGJ1YmJsZSwgaW5kaWNhdGVzIHdoZXRoZXIgdG8gbGlzdGVuIGZvciB0aGUgZXZlbnQgaW4gdGhlIGNhcHR1cmUgb3IgYnViYmxpbmcvdGFyZ2V0IHBoYXNlLg0KCSAqIEByZXR1cm4ge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBhbm9ueW1vdXMgZnVuY3Rpb24gdGhhdCB3YXMgY3JlYXRlZCBhbmQgYXNzaWduZWQgYXMgdGhlIGxpc3RlbmVyLiBUaGlzIGlzIG5lZWRlZCB0byByZW1vdmUgdGhlIGxpc3RlbmVyIGxhdGVyIHVzaW5nIC5yZW1vdmVFdmVudExpc3RlbmVyLg0KCSAqKi8NCglwLm9uID0gZnVuY3Rpb24odHlwZSwgbGlzdGVuZXIsIHNjb3BlLCBvbmNlLCBkYXRhLCB1c2VDYXB0dXJlKSB7DQoJCWlmIChsaXN0ZW5lci5oYW5kbGVFdmVudCkgew0KCQkJc2NvcGUgPSBzY29wZXx8bGlzdGVuZXI7DQoJCQlsaXN0ZW5lciA9IGxpc3RlbmVyLmhhbmRsZUV2ZW50Ow0KCQl9DQoJCXNjb3BlID0gc2NvcGV8fHRoaXM7DQoJCXJldHVybiB0aGlzLmFkZEV2ZW50TGlzdGVuZXIodHlwZSwgZnVuY3Rpb24oZXZ0KSB7DQoJCQkJbGlzdGVuZXIuY2FsbChzY29wZSwgZXZ0LCBkYXRhKTsNCgkJCQlvbmNlJiZldnQucmVtb3ZlKCk7DQoJCQl9LCB1c2VDYXB0dXJlKTsNCgl9Ow0KDQoJLyoqDQoJICogUmVtb3ZlcyB0aGUgc3BlY2lmaWVkIGV2ZW50IGxpc3RlbmVyLg0KCSAqDQoJICogPGI+SW1wb3J0YW50IE5vdGU6PC9iPiB0aGF0IHlvdSBtdXN0IHBhc3MgdGhlIGV4YWN0IGZ1bmN0aW9uIHJlZmVyZW5jZSB1c2VkIHdoZW4gdGhlIGV2ZW50IHdhcyBhZGRlZC4gSWYgYSBwcm94eQ0KCSAqIGZ1bmN0aW9uLCBvciBmdW5jdGlvbiBjbG9zdXJlIGlzIHVzZWQgYXMgdGhlIGNhbGxiYWNrLCB0aGUgcHJveHkvY2xvc3VyZSByZWZlcmVuY2UgbXVzdCBiZSB1c2VkIC0gYSBuZXcgcHJveHkgb3INCgkgKiBjbG9zdXJlIHdpbGwgbm90IHdvcmsuDQoJICoNCgkgKiA8aDQ+RXhhbXBsZTwvaDQ+DQoJICoNCgkgKiAgICAgIGRpc3BsYXlPYmplY3QucmVtb3ZlRXZlbnRMaXN0ZW5lcigiY2xpY2siLCBoYW5kbGVDbGljayk7DQoJICoNCgkgKiBAbWV0aG9kIHJlbW92ZUV2ZW50TGlzdGVuZXINCgkgKiBAcGFyYW0ge1N0cmluZ30gdHlwZSBUaGUgc3RyaW5nIHR5cGUgb2YgdGhlIGV2ZW50Lg0KCSAqIEBwYXJhbSB7RnVuY3Rpb24gfCBPYmplY3R9IGxpc3RlbmVyIFRoZSBsaXN0ZW5lciBmdW5jdGlvbiBvciBvYmplY3QuDQoJICogQHBhcmFtIHtCb29sZWFufSBbdXNlQ2FwdHVyZV0gRm9yIGV2ZW50cyB0aGF0IGJ1YmJsZSwgaW5kaWNhdGVzIHdoZXRoZXIgdG8gbGlzdGVuIGZvciB0aGUgZXZlbnQgaW4gdGhlIGNhcHR1cmUgb3IgYnViYmxpbmcvdGFyZ2V0IHBoYXNlLg0KCSAqKi8NCglwLnJlbW92ZUV2ZW50TGlzdGVuZXIgPSBmdW5jdGlvbih0eXBlLCBsaXN0ZW5lciwgdXNlQ2FwdHVyZSkgew0KCQl2YXIgbGlzdGVuZXJzID0gdXNlQ2FwdHVyZSA/IHRoaXMuX2NhcHR1cmVMaXN0ZW5lcnMgOiB0aGlzLl9saXN0ZW5lcnM7DQoJCWlmICghbGlzdGVuZXJzKSB7IHJldHVybjsgfQ0KCQl2YXIgYXJyID0gbGlzdGVuZXJzW3R5cGVdOw0KCQlpZiAoIWFycikgeyByZXR1cm47IH0NCgkJZm9yICh2YXIgaT0wLGw9YXJyLmxlbmd0aDsgaTxsOyBpKyspIHsNCgkJCWlmIChhcnJbaV0gPT0gbGlzdGVuZXIpIHsNCgkJCQlpZiAobD09MSkgeyBkZWxldGUobGlzdGVuZXJzW3R5cGVdKTsgfSAvLyBhbGxvd3MgZm9yIGZhc3RlciBjaGVja3MuDQoJCQkJZWxzZSB7IGFyci5zcGxpY2UoaSwxKTsgfQ0KCQkJCWJyZWFrOw0KCQkJfQ0KCQl9DQoJfTsNCgkNCgkvKioNCgkgKiBBIHNob3J0Y3V0IHRvIHRoZSByZW1vdmVFdmVudExpc3RlbmVyIG1ldGhvZCwgd2l0aCB0aGUgc2FtZSBwYXJhbWV0ZXJzIGFuZCByZXR1cm4gdmFsdWUuIFRoaXMgaXMgYSBjb21wYW5pb24gdG8gdGhlDQoJICogLm9uIG1ldGhvZC4NCgkgKg0KCSAqIEBtZXRob2Qgb2ZmDQoJICogQHBhcmFtIHtTdHJpbmd9IHR5cGUgVGhlIHN0cmluZyB0eXBlIG9mIHRoZSBldmVudC4NCgkgKiBAcGFyYW0ge0Z1bmN0aW9uIHwgT2JqZWN0fSBsaXN0ZW5lciBUaGUgbGlzdGVuZXIgZnVuY3Rpb24gb3Igb2JqZWN0Lg0KCSAqIEBwYXJhbSB7Qm9vbGVhbn0gW3VzZUNhcHR1cmVdIEZvciBldmVudHMgdGhhdCBidWJibGUsIGluZGljYXRlcyB3aGV0aGVyIHRvIGxpc3RlbiBmb3IgdGhlIGV2ZW50IGluIHRoZSBjYXB0dXJlIG9yIGJ1YmJsaW5nL3RhcmdldCBwaGFzZS4NCgkgKiovDQoJcC5vZmYgPSBwLnJlbW92ZUV2ZW50TGlzdGVuZXI7DQoNCgkvKioNCgkgKiBSZW1vdmVzIGFsbCBsaXN0ZW5lcnMgZm9yIHRoZSBzcGVjaWZpZWQgdHlwZSwgb3IgYWxsIGxpc3RlbmVycyBvZiBhbGwgdHlwZXMuDQoJICoNCgkgKiA8aDQ+RXhhbXBsZTwvaDQ+DQoJICoNCgkgKiAgICAgIC8vIFJlbW92ZSBhbGwgbGlzdGVuZXJzDQoJICogICAgICBkaXNwbGF5T2JqZWN0LnJlbW92ZUFsbEV2ZW50TGlzdGVuZXJzKCk7DQoJICoNCgkgKiAgICAgIC8vIFJlbW92ZSBhbGwgY2xpY2sgbGlzdGVuZXJzDQoJICogICAgICBkaXNwbGF5T2JqZWN0LnJlbW92ZUFsbEV2ZW50TGlzdGVuZXJzKCJjbGljayIpOw0KCSAqDQoJICogQG1ldGhvZCByZW1vdmVBbGxFdmVudExpc3RlbmVycw0KCSAqIEBwYXJhbSB7U3RyaW5nfSBbdHlwZV0gVGhlIHN0cmluZyB0eXBlIG9mIHRoZSBldmVudC4gSWYgb21pdHRlZCwgYWxsIGxpc3RlbmVycyBmb3IgYWxsIHR5cGVzIHdpbGwgYmUgcmVtb3ZlZC4NCgkgKiovDQoJcC5yZW1vdmVBbGxFdmVudExpc3RlbmVycyA9IGZ1bmN0aW9uKHR5cGUpIHsNCgkJaWYgKCF0eXBlKSB7IHRoaXMuX2xpc3RlbmVycyA9IHRoaXMuX2NhcHR1cmVMaXN0ZW5lcnMgPSBudWxsOyB9DQoJCWVsc2Ugew0KCQkJaWYgKHRoaXMuX2xpc3RlbmVycykgeyBkZWxldGUodGhpcy5fbGlzdGVuZXJzW3R5cGVdKTsgfQ0KCQkJaWYgKHRoaXMuX2NhcHR1cmVMaXN0ZW5lcnMpIHsgZGVsZXRlKHRoaXMuX2NhcHR1cmVMaXN0ZW5lcnNbdHlwZV0pOyB9DQoJCX0NCgl9Ow0KDQoJLyoqDQoJICogRGlzcGF0Y2hlcyB0aGUgc3BlY2lmaWVkIGV2ZW50IHRvIGFsbCBsaXN0ZW5lcnMuDQoJICoNCgkgKiA8aDQ+RXhhbXBsZTwvaDQ+DQoJICoNCgkgKiAgICAgIC8vIFVzZSBhIHN0cmluZyBldmVudA0KCSAqICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KCJjb21wbGV0ZSIpOw0KCSAqDQoJICogICAgICAvLyBVc2UgYW4gRXZlbnQgaW5zdGFuY2UNCgkgKiAgICAgIHZhciBldmVudCA9IG5ldyBjcmVhdGVqcy5FdmVudCgicHJvZ3Jlc3MiKTsNCgkgKiAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChldmVudCk7DQoJICoNCgkgKiBAbWV0aG9kIGRpc3BhdGNoRXZlbnQNCgkgKiBAcGFyYW0ge09iamVjdCB8IFN0cmluZyB8IEV2ZW50fSBldmVudE9iaiBBbiBvYmplY3Qgd2l0aCBhICJ0eXBlIiBwcm9wZXJ0eSwgb3IgYSBzdHJpbmcgdHlwZS4NCgkgKiBXaGlsZSBhIGdlbmVyaWMgb2JqZWN0IHdpbGwgd29yaywgaXQgaXMgcmVjb21tZW5kZWQgdG8gdXNlIGEgQ3JlYXRlSlMgRXZlbnQgaW5zdGFuY2UuIElmIGEgc3RyaW5nIGlzIHVzZWQsDQoJICogZGlzcGF0Y2hFdmVudCB3aWxsIGNvbnN0cnVjdCBhbiBFdmVudCBpbnN0YW5jZSB3aXRoIHRoZSBzcGVjaWZpZWQgdHlwZS4NCgkgKiBAcmV0dXJuIHtCb29sZWFufSBSZXR1cm5zIHRoZSB2YWx1ZSBvZiBldmVudE9iai5kZWZhdWx0UHJldmVudGVkLg0KCSAqKi8NCglwLmRpc3BhdGNoRXZlbnQgPSBmdW5jdGlvbihldmVudE9iaikgew0KCQlpZiAodHlwZW9mIGV2ZW50T2JqID09ICJzdHJpbmciKSB7DQoJCQkvLyB3b24ndCBidWJibGUsIHNvIHNraXAgZXZlcnl0aGluZyBpZiB0aGVyZSdzIG5vIGxpc3RlbmVyczoNCgkJCXZhciBsaXN0ZW5lcnMgPSB0aGlzLl9saXN0ZW5lcnM7DQoJCQlpZiAoIWxpc3RlbmVycyB8fCAhbGlzdGVuZXJzW2V2ZW50T2JqXSkgeyByZXR1cm4gZmFsc2U7IH0NCgkJCWV2ZW50T2JqID0gbmV3IGNyZWF0ZWpzLkV2ZW50KGV2ZW50T2JqKTsNCgkJfSBlbHNlIGlmIChldmVudE9iai50YXJnZXQgJiYgZXZlbnRPYmouY2xvbmUpIHsNCgkJCS8vIHJlZGlzcGF0Y2hpbmcgYW4gYWN0aXZlIGV2ZW50IG9iamVjdCwgc28gY2xvbmUgaXQ6DQoJCQlldmVudE9iaiA9IGV2ZW50T2JqLmNsb25lKCk7DQoJCX0NCgkJdHJ5IHsgZXZlbnRPYmoudGFyZ2V0ID0gdGhpczsgfSBjYXRjaCAoZSkge30gLy8gdHJ5L2NhdGNoIGFsbG93cyByZWRpc3BhdGNoaW5nIG9mIG5hdGl2ZSBldmVudHMNCg0KCQlpZiAoIWV2ZW50T2JqLmJ1YmJsZXMgfHwgIXRoaXMucGFyZW50KSB7DQoJCQl0aGlzLl9kaXNwYXRjaEV2ZW50KGV2ZW50T2JqLCAyKTsNCgkJfSBlbHNlIHsNCgkJCXZhciB0b3A9dGhpcywgbGlzdD1bdG9wXTsNCgkJCXdoaWxlICh0b3AucGFyZW50KSB7IGxpc3QucHVzaCh0b3AgPSB0b3AucGFyZW50KTsgfQ0KCQkJdmFyIGksIGw9bGlzdC5sZW5ndGg7DQoNCgkJCS8vIGNhcHR1cmUgJiBhdFRhcmdldA0KCQkJZm9yIChpPWwtMTsgaT49MCAmJiAhZXZlbnRPYmoucHJvcGFnYXRpb25TdG9wcGVkOyBpLS0pIHsNCgkJCQlsaXN0W2ldLl9kaXNwYXRjaEV2ZW50KGV2ZW50T2JqLCAxKyhpPT0wKSk7DQoJCQl9DQoJCQkvLyBidWJibGluZw0KCQkJZm9yIChpPTE7IGk8bCAmJiAhZXZlbnRPYmoucHJvcGFnYXRpb25TdG9wcGVkOyBpKyspIHsNCgkJCQlsaXN0W2ldLl9kaXNwYXRjaEV2ZW50KGV2ZW50T2JqLCAzKTsNCgkJCX0NCgkJfQ0KCQlyZXR1cm4gZXZlbnRPYmouZGVmYXVsdFByZXZlbnRlZDsNCgl9Ow0KDQoJLyoqDQoJICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlcmUgaXMgYXQgbGVhc3Qgb25lIGxpc3RlbmVyIGZvciB0aGUgc3BlY2lmaWVkIGV2ZW50IHR5cGUuDQoJICogQG1ldGhvZCBoYXNFdmVudExpc3RlbmVyDQoJICogQHBhcmFtIHtTdHJpbmd9IHR5cGUgVGhlIHN0cmluZyB0eXBlIG9mIHRoZSBldmVudC4NCgkgKiBAcmV0dXJuIHtCb29sZWFufSBSZXR1cm5zIHRydWUgaWYgdGhlcmUgaXMgYXQgbGVhc3Qgb25lIGxpc3RlbmVyIGZvciB0aGUgc3BlY2lmaWVkIGV2ZW50Lg0KCSAqKi8NCglwLmhhc0V2ZW50TGlzdGVuZXIgPSBmdW5jdGlvbih0eXBlKSB7DQoJCXZhciBsaXN0ZW5lcnMgPSB0aGlzLl9saXN0ZW5lcnMsIGNhcHR1cmVMaXN0ZW5lcnMgPSB0aGlzLl9jYXB0dXJlTGlzdGVuZXJzOw0KCQlyZXR1cm4gISEoKGxpc3RlbmVycyAmJiBsaXN0ZW5lcnNbdHlwZV0pIHx8IChjYXB0dXJlTGlzdGVuZXJzICYmIGNhcHR1cmVMaXN0ZW5lcnNbdHlwZV0pKTsNCgl9Ow0KCQ0KCS8qKg0KCSAqIEluZGljYXRlcyB3aGV0aGVyIHRoZXJlIGlzIGF0IGxlYXN0IG9uZSBsaXN0ZW5lciBmb3IgdGhlIHNwZWNpZmllZCBldmVudCB0eXBlIG9uIHRoaXMgb2JqZWN0IG9yIGFueSBvZiBpdHMNCgkgKiBhbmNlc3RvcnMgKHBhcmVudCwgcGFyZW50J3MgcGFyZW50LCBldGMpLiBBIHJldHVybiB2YWx1ZSBvZiB0cnVlIGluZGljYXRlcyB0aGF0IGlmIGEgYnViYmxpbmcgZXZlbnQgb2YgdGhlDQoJICogc3BlY2lmaWVkIHR5cGUgaXMgZGlzcGF0Y2hlZCBmcm9tIHRoaXMgb2JqZWN0LCBpdCB3aWxsIHRyaWdnZXIgYXQgbGVhc3Qgb25lIGxpc3RlbmVyLg0KCSAqIA0KCSAqIFRoaXMgaXMgc2ltaWxhciB0byB7eyNjcm9zc0xpbmsgIkV2ZW50RGlzcGF0Y2hlci9oYXNFdmVudExpc3RlbmVyIn19e3svY3Jvc3NMaW5rfX0sIGJ1dCBpdCBzZWFyY2hlcyB0aGUgZW50aXJlDQoJICogZXZlbnQgZmxvdyBmb3IgYSBsaXN0ZW5lciwgbm90IGp1c3QgdGhpcyBvYmplY3QuDQoJICogQG1ldGhvZCB3aWxsVHJpZ2dlcg0KCSAqIEBwYXJhbSB7U3RyaW5nfSB0eXBlIFRoZSBzdHJpbmcgdHlwZSBvZiB0aGUgZXZlbnQuDQoJICogQHJldHVybiB7Qm9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlcmUgaXMgYXQgbGVhc3Qgb25lIGxpc3RlbmVyIGZvciB0aGUgc3BlY2lmaWVkIGV2ZW50Lg0KCSAqKi8NCglwLndpbGxUcmlnZ2VyID0gZnVuY3Rpb24odHlwZSkgew0KCQl2YXIgbyA9IHRoaXM7DQoJCXdoaWxlIChvKSB7DQoJCQlpZiAoby5oYXNFdmVudExpc3RlbmVyKHR5cGUpKSB7IHJldHVybiB0cnVlOyB9DQoJCQlvID0gby5wYXJlbnQ7DQoJCX0NCgkJcmV0dXJuIGZhbHNlOw0KCX07DQoNCgkvKioNCgkgKiBAbWV0aG9kIHRvU3RyaW5nDQoJICogQHJldHVybiB7U3RyaW5nfSBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgaW5zdGFuY2UuDQoJICoqLw0KCXAudG9TdHJpbmcgPSBmdW5jdGlvbigpIHsNCgkJcmV0dXJuICJbRXZlbnREaXNwYXRjaGVyXSI7DQoJfTsNCg0KDQovLyBwcml2YXRlIG1ldGhvZHM6DQoJLyoqDQoJICogQG1ldGhvZCBfZGlzcGF0Y2hFdmVudA0KCSAqIEBwYXJhbSB7T2JqZWN0IHwgU3RyaW5nIHwgRXZlbnR9IGV2ZW50T2JqDQoJICogQHBhcmFtIHtPYmplY3R9IGV2ZW50UGhhc2UNCgkgKiBAcHJvdGVjdGVkDQoJICoqLw0KCXAuX2Rpc3BhdGNoRXZlbnQgPSBmdW5jdGlvbihldmVudE9iaiwgZXZlbnRQaGFzZSkgew0KCQl2YXIgbCwgbGlzdGVuZXJzID0gKGV2ZW50UGhhc2U9PTEpID8gdGhpcy5fY2FwdHVyZUxpc3RlbmVycyA6IHRoaXMuX2xpc3RlbmVyczsNCgkJaWYgKGV2ZW50T2JqICYmIGxpc3RlbmVycykgew0KCQkJdmFyIGFyciA9IGxpc3RlbmVyc1tldmVudE9iai50eXBlXTsNCgkJCWlmICghYXJyfHwhKGw9YXJyLmxlbmd0aCkpIHsgcmV0dXJuOyB9DQoJCQl0cnkgeyBldmVudE9iai5jdXJyZW50VGFyZ2V0ID0gdGhpczsgfSBjYXRjaCAoZSkge30NCgkJCXRyeSB7IGV2ZW50T2JqLmV2ZW50UGhhc2UgPSBldmVudFBoYXNlOyB9IGNhdGNoIChlKSB7fQ0KCQkJZXZlbnRPYmoucmVtb3ZlZCA9IGZhbHNlOw0KCQkJDQoJCQlhcnIgPSBhcnIuc2xpY2UoKTsgLy8gdG8gYXZvaWQgaXNzdWVzIHdpdGggaXRlbXMgYmVpbmcgcmVtb3ZlZCBvciBhZGRlZCBkdXJpbmcgdGhlIGRpc3BhdGNoDQoJCQlmb3IgKHZhciBpPTA7IGk8bCAmJiAhZXZlbnRPYmouaW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkOyBpKyspIHsNCgkJCQl2YXIgbyA9IGFycltpXTsNCgkJCQlpZiAoby5oYW5kbGVFdmVudCkgeyBvLmhhbmRsZUV2ZW50KGV2ZW50T2JqKTsgfQ0KCQkJCWVsc2UgeyBvKGV2ZW50T2JqKTsgfQ0KCQkJCWlmIChldmVudE9iai5yZW1vdmVkKSB7DQoJCQkJCXRoaXMub2ZmKGV2ZW50T2JqLnR5cGUsIG8sIGV2ZW50UGhhc2U9PTEpOw0KCQkJCQlldmVudE9iai5yZW1vdmVkID0gZmFsc2U7DQoJCQkJfQ0KCQkJfQ0KCQl9DQoJfTsNCg0KDQoJY3JlYXRlanMuRXZlbnREaXNwYXRjaGVyID0gRXZlbnREaXNwYXRjaGVyOw0KfSgpKTsKCi8vIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi8vIFByb2dyZXNzRXZlbnQuanMKLy8jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCnRoaXMuY3JlYXRlanMgPSB0aGlzLmNyZWF0ZWpzIHx8IHt9OwoKKGZ1bmN0aW9uIChzY29wZSkgewoJInVzZSBzdHJpY3QiOwoKCS8vIGNvbnN0cnVjdG9yCgkvKioKCSAqIEEgY3JlYXRlanMge3sjY3Jvc3NMaW5rICJFdmVudCJ9fXt7L2Nyb3NzTGlua319IHRoYXQgaXMgZGlzcGF0Y2hlZCB3aGVuIHByb2dyZXNzIGNoYW5nZXMuCgkgKiBAY2xhc3MgUHJvZ3Jlc3NFdmVudAoJICogQHBhcmFtIHtOdW1iZXJ9IGxvYWRlZCBUaGUgYW1vdW50IHRoYXQgaGFzIGJlZW4gbG9hZGVkLiBUaGlzIGNhbiBiZSBhbnkgbnVtYmVyIHJlbGF0aXZlIHRvIHRoZSB0b3RhbC4KCSAqIEBwYXJhbSB7TnVtYmVyfSBbdG90YWxdIFRoZSB0b3RhbCBhbW91bnQgdGhhdCB3aWxsIGxvYWQuIFRoaXMgd2lsbCBkZWZhdWx0IHRvIDAsIHNvIGRvZXMgbm90IG5lZWQgdG8gYmUgcGFzc2VkIGluLAoJICogYXMgbG9uZyBhcyB0aGUgbG9hZGVkIHZhbHVlIGlzIGEgcHJvZ3Jlc3MgdmFsdWUgKGJldHdlZW4gMCBhbmQgMSkuCgkgKiBAdG9kbyBDb25zaWRlciBoYXZpbmcgdGhpcyBldmVudCBiZSBhICJmaWxlcHJvZ3Jlc3MiIGV2ZW50IGFzIHdlbGwKCSAqIEBjb25zdHJ1Y3RvcgoJICovCglmdW5jdGlvbiBQcm9ncmVzc0V2ZW50KGxvYWRlZCwgdG90YWwpIHsKCQl0aGlzLkV2ZW50X2NvbnN0cnVjdG9yKCJwcm9ncmVzcyIpOwoKCQkvKioKCQkgKiBUaGUgYW1vdW50IHRoYXQgaGFzIGJlZW4gbG9hZGVkIChvdXQgb2YgYSB0b3RhbCBhbW91bnQpCgkJICogQHByb3BlcnR5IGxvYWRlZAoJCSAqIEB0eXBlIHtOdW1iZXJ9CgkJICovCgkJdGhpcy5sb2FkZWQgPSBsb2FkZWQ7CgoJCS8qKgoJCSAqIFRoZSB0b3RhbCAic2l6ZSIgb2YgdGhlIGxvYWQuCgkJICogQHByb3BlcnR5IHRvdGFsCgkJICogQHR5cGUge051bWJlcn0KCQkgKiBAZGVmYXVsdCAxCgkJICovCgkJdGhpcy50b3RhbCA9ICh0b3RhbCA9PSBudWxsKSA/IDEgOiB0b3RhbDsKCgkJLyoqCgkJICogVGhlIHBlcmNlbnRhZ2UgKG91dCBvZiAxKSB0aGF0IHRoZSBsb2FkIGhhcyBiZWVuIGNvbXBsZXRlZC4gVGhpcyBpcyBjYWxjdWxhdGVkIHVzaW5nIGBsb2FkZWQvdG90YWxgLgoJCSAqIEBwcm9wZXJ0eSBwcm9ncmVzcwoJCSAqIEB0eXBlIHtOdW1iZXJ9CgkJICogQGRlZmF1bHQgMAoJCSAqLwoJCXRoaXMucHJvZ3Jlc3MgPSAodG90YWwgPT0gMCkgPyAwIDogdGhpcy5sb2FkZWQgLyB0aGlzLnRvdGFsOwoJfTsKCgl2YXIgcCA9IGNyZWF0ZWpzLmV4dGVuZChQcm9ncmVzc0V2ZW50LCBjcmVhdGVqcy5FdmVudCk7CgoJLyoqCgkgKiBSZXR1cm5zIGEgY2xvbmUgb2YgdGhlIFByb2dyZXNzRXZlbnQgaW5zdGFuY2UuCgkgKiBAbWV0aG9kIGNsb25lCgkgKiBAcmV0dXJuIHtQcm9ncmVzc0V2ZW50fSBhIGNsb25lIG9mIHRoZSBFdmVudCBpbnN0YW5jZS4KCSAqKi8KCXAuY2xvbmUgPSBmdW5jdGlvbigpIHsKCQlyZXR1cm4gbmV3IGNyZWF0ZWpzLlByb2dyZXNzRXZlbnQodGhpcy5sb2FkZWQsIHRoaXMudG90YWwpOwoJfTsKCgljcmVhdGVqcy5Qcm9ncmVzc0V2ZW50ID0gY3JlYXRlanMucHJvbW90ZShQcm9ncmVzc0V2ZW50LCAiRXZlbnQiKTsKCn0od2luZG93KSk7CgovLyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwovLyBqc29uMy5qcwovLyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKLyohIEpTT04gdjMuMy4yIHwgaHR0cDovL2Jlc3RpZWpzLmdpdGh1Yi5pby9qc29uMyB8IENvcHlyaWdodCAyMDEyLTIwMTQsIEtpdCBDYW1icmlkZ2UgfCBodHRwOi8va2l0Lm1pdC1saWNlbnNlLm9yZyAqLwo7KGZ1bmN0aW9uICgpIHsKICAvLyBEZXRlY3QgdGhlIGBkZWZpbmVgIGZ1bmN0aW9uIGV4cG9zZWQgYnkgYXN5bmNocm9ub3VzIG1vZHVsZSBsb2FkZXJzLiBUaGUKICAvLyBzdHJpY3QgYGRlZmluZWAgY2hlY2sgaXMgbmVjZXNzYXJ5IGZvciBjb21wYXRpYmlsaXR5IHdpdGggYHIuanNgLgogIHZhciBpc0xvYWRlciA9IHR5cGVvZiBkZWZpbmUgPT09ICJmdW5jdGlvbiIgJiYgZGVmaW5lLmFtZDsKCiAgLy8gQSBzZXQgb2YgdHlwZXMgdXNlZCB0byBkaXN0aW5ndWlzaCBvYmplY3RzIGZyb20gcHJpbWl0aXZlcy4KICB2YXIgb2JqZWN0VHlwZXMgPSB7CiAgICAiZnVuY3Rpb24iOiB0cnVlLAogICAgIm9iamVjdCI6IHRydWUKICB9OwoKICAvLyBEZXRlY3QgdGhlIGBleHBvcnRzYCBvYmplY3QgZXhwb3NlZCBieSBDb21tb25KUyBpbXBsZW1lbnRhdGlvbnMuCiAgdmFyIGZyZWVFeHBvcnRzID0gb2JqZWN0VHlwZXNbdHlwZW9mIGV4cG9ydHNdICYmIGV4cG9ydHMgJiYgIWV4cG9ydHMubm9kZVR5cGUgJiYgZXhwb3J0czsKCiAgLy8gVXNlIHRoZSBgZ2xvYmFsYCBvYmplY3QgZXhwb3NlZCBieSBOb2RlIChpbmNsdWRpbmcgQnJvd3NlcmlmeSB2aWEKICAvLyBgaW5zZXJ0LW1vZHVsZS1nbG9iYWxzYCksIE5hcndoYWwsIGFuZCBSaW5nbyBhcyB0aGUgZGVmYXVsdCBjb250ZXh0LAogIC8vIGFuZCB0aGUgYHdpbmRvd2Agb2JqZWN0IGluIGJyb3dzZXJzLiBSaGlubyBleHBvcnRzIGEgYGdsb2JhbGAgZnVuY3Rpb24KICAvLyBpbnN0ZWFkLgogIHZhciByb290ID0gb2JqZWN0VHlwZXNbdHlwZW9mIHdpbmRvd10gJiYgd2luZG93IHx8IHRoaXMsCiAgICAgIGZyZWVHbG9iYWwgPSBmcmVlRXhwb3J0cyAmJiBvYmplY3RUeXBlc1t0eXBlb2YgbW9kdWxlXSAmJiBtb2R1bGUgJiYgIW1vZHVsZS5ub2RlVHlwZSAmJiB0eXBlb2YgZ2xvYmFsID09ICJvYmplY3QiICYmIGdsb2JhbDsKCiAgaWYgKGZyZWVHbG9iYWwgJiYgKGZyZWVHbG9iYWxbImdsb2JhbCJdID09PSBmcmVlR2xvYmFsIHx8IGZyZWVHbG9iYWxbIndpbmRvdyJdID09PSBmcmVlR2xvYmFsIHx8IGZyZWVHbG9iYWxbInNlbGYiXSA9PT0gZnJlZUdsb2JhbCkpIHsKICAgIHJvb3QgPSBmcmVlR2xvYmFsOwogIH0KCiAgLy8gUHVibGljOiBJbml0aWFsaXplcyBKU09OIDMgdXNpbmcgdGhlIGdpdmVuIGBjb250ZXh0YCBvYmplY3QsIGF0dGFjaGluZyB0aGUKICAvLyBgc3RyaW5naWZ5YCBhbmQgYHBhcnNlYCBmdW5jdGlvbnMgdG8gdGhlIHNwZWNpZmllZCBgZXhwb3J0c2Agb2JqZWN0LgogIGZ1bmN0aW9uIHJ1bkluQ29udGV4dChjb250ZXh0LCBleHBvcnRzKSB7CiAgICBjb250ZXh0IHx8IChjb250ZXh0ID0gcm9vdFsiT2JqZWN0Il0oKSk7CiAgICBleHBvcnRzIHx8IChleHBvcnRzID0gcm9vdFsiT2JqZWN0Il0oKSk7CgogICAgLy8gTmF0aXZlIGNvbnN0cnVjdG9yIGFsaWFzZXMuCiAgICB2YXIgTnVtYmVyID0gY29udGV4dFsiTnVtYmVyIl0gfHwgcm9vdFsiTnVtYmVyIl0sCiAgICAgICAgU3RyaW5nID0gY29udGV4dFsiU3RyaW5nIl0gfHwgcm9vdFsiU3RyaW5nIl0sCiAgICAgICAgT2JqZWN0ID0gY29udGV4dFsiT2JqZWN0Il0gfHwgcm9vdFsiT2JqZWN0Il0sCiAgICAgICAgRGF0ZSA9IGNvbnRleHRbIkRhdGUiXSB8fCByb290WyJEYXRlIl0sCiAgICAgICAgU3ludGF4RXJyb3IgPSBjb250ZXh0WyJTeW50YXhFcnJvciJdIHx8IHJvb3RbIlN5bnRheEVycm9yIl0sCiAgICAgICAgVHlwZUVycm9yID0gY29udGV4dFsiVHlwZUVycm9yIl0gfHwgcm9vdFsiVHlwZUVycm9yIl0sCiAgICAgICAgTWF0aCA9IGNvbnRleHRbIk1hdGgiXSB8fCByb290WyJNYXRoIl0sCiAgICAgICAgbmF0aXZlSlNPTiA9IGNvbnRleHRbIkpTT04iXSB8fCByb290WyJKU09OIl07CgogICAgLy8gRGVsZWdhdGUgdG8gdGhlIG5hdGl2ZSBgc3RyaW5naWZ5YCBhbmQgYHBhcnNlYCBpbXBsZW1lbnRhdGlvbnMuCiAgICBpZiAodHlwZW9mIG5hdGl2ZUpTT04gPT0gIm9iamVjdCIgJiYgbmF0aXZlSlNPTikgewogICAgICBleHBvcnRzLnN0cmluZ2lmeSA9IG5hdGl2ZUpTT04uc3RyaW5naWZ5OwogICAgICBleHBvcnRzLnBhcnNlID0gbmF0aXZlSlNPTi5wYXJzZTsKICAgIH0KCiAgICAvLyBDb252ZW5pZW5jZSBhbGlhc2VzLgogICAgdmFyIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZSwKICAgICAgICBnZXRDbGFzcyA9IG9iamVjdFByb3RvLnRvU3RyaW5nLAogICAgICAgIGlzUHJvcGVydHksIGZvckVhY2gsIHVuZGVmOwoKICAgIC8vIFRlc3QgdGhlIGBEYXRlI2dldFVUQypgIG1ldGhvZHMuIEJhc2VkIG9uIHdvcmsgYnkgQFlhZmZsZS4KICAgIHZhciBpc0V4dGVuZGVkID0gbmV3IERhdGUoLTM1MDk4MjczMzQ1NzMyOTIpOwogICAgdHJ5IHsKICAgICAgLy8gVGhlIGBnZXRVVENGdWxsWWVhcmAsIGBNb250aGAsIGFuZCBgRGF0ZWAgbWV0aG9kcyByZXR1cm4gbm9uc2Vuc2ljYWwKICAgICAgLy8gcmVzdWx0cyBmb3IgY2VydGFpbiBkYXRlcyBpbiBPcGVyYSA+PSAxMC41My4KICAgICAgaXNFeHRlbmRlZCA9IGlzRXh0ZW5kZWQuZ2V0VVRDRnVsbFllYXIoKSA9PSAtMTA5MjUyICYmIGlzRXh0ZW5kZWQuZ2V0VVRDTW9udGgoKSA9PT0gMCAmJiBpc0V4dGVuZGVkLmdldFVUQ0RhdGUoKSA9PT0gMSAmJgogICAgICAgIC8vIFNhZmFyaSA8IDIuMC4yIHN0b3JlcyB0aGUgaW50ZXJuYWwgbWlsbGlzZWNvbmQgdGltZSB2YWx1ZSBjb3JyZWN0bHksCiAgICAgICAgLy8gYnV0IGNsaXBzIHRoZSB2YWx1ZXMgcmV0dXJuZWQgYnkgdGhlIGRhdGUgbWV0aG9kcyB0byB0aGUgcmFuZ2Ugb2YKICAgICAgICAvLyBzaWduZWQgMzItYml0IGludGVnZXJzIChbLTIgKiogMzEsIDIgKiogMzEgLSAxXSkuCiAgICAgICAgaXNFeHRlbmRlZC5nZXRVVENIb3VycygpID09IDEwICYmIGlzRXh0ZW5kZWQuZ2V0VVRDTWludXRlcygpID09IDM3ICYmIGlzRXh0ZW5kZWQuZ2V0VVRDU2Vjb25kcygpID09IDYgJiYgaXNFeHRlbmRlZC5nZXRVVENNaWxsaXNlY29uZHMoKSA9PSA3MDg7CiAgICB9IGNhdGNoIChleGNlcHRpb24pIHt9CgogICAgLy8gSW50ZXJuYWw6IERldGVybWluZXMgd2hldGhlciB0aGUgbmF0aXZlIGBKU09OLnN0cmluZ2lmeWAgYW5kIGBwYXJzZWAKICAgIC8vIGltcGxlbWVudGF0aW9ucyBhcmUgc3BlYy1jb21wbGlhbnQuIEJhc2VkIG9uIHdvcmsgYnkgS2VuIFNueWRlci4KICAgIGZ1bmN0aW9uIGhhcyhuYW1lKSB7CiAgICAgIGlmIChoYXNbbmFtZV0gIT09IHVuZGVmKSB7CiAgICAgICAgLy8gUmV0dXJuIGNhY2hlZCBmZWF0dXJlIHRlc3QgcmVzdWx0LgogICAgICAgIHJldHVybiBoYXNbbmFtZV07CiAgICAgIH0KICAgICAgdmFyIGlzU3VwcG9ydGVkOwogICAgICBpZiAobmFtZSA9PSAiYnVnLXN0cmluZy1jaGFyLWluZGV4IikgewogICAgICAgIC8vIElFIDw9IDcgZG9lc24ndCBzdXBwb3J0IGFjY2Vzc2luZyBzdHJpbmcgY2hhcmFjdGVycyB1c2luZyBzcXVhcmUKICAgICAgICAvLyBicmFja2V0IG5vdGF0aW9uLiBJRSA4IG9ubHkgc3VwcG9ydHMgdGhpcyBmb3IgcHJpbWl0aXZlcy4KICAgICAgICBpc1N1cHBvcnRlZCA9ICJhIlswXSAhPSAiYSI7CiAgICAgIH0gZWxzZSBpZiAobmFtZSA9PSAianNvbiIpIHsKICAgICAgICAvLyBJbmRpY2F0ZXMgd2hldGhlciBib3RoIGBKU09OLnN0cmluZ2lmeWAgYW5kIGBKU09OLnBhcnNlYCBhcmUKICAgICAgICAvLyBzdXBwb3J0ZWQuCiAgICAgICAgaXNTdXBwb3J0ZWQgPSBoYXMoImpzb24tc3RyaW5naWZ5IikgJiYgaGFzKCJqc29uLXBhcnNlIik7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdmFyIHZhbHVlLCBzZXJpYWxpemVkID0gJ3siYSI6WzEsdHJ1ZSxmYWxzZSxudWxsLCJcXHUwMDAwXFxiXFxuXFxmXFxyXFx0Il19JzsKICAgICAgICAvLyBUZXN0IGBKU09OLnN0cmluZ2lmeWAuCiAgICAgICAgaWYgKG5hbWUgPT0gImpzb24tc3RyaW5naWZ5IikgewogICAgICAgICAgdmFyIHN0cmluZ2lmeSA9IGV4cG9ydHMuc3RyaW5naWZ5LCBzdHJpbmdpZnlTdXBwb3J0ZWQgPSB0eXBlb2Ygc3RyaW5naWZ5ID09ICJmdW5jdGlvbiIgJiYgaXNFeHRlbmRlZDsKICAgICAgICAgIGlmIChzdHJpbmdpZnlTdXBwb3J0ZWQpIHsKICAgICAgICAgICAgLy8gQSB0ZXN0IGZ1bmN0aW9uIG9iamVjdCB3aXRoIGEgY3VzdG9tIGB0b0pTT05gIG1ldGhvZC4KICAgICAgICAgICAgKHZhbHVlID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgIHJldHVybiAxOwogICAgICAgICAgICB9KS50b0pTT04gPSB2YWx1ZTsKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICBzdHJpbmdpZnlTdXBwb3J0ZWQgPQogICAgICAgICAgICAgICAgLy8gRmlyZWZveCAzLjFiMSBhbmQgYjIgc2VyaWFsaXplIHN0cmluZywgbnVtYmVyLCBhbmQgYm9vbGVhbgogICAgICAgICAgICAgICAgLy8gcHJpbWl0aXZlcyBhcyBvYmplY3QgbGl0ZXJhbHMuCiAgICAgICAgICAgICAgICBzdHJpbmdpZnkoMCkgPT09ICIwIiAmJgogICAgICAgICAgICAgICAgLy8gRkYgMy4xYjEsIGIyLCBhbmQgSlNPTiAyIHNlcmlhbGl6ZSB3cmFwcGVkIHByaW1pdGl2ZXMgYXMgb2JqZWN0CiAgICAgICAgICAgICAgICAvLyBsaXRlcmFscy4KICAgICAgICAgICAgICAgIHN0cmluZ2lmeShuZXcgTnVtYmVyKCkpID09PSAiMCIgJiYKICAgICAgICAgICAgICAgIHN0cmluZ2lmeShuZXcgU3RyaW5nKCkpID09ICciIicgJiYKICAgICAgICAgICAgICAgIC8vIEZGIDMuMWIxLCAyIHRocm93IGFuIGVycm9yIGlmIHRoZSB2YWx1ZSBpcyBgbnVsbGAsIGB1bmRlZmluZWRgLCBvcgogICAgICAgICAgICAgICAgLy8gZG9lcyBub3QgZGVmaW5lIGEgY2Fub25pY2FsIEpTT04gcmVwcmVzZW50YXRpb24gKHRoaXMgYXBwbGllcyB0bwogICAgICAgICAgICAgICAgLy8gb2JqZWN0cyB3aXRoIGB0b0pTT05gIHByb3BlcnRpZXMgYXMgd2VsbCwgKnVubGVzcyogdGhleSBhcmUgbmVzdGVkCiAgICAgICAgICAgICAgICAvLyB3aXRoaW4gYW4gb2JqZWN0IG9yIGFycmF5KS4KICAgICAgICAgICAgICAgIHN0cmluZ2lmeShnZXRDbGFzcykgPT09IHVuZGVmICYmCiAgICAgICAgICAgICAgICAvLyBJRSA4IHNlcmlhbGl6ZXMgYHVuZGVmaW5lZGAgYXMgYCJ1bmRlZmluZWQiYC4gU2FmYXJpIDw9IDUuMS43IGFuZAogICAgICAgICAgICAgICAgLy8gRkYgMy4xYjMgcGFzcyB0aGlzIHRlc3QuCiAgICAgICAgICAgICAgICBzdHJpbmdpZnkodW5kZWYpID09PSB1bmRlZiAmJgogICAgICAgICAgICAgICAgLy8gU2FmYXJpIDw9IDUuMS43IGFuZCBGRiAzLjFiMyB0aHJvdyBgRXJyb3JgcyBhbmQgYFR5cGVFcnJvcmBzLAogICAgICAgICAgICAgICAgLy8gcmVzcGVjdGl2ZWx5LCBpZiB0aGUgdmFsdWUgaXMgb21pdHRlZCBlbnRpcmVseS4KICAgICAgICAgICAgICAgIHN0cmluZ2lmeSgpID09PSB1bmRlZiAmJgogICAgICAgICAgICAgICAgLy8gRkYgMy4xYjEsIDIgdGhyb3cgYW4gZXJyb3IgaWYgdGhlIGdpdmVuIHZhbHVlIGlzIG5vdCBhIG51bWJlciwKICAgICAgICAgICAgICAgIC8vIHN0cmluZywgYXJyYXksIG9iamVjdCwgQm9vbGVhbiwgb3IgYG51bGxgIGxpdGVyYWwuIFRoaXMgYXBwbGllcyB0bwogICAgICAgICAgICAgICAgLy8gb2JqZWN0cyB3aXRoIGN1c3RvbSBgdG9KU09OYCBtZXRob2RzIGFzIHdlbGwsIHVubGVzcyB0aGV5IGFyZSBuZXN0ZWQKICAgICAgICAgICAgICAgIC8vIGluc2lkZSBvYmplY3Qgb3IgYXJyYXkgbGl0ZXJhbHMuIFlVSSAzLjAuMGIxIGlnbm9yZXMgY3VzdG9tIGB0b0pTT05gCiAgICAgICAgICAgICAgICAvLyBtZXRob2RzIGVudGlyZWx5LgogICAgICAgICAgICAgICAgc3RyaW5naWZ5KHZhbHVlKSA9PT0gIjEiICYmCiAgICAgICAgICAgICAgICBzdHJpbmdpZnkoW3ZhbHVlXSkgPT0gIlsxXSIgJiYKICAgICAgICAgICAgICAgIC8vIFByb3RvdHlwZSA8PSAxLjYuMSBzZXJpYWxpemVzIGBbdW5kZWZpbmVkXWAgYXMgYCJbXSJgIGluc3RlYWQgb2YKICAgICAgICAgICAgICAgIC8vIGAiW251bGxdImAuCiAgICAgICAgICAgICAgICBzdHJpbmdpZnkoW3VuZGVmXSkgPT0gIltudWxsXSIgJiYKICAgICAgICAgICAgICAgIC8vIFlVSSAzLjAuMGIxIGZhaWxzIHRvIHNlcmlhbGl6ZSBgbnVsbGAgbGl0ZXJhbHMuCiAgICAgICAgICAgICAgICBzdHJpbmdpZnkobnVsbCkgPT0gIm51bGwiICYmCiAgICAgICAgICAgICAgICAvLyBGRiAzLjFiMSwgMiBoYWx0cyBzZXJpYWxpemF0aW9uIGlmIGFuIGFycmF5IGNvbnRhaW5zIGEgZnVuY3Rpb246CiAgICAgICAgICAgICAgICAvLyBgWzEsIHRydWUsIGdldENsYXNzLCAxXWAgc2VyaWFsaXplcyBhcyAiWzEsdHJ1ZSxdLCIuIEZGIDMuMWIzCiAgICAgICAgICAgICAgICAvLyBlbGlkZXMgbm9uLUpTT04gdmFsdWVzIGZyb20gb2JqZWN0cyBhbmQgYXJyYXlzLCB1bmxlc3MgdGhleQogICAgICAgICAgICAgICAgLy8gZGVmaW5lIGN1c3RvbSBgdG9KU09OYCBtZXRob2RzLgogICAgICAgICAgICAgICAgc3RyaW5naWZ5KFt1bmRlZiwgZ2V0Q2xhc3MsIG51bGxdKSA9PSAiW251bGwsbnVsbCxudWxsXSIgJiYKICAgICAgICAgICAgICAgIC8vIFNpbXBsZSBzZXJpYWxpemF0aW9uIHRlc3QuIEZGIDMuMWIxIHVzZXMgVW5pY29kZSBlc2NhcGUgc2VxdWVuY2VzCiAgICAgICAgICAgICAgICAvLyB3aGVyZSBjaGFyYWN0ZXIgZXNjYXBlIGNvZGVzIGFyZSBleHBlY3RlZCAoZS5nLiwgYFxiYCA9PiBgXHUwMDA4YCkuCiAgICAgICAgICAgICAgICBzdHJpbmdpZnkoeyAiYSI6IFt2YWx1ZSwgdHJ1ZSwgZmFsc2UsIG51bGwsICJceDAwXGJcblxmXHJcdCJdIH0pID09IHNlcmlhbGl6ZWQgJiYKICAgICAgICAgICAgICAgIC8vIEZGIDMuMWIxIGFuZCBiMiBpZ25vcmUgdGhlIGBmaWx0ZXJgIGFuZCBgd2lkdGhgIGFyZ3VtZW50cy4KICAgICAgICAgICAgICAgIHN0cmluZ2lmeShudWxsLCB2YWx1ZSkgPT09ICIxIiAmJgogICAgICAgICAgICAgICAgc3RyaW5naWZ5KFsxLCAyXSwgbnVsbCwgMSkgPT0gIltcbiAxLFxuIDJcbl0iICYmCiAgICAgICAgICAgICAgICAvLyBKU09OIDIsIFByb3RvdHlwZSA8PSAxLjcsIGFuZCBvbGRlciBXZWJLaXQgYnVpbGRzIGluY29ycmVjdGx5CiAgICAgICAgICAgICAgICAvLyBzZXJpYWxpemUgZXh0ZW5kZWQgeWVhcnMuCiAgICAgICAgICAgICAgICBzdHJpbmdpZnkobmV3IERhdGUoLTguNjRlMTUpKSA9PSAnIi0yNzE4MjEtMDQtMjBUMDA6MDA6MDAuMDAwWiInICYmCiAgICAgICAgICAgICAgICAvLyBUaGUgbWlsbGlzZWNvbmRzIGFyZSBvcHRpb25hbCBpbiBFUyA1LCBidXQgcmVxdWlyZWQgaW4gNS4xLgogICAgICAgICAgICAgICAgc3RyaW5naWZ5KG5ldyBEYXRlKDguNjRlMTUpKSA9PSAnIisyNzU3NjAtMDktMTNUMDA6MDA6MDAuMDAwWiInICYmCiAgICAgICAgICAgICAgICAvLyBGaXJlZm94IDw9IDExLjAgaW5jb3JyZWN0bHkgc2VyaWFsaXplcyB5ZWFycyBwcmlvciB0byAwIGFzIG5lZ2F0aXZlCiAgICAgICAgICAgICAgICAvLyBmb3VyLWRpZ2l0IHllYXJzIGluc3RlYWQgb2Ygc2l4LWRpZ2l0IHllYXJzLiBDcmVkaXRzOiBAWWFmZmxlLgogICAgICAgICAgICAgICAgc3RyaW5naWZ5KG5ldyBEYXRlKC02MjE5ODc1NTJlNSkpID09ICciLTAwMDAwMS0wMS0wMVQwMDowMDowMC4wMDBaIicgJiYKICAgICAgICAgICAgICAgIC8vIFNhZmFyaSA8PSA1LjEuNSBhbmQgT3BlcmEgPj0gMTAuNTMgaW5jb3JyZWN0bHkgc2VyaWFsaXplIG1pbGxpc2Vjb25kCiAgICAgICAgICAgICAgICAvLyB2YWx1ZXMgbGVzcyB0aGFuIDEwMDAuIENyZWRpdHM6IEBZYWZmbGUuCiAgICAgICAgICAgICAgICBzdHJpbmdpZnkobmV3IERhdGUoLTEpKSA9PSAnIjE5NjktMTItMzFUMjM6NTk6NTkuOTk5WiInOwogICAgICAgICAgICB9IGNhdGNoIChleGNlcHRpb24pIHsKICAgICAgICAgICAgICBzdHJpbmdpZnlTdXBwb3J0ZWQgPSBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgaXNTdXBwb3J0ZWQgPSBzdHJpbmdpZnlTdXBwb3J0ZWQ7CiAgICAgICAgfQogICAgICAgIC8vIFRlc3QgYEpTT04ucGFyc2VgLgogICAgICAgIGlmIChuYW1lID09ICJqc29uLXBhcnNlIikgewogICAgICAgICAgdmFyIHBhcnNlID0gZXhwb3J0cy5wYXJzZTsKICAgICAgICAgIGlmICh0eXBlb2YgcGFyc2UgPT0gImZ1bmN0aW9uIikgewogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgIC8vIEZGIDMuMWIxLCBiMiB3aWxsIHRocm93IGFuIGV4Y2VwdGlvbiBpZiBhIGJhcmUgbGl0ZXJhbCBpcyBwcm92aWRlZC4KICAgICAgICAgICAgICAvLyBDb25mb3JtaW5nIGltcGxlbWVudGF0aW9ucyBzaG91bGQgYWxzbyBjb2VyY2UgdGhlIGluaXRpYWwgYXJndW1lbnQgdG8KICAgICAgICAgICAgICAvLyBhIHN0cmluZyBwcmlvciB0byBwYXJzaW5nLgogICAgICAgICAgICAgIGlmIChwYXJzZSgiMCIpID09PSAwICYmICFwYXJzZShmYWxzZSkpIHsKICAgICAgICAgICAgICAgIC8vIFNpbXBsZSBwYXJzaW5nIHRlc3QuCiAgICAgICAgICAgICAgICB2YWx1ZSA9IHBhcnNlKHNlcmlhbGl6ZWQpOwogICAgICAgICAgICAgICAgdmFyIHBhcnNlU3VwcG9ydGVkID0gdmFsdWVbImEiXS5sZW5ndGggPT0gNSAmJiB2YWx1ZVsiYSJdWzBdID09PSAxOwogICAgICAgICAgICAgICAgaWYgKHBhcnNlU3VwcG9ydGVkKSB7CiAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgLy8gU2FmYXJpIDw9IDUuMS4yIGFuZCBGRiAzLjFiMSBhbGxvdyB1bmVzY2FwZWQgdGFicyBpbiBzdHJpbmdzLgogICAgICAgICAgICAgICAgICAgIHBhcnNlU3VwcG9ydGVkID0gIXBhcnNlKCciXHQiJyk7CiAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGV4Y2VwdGlvbikge30KICAgICAgICAgICAgICAgICAgaWYgKHBhcnNlU3VwcG9ydGVkKSB7CiAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgIC8vIEZGIDQuMCBhbmQgNC4wLjEgYWxsb3cgbGVhZGluZyBgK2Agc2lnbnMgYW5kIGxlYWRpbmcKICAgICAgICAgICAgICAgICAgICAgIC8vIGRlY2ltYWwgcG9pbnRzLiBGRiA0LjAsIDQuMC4xLCBhbmQgSUUgOS0xMCBhbHNvIGFsbG93CiAgICAgICAgICAgICAgICAgICAgICAvLyBjZXJ0YWluIG9jdGFsIGxpdGVyYWxzLgogICAgICAgICAgICAgICAgICAgICAgcGFyc2VTdXBwb3J0ZWQgPSBwYXJzZSgiMDEiKSAhPT0gMTsKICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChleGNlcHRpb24pIHt9CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgaWYgKHBhcnNlU3VwcG9ydGVkKSB7CiAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgIC8vIEZGIDQuMCwgNC4wLjEsIGFuZCBSaGlubyAxLjdSMy1SNCBhbGxvdyB0cmFpbGluZyBkZWNpbWFsCiAgICAgICAgICAgICAgICAgICAgICAvLyBwb2ludHMuIFRoZXNlIGVudmlyb25tZW50cywgYWxvbmcgd2l0aCBGRiAzLjFiMSBhbmQgMiwKICAgICAgICAgICAgICAgICAgICAgIC8vIGFsc28gYWxsb3cgdHJhaWxpbmcgY29tbWFzIGluIEpTT04gb2JqZWN0cyBhbmQgYXJyYXlzLgogICAgICAgICAgICAgICAgICAgICAgcGFyc2VTdXBwb3J0ZWQgPSBwYXJzZSgiMS4iKSAhPT0gMTsKICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChleGNlcHRpb24pIHt9CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gY2F0Y2ggKGV4Y2VwdGlvbikgewogICAgICAgICAgICAgIHBhcnNlU3VwcG9ydGVkID0gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGlzU3VwcG9ydGVkID0gcGFyc2VTdXBwb3J0ZWQ7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiBoYXNbbmFtZV0gPSAhIWlzU3VwcG9ydGVkOwogICAgfQoKICAgIGlmICghaGFzKCJqc29uIikpIHsKICAgICAgLy8gQ29tbW9uIGBbW0NsYXNzXV1gIG5hbWUgYWxpYXNlcy4KICAgICAgdmFyIGZ1bmN0aW9uQ2xhc3MgPSAiW29iamVjdCBGdW5jdGlvbl0iLAogICAgICAgICAgZGF0ZUNsYXNzID0gIltvYmplY3QgRGF0ZV0iLAogICAgICAgICAgbnVtYmVyQ2xhc3MgPSAiW29iamVjdCBOdW1iZXJdIiwKICAgICAgICAgIHN0cmluZ0NsYXNzID0gIltvYmplY3QgU3RyaW5nXSIsCiAgICAgICAgICBhcnJheUNsYXNzID0gIltvYmplY3QgQXJyYXldIiwKICAgICAgICAgIGJvb2xlYW5DbGFzcyA9ICJbb2JqZWN0IEJvb2xlYW5dIjsKCiAgICAgIC8vIERldGVjdCBpbmNvbXBsZXRlIHN1cHBvcnQgZm9yIGFjY2Vzc2luZyBzdHJpbmcgY2hhcmFjdGVycyBieSBpbmRleC4KICAgICAgdmFyIGNoYXJJbmRleEJ1Z2d5ID0gaGFzKCJidWctc3RyaW5nLWNoYXItaW5kZXgiKTsKCiAgICAgIC8vIERlZmluZSBhZGRpdGlvbmFsIHV0aWxpdHkgbWV0aG9kcyBpZiB0aGUgYERhdGVgIG1ldGhvZHMgYXJlIGJ1Z2d5LgogICAgICBpZiAoIWlzRXh0ZW5kZWQpIHsKICAgICAgICB2YXIgZmxvb3IgPSBNYXRoLmZsb29yOwogICAgICAgIC8vIEEgbWFwcGluZyBiZXR3ZWVuIHRoZSBtb250aHMgb2YgdGhlIHllYXIgYW5kIHRoZSBudW1iZXIgb2YgZGF5cyBiZXR3ZWVuCiAgICAgICAgLy8gSmFudWFyeSAxc3QgYW5kIHRoZSBmaXJzdCBvZiB0aGUgcmVzcGVjdGl2ZSBtb250aC4KICAgICAgICB2YXIgTW9udGhzID0gWzAsIDMxLCA1OSwgOTAsIDEyMCwgMTUxLCAxODEsIDIxMiwgMjQzLCAyNzMsIDMwNCwgMzM0XTsKICAgICAgICAvLyBJbnRlcm5hbDogQ2FsY3VsYXRlcyB0aGUgbnVtYmVyIG9mIGRheXMgYmV0d2VlbiB0aGUgVW5peCBlcG9jaCBhbmQgdGhlCiAgICAgICAgLy8gZmlyc3QgZGF5IG9mIHRoZSBnaXZlbiBtb250aC4KICAgICAgICB2YXIgZ2V0RGF5ID0gZnVuY3Rpb24gKHllYXIsIG1vbnRoKSB7CiAgICAgICAgICByZXR1cm4gTW9udGhzW21vbnRoXSArIDM2NSAqICh5ZWFyIC0gMTk3MCkgKyBmbG9vcigoeWVhciAtIDE5NjkgKyAobW9udGggPSArKG1vbnRoID4gMSkpKSAvIDQpIC0gZmxvb3IoKHllYXIgLSAxOTAxICsgbW9udGgpIC8gMTAwKSArIGZsb29yKCh5ZWFyIC0gMTYwMSArIG1vbnRoKSAvIDQwMCk7CiAgICAgICAgfTsKICAgICAgfQoKICAgICAgLy8gSW50ZXJuYWw6IERldGVybWluZXMgaWYgYSBwcm9wZXJ0eSBpcyBhIGRpcmVjdCBwcm9wZXJ0eSBvZiB0aGUgZ2l2ZW4KICAgICAgLy8gb2JqZWN0LiBEZWxlZ2F0ZXMgdG8gdGhlIG5hdGl2ZSBgT2JqZWN0I2hhc093blByb3BlcnR5YCBtZXRob2QuCiAgICAgIGlmICghKGlzUHJvcGVydHkgPSBvYmplY3RQcm90by5oYXNPd25Qcm9wZXJ0eSkpIHsKICAgICAgICBpc1Byb3BlcnR5ID0gZnVuY3Rpb24gKHByb3BlcnR5KSB7CiAgICAgICAgICB2YXIgbWVtYmVycyA9IHt9LCBjb25zdHJ1Y3RvcjsKICAgICAgICAgIGlmICgobWVtYmVycy5fX3Byb3RvX18gPSBudWxsLCBtZW1iZXJzLl9fcHJvdG9fXyA9IHsKICAgICAgICAgICAgLy8gVGhlICpwcm90byogcHJvcGVydHkgY2Fubm90IGJlIHNldCBtdWx0aXBsZSB0aW1lcyBpbiByZWNlbnQKICAgICAgICAgICAgLy8gdmVyc2lvbnMgb2YgRmlyZWZveCBhbmQgU2VhTW9ua2V5LgogICAgICAgICAgICAidG9TdHJpbmciOiAxCiAgICAgICAgICB9LCBtZW1iZXJzKS50b1N0cmluZyAhPSBnZXRDbGFzcykgewogICAgICAgICAgICAvLyBTYWZhcmkgPD0gMi4wLjMgZG9lc24ndCBpbXBsZW1lbnQgYE9iamVjdCNoYXNPd25Qcm9wZXJ0eWAsIGJ1dAogICAgICAgICAgICAvLyBzdXBwb3J0cyB0aGUgbXV0YWJsZSAqcHJvdG8qIHByb3BlcnR5LgogICAgICAgICAgICBpc1Byb3BlcnR5ID0gZnVuY3Rpb24gKHByb3BlcnR5KSB7CiAgICAgICAgICAgICAgLy8gQ2FwdHVyZSBhbmQgYnJlYWsgdGhlIG9iamVjdCdzIHByb3RvdHlwZSBjaGFpbiAoc2VlIHNlY3Rpb24gOC42LjIKICAgICAgICAgICAgICAvLyBvZiB0aGUgRVMgNS4xIHNwZWMpLiBUaGUgcGFyZW50aGVzaXplZCBleHByZXNzaW9uIHByZXZlbnRzIGFuCiAgICAgICAgICAgICAgLy8gdW5zYWZlIHRyYW5zZm9ybWF0aW9uIGJ5IHRoZSBDbG9zdXJlIENvbXBpbGVyLgogICAgICAgICAgICAgIHZhciBvcmlnaW5hbCA9IHRoaXMuX19wcm90b19fLCByZXN1bHQgPSBwcm9wZXJ0eSBpbiAodGhpcy5fX3Byb3RvX18gPSBudWxsLCB0aGlzKTsKICAgICAgICAgICAgICAvLyBSZXN0b3JlIHRoZSBvcmlnaW5hbCBwcm90b3R5cGUgY2hhaW4uCiAgICAgICAgICAgICAgdGhpcy5fX3Byb3RvX18gPSBvcmlnaW5hbDsKICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgICAgICB9OwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgLy8gQ2FwdHVyZSBhIHJlZmVyZW5jZSB0byB0aGUgdG9wLWxldmVsIGBPYmplY3RgIGNvbnN0cnVjdG9yLgogICAgICAgICAgICBjb25zdHJ1Y3RvciA9IG1lbWJlcnMuY29uc3RydWN0b3I7CiAgICAgICAgICAgIC8vIFVzZSB0aGUgYGNvbnN0cnVjdG9yYCBwcm9wZXJ0eSB0byBzaW11bGF0ZSBgT2JqZWN0I2hhc093blByb3BlcnR5YCBpbgogICAgICAgICAgICAvLyBvdGhlciBlbnZpcm9ubWVudHMuCiAgICAgICAgICAgIGlzUHJvcGVydHkgPSBmdW5jdGlvbiAocHJvcGVydHkpIHsKICAgICAgICAgICAgICB2YXIgcGFyZW50ID0gKHRoaXMuY29uc3RydWN0b3IgfHwgY29uc3RydWN0b3IpLnByb3RvdHlwZTsKICAgICAgICAgICAgICByZXR1cm4gcHJvcGVydHkgaW4gdGhpcyAmJiAhKHByb3BlcnR5IGluIHBhcmVudCAmJiB0aGlzW3Byb3BlcnR5XSA9PT0gcGFyZW50W3Byb3BlcnR5XSk7CiAgICAgICAgICAgIH07CiAgICAgICAgICB9CiAgICAgICAgICBtZW1iZXJzID0gbnVsbDsKICAgICAgICAgIHJldHVybiBpc1Byb3BlcnR5LmNhbGwodGhpcywgcHJvcGVydHkpOwogICAgICAgIH07CiAgICAgIH0KCiAgICAgIC8vIEludGVybmFsOiBOb3JtYWxpemVzIHRoZSBgZm9yLi4uaW5gIGl0ZXJhdGlvbiBhbGdvcml0aG0gYWNyb3NzCiAgICAgIC8vIGVudmlyb25tZW50cy4gRWFjaCBlbnVtZXJhdGVkIGtleSBpcyB5aWVsZGVkIHRvIGEgYGNhbGxiYWNrYCBmdW5jdGlvbi4KICAgICAgZm9yRWFjaCA9IGZ1bmN0aW9uIChvYmplY3QsIGNhbGxiYWNrKSB7CiAgICAgICAgdmFyIHNpemUgPSAwLCBQcm9wZXJ0aWVzLCBtZW1iZXJzLCBwcm9wZXJ0eTsKCiAgICAgICAgLy8gVGVzdHMgZm9yIGJ1Z3MgaW4gdGhlIGN1cnJlbnQgZW52aXJvbm1lbnQncyBgZm9yLi4uaW5gIGFsZ29yaXRobS4gVGhlCiAgICAgICAgLy8gYHZhbHVlT2ZgIHByb3BlcnR5IGluaGVyaXRzIHRoZSBub24tZW51bWVyYWJsZSBmbGFnIGZyb20KICAgICAgICAvLyBgT2JqZWN0LnByb3RvdHlwZWAgaW4gb2xkZXIgdmVyc2lvbnMgb2YgSUUsIE5ldHNjYXBlLCBhbmQgTW96aWxsYS4KICAgICAgICAoUHJvcGVydGllcyA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgIHRoaXMudmFsdWVPZiA9IDA7CiAgICAgICAgfSkucHJvdG90eXBlLnZhbHVlT2YgPSAwOwoKICAgICAgICAvLyBJdGVyYXRlIG92ZXIgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIGBQcm9wZXJ0aWVzYCBjbGFzcy4KICAgICAgICBtZW1iZXJzID0gbmV3IFByb3BlcnRpZXMoKTsKICAgICAgICBmb3IgKHByb3BlcnR5IGluIG1lbWJlcnMpIHsKICAgICAgICAgIC8vIElnbm9yZSBhbGwgcHJvcGVydGllcyBpbmhlcml0ZWQgZnJvbSBgT2JqZWN0LnByb3RvdHlwZWAuCiAgICAgICAgICBpZiAoaXNQcm9wZXJ0eS5jYWxsKG1lbWJlcnMsIHByb3BlcnR5KSkgewogICAgICAgICAgICBzaXplKys7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIFByb3BlcnRpZXMgPSBtZW1iZXJzID0gbnVsbDsKCiAgICAgICAgLy8gTm9ybWFsaXplIHRoZSBpdGVyYXRpb24gYWxnb3JpdGhtLgogICAgICAgIGlmICghc2l6ZSkgewogICAgICAgICAgLy8gQSBsaXN0IG9mIG5vbi1lbnVtZXJhYmxlIHByb3BlcnRpZXMgaW5oZXJpdGVkIGZyb20gYE9iamVjdC5wcm90b3R5cGVgLgogICAgICAgICAgbWVtYmVycyA9IFsidmFsdWVPZiIsICJ0b1N0cmluZyIsICJ0b0xvY2FsZVN0cmluZyIsICJwcm9wZXJ0eUlzRW51bWVyYWJsZSIsICJpc1Byb3RvdHlwZU9mIiwgImhhc093blByb3BlcnR5IiwgImNvbnN0cnVjdG9yIl07CiAgICAgICAgICAvLyBJRSA8PSA4LCBNb3ppbGxhIDEuMCwgYW5kIE5ldHNjYXBlIDYuMiBpZ25vcmUgc2hhZG93ZWQgbm9uLWVudW1lcmFibGUKICAgICAgICAgIC8vIHByb3BlcnRpZXMuCiAgICAgICAgICBmb3JFYWNoID0gZnVuY3Rpb24gKG9iamVjdCwgY2FsbGJhY2spIHsKICAgICAgICAgICAgdmFyIGlzRnVuY3Rpb24gPSBnZXRDbGFzcy5jYWxsKG9iamVjdCkgPT0gZnVuY3Rpb25DbGFzcywgcHJvcGVydHksIGxlbmd0aDsKICAgICAgICAgICAgdmFyIGhhc1Byb3BlcnR5ID0gIWlzRnVuY3Rpb24gJiYgdHlwZW9mIG9iamVjdC5jb25zdHJ1Y3RvciAhPSAiZnVuY3Rpb24iICYmIG9iamVjdFR5cGVzW3R5cGVvZiBvYmplY3QuaGFzT3duUHJvcGVydHldICYmIG9iamVjdC5oYXNPd25Qcm9wZXJ0eSB8fCBpc1Byb3BlcnR5OwogICAgICAgICAgICBmb3IgKHByb3BlcnR5IGluIG9iamVjdCkgewogICAgICAgICAgICAgIC8vIEdlY2tvIDw9IDEuMCBlbnVtZXJhdGVzIHRoZSBgcHJvdG90eXBlYCBwcm9wZXJ0eSBvZiBmdW5jdGlvbnMgdW5kZXIKICAgICAgICAgICAgICAvLyBjZXJ0YWluIGNvbmRpdGlvbnM7IElFIGRvZXMgbm90LgogICAgICAgICAgICAgIGlmICghKGlzRnVuY3Rpb24gJiYgcHJvcGVydHkgPT0gInByb3RvdHlwZSIpICYmIGhhc1Byb3BlcnR5LmNhbGwob2JqZWN0LCBwcm9wZXJ0eSkpIHsKICAgICAgICAgICAgICAgIGNhbGxiYWNrKHByb3BlcnR5KTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gTWFudWFsbHkgaW52b2tlIHRoZSBjYWxsYmFjayBmb3IgZWFjaCBub24tZW51bWVyYWJsZSBwcm9wZXJ0eS4KICAgICAgICAgICAgZm9yIChsZW5ndGggPSBtZW1iZXJzLmxlbmd0aDsgcHJvcGVydHkgPSBtZW1iZXJzWy0tbGVuZ3RoXTsgaGFzUHJvcGVydHkuY2FsbChvYmplY3QsIHByb3BlcnR5KSAmJiBjYWxsYmFjayhwcm9wZXJ0eSkpOwogICAgICAgICAgfTsKICAgICAgICB9IGVsc2UgaWYgKHNpemUgPT0gMikgewogICAgICAgICAgLy8gU2FmYXJpIDw9IDIuMC40IGVudW1lcmF0ZXMgc2hhZG93ZWQgcHJvcGVydGllcyB0d2ljZS4KICAgICAgICAgIGZvckVhY2ggPSBmdW5jdGlvbiAob2JqZWN0LCBjYWxsYmFjaykgewogICAgICAgICAgICAvLyBDcmVhdGUgYSBzZXQgb2YgaXRlcmF0ZWQgcHJvcGVydGllcy4KICAgICAgICAgICAgdmFyIG1lbWJlcnMgPSB7fSwgaXNGdW5jdGlvbiA9IGdldENsYXNzLmNhbGwob2JqZWN0KSA9PSBmdW5jdGlvbkNsYXNzLCBwcm9wZXJ0eTsKICAgICAgICAgICAgZm9yIChwcm9wZXJ0eSBpbiBvYmplY3QpIHsKICAgICAgICAgICAgICAvLyBTdG9yZSBlYWNoIHByb3BlcnR5IG5hbWUgdG8gcHJldmVudCBkb3VibGUgZW51bWVyYXRpb24uIFRoZQogICAgICAgICAgICAgIC8vIGBwcm90b3R5cGVgIHByb3BlcnR5IG9mIGZ1bmN0aW9ucyBpcyBub3QgZW51bWVyYXRlZCBkdWUgdG8gY3Jvc3MtCiAgICAgICAgICAgICAgLy8gZW52aXJvbm1lbnQgaW5jb25zaXN0ZW5jaWVzLgogICAgICAgICAgICAgIGlmICghKGlzRnVuY3Rpb24gJiYgcHJvcGVydHkgPT0gInByb3RvdHlwZSIpICYmICFpc1Byb3BlcnR5LmNhbGwobWVtYmVycywgcHJvcGVydHkpICYmIChtZW1iZXJzW3Byb3BlcnR5XSA9IDEpICYmIGlzUHJvcGVydHkuY2FsbChvYmplY3QsIHByb3BlcnR5KSkgewogICAgICAgICAgICAgICAgY2FsbGJhY2socHJvcGVydHkpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgLy8gTm8gYnVncyBkZXRlY3RlZDsgdXNlIHRoZSBzdGFuZGFyZCBgZm9yLi4uaW5gIGFsZ29yaXRobS4KICAgICAgICAgIGZvckVhY2ggPSBmdW5jdGlvbiAob2JqZWN0LCBjYWxsYmFjaykgewogICAgICAgICAgICB2YXIgaXNGdW5jdGlvbiA9IGdldENsYXNzLmNhbGwob2JqZWN0KSA9PSBmdW5jdGlvbkNsYXNzLCBwcm9wZXJ0eSwgaXNDb25zdHJ1Y3RvcjsKICAgICAgICAgICAgZm9yIChwcm9wZXJ0eSBpbiBvYmplY3QpIHsKICAgICAgICAgICAgICBpZiAoIShpc0Z1bmN0aW9uICYmIHByb3BlcnR5ID09ICJwcm90b3R5cGUiKSAmJiBpc1Byb3BlcnR5LmNhbGwob2JqZWN0LCBwcm9wZXJ0eSkgJiYgIShpc0NvbnN0cnVjdG9yID0gcHJvcGVydHkgPT09ICJjb25zdHJ1Y3RvciIpKSB7CiAgICAgICAgICAgICAgICBjYWxsYmFjayhwcm9wZXJ0eSk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIE1hbnVhbGx5IGludm9rZSB0aGUgY2FsbGJhY2sgZm9yIHRoZSBgY29uc3RydWN0b3JgIHByb3BlcnR5IGR1ZSB0bwogICAgICAgICAgICAvLyBjcm9zcy1lbnZpcm9ubWVudCBpbmNvbnNpc3RlbmNpZXMuCiAgICAgICAgICAgIGlmIChpc0NvbnN0cnVjdG9yIHx8IGlzUHJvcGVydHkuY2FsbChvYmplY3QsIChwcm9wZXJ0eSA9ICJjb25zdHJ1Y3RvciIpKSkgewogICAgICAgICAgICAgIGNhbGxiYWNrKHByb3BlcnR5KTsKICAgICAgICAgICAgfQogICAgICAgICAgfTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGZvckVhY2gob2JqZWN0LCBjYWxsYmFjayk7CiAgICAgIH07CgogICAgICAvLyBQdWJsaWM6IFNlcmlhbGl6ZXMgYSBKYXZhU2NyaXB0IGB2YWx1ZWAgYXMgYSBKU09OIHN0cmluZy4gVGhlIG9wdGlvbmFsCiAgICAgIC8vIGBmaWx0ZXJgIGFyZ3VtZW50IG1heSBzcGVjaWZ5IGVpdGhlciBhIGZ1bmN0aW9uIHRoYXQgYWx0ZXJzIGhvdyBvYmplY3QgYW5kCiAgICAgIC8vIGFycmF5IG1lbWJlcnMgYXJlIHNlcmlhbGl6ZWQsIG9yIGFuIGFycmF5IG9mIHN0cmluZ3MgYW5kIG51bWJlcnMgdGhhdAogICAgICAvLyBpbmRpY2F0ZXMgd2hpY2ggcHJvcGVydGllcyBzaG91bGQgYmUgc2VyaWFsaXplZC4gVGhlIG9wdGlvbmFsIGB3aWR0aGAKICAgICAgLy8gYXJndW1lbnQgbWF5IGJlIGVpdGhlciBhIHN0cmluZyBvciBudW1iZXIgdGhhdCBzcGVjaWZpZXMgdGhlIGluZGVudGF0aW9uCiAgICAgIC8vIGxldmVsIG9mIHRoZSBvdXRwdXQuCiAgICAgIGlmICghaGFzKCJqc29uLXN0cmluZ2lmeSIpKSB7CiAgICAgICAgLy8gSW50ZXJuYWw6IEEgbWFwIG9mIGNvbnRyb2wgY2hhcmFjdGVycyBhbmQgdGhlaXIgZXNjYXBlZCBlcXVpdmFsZW50cy4KICAgICAgICB2YXIgRXNjYXBlcyA9IHsKICAgICAgICAgIDkyOiAiXFxcXCIsCiAgICAgICAgICAzNDogJ1xcIicsCiAgICAgICAgICA4OiAiXFxiIiwKICAgICAgICAgIDEyOiAiXFxmIiwKICAgICAgICAgIDEwOiAiXFxuIiwKICAgICAgICAgIDEzOiAiXFxyIiwKICAgICAgICAgIDk6ICJcXHQiCiAgICAgICAgfTsKCiAgICAgICAgLy8gSW50ZXJuYWw6IENvbnZlcnRzIGB2YWx1ZWAgaW50byBhIHplcm8tcGFkZGVkIHN0cmluZyBzdWNoIHRoYXQgaXRzCiAgICAgICAgLy8gbGVuZ3RoIGlzIGF0IGxlYXN0IGVxdWFsIHRvIGB3aWR0aGAuIFRoZSBgd2lkdGhgIG11c3QgYmUgPD0gNi4KICAgICAgICB2YXIgbGVhZGluZ1plcm9lcyA9ICIwMDAwMDAiOwogICAgICAgIHZhciB0b1BhZGRlZFN0cmluZyA9IGZ1bmN0aW9uICh3aWR0aCwgdmFsdWUpIHsKICAgICAgICAgIC8vIFRoZSBgfHwgMGAgZXhwcmVzc2lvbiBpcyBuZWNlc3NhcnkgdG8gd29yayBhcm91bmQgYSBidWcgaW4KICAgICAgICAgIC8vIE9wZXJhIDw9IDcuNTR1MiB3aGVyZSBgMCA9PSAtMGAsIGJ1dCBgU3RyaW5nKC0wKSAhPT0gIjAiYC4KICAgICAgICAgIHJldHVybiAobGVhZGluZ1plcm9lcyArICh2YWx1ZSB8fCAwKSkuc2xpY2UoLXdpZHRoKTsKICAgICAgICB9OwoKICAgICAgICAvLyBJbnRlcm5hbDogRG91YmxlLXF1b3RlcyBhIHN0cmluZyBgdmFsdWVgLCByZXBsYWNpbmcgYWxsIEFTQ0lJIGNvbnRyb2wKICAgICAgICAvLyBjaGFyYWN0ZXJzIChjaGFyYWN0ZXJzIHdpdGggY29kZSB1bml0IHZhbHVlcyBiZXR3ZWVuIDAgYW5kIDMxKSB3aXRoCiAgICAgICAgLy8gdGhlaXIgZXNjYXBlZCBlcXVpdmFsZW50cy4gVGhpcyBpcyBhbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUKICAgICAgICAvLyBgUXVvdGUodmFsdWUpYCBvcGVyYXRpb24gZGVmaW5lZCBpbiBFUyA1LjEgc2VjdGlvbiAxNS4xMi4zLgogICAgICAgIHZhciB1bmljb2RlUHJlZml4ID0gIlxcdTAwIjsKICAgICAgICB2YXIgcXVvdGUgPSBmdW5jdGlvbiAodmFsdWUpIHsKICAgICAgICAgIHZhciByZXN1bHQgPSAnIicsIGluZGV4ID0gMCwgbGVuZ3RoID0gdmFsdWUubGVuZ3RoLCB1c2VDaGFySW5kZXggPSAhY2hhckluZGV4QnVnZ3kgfHwgbGVuZ3RoID4gMTA7CiAgICAgICAgICB2YXIgc3ltYm9scyA9IHVzZUNoYXJJbmRleCAmJiAoY2hhckluZGV4QnVnZ3kgPyB2YWx1ZS5zcGxpdCgiIikgOiB2YWx1ZSk7CiAgICAgICAgICBmb3IgKDsgaW5kZXggPCBsZW5ndGg7IGluZGV4KyspIHsKICAgICAgICAgICAgdmFyIGNoYXJDb2RlID0gdmFsdWUuY2hhckNvZGVBdChpbmRleCk7CiAgICAgICAgICAgIC8vIElmIHRoZSBjaGFyYWN0ZXIgaXMgYSBjb250cm9sIGNoYXJhY3RlciwgYXBwZW5kIGl0cyBVbmljb2RlIG9yCiAgICAgICAgICAgIC8vIHNob3J0aGFuZCBlc2NhcGUgc2VxdWVuY2U7IG90aGVyd2lzZSwgYXBwZW5kIHRoZSBjaGFyYWN0ZXIgYXMtaXMuCiAgICAgICAgICAgIHN3aXRjaCAoY2hhckNvZGUpIHsKICAgICAgICAgICAgICBjYXNlIDg6IGNhc2UgOTogY2FzZSAxMDogY2FzZSAxMjogY2FzZSAxMzogY2FzZSAzNDogY2FzZSA5MjoKICAgICAgICAgICAgICAgIHJlc3VsdCArPSBFc2NhcGVzW2NoYXJDb2RlXTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICBpZiAoY2hhckNvZGUgPCAzMikgewogICAgICAgICAgICAgICAgICByZXN1bHQgKz0gdW5pY29kZVByZWZpeCArIHRvUGFkZGVkU3RyaW5nKDIsIGNoYXJDb2RlLnRvU3RyaW5nKDE2KSk7CiAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmVzdWx0ICs9IHVzZUNoYXJJbmRleCA/IHN5bWJvbHNbaW5kZXhdIDogdmFsdWUuY2hhckF0KGluZGV4KTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIHJlc3VsdCArICciJzsKICAgICAgICB9OwoKICAgICAgICAvLyBJbnRlcm5hbDogUmVjdXJzaXZlbHkgc2VyaWFsaXplcyBhbiBvYmplY3QuIEltcGxlbWVudHMgdGhlCiAgICAgICAgLy8gYFN0cihrZXksIGhvbGRlcilgLCBgSk8odmFsdWUpYCwgYW5kIGBKQSh2YWx1ZSlgIG9wZXJhdGlvbnMuCiAgICAgICAgdmFyIHNlcmlhbGl6ZSA9IGZ1bmN0aW9uIChwcm9wZXJ0eSwgb2JqZWN0LCBjYWxsYmFjaywgcHJvcGVydGllcywgd2hpdGVzcGFjZSwgaW5kZW50YXRpb24sIHN0YWNrKSB7CiAgICAgICAgICB2YXIgdmFsdWUsIGNsYXNzTmFtZSwgeWVhciwgbW9udGgsIGRhdGUsIHRpbWUsIGhvdXJzLCBtaW51dGVzLCBzZWNvbmRzLCBtaWxsaXNlY29uZHMsIHJlc3VsdHMsIGVsZW1lbnQsIGluZGV4LCBsZW5ndGgsIHByZWZpeCwgcmVzdWx0OwogICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgLy8gTmVjZXNzYXJ5IGZvciBob3N0IG9iamVjdCBzdXBwb3J0LgogICAgICAgICAgICB2YWx1ZSA9IG9iamVjdFtwcm9wZXJ0eV07CiAgICAgICAgICB9IGNhdGNoIChleGNlcHRpb24pIHt9CiAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09ICJvYmplY3QiICYmIHZhbHVlKSB7CiAgICAgICAgICAgIGNsYXNzTmFtZSA9IGdldENsYXNzLmNhbGwodmFsdWUpOwogICAgICAgICAgICBpZiAoY2xhc3NOYW1lID09IGRhdGVDbGFzcyAmJiAhaXNQcm9wZXJ0eS5jYWxsKHZhbHVlLCAidG9KU09OIikpIHsKICAgICAgICAgICAgICBpZiAodmFsdWUgPiAtMSAvIDAgJiYgdmFsdWUgPCAxIC8gMCkgewogICAgICAgICAgICAgICAgLy8gRGF0ZXMgYXJlIHNlcmlhbGl6ZWQgYWNjb3JkaW5nIHRvIHRoZSBgRGF0ZSN0b0pTT05gIG1ldGhvZAogICAgICAgICAgICAgICAgLy8gc3BlY2lmaWVkIGluIEVTIDUuMSBzZWN0aW9uIDE1LjkuNS40NC4gU2VlIHNlY3Rpb24gMTUuOS4xLjE1CiAgICAgICAgICAgICAgICAvLyBmb3IgdGhlIElTTyA4NjAxIGRhdGUgdGltZSBzdHJpbmcgZm9ybWF0LgogICAgICAgICAgICAgICAgaWYgKGdldERheSkgewogICAgICAgICAgICAgICAgICAvLyBNYW51YWxseSBjb21wdXRlIHRoZSB5ZWFyLCBtb250aCwgZGF0ZSwgaG91cnMsIG1pbnV0ZXMsCiAgICAgICAgICAgICAgICAgIC8vIHNlY29uZHMsIGFuZCBtaWxsaXNlY29uZHMgaWYgdGhlIGBnZXRVVEMqYCBtZXRob2RzIGFyZQogICAgICAgICAgICAgICAgICAvLyBidWdneS4gQWRhcHRlZCBmcm9tIEBZYWZmbGUncyBgZGF0ZS1zaGltYCBwcm9qZWN0LgogICAgICAgICAgICAgICAgICBkYXRlID0gZmxvb3IodmFsdWUgLyA4NjRlNSk7CiAgICAgICAgICAgICAgICAgIGZvciAoeWVhciA9IGZsb29yKGRhdGUgLyAzNjUuMjQyNSkgKyAxOTcwIC0gMTsgZ2V0RGF5KHllYXIgKyAxLCAwKSA8PSBkYXRlOyB5ZWFyKyspOwogICAgICAgICAgICAgICAgICBmb3IgKG1vbnRoID0gZmxvb3IoKGRhdGUgLSBnZXREYXkoeWVhciwgMCkpIC8gMzAuNDIpOyBnZXREYXkoeWVhciwgbW9udGggKyAxKSA8PSBkYXRlOyBtb250aCsrKTsKICAgICAgICAgICAgICAgICAgZGF0ZSA9IDEgKyBkYXRlIC0gZ2V0RGF5KHllYXIsIG1vbnRoKTsKICAgICAgICAgICAgICAgICAgLy8gVGhlIGB0aW1lYCB2YWx1ZSBzcGVjaWZpZXMgdGhlIHRpbWUgd2l0aGluIHRoZSBkYXkgKHNlZSBFUwogICAgICAgICAgICAgICAgICAvLyA1LjEgc2VjdGlvbiAxNS45LjEuMikuIFRoZSBmb3JtdWxhIGAoQSAlIEIgKyBCKSAlIEJgIGlzIHVzZWQKICAgICAgICAgICAgICAgICAgLy8gdG8gY29tcHV0ZSBgQSBtb2R1bG8gQmAsIGFzIHRoZSBgJWAgb3BlcmF0b3IgZG9lcyBub3QKICAgICAgICAgICAgICAgICAgLy8gY29ycmVzcG9uZCB0byB0aGUgYG1vZHVsb2Agb3BlcmF0aW9uIGZvciBuZWdhdGl2ZSBudW1iZXJzLgogICAgICAgICAgICAgICAgICB0aW1lID0gKHZhbHVlICUgODY0ZTUgKyA4NjRlNSkgJSA4NjRlNTsKICAgICAgICAgICAgICAgICAgLy8gVGhlIGhvdXJzLCBtaW51dGVzLCBzZWNvbmRzLCBhbmQgbWlsbGlzZWNvbmRzIGFyZSBvYnRhaW5lZCBieQogICAgICAgICAgICAgICAgICAvLyBkZWNvbXBvc2luZyB0aGUgdGltZSB3aXRoaW4gdGhlIGRheS4gU2VlIHNlY3Rpb24gMTUuOS4xLjEwLgogICAgICAgICAgICAgICAgICBob3VycyA9IGZsb29yKHRpbWUgLyAzNmU1KSAlIDI0OwogICAgICAgICAgICAgICAgICBtaW51dGVzID0gZmxvb3IodGltZSAvIDZlNCkgJSA2MDsKICAgICAgICAgICAgICAgICAgc2Vjb25kcyA9IGZsb29yKHRpbWUgLyAxZTMpICUgNjA7CiAgICAgICAgICAgICAgICAgIG1pbGxpc2Vjb25kcyA9IHRpbWUgJSAxZTM7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICB5ZWFyID0gdmFsdWUuZ2V0VVRDRnVsbFllYXIoKTsKICAgICAgICAgICAgICAgICAgbW9udGggPSB2YWx1ZS5nZXRVVENNb250aCgpOwogICAgICAgICAgICAgICAgICBkYXRlID0gdmFsdWUuZ2V0VVRDRGF0ZSgpOwogICAgICAgICAgICAgICAgICBob3VycyA9IHZhbHVlLmdldFVUQ0hvdXJzKCk7CiAgICAgICAgICAgICAgICAgIG1pbnV0ZXMgPSB2YWx1ZS5nZXRVVENNaW51dGVzKCk7CiAgICAgICAgICAgICAgICAgIHNlY29uZHMgPSB2YWx1ZS5nZXRVVENTZWNvbmRzKCk7CiAgICAgICAgICAgICAgICAgIG1pbGxpc2Vjb25kcyA9IHZhbHVlLmdldFVUQ01pbGxpc2Vjb25kcygpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLy8gU2VyaWFsaXplIGV4dGVuZGVkIHllYXJzIGNvcnJlY3RseS4KICAgICAgICAgICAgICAgIHZhbHVlID0gKHllYXIgPD0gMCB8fCB5ZWFyID49IDFlNCA/ICh5ZWFyIDwgMCA/ICItIiA6ICIrIikgKyB0b1BhZGRlZFN0cmluZyg2LCB5ZWFyIDwgMCA/IC15ZWFyIDogeWVhcikgOiB0b1BhZGRlZFN0cmluZyg0LCB5ZWFyKSkgKwogICAgICAgICAgICAgICAgICAiLSIgKyB0b1BhZGRlZFN0cmluZygyLCBtb250aCArIDEpICsgIi0iICsgdG9QYWRkZWRTdHJpbmcoMiwgZGF0ZSkgKwogICAgICAgICAgICAgICAgICAvLyBNb250aHMsIGRhdGVzLCBob3VycywgbWludXRlcywgYW5kIHNlY29uZHMgc2hvdWxkIGhhdmUgdHdvCiAgICAgICAgICAgICAgICAgIC8vIGRpZ2l0czsgbWlsbGlzZWNvbmRzIHNob3VsZCBoYXZlIHRocmVlLgogICAgICAgICAgICAgICAgICAiVCIgKyB0b1BhZGRlZFN0cmluZygyLCBob3VycykgKyAiOiIgKyB0b1BhZGRlZFN0cmluZygyLCBtaW51dGVzKSArICI6IiArIHRvUGFkZGVkU3RyaW5nKDIsIHNlY29uZHMpICsKICAgICAgICAgICAgICAgICAgLy8gTWlsbGlzZWNvbmRzIGFyZSBvcHRpb25hbCBpbiBFUyA1LjAsIGJ1dCByZXF1aXJlZCBpbiA1LjEuCiAgICAgICAgICAgICAgICAgICIuIiArIHRvUGFkZGVkU3RyaW5nKDMsIG1pbGxpc2Vjb25kcykgKyAiWiI7CiAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHZhbHVlID0gbnVsbDsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlLnRvSlNPTiA9PSAiZnVuY3Rpb24iICYmICgoY2xhc3NOYW1lICE9IG51bWJlckNsYXNzICYmIGNsYXNzTmFtZSAhPSBzdHJpbmdDbGFzcyAmJiBjbGFzc05hbWUgIT0gYXJyYXlDbGFzcykgfHwgaXNQcm9wZXJ0eS5jYWxsKHZhbHVlLCAidG9KU09OIikpKSB7CiAgICAgICAgICAgICAgLy8gUHJvdG90eXBlIDw9IDEuNi4xIGFkZHMgbm9uLXN0YW5kYXJkIGB0b0pTT05gIG1ldGhvZHMgdG8gdGhlCiAgICAgICAgICAgICAgLy8gYE51bWJlcmAsIGBTdHJpbmdgLCBgRGF0ZWAsIGFuZCBgQXJyYXlgIHByb3RvdHlwZXMuIEpTT04gMwogICAgICAgICAgICAgIC8vIGlnbm9yZXMgYWxsIGB0b0pTT05gIG1ldGhvZHMgb24gdGhlc2Ugb2JqZWN0cyB1bmxlc3MgdGhleSBhcmUKICAgICAgICAgICAgICAvLyBkZWZpbmVkIGRpcmVjdGx5IG9uIGFuIGluc3RhbmNlLgogICAgICAgICAgICAgIHZhbHVlID0gdmFsdWUudG9KU09OKHByb3BlcnR5KTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgaWYgKGNhbGxiYWNrKSB7CiAgICAgICAgICAgIC8vIElmIGEgcmVwbGFjZW1lbnQgZnVuY3Rpb24gd2FzIHByb3ZpZGVkLCBjYWxsIGl0IHRvIG9idGFpbiB0aGUgdmFsdWUKICAgICAgICAgICAgLy8gZm9yIHNlcmlhbGl6YXRpb24uCiAgICAgICAgICAgIHZhbHVlID0gY2FsbGJhY2suY2FsbChvYmplY3QsIHByb3BlcnR5LCB2YWx1ZSk7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAodmFsdWUgPT09IG51bGwpIHsKICAgICAgICAgICAgcmV0dXJuICJudWxsIjsKICAgICAgICAgIH0KICAgICAgICAgIGNsYXNzTmFtZSA9IGdldENsYXNzLmNhbGwodmFsdWUpOwogICAgICAgICAgaWYgKGNsYXNzTmFtZSA9PSBib29sZWFuQ2xhc3MpIHsKICAgICAgICAgICAgLy8gQm9vbGVhbnMgYXJlIHJlcHJlc2VudGVkIGxpdGVyYWxseS4KICAgICAgICAgICAgcmV0dXJuICIiICsgdmFsdWU7CiAgICAgICAgICB9IGVsc2UgaWYgKGNsYXNzTmFtZSA9PSBudW1iZXJDbGFzcykgewogICAgICAgICAgICAvLyBKU09OIG51bWJlcnMgbXVzdCBiZSBmaW5pdGUuIGBJbmZpbml0eWAgYW5kIGBOYU5gIGFyZSBzZXJpYWxpemVkIGFzCiAgICAgICAgICAgIC8vIGAibnVsbCJgLgogICAgICAgICAgICByZXR1cm4gdmFsdWUgPiAtMSAvIDAgJiYgdmFsdWUgPCAxIC8gMCA/ICIiICsgdmFsdWUgOiAibnVsbCI7CiAgICAgICAgICB9IGVsc2UgaWYgKGNsYXNzTmFtZSA9PSBzdHJpbmdDbGFzcykgewogICAgICAgICAgICAvLyBTdHJpbmdzIGFyZSBkb3VibGUtcXVvdGVkIGFuZCBlc2NhcGVkLgogICAgICAgICAgICByZXR1cm4gcXVvdGUoIiIgKyB2YWx1ZSk7CiAgICAgICAgICB9CiAgICAgICAgICAvLyBSZWN1cnNpdmVseSBzZXJpYWxpemUgb2JqZWN0cyBhbmQgYXJyYXlzLgogICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PSAib2JqZWN0IikgewogICAgICAgICAgICAvLyBDaGVjayBmb3IgY3ljbGljIHN0cnVjdHVyZXMuIFRoaXMgaXMgYSBsaW5lYXIgc2VhcmNoOyBwZXJmb3JtYW5jZQogICAgICAgICAgICAvLyBpcyBpbnZlcnNlbHkgcHJvcG9ydGlvbmFsIHRvIHRoZSBudW1iZXIgb2YgdW5pcXVlIG5lc3RlZCBvYmplY3RzLgogICAgICAgICAgICBmb3IgKGxlbmd0aCA9IHN0YWNrLmxlbmd0aDsgbGVuZ3RoLS07KSB7CiAgICAgICAgICAgICAgaWYgKHN0YWNrW2xlbmd0aF0gPT09IHZhbHVlKSB7CiAgICAgICAgICAgICAgICAvLyBDeWNsaWMgc3RydWN0dXJlcyBjYW5ub3QgYmUgc2VyaWFsaXplZCBieSBgSlNPTi5zdHJpbmdpZnlgLgogICAgICAgICAgICAgICAgdGhyb3cgVHlwZUVycm9yKCk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIEFkZCB0aGUgb2JqZWN0IHRvIHRoZSBzdGFjayBvZiB0cmF2ZXJzZWQgb2JqZWN0cy4KICAgICAgICAgICAgc3RhY2sucHVzaCh2YWx1ZSk7CiAgICAgICAgICAgIHJlc3VsdHMgPSBbXTsKICAgICAgICAgICAgLy8gU2F2ZSB0aGUgY3VycmVudCBpbmRlbnRhdGlvbiBsZXZlbCBhbmQgaW5kZW50IG9uZSBhZGRpdGlvbmFsIGxldmVsLgogICAgICAgICAgICBwcmVmaXggPSBpbmRlbnRhdGlvbjsKICAgICAgICAgICAgaW5kZW50YXRpb24gKz0gd2hpdGVzcGFjZTsKICAgICAgICAgICAgaWYgKGNsYXNzTmFtZSA9PSBhcnJheUNsYXNzKSB7CiAgICAgICAgICAgICAgLy8gUmVjdXJzaXZlbHkgc2VyaWFsaXplIGFycmF5IGVsZW1lbnRzLgogICAgICAgICAgICAgIGZvciAoaW5kZXggPSAwLCBsZW5ndGggPSB2YWx1ZS5sZW5ndGg7IGluZGV4IDwgbGVuZ3RoOyBpbmRleCsrKSB7CiAgICAgICAgICAgICAgICBlbGVtZW50ID0gc2VyaWFsaXplKGluZGV4LCB2YWx1ZSwgY2FsbGJhY2ssIHByb3BlcnRpZXMsIHdoaXRlc3BhY2UsIGluZGVudGF0aW9uLCBzdGFjayk7CiAgICAgICAgICAgICAgICByZXN1bHRzLnB1c2goZWxlbWVudCA9PT0gdW5kZWYgPyAibnVsbCIgOiBlbGVtZW50KTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0cy5sZW5ndGggPyAod2hpdGVzcGFjZSA/ICJbXG4iICsgaW5kZW50YXRpb24gKyByZXN1bHRzLmpvaW4oIixcbiIgKyBpbmRlbnRhdGlvbikgKyAiXG4iICsgcHJlZml4ICsgIl0iIDogKCJbIiArIHJlc3VsdHMuam9pbigiLCIpICsgIl0iKSkgOiAiW10iOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIC8vIFJlY3Vyc2l2ZWx5IHNlcmlhbGl6ZSBvYmplY3QgbWVtYmVycy4gTWVtYmVycyBhcmUgc2VsZWN0ZWQgZnJvbQogICAgICAgICAgICAgIC8vIGVpdGhlciBhIHVzZXItc3BlY2lmaWVkIGxpc3Qgb2YgcHJvcGVydHkgbmFtZXMsIG9yIHRoZSBvYmplY3QKICAgICAgICAgICAgICAvLyBpdHNlbGYuCiAgICAgICAgICAgICAgZm9yRWFjaChwcm9wZXJ0aWVzIHx8IHZhbHVlLCBmdW5jdGlvbiAocHJvcGVydHkpIHsKICAgICAgICAgICAgICAgIHZhciBlbGVtZW50ID0gc2VyaWFsaXplKHByb3BlcnR5LCB2YWx1ZSwgY2FsbGJhY2ssIHByb3BlcnRpZXMsIHdoaXRlc3BhY2UsIGluZGVudGF0aW9uLCBzdGFjayk7CiAgICAgICAgICAgICAgICBpZiAoZWxlbWVudCAhPT0gdW5kZWYpIHsKICAgICAgICAgICAgICAgICAgLy8gQWNjb3JkaW5nIHRvIEVTIDUuMSBzZWN0aW9uIDE1LjEyLjM6ICJJZiBgZ2FwYCB7d2hpdGVzcGFjZX0KICAgICAgICAgICAgICAgICAgLy8gaXMgbm90IHRoZSBlbXB0eSBzdHJpbmcsIGxldCBgbWVtYmVyYCB7cXVvdGUocHJvcGVydHkpICsgIjoifQogICAgICAgICAgICAgICAgICAvLyBiZSB0aGUgY29uY2F0ZW5hdGlvbiBvZiBgbWVtYmVyYCBhbmQgdGhlIGBzcGFjZWAgY2hhcmFjdGVyLiIKICAgICAgICAgICAgICAgICAgLy8gVGhlICJgc3BhY2VgIGNoYXJhY3RlciIgcmVmZXJzIHRvIHRoZSBsaXRlcmFsIHNwYWNlCiAgICAgICAgICAgICAgICAgIC8vIGNoYXJhY3Rlciwgbm90IHRoZSBgc3BhY2VgIHt3aWR0aH0gYXJndW1lbnQgcHJvdmlkZWQgdG8KICAgICAgICAgICAgICAgICAgLy8gYEpTT04uc3RyaW5naWZ5YC4KICAgICAgICAgICAgICAgICAgcmVzdWx0cy5wdXNoKHF1b3RlKHByb3BlcnR5KSArICI6IiArICh3aGl0ZXNwYWNlID8gIiAiIDogIiIpICsgZWxlbWVudCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0cy5sZW5ndGggPyAod2hpdGVzcGFjZSA/ICJ7XG4iICsgaW5kZW50YXRpb24gKyByZXN1bHRzLmpvaW4oIixcbiIgKyBpbmRlbnRhdGlvbikgKyAiXG4iICsgcHJlZml4ICsgIn0iIDogKCJ7IiArIHJlc3VsdHMuam9pbigiLCIpICsgIn0iKSkgOiAie30iOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIFJlbW92ZSB0aGUgb2JqZWN0IGZyb20gdGhlIHRyYXZlcnNlZCBvYmplY3Qgc3RhY2suCiAgICAgICAgICAgIHN0YWNrLnBvcCgpOwogICAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgICAgfQogICAgICAgIH07CgogICAgICAgIC8vIFB1YmxpYzogYEpTT04uc3RyaW5naWZ5YC4gU2VlIEVTIDUuMSBzZWN0aW9uIDE1LjEyLjMuCiAgICAgICAgZXhwb3J0cy5zdHJpbmdpZnkgPSBmdW5jdGlvbiAoc291cmNlLCBmaWx0ZXIsIHdpZHRoKSB7CiAgICAgICAgICB2YXIgd2hpdGVzcGFjZSwgY2FsbGJhY2ssIHByb3BlcnRpZXMsIGNsYXNzTmFtZTsKICAgICAgICAgIGlmIChvYmplY3RUeXBlc1t0eXBlb2YgZmlsdGVyXSAmJiBmaWx0ZXIpIHsKICAgICAgICAgICAgaWYgKChjbGFzc05hbWUgPSBnZXRDbGFzcy5jYWxsKGZpbHRlcikpID09IGZ1bmN0aW9uQ2xhc3MpIHsKICAgICAgICAgICAgICBjYWxsYmFjayA9IGZpbHRlcjsKICAgICAgICAgICAgfSBlbHNlIGlmIChjbGFzc05hbWUgPT0gYXJyYXlDbGFzcykgewogICAgICAgICAgICAgIC8vIENvbnZlcnQgdGhlIHByb3BlcnR5IG5hbWVzIGFycmF5IGludG8gYSBtYWtlc2hpZnQgc2V0LgogICAgICAgICAgICAgIHByb3BlcnRpZXMgPSB7fTsKICAgICAgICAgICAgICBmb3IgKHZhciBpbmRleCA9IDAsIGxlbmd0aCA9IGZpbHRlci5sZW5ndGgsIHZhbHVlOyBpbmRleCA8IGxlbmd0aDsgdmFsdWUgPSBmaWx0ZXJbaW5kZXgrK10sICgoY2xhc3NOYW1lID0gZ2V0Q2xhc3MuY2FsbCh2YWx1ZSkpLCBjbGFzc05hbWUgPT0gc3RyaW5nQ2xhc3MgfHwgY2xhc3NOYW1lID09IG51bWJlckNsYXNzKSAmJiAocHJvcGVydGllc1t2YWx1ZV0gPSAxKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGlmICh3aWR0aCkgewogICAgICAgICAgICBpZiAoKGNsYXNzTmFtZSA9IGdldENsYXNzLmNhbGwod2lkdGgpKSA9PSBudW1iZXJDbGFzcykgewogICAgICAgICAgICAgIC8vIENvbnZlcnQgdGhlIGB3aWR0aGAgdG8gYW4gaW50ZWdlciBhbmQgY3JlYXRlIGEgc3RyaW5nIGNvbnRhaW5pbmcKICAgICAgICAgICAgICAvLyBgd2lkdGhgIG51bWJlciBvZiBzcGFjZSBjaGFyYWN0ZXJzLgogICAgICAgICAgICAgIGlmICgod2lkdGggLT0gd2lkdGggJSAxKSA+IDApIHsKICAgICAgICAgICAgICAgIGZvciAod2hpdGVzcGFjZSA9ICIiLCB3aWR0aCA+IDEwICYmICh3aWR0aCA9IDEwKTsgd2hpdGVzcGFjZS5sZW5ndGggPCB3aWR0aDsgd2hpdGVzcGFjZSArPSAiICIpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIGlmIChjbGFzc05hbWUgPT0gc3RyaW5nQ2xhc3MpIHsKICAgICAgICAgICAgICB3aGl0ZXNwYWNlID0gd2lkdGgubGVuZ3RoIDw9IDEwID8gd2lkdGggOiB3aWR0aC5zbGljZSgwLCAxMCk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIC8vIE9wZXJhIDw9IDcuNTR1MiBkaXNjYXJkcyB0aGUgdmFsdWVzIGFzc29jaWF0ZWQgd2l0aCBlbXB0eSBzdHJpbmcga2V5cwogICAgICAgICAgLy8gKGAiImApIG9ubHkgaWYgdGhleSBhcmUgdXNlZCBkaXJlY3RseSB3aXRoaW4gYW4gb2JqZWN0IG1lbWJlciBsaXN0CiAgICAgICAgICAvLyAoZS5nLiwgYCEoIiIgaW4geyAiIjogMX0pYCkuCiAgICAgICAgICByZXR1cm4gc2VyaWFsaXplKCIiLCAodmFsdWUgPSB7fSwgdmFsdWVbIiJdID0gc291cmNlLCB2YWx1ZSksIGNhbGxiYWNrLCBwcm9wZXJ0aWVzLCB3aGl0ZXNwYWNlLCAiIiwgW10pOwogICAgICAgIH07CiAgICAgIH0KCiAgICAgIC8vIFB1YmxpYzogUGFyc2VzIGEgSlNPTiBzb3VyY2Ugc3RyaW5nLgogICAgICBpZiAoIWhhcygianNvbi1wYXJzZSIpKSB7CiAgICAgICAgdmFyIGZyb21DaGFyQ29kZSA9IFN0cmluZy5mcm9tQ2hhckNvZGU7CgogICAgICAgIC8vIEludGVybmFsOiBBIG1hcCBvZiBlc2NhcGVkIGNvbnRyb2wgY2hhcmFjdGVycyBhbmQgdGhlaXIgdW5lc2NhcGVkCiAgICAgICAgLy8gZXF1aXZhbGVudHMuCiAgICAgICAgdmFyIFVuZXNjYXBlcyA9IHsKICAgICAgICAgIDkyOiAiXFwiLAogICAgICAgICAgMzQ6ICciJywKICAgICAgICAgIDQ3OiAiLyIsCiAgICAgICAgICA5ODogIlxiIiwKICAgICAgICAgIDExNjogIlx0IiwKICAgICAgICAgIDExMDogIlxuIiwKICAgICAgICAgIDEwMjogIlxmIiwKICAgICAgICAgIDExNDogIlxyIgogICAgICAgIH07CgogICAgICAgIC8vIEludGVybmFsOiBTdG9yZXMgdGhlIHBhcnNlciBzdGF0ZS4KICAgICAgICB2YXIgSW5kZXgsIFNvdXJjZTsKCiAgICAgICAgLy8gSW50ZXJuYWw6IFJlc2V0cyB0aGUgcGFyc2VyIHN0YXRlIGFuZCB0aHJvd3MgYSBgU3ludGF4RXJyb3JgLgogICAgICAgIHZhciBhYm9ydCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgIEluZGV4ID0gU291cmNlID0gbnVsbDsKICAgICAgICAgIHRocm93IFN5bnRheEVycm9yKCk7CiAgICAgICAgfTsKCiAgICAgICAgLy8gSW50ZXJuYWw6IFJldHVybnMgdGhlIG5leHQgdG9rZW4sIG9yIGAiJCJgIGlmIHRoZSBwYXJzZXIgaGFzIHJlYWNoZWQKICAgICAgICAvLyB0aGUgZW5kIG9mIHRoZSBzb3VyY2Ugc3RyaW5nLiBBIHRva2VuIG1heSBiZSBhIHN0cmluZywgbnVtYmVyLCBgbnVsbGAKICAgICAgICAvLyBsaXRlcmFsLCBvciBCb29sZWFuIGxpdGVyYWwuCiAgICAgICAgdmFyIGxleCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgIHZhciBzb3VyY2UgPSBTb3VyY2UsIGxlbmd0aCA9IHNvdXJjZS5sZW5ndGgsIHZhbHVlLCBiZWdpbiwgcG9zaXRpb24sIGlzU2lnbmVkLCBjaGFyQ29kZTsKICAgICAgICAgIHdoaWxlIChJbmRleCA8IGxlbmd0aCkgewogICAgICAgICAgICBjaGFyQ29kZSA9IHNvdXJjZS5jaGFyQ29kZUF0KEluZGV4KTsKICAgICAgICAgICAgc3dpdGNoIChjaGFyQ29kZSkgewogICAgICAgICAgICAgIGNhc2UgOTogY2FzZSAxMDogY2FzZSAxMzogY2FzZSAzMjoKICAgICAgICAgICAgICAgIC8vIFNraXAgd2hpdGVzcGFjZSB0b2tlbnMsIGluY2x1ZGluZyB0YWJzLCBjYXJyaWFnZSByZXR1cm5zLCBsaW5lCiAgICAgICAgICAgICAgICAvLyBmZWVkcywgYW5kIHNwYWNlIGNoYXJhY3RlcnMuCiAgICAgICAgICAgICAgICBJbmRleCsrOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgY2FzZSAxMjM6IGNhc2UgMTI1OiBjYXNlIDkxOiBjYXNlIDkzOiBjYXNlIDU4OiBjYXNlIDQ0OgogICAgICAgICAgICAgICAgLy8gUGFyc2UgYSBwdW5jdHVhdG9yIHRva2VuIChge2AsIGB9YCwgYFtgLCBgXWAsIGA6YCwgb3IgYCxgKSBhdAogICAgICAgICAgICAgICAgLy8gdGhlIGN1cnJlbnQgcG9zaXRpb24uCiAgICAgICAgICAgICAgICB2YWx1ZSA9IGNoYXJJbmRleEJ1Z2d5ID8gc291cmNlLmNoYXJBdChJbmRleCkgOiBzb3VyY2VbSW5kZXhdOwogICAgICAgICAgICAgICAgSW5kZXgrKzsKICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKICAgICAgICAgICAgICBjYXNlIDM0OgogICAgICAgICAgICAgICAgLy8gYCJgIGRlbGltaXRzIGEgSlNPTiBzdHJpbmc7IGFkdmFuY2UgdG8gdGhlIG5leHQgY2hhcmFjdGVyIGFuZAogICAgICAgICAgICAgICAgLy8gYmVnaW4gcGFyc2luZyB0aGUgc3RyaW5nLiBTdHJpbmcgdG9rZW5zIGFyZSBwcmVmaXhlZCB3aXRoIHRoZQogICAgICAgICAgICAgICAgLy8gc2VudGluZWwgYEBgIGNoYXJhY3RlciB0byBkaXN0aW5ndWlzaCB0aGVtIGZyb20gcHVuY3R1YXRvcnMgYW5kCiAgICAgICAgICAgICAgICAvLyBlbmQtb2Ytc3RyaW5nIHRva2Vucy4KICAgICAgICAgICAgICAgIGZvciAodmFsdWUgPSAiQCIsIEluZGV4Kys7IEluZGV4IDwgbGVuZ3RoOykgewogICAgICAgICAgICAgICAgICBjaGFyQ29kZSA9IHNvdXJjZS5jaGFyQ29kZUF0KEluZGV4KTsKICAgICAgICAgICAgICAgICAgaWYgKGNoYXJDb2RlIDwgMzIpIHsKICAgICAgICAgICAgICAgICAgICAvLyBVbmVzY2FwZWQgQVNDSUkgY29udHJvbCBjaGFyYWN0ZXJzICh0aG9zZSB3aXRoIGEgY29kZSB1bml0CiAgICAgICAgICAgICAgICAgICAgLy8gbGVzcyB0aGFuIHRoZSBzcGFjZSBjaGFyYWN0ZXIpIGFyZSBub3QgcGVybWl0dGVkLgogICAgICAgICAgICAgICAgICAgIGFib3J0KCk7CiAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2hhckNvZGUgPT0gOTIpIHsKICAgICAgICAgICAgICAgICAgICAvLyBBIHJldmVyc2Ugc29saWR1cyAoYFxgKSBtYXJrcyB0aGUgYmVnaW5uaW5nIG9mIGFuIGVzY2FwZWQKICAgICAgICAgICAgICAgICAgICAvLyBjb250cm9sIGNoYXJhY3RlciAoaW5jbHVkaW5nIGAiYCwgYFxgLCBhbmQgYC9gKSBvciBVbmljb2RlCiAgICAgICAgICAgICAgICAgICAgLy8gZXNjYXBlIHNlcXVlbmNlLgogICAgICAgICAgICAgICAgICAgIGNoYXJDb2RlID0gc291cmNlLmNoYXJDb2RlQXQoKytJbmRleCk7CiAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChjaGFyQ29kZSkgewogICAgICAgICAgICAgICAgICAgICAgY2FzZSA5MjogY2FzZSAzNDogY2FzZSA0NzogY2FzZSA5ODogY2FzZSAxMTY6IGNhc2UgMTEwOiBjYXNlIDEwMjogY2FzZSAxMTQ6CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJldml2ZSBlc2NhcGVkIGNvbnRyb2wgY2hhcmFjdGVycy4KICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgKz0gVW5lc2NhcGVzW2NoYXJDb2RlXTsKICAgICAgICAgICAgICAgICAgICAgICAgSW5kZXgrKzsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICBjYXNlIDExNzoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gYFx1YCBtYXJrcyB0aGUgYmVnaW5uaW5nIG9mIGEgVW5pY29kZSBlc2NhcGUgc2VxdWVuY2UuCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFkdmFuY2UgdG8gdGhlIGZpcnN0IGNoYXJhY3RlciBhbmQgdmFsaWRhdGUgdGhlCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvdXItZGlnaXQgY29kZSBwb2ludC4KICAgICAgICAgICAgICAgICAgICAgICAgYmVnaW4gPSArK0luZGV4OwogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHBvc2l0aW9uID0gSW5kZXggKyA0OyBJbmRleCA8IHBvc2l0aW9uOyBJbmRleCsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhckNvZGUgPSBzb3VyY2UuY2hhckNvZGVBdChJbmRleCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQSB2YWxpZCBzZXF1ZW5jZSBjb21wcmlzZXMgZm91ciBoZXhkaWdpdHMgKGNhc2UtCiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW5zZW5zaXRpdmUpIHRoYXQgZm9ybSBhIHNpbmdsZSBoZXhhZGVjaW1hbCB2YWx1ZS4KICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIShjaGFyQ29kZSA+PSA0OCAmJiBjaGFyQ29kZSA8PSA1NyB8fCBjaGFyQ29kZSA+PSA5NyAmJiBjaGFyQ29kZSA8PSAxMDIgfHwgY2hhckNvZGUgPj0gNjUgJiYgY2hhckNvZGUgPD0gNzApKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbnZhbGlkIFVuaWNvZGUgZXNjYXBlIHNlcXVlbmNlLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJvcnQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmV2aXZlIHRoZSBlc2NhcGVkIGNoYXJhY3Rlci4KICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgKz0gZnJvbUNoYXJDb2RlKCIweCIgKyBzb3VyY2Uuc2xpY2UoYmVnaW4sIEluZGV4KSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW52YWxpZCBlc2NhcGUgc2VxdWVuY2UuCiAgICAgICAgICAgICAgICAgICAgICAgIGFib3J0KCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIGlmIChjaGFyQ29kZSA9PSAzNCkgewogICAgICAgICAgICAgICAgICAgICAgLy8gQW4gdW5lc2NhcGVkIGRvdWJsZS1xdW90ZSBjaGFyYWN0ZXIgbWFya3MgdGhlIGVuZCBvZiB0aGUKICAgICAgICAgICAgICAgICAgICAgIC8vIHN0cmluZy4KICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBjaGFyQ29kZSA9IHNvdXJjZS5jaGFyQ29kZUF0KEluZGV4KTsKICAgICAgICAgICAgICAgICAgICBiZWdpbiA9IEluZGV4OwogICAgICAgICAgICAgICAgICAgIC8vIE9wdGltaXplIGZvciB0aGUgY29tbW9uIGNhc2Ugd2hlcmUgYSBzdHJpbmcgaXMgdmFsaWQuCiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGNoYXJDb2RlID49IDMyICYmIGNoYXJDb2RlICE9IDkyICYmIGNoYXJDb2RlICE9IDM0KSB7CiAgICAgICAgICAgICAgICAgICAgICBjaGFyQ29kZSA9IHNvdXJjZS5jaGFyQ29kZUF0KCsrSW5kZXgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAvLyBBcHBlbmQgdGhlIHN0cmluZyBhcy1pcy4KICAgICAgICAgICAgICAgICAgICB2YWx1ZSArPSBzb3VyY2Uuc2xpY2UoYmVnaW4sIEluZGV4KTsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKHNvdXJjZS5jaGFyQ29kZUF0KEluZGV4KSA9PSAzNCkgewogICAgICAgICAgICAgICAgICAvLyBBZHZhbmNlIHRvIHRoZSBuZXh0IGNoYXJhY3RlciBhbmQgcmV0dXJuIHRoZSByZXZpdmVkIHN0cmluZy4KICAgICAgICAgICAgICAgICAgSW5kZXgrKzsKICAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLy8gVW50ZXJtaW5hdGVkIHN0cmluZy4KICAgICAgICAgICAgICAgIGFib3J0KCk7CiAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgIC8vIFBhcnNlIG51bWJlcnMgYW5kIGxpdGVyYWxzLgogICAgICAgICAgICAgICAgYmVnaW4gPSBJbmRleDsKICAgICAgICAgICAgICAgIC8vIEFkdmFuY2UgcGFzdCB0aGUgbmVnYXRpdmUgc2lnbiwgaWYgb25lIGlzIHNwZWNpZmllZC4KICAgICAgICAgICAgICAgIGlmIChjaGFyQ29kZSA9PSA0NSkgewogICAgICAgICAgICAgICAgICBpc1NpZ25lZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgIGNoYXJDb2RlID0gc291cmNlLmNoYXJDb2RlQXQoKytJbmRleCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAvLyBQYXJzZSBhbiBpbnRlZ2VyIG9yIGZsb2F0aW5nLXBvaW50IHZhbHVlLgogICAgICAgICAgICAgICAgaWYgKGNoYXJDb2RlID49IDQ4ICYmIGNoYXJDb2RlIDw9IDU3KSB7CiAgICAgICAgICAgICAgICAgIC8vIExlYWRpbmcgemVyb2VzIGFyZSBpbnRlcnByZXRlZCBhcyBvY3RhbCBsaXRlcmFscy4KICAgICAgICAgICAgICAgICAgaWYgKGNoYXJDb2RlID09IDQ4ICYmICgoY2hhckNvZGUgPSBzb3VyY2UuY2hhckNvZGVBdChJbmRleCArIDEpKSwgY2hhckNvZGUgPj0gNDggJiYgY2hhckNvZGUgPD0gNTcpKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gSWxsZWdhbCBvY3RhbCBsaXRlcmFsLgogICAgICAgICAgICAgICAgICAgIGFib3J0KCk7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgaXNTaWduZWQgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgLy8gUGFyc2UgdGhlIGludGVnZXIgY29tcG9uZW50LgogICAgICAgICAgICAgICAgICBmb3IgKDsgSW5kZXggPCBsZW5ndGggJiYgKChjaGFyQ29kZSA9IHNvdXJjZS5jaGFyQ29kZUF0KEluZGV4KSksIGNoYXJDb2RlID49IDQ4ICYmIGNoYXJDb2RlIDw9IDU3KTsgSW5kZXgrKyk7CiAgICAgICAgICAgICAgICAgIC8vIEZsb2F0cyBjYW5ub3QgY29udGFpbiBhIGxlYWRpbmcgZGVjaW1hbCBwb2ludDsgaG93ZXZlciwgdGhpcwogICAgICAgICAgICAgICAgICAvLyBjYXNlIGlzIGFscmVhZHkgYWNjb3VudGVkIGZvciBieSB0aGUgcGFyc2VyLgogICAgICAgICAgICAgICAgICBpZiAoc291cmNlLmNoYXJDb2RlQXQoSW5kZXgpID09IDQ2KSB7CiAgICAgICAgICAgICAgICAgICAgcG9zaXRpb24gPSArK0luZGV4OwogICAgICAgICAgICAgICAgICAgIC8vIFBhcnNlIHRoZSBkZWNpbWFsIGNvbXBvbmVudC4KICAgICAgICAgICAgICAgICAgICBmb3IgKDsgcG9zaXRpb24gPCBsZW5ndGggJiYgKChjaGFyQ29kZSA9IHNvdXJjZS5jaGFyQ29kZUF0KHBvc2l0aW9uKSksIGNoYXJDb2RlID49IDQ4ICYmIGNoYXJDb2RlIDw9IDU3KTsgcG9zaXRpb24rKyk7CiAgICAgICAgICAgICAgICAgICAgaWYgKHBvc2l0aW9uID09IEluZGV4KSB7CiAgICAgICAgICAgICAgICAgICAgICAvLyBJbGxlZ2FsIHRyYWlsaW5nIGRlY2ltYWwuCiAgICAgICAgICAgICAgICAgICAgICBhYm9ydCgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBJbmRleCA9IHBvc2l0aW9uOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIC8vIFBhcnNlIGV4cG9uZW50cy4gVGhlIGBlYCBkZW5vdGluZyB0aGUgZXhwb25lbnQgaXMKICAgICAgICAgICAgICAgICAgLy8gY2FzZS1pbnNlbnNpdGl2ZS4KICAgICAgICAgICAgICAgICAgY2hhckNvZGUgPSBzb3VyY2UuY2hhckNvZGVBdChJbmRleCk7CiAgICAgICAgICAgICAgICAgIGlmIChjaGFyQ29kZSA9PSAxMDEgfHwgY2hhckNvZGUgPT0gNjkpIHsKICAgICAgICAgICAgICAgICAgICBjaGFyQ29kZSA9IHNvdXJjZS5jaGFyQ29kZUF0KCsrSW5kZXgpOwogICAgICAgICAgICAgICAgICAgIC8vIFNraXAgcGFzdCB0aGUgc2lnbiBmb2xsb3dpbmcgdGhlIGV4cG9uZW50LCBpZiBvbmUgaXMKICAgICAgICAgICAgICAgICAgICAvLyBzcGVjaWZpZWQuCiAgICAgICAgICAgICAgICAgICAgaWYgKGNoYXJDb2RlID09IDQzIHx8IGNoYXJDb2RlID09IDQ1KSB7CiAgICAgICAgICAgICAgICAgICAgICBJbmRleCsrOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAvLyBQYXJzZSB0aGUgZXhwb25lbnRpYWwgY29tcG9uZW50LgogICAgICAgICAgICAgICAgICAgIGZvciAocG9zaXRpb24gPSBJbmRleDsgcG9zaXRpb24gPCBsZW5ndGggJiYgKChjaGFyQ29kZSA9IHNvdXJjZS5jaGFyQ29kZUF0KHBvc2l0aW9uKSksIGNoYXJDb2RlID49IDQ4ICYmIGNoYXJDb2RlIDw9IDU3KTsgcG9zaXRpb24rKyk7CiAgICAgICAgICAgICAgICAgICAgaWYgKHBvc2l0aW9uID09IEluZGV4KSB7CiAgICAgICAgICAgICAgICAgICAgICAvLyBJbGxlZ2FsIGVtcHR5IGV4cG9uZW50LgogICAgICAgICAgICAgICAgICAgICAgYWJvcnQoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgSW5kZXggPSBwb3NpdGlvbjsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAvLyBDb2VyY2UgdGhlIHBhcnNlZCB2YWx1ZSB0byBhIEphdmFTY3JpcHQgbnVtYmVyLgogICAgICAgICAgICAgICAgICByZXR1cm4gK3NvdXJjZS5zbGljZShiZWdpbiwgSW5kZXgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLy8gQSBuZWdhdGl2ZSBzaWduIG1heSBvbmx5IHByZWNlZGUgbnVtYmVycy4KICAgICAgICAgICAgICAgIGlmIChpc1NpZ25lZCkgewogICAgICAgICAgICAgICAgICBhYm9ydCgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLy8gYHRydWVgLCBgZmFsc2VgLCBhbmQgYG51bGxgIGxpdGVyYWxzLgogICAgICAgICAgICAgICAgaWYgKHNvdXJjZS5zbGljZShJbmRleCwgSW5kZXggKyA0KSA9PSAidHJ1ZSIpIHsKICAgICAgICAgICAgICAgICAgSW5kZXggKz0gNDsKICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHNvdXJjZS5zbGljZShJbmRleCwgSW5kZXggKyA1KSA9PSAiZmFsc2UiKSB7CiAgICAgICAgICAgICAgICAgIEluZGV4ICs9IDU7CiAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc291cmNlLnNsaWNlKEluZGV4LCBJbmRleCArIDQpID09ICJudWxsIikgewogICAgICAgICAgICAgICAgICBJbmRleCArPSA0OwogICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8vIFVucmVjb2duaXplZCB0b2tlbi4KICAgICAgICAgICAgICAgIGFib3J0KCk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIC8vIFJldHVybiB0aGUgc2VudGluZWwgYCRgIGNoYXJhY3RlciBpZiB0aGUgcGFyc2VyIGhhcyByZWFjaGVkIHRoZSBlbmQKICAgICAgICAgIC8vIG9mIHRoZSBzb3VyY2Ugc3RyaW5nLgogICAgICAgICAgcmV0dXJuICIkIjsKICAgICAgICB9OwoKICAgICAgICAvLyBJbnRlcm5hbDogUGFyc2VzIGEgSlNPTiBgdmFsdWVgIHRva2VuLgogICAgICAgIHZhciBnZXQgPSBmdW5jdGlvbiAodmFsdWUpIHsKICAgICAgICAgIHZhciByZXN1bHRzLCBoYXNNZW1iZXJzOwogICAgICAgICAgaWYgKHZhbHVlID09ICIkIikgewogICAgICAgICAgICAvLyBVbmV4cGVjdGVkIGVuZCBvZiBpbnB1dC4KICAgICAgICAgICAgYWJvcnQoKTsKICAgICAgICAgIH0KICAgICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT0gInN0cmluZyIpIHsKICAgICAgICAgICAgaWYgKChjaGFySW5kZXhCdWdneSA/IHZhbHVlLmNoYXJBdCgwKSA6IHZhbHVlWzBdKSA9PSAiQCIpIHsKICAgICAgICAgICAgICAvLyBSZW1vdmUgdGhlIHNlbnRpbmVsIGBAYCBjaGFyYWN0ZXIuCiAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlLnNsaWNlKDEpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIFBhcnNlIG9iamVjdCBhbmQgYXJyYXkgbGl0ZXJhbHMuCiAgICAgICAgICAgIGlmICh2YWx1ZSA9PSAiWyIpIHsKICAgICAgICAgICAgICAvLyBQYXJzZXMgYSBKU09OIGFycmF5LCByZXR1cm5pbmcgYSBuZXcgSmF2YVNjcmlwdCBhcnJheS4KICAgICAgICAgICAgICByZXN1bHRzID0gW107CiAgICAgICAgICAgICAgZm9yICg7OyBoYXNNZW1iZXJzIHx8IChoYXNNZW1iZXJzID0gdHJ1ZSkpIHsKICAgICAgICAgICAgICAgIHZhbHVlID0gbGV4KCk7CiAgICAgICAgICAgICAgICAvLyBBIGNsb3Npbmcgc3F1YXJlIGJyYWNrZXQgbWFya3MgdGhlIGVuZCBvZiB0aGUgYXJyYXkgbGl0ZXJhbC4KICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PSAiXSIpIHsKICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAvLyBJZiB0aGUgYXJyYXkgbGl0ZXJhbCBjb250YWlucyBlbGVtZW50cywgdGhlIGN1cnJlbnQgdG9rZW4KICAgICAgICAgICAgICAgIC8vIHNob3VsZCBiZSBhIGNvbW1hIHNlcGFyYXRpbmcgdGhlIHByZXZpb3VzIGVsZW1lbnQgZnJvbSB0aGUKICAgICAgICAgICAgICAgIC8vIG5leHQuCiAgICAgICAgICAgICAgICBpZiAoaGFzTWVtYmVycykgewogICAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT0gIiwiKSB7CiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBsZXgoKTsKICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT0gIl0iKSB7CiAgICAgICAgICAgICAgICAgICAgICAvLyBVbmV4cGVjdGVkIHRyYWlsaW5nIGAsYCBpbiBhcnJheSBsaXRlcmFsLgogICAgICAgICAgICAgICAgICAgICAgYWJvcnQoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgLy8gQSBgLGAgbXVzdCBzZXBhcmF0ZSBlYWNoIGFycmF5IGVsZW1lbnQuCiAgICAgICAgICAgICAgICAgICAgYWJvcnQoKTsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLy8gRWxpc2lvbnMgYW5kIGxlYWRpbmcgY29tbWFzIGFyZSBub3QgcGVybWl0dGVkLgogICAgICAgICAgICAgICAgaWYgKHZhbHVlID09ICIsIikgewogICAgICAgICAgICAgICAgICBhYm9ydCgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmVzdWx0cy5wdXNoKGdldCh2YWx1ZSkpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0czsKICAgICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSA9PSAieyIpIHsKICAgICAgICAgICAgICAvLyBQYXJzZXMgYSBKU09OIG9iamVjdCwgcmV0dXJuaW5nIGEgbmV3IEphdmFTY3JpcHQgb2JqZWN0LgogICAgICAgICAgICAgIHJlc3VsdHMgPSB7fTsKICAgICAgICAgICAgICBmb3IgKDs7IGhhc01lbWJlcnMgfHwgKGhhc01lbWJlcnMgPSB0cnVlKSkgewogICAgICAgICAgICAgICAgdmFsdWUgPSBsZXgoKTsKICAgICAgICAgICAgICAgIC8vIEEgY2xvc2luZyBjdXJseSBicmFjZSBtYXJrcyB0aGUgZW5kIG9mIHRoZSBvYmplY3QgbGl0ZXJhbC4KICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PSAifSIpIHsKICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAvLyBJZiB0aGUgb2JqZWN0IGxpdGVyYWwgY29udGFpbnMgbWVtYmVycywgdGhlIGN1cnJlbnQgdG9rZW4KICAgICAgICAgICAgICAgIC8vIHNob3VsZCBiZSBhIGNvbW1hIHNlcGFyYXRvci4KICAgICAgICAgICAgICAgIGlmIChoYXNNZW1iZXJzKSB7CiAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PSAiLCIpIHsKICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IGxleCgpOwogICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PSAifSIpIHsKICAgICAgICAgICAgICAgICAgICAgIC8vIFVuZXhwZWN0ZWQgdHJhaWxpbmcgYCxgIGluIG9iamVjdCBsaXRlcmFsLgogICAgICAgICAgICAgICAgICAgICAgYWJvcnQoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgLy8gQSBgLGAgbXVzdCBzZXBhcmF0ZSBlYWNoIG9iamVjdCBtZW1iZXIuCiAgICAgICAgICAgICAgICAgICAgYWJvcnQoKTsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLy8gTGVhZGluZyBjb21tYXMgYXJlIG5vdCBwZXJtaXR0ZWQsIG9iamVjdCBwcm9wZXJ0eSBuYW1lcyBtdXN0IGJlCiAgICAgICAgICAgICAgICAvLyBkb3VibGUtcXVvdGVkIHN0cmluZ3MsIGFuZCBhIGA6YCBtdXN0IHNlcGFyYXRlIGVhY2ggcHJvcGVydHkKICAgICAgICAgICAgICAgIC8vIG5hbWUgYW5kIHZhbHVlLgogICAgICAgICAgICAgICAgaWYgKHZhbHVlID09ICIsIiB8fCB0eXBlb2YgdmFsdWUgIT0gInN0cmluZyIgfHwgKGNoYXJJbmRleEJ1Z2d5ID8gdmFsdWUuY2hhckF0KDApIDogdmFsdWVbMF0pICE9ICJAIiB8fCBsZXgoKSAhPSAiOiIpIHsKICAgICAgICAgICAgICAgICAgYWJvcnQoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJlc3VsdHNbdmFsdWUuc2xpY2UoMSldID0gZ2V0KGxleCgpKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdHM7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gVW5leHBlY3RlZCB0b2tlbiBlbmNvdW50ZXJlZC4KICAgICAgICAgICAgYWJvcnQoKTsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiB2YWx1ZTsKICAgICAgICB9OwoKICAgICAgICAvLyBJbnRlcm5hbDogVXBkYXRlcyBhIHRyYXZlcnNlZCBvYmplY3QgbWVtYmVyLgogICAgICAgIHZhciB1cGRhdGUgPSBmdW5jdGlvbiAoc291cmNlLCBwcm9wZXJ0eSwgY2FsbGJhY2spIHsKICAgICAgICAgIHZhciBlbGVtZW50ID0gd2Fsayhzb3VyY2UsIHByb3BlcnR5LCBjYWxsYmFjayk7CiAgICAgICAgICBpZiAoZWxlbWVudCA9PT0gdW5kZWYpIHsKICAgICAgICAgICAgZGVsZXRlIHNvdXJjZVtwcm9wZXJ0eV07CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBzb3VyY2VbcHJvcGVydHldID0gZWxlbWVudDsKICAgICAgICAgIH0KICAgICAgICB9OwoKICAgICAgICAvLyBJbnRlcm5hbDogUmVjdXJzaXZlbHkgdHJhdmVyc2VzIGEgcGFyc2VkIEpTT04gb2JqZWN0LCBpbnZva2luZyB0aGUKICAgICAgICAvLyBgY2FsbGJhY2tgIGZ1bmN0aW9uIGZvciBlYWNoIHZhbHVlLiBUaGlzIGlzIGFuIGltcGxlbWVudGF0aW9uIG9mIHRoZQogICAgICAgIC8vIGBXYWxrKGhvbGRlciwgbmFtZSlgIG9wZXJhdGlvbiBkZWZpbmVkIGluIEVTIDUuMSBzZWN0aW9uIDE1LjEyLjIuCiAgICAgICAgdmFyIHdhbGsgPSBmdW5jdGlvbiAoc291cmNlLCBwcm9wZXJ0eSwgY2FsbGJhY2spIHsKICAgICAgICAgIHZhciB2YWx1ZSA9IHNvdXJjZVtwcm9wZXJ0eV0sIGxlbmd0aDsKICAgICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT0gIm9iamVjdCIgJiYgdmFsdWUpIHsKICAgICAgICAgICAgLy8gYGZvckVhY2hgIGNhbid0IGJlIHVzZWQgdG8gdHJhdmVyc2UgYW4gYXJyYXkgaW4gT3BlcmEgPD0gOC41NAogICAgICAgICAgICAvLyBiZWNhdXNlIGl0cyBgT2JqZWN0I2hhc093blByb3BlcnR5YCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIGBmYWxzZWAKICAgICAgICAgICAgLy8gZm9yIGFycmF5IGluZGljZXMgKGUuZy4sIGAhWzEsIDIsIDNdLmhhc093blByb3BlcnR5KCIwIilgKS4KICAgICAgICAgICAgaWYgKGdldENsYXNzLmNhbGwodmFsdWUpID09IGFycmF5Q2xhc3MpIHsKICAgICAgICAgICAgICBmb3IgKGxlbmd0aCA9IHZhbHVlLmxlbmd0aDsgbGVuZ3RoLS07KSB7CiAgICAgICAgICAgICAgICB1cGRhdGUodmFsdWUsIGxlbmd0aCwgY2FsbGJhY2spOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICBmb3JFYWNoKHZhbHVlLCBmdW5jdGlvbiAocHJvcGVydHkpIHsKICAgICAgICAgICAgICAgIHVwZGF0ZSh2YWx1ZSwgcHJvcGVydHksIGNhbGxiYWNrKTsKICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIGNhbGxiYWNrLmNhbGwoc291cmNlLCBwcm9wZXJ0eSwgdmFsdWUpOwogICAgICAgIH07CgogICAgICAgIC8vIFB1YmxpYzogYEpTT04ucGFyc2VgLiBTZWUgRVMgNS4xIHNlY3Rpb24gMTUuMTIuMi4KICAgICAgICBleHBvcnRzLnBhcnNlID0gZnVuY3Rpb24gKHNvdXJjZSwgY2FsbGJhY2spIHsKICAgICAgICAgIHZhciByZXN1bHQsIHZhbHVlOwogICAgICAgICAgSW5kZXggPSAwOwogICAgICAgICAgU291cmNlID0gIiIgKyBzb3VyY2U7CiAgICAgICAgICByZXN1bHQgPSBnZXQobGV4KCkpOwogICAgICAgICAgLy8gSWYgYSBKU09OIHN0cmluZyBjb250YWlucyBtdWx0aXBsZSB0b2tlbnMsIGl0IGlzIGludmFsaWQuCiAgICAgICAgICBpZiAobGV4KCkgIT0gIiQiKSB7CiAgICAgICAgICAgIGFib3J0KCk7CiAgICAgICAgICB9CiAgICAgICAgICAvLyBSZXNldCB0aGUgcGFyc2VyIHN0YXRlLgogICAgICAgICAgSW5kZXggPSBTb3VyY2UgPSBudWxsOwogICAgICAgICAgcmV0dXJuIGNhbGxiYWNrICYmIGdldENsYXNzLmNhbGwoY2FsbGJhY2spID09IGZ1bmN0aW9uQ2xhc3MgPyB3YWxrKCh2YWx1ZSA9IHt9LCB2YWx1ZVsiIl0gPSByZXN1bHQsIHZhbHVlKSwgIiIsIGNhbGxiYWNrKSA6IHJlc3VsdDsKICAgICAgICB9OwogICAgICB9CiAgICB9CgogICAgZXhwb3J0c1sicnVuSW5Db250ZXh0Il0gPSBydW5JbkNvbnRleHQ7CiAgICByZXR1cm4gZXhwb3J0czsKICB9CgogIGlmIChmcmVlRXhwb3J0cyAmJiAhaXNMb2FkZXIpIHsKICAgIC8vIEV4cG9ydCBmb3IgQ29tbW9uSlMgZW52aXJvbm1lbnRzLgogICAgcnVuSW5Db250ZXh0KHJvb3QsIGZyZWVFeHBvcnRzKTsKICB9IGVsc2UgewogICAgLy8gRXhwb3J0IGZvciB3ZWIgYnJvd3NlcnMgYW5kIEphdmFTY3JpcHQgZW5naW5lcy4KICAgIHZhciBuYXRpdmVKU09OID0gcm9vdC5KU09OLAogICAgICAgIHByZXZpb3VzSlNPTiA9IHJvb3RbIkpTT04zIl0sCiAgICAgICAgaXNSZXN0b3JlZCA9IGZhbHNlOwoKICAgIHZhciBKU09OMyA9IHJ1bkluQ29udGV4dChyb290LCAocm9vdFsiSlNPTjMiXSA9IHsKICAgICAgLy8gUHVibGljOiBSZXN0b3JlcyB0aGUgb3JpZ2luYWwgdmFsdWUgb2YgdGhlIGdsb2JhbCBgSlNPTmAgb2JqZWN0IGFuZAogICAgICAvLyByZXR1cm5zIGEgcmVmZXJlbmNlIHRvIHRoZSBgSlNPTjNgIG9iamVjdC4KICAgICAgIm5vQ29uZmxpY3QiOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgaWYgKCFpc1Jlc3RvcmVkKSB7CiAgICAgICAgICBpc1Jlc3RvcmVkID0gdHJ1ZTsKICAgICAgICAgIHJvb3QuSlNPTiA9IG5hdGl2ZUpTT047CiAgICAgICAgICByb290WyJKU09OMyJdID0gcHJldmlvdXNKU09OOwogICAgICAgICAgbmF0aXZlSlNPTiA9IHByZXZpb3VzSlNPTiA9IG51bGw7CiAgICAgICAgfQogICAgICAgIHJldHVybiBKU09OMzsKICAgICAgfQogICAgfSkpOwoKICAgIHJvb3QuSlNPTiA9IHsKICAgICAgInBhcnNlIjogSlNPTjMucGFyc2UsCiAgICAgICJzdHJpbmdpZnkiOiBKU09OMy5zdHJpbmdpZnkKICAgIH07CiAgfQoKICAvLyBFeHBvcnQgZm9yIGFzeW5jaHJvbm91cyBtb2R1bGUgbG9hZGVycy4KICBpZiAoaXNMb2FkZXIpIHsKICAgIGRlZmluZShmdW5jdGlvbiAoKSB7CiAgICAgIHJldHVybiBKU09OMzsKICAgIH0pOwogIH0KfSkuY2FsbCh0aGlzKTsKCi8vIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi8vIERhdGFVdGlscy5qcwovLyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKKGZ1bmN0aW9uICgpIHsKCgkvKioKCSAqIEEgZmV3IGRhdGEgdXRpbGl0aWVzIGZvciBmb3JtYXR0aW5nIGRpZmZlcmVudCBkYXRhIHR5cGVzLgoJICogQGNsYXNzIERhdGFVdGlscwoJICovCgl2YXIgcyA9IHt9OwoKCS8vIHN0YXRpYyBtZXRob2RzCgkvKioKCSAqIFBhcnNlIFhNTCB1c2luZyB0aGUgRE9NLiBUaGlzIGlzIHJlcXVpcmVkIHdoZW4gcHJlbG9hZGluZyBYTUwgb3IgU1ZHLgoJICogQG1ldGhvZCBwYXJzZVhNTAoJICogQHBhcmFtIHtTdHJpbmd9IHRleHQgVGhlIHJhdyB0ZXh0IG9yIFhNTCB0aGF0IGlzIGxvYWRlZCBieSBYSFIuCgkgKiBAcGFyYW0ge1N0cmluZ30gdHlwZSBUaGUgbWltZSB0eXBlIG9mIHRoZSBYTUwuIFVzZSAidGV4dC94bWwiIGZvciBYTUwsIGFuZCAgImltYWdlL3N2Zyt4bWwiIGZvciBTVkcgcGFyc2luZy4KCSAqIEByZXR1cm4ge1hNTH0gQW4gWE1MIGRvY3VtZW50CgkgKiBAc3RhdGljCgkgKi8KCXMucGFyc2VYTUwgPSBmdW5jdGlvbiAodGV4dCwgdHlwZSkgewoJCXZhciB4bWwgPSBudWxsOwoJCXRyeSB7CgkJCS8vIENvY29vbkpTIGRvZXMgbm90IHN1cHBvcnQgWE1MIHBhcnNpbmcgd2l0aCBlaXRoZXIgbWV0aG9kLgoJCQlpZiAod2luZG93LkRPTVBhcnNlcikgewoJCQkJdmFyIHBhcnNlciA9IG5ldyBET01QYXJzZXIoKTsKCQkJCXhtbCA9IHBhcnNlci5wYXJzZUZyb21TdHJpbmcodGV4dCwgdHlwZSk7CgkJCX0gZWxzZSB7IC8vIElFCgkJCQl4bWwgPSBuZXcgQWN0aXZlWE9iamVjdCgiTWljcm9zb2Z0LlhNTERPTSIpOwoJCQkJeG1sLmFzeW5jID0gZmFsc2U7CgkJCQl4bWwubG9hZFhNTCh0ZXh0KTsKCQkJfQoJCX0gY2F0Y2ggKGUpIHt9CgkJcmV0dXJuIHhtbDsKCX07CgoJLyoqCgkgKiBQYXJzZSBhIHN0cmluZyBpbnRvIGFuIE9iamVjdC4KCSAqIEBtZXRob2QgcGFyc2VKU09OCgkgKiBAcGFyYW0ge1N0cmluZ30gdmFsdWUgVGhlIGxvYWRlZCBKU09OIHN0cmluZwoJICogQHJldHVybnMge09iamVjdH0gQSBKYXZhU2NyaXB0IG9iamVjdC4KCSAqLwoJcy5wYXJzZUpTT04gPSBmdW5jdGlvbiAodmFsdWUpIHsKCQlpZiAodmFsdWUgPT0gbnVsbCkgewoJCQlyZXR1cm4gbnVsbDsKCQl9CgoJCXRyeSB7CgkJCXJldHVybiBKU09OLnBhcnNlKHZhbHVlKTsKCQl9IGNhdGNoIChlKSB7CgkJCS8vIFRPRE87IEhhbmRsZSB0aGlzIHdpdGggYSBjdXN0b20gZXJyb3I/CgkJCXRocm93IGU7CgkJfQoJfTsKCgljcmVhdGVqcy5EYXRhVXRpbHMgPSBzOwoKfSgpKTsKCi8vIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi8vIExvYWRJdGVtLmpzCi8vIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgp0aGlzLmNyZWF0ZWpzID0gdGhpcy5jcmVhdGVqcyB8fCB7fTsKCihmdW5jdGlvbiAoKSB7CgkidXNlIHN0cmljdCI7CgoJLyoqCgkgKiBBbGwgbG9hZGVycyBhY2NlcHQgYW4gaXRlbSBjb250YWluaW5nIHRoZSBwcm9wZXJ0aWVzIGRlZmluZWQgaW4gdGhpcyBjbGFzcy4gSWYgYSByYXcgb2JqZWN0IGlzIHBhc3NlZCBpbnN0ZWFkLAoJICogaXQgd2lsbCBub3QgYmUgYWZmZWN0ZWQsIGJ1dCBpdCBtdXN0IGNvbnRhaW4gYXQgbGVhc3QgYSB7eyNjcm9zc0xpbmsgInNyYzpwcm9wZXJ0eSJ9fXt7L2Nyb3NzTGlua319IHByb3BlcnR5LiBBCgkgKiBzdHJpbmcgcGF0aCBvciBIVE1MIHRhZyBpcyBhbHNvIGFjY2VwdGFibGUsIGJ1dCBpdCB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgY29udmVydGVkIHRvIGEgTG9hZEl0ZW0gdXNpbmcgdGhlCgkgKiB7eyNjcm9zc0xpbmsgImNyZWF0ZSJ9fXt7L2Nyb3NzTGlua319IG1ldGhvZCBieSB7eyNjcm9zc0xpbmsgIkFic3RyYWN0TG9hZGVyIn19e3svY3Jvc3NMaW5rfX0KCSAqIEBjbGFzcyBMb2FkSXRlbQoJICogQGNvbnN0cnVjdG9yCgkgKiBAc2luY2UgMC42LjAKCSAqLwoJZnVuY3Rpb24gTG9hZEl0ZW0oKSB7CgkJLyoqCgkJICogVGhlIHNvdXJjZSBvZiB0aGUgZmlsZSB0aGF0IGlzIGJlaW5nIGxvYWRlZC4gVGhpcyBwcm9wZXJ0eSBpcyA8Yj5yZXF1aXJlZDwvYj4uIFRoZSBzb3VyY2UgY2FuIGVpdGhlciBiZSBhCgkJICogc3RyaW5nIChyZWNvbW1lbmRlZCksIG9yIGFuIEhUTUwgdGFnLjwvbGk+CgkJICogQHByb3BlcnR5IHNyYwoJCSAqIEB0eXBlIHtTdHJpbmd9CgkJICogQGRlZmF1bHQgbnVsbAoJCSAqLwoJCXRoaXMuc3JjID0gbnVsbDsKCgkJLyoqCgkJICogVGhlIHNvdXJjZSBvZiB0aGUgZmlsZSB0aGF0IGlzIGJlaW5nIGxvYWRlZC4gVGhpcyBwcm9wZXJ0eSBpcyA8c3Ryb25nPnJlcXVpcmVkPC9zdHJvbmc+LiBUaGUgc291cmNlIGNhbgoJCSAqIGVpdGhlciBiZSBhIHN0cmluZyAocmVjb21tZW5kZWQpLCBvciBhbiBIVE1MIHRhZy4gU2VlIHRoZSB7eyNjcm9zc0xpbmsgIkFic3RyYWN0TG9hZGVyIn19e3svY3Jvc3NMaW5rfX0KCQkgKiBjbGFzcyBmb3IgdGhlIGZ1bGwgbGlzdCBvZiBzdXBwb3J0ZWQgdHlwZXMuCgkJICogQHByb3BlcnR5IHR5cGUKCQkgKiBAdHlwZSB7U3RyaW5nfQoJCSAqIEBkZWZhdWx0IG51bGwKCQkgKi8KCQl0aGlzLnR5cGUgPSBudWxsOwoKCQkvKioKCQkgKiBBIHN0cmluZyBpZGVudGlmaWVyIHdoaWNoIGNhbiBiZSB1c2VkIHRvIHJlZmVyZW5jZSB0aGUgbG9hZGVkIG9iamVjdC4gSWYgbm9uZSBpcyBwcm92aWRlZCwgdGhpcyB3aWxsIGJlCgkJICogYXV0b21hdGljYWxseSBzZXQgdG8gdGhlIHt7I2Nyb3NzTGluayAic3JjOnByb3BlcnR5In19e3svY3Jvc3NMaW5rfX0uCgkJICogQHByb3BlcnR5IGlkCgkJICogQHR5cGUge1N0cmluZ30KCQkgKiBAZGVmYXVsdCBudWxsCgkJICovCgkJdGhpcy5pZCA9IG51bGw7CgoJCS8qKgoJCSAqIERldGVybWluZXMgaWYgYSBtYW5pZmVzdCB3aWxsIG1haW50YWluIHRoZSBvcmRlciBvZiB0aGlzIGl0ZW0sIGluIHJlbGF0aW9uIHRvIG90aGVyIGl0ZW1zIGluIHRoZSBtYW5pZmVzdAoJCSAqIHRoYXQgaGF2ZSBhbHNvIHNldCB0aGUgYG1haW50YWluT3JkZXJgIHByb3BlcnR5IHRvIGB0cnVlYC4gVGhpcyBvbmx5IGFwcGxpZXMgd2hlbiB0aGUgbWF4IGNvbm5lY3Rpb25zIGhhcwoJCSAqIGJlZW4gc2V0IGFib3ZlIDEgKHVzaW5nIHt7I2Nyb3NzTGluayAiTG9hZFF1ZXVlL3NldE1heENvbm5lY3Rpb25zIn19e3svY3Jvc3NMaW5rfX0pLiBFdmVyeXRoaW5nIHdpdGggdGhpcwoJCSAqIHByb3BlcnR5IHNldCB0byBgZmFsc2VgIHdpbGwgZmluaXNoIGFzIGl0IGlzIGxvYWRlZC4gT3JkZXJlZCBpdGVtcyBhcmUgY29tYmluZWQgd2l0aCBzY3JpcHQgdGFncyBsb2FkaW5nIGluCgkJICogb3JkZXIgd2hlbiB7eyNjcm9zc0xpbmsgIkxvYWRRdWV1ZS9tYWludGFpblNjcmlwdE9yZGVyOnByb3BlcnR5In19e3svY3Jvc3NMaW5rfX0gaXMgc2V0IHRvIGB0cnVlYC4KCQkgKiBAcHJvcGVydHkgbWFpbnRhaW5PcmRlcgoJCSAqIEB0eXBlIHtCb29sZWFufQoJCSAqIEBkZWZhdWx0IGZhbHNlCgkJICovCgkJdGhpcy5tYWludGFpbk9yZGVyID0gZmFsc2U7CgoJCS8qKgoJCSAqIEEgY2FsbGJhY2sgdXNlZCBieSBKU09OUCByZXF1ZXN0cyB0aGF0IGRlZmluZXMgd2hhdCBnbG9iYWwgbWV0aG9kIHRvIGNhbGwgd2hlbiB0aGUgSlNPTlAgY29udGVudCBpcyBsb2FkZWQuCgkJICogQHByb3BlcnR5IGNhbGxiYWNrCgkJICogQHR5cGUge1N0cmluZ30KCQkgKiBAZGVmYXVsdCBudWxsCgkJICovCgkJdGhpcy5jYWxsYmFjayA9IG51bGw7CgoJCS8qKgoJCSAqIEFuIGFyYml0cmFyeSBkYXRhIG9iamVjdCwgd2hpY2ggaXMgaW5jbHVkZWQgd2l0aCB0aGUgbG9hZGVkIG9iamVjdC4KCQkgKiBAcHJvcGVydHkgZGF0YQoJCSAqIEB0eXBlIHtPYmplY3R9CgkJICogQGRlZmF1bHQgbnVsbAoJCSAqLwoJCXRoaXMuZGF0YSA9IG51bGw7CgoJCS8qKgoJCSAqIFRoZSByZXF1ZXN0IG1ldGhvZCB1c2VkIGZvciBIVFRQIGNhbGxzLiBCb3RoIHt7I2Nyb3NzTGluayAiQWJzdHJhY3RMb2FkZXIvR0VUOnByb3BlcnR5In19e3svY3Jvc3NMaW5rfX0gb3IKCQkgKiB7eyNjcm9zc0xpbmsgIkFic3RyYWN0TG9hZGVyL1BPU1Q6cHJvcGVydHkifX17ey9jcm9zc0xpbmt9fSByZXF1ZXN0IHR5cGVzIGFyZSBzdXBwb3J0ZWQsIGFuZCBhcmUgZGVmaW5lZCBhcwoJCSAqIGNvbnN0YW50cyBvbiB7eyNjcm9zc0xpbmsgIkFic3RyYWN0TG9hZGVyIn19e3svY3Jvc3NMaW5rfX0uCgkJICogQHByb3BlcnR5IG1ldGhvZAoJCSAqIEB0eXBlIHtTdHJpbmd9CgkJICogQGRlZmF1bHQgZ2V0CgkJICovCgkJdGhpcy5tZXRob2QgPSBjcmVhdGVqcy5Mb2FkSXRlbS5HRVQ7CgoJCS8qKgoJCSAqIEFuIG9iamVjdCBoYXNoIG9mIG5hbWUvdmFsdWUgcGFpcnMgdG8gc2VuZCB0byB0aGUgc2VydmVyLgoJCSAqIEBwcm9wZXJ0eSB2YWx1ZXMKCQkgKiBAdHlwZSB7T2JqZWN0fQoJCSAqIEBkZWZhdWx0IG51bGwKCQkgKi8KCQl0aGlzLnZhbHVlcyA9IG51bGw7CgoJCS8qKgoJCSAqIEFuIG9iamVjdCBoYXNoIG9mIGhlYWRlcnMgdG8gYXR0YWNoIHRvIGFuIFhIUiByZXF1ZXN0LiBQcmVsb2FkSlMgd2lsbCBhdXRvbWF0aWNhbGx5IGF0dGFjaCBzb21lIGRlZmF1bHQKCQkgKiBoZWFkZXJzIHdoZW4gcmVxdWlyZWQsIGluY2x1ZGluZyAiT3JpZ2luIiwgIkNvbnRlbnQtVHlwZSIsIGFuZCAiWC1SZXF1ZXN0ZWQtV2l0aCIuIFlvdSBtYXkgb3ZlcnJpZGUgdGhlCgkJICogZGVmYXVsdCBoZWFkZXJzIGJ5IGluY2x1ZGluZyB0aGVtIGluIHlvdXIgaGVhZGVycyBvYmplY3QuCgkJICogQHByb3BlcnR5IGhlYWRlcnMKCQkgKiBAdHlwZSB7T2JqZWN0fQoJCSAqIEBkZWZhdWx0IG51bGwKCQkgKi8KCQl0aGlzLmhlYWRlcnMgPSBudWxsOwoKCQkvKioKCQkgKiBFbmFibGUgY3JlZGVudGlhbHMgZm9yIFhIUiByZXF1ZXN0cy4KCQkgKiBAcHJvcGVydHkgd2l0aENyZWRlbnRpYWxzCgkJICogQHR5cGUge0Jvb2xlYW59CgkJICogQGRlZmF1bHQgZmFsc2UKCQkgKi8KCQl0aGlzLndpdGhDcmVkZW50aWFscyA9IGZhbHNlOwoKCQkvKioKCQkgKiBTZXQgdGhlIG1pbWUgdHlwZSBvZiBYSFItYmFzZWQgcmVxdWVzdHMuIFRoaXMgaXMgYXV0b21hdGljYWxseSBzZXQgdG8gInRleHQvcGxhaW47IGNoYXJzZXQ9dXRmLTgiIGZvciB0ZXh0CgkJICogYmFzZWQgZmlsZXMgKGpzb24sIHhtbCwgdGV4dCwgY3NzLCBqcykuCgkJICogQHByb3BlcnR5IG1pbWVUeXBlCgkJICogQHR5cGUge1N0cmluZ30KCQkgKiBAZGVmYXVsdCBudWxsCgkJICovCgkJdGhpcy5taW1lVHlwZSA9IG51bGw7CgoJCS8qKgoJCSAqIFNldHMgdGhlIGNyb3NzT3JpZ2luIGF0dHJpYnV0ZSBmb3IgQ09SUy1lbmFibGVkIGltYWdlcyBsb2FkaW5nIGNyb3NzLWRvbWFpbi4KCQkgKiBAcHJvcGVydHkgY3Jvc3NPcmlnaW4KCQkgKiBAdHlwZSB7Ym9vbGVhbn0KCQkgKiBAZGVmYXVsdCBBbm9ueW1vdXMKCQkgKi8KCQl0aGlzLmNyb3NzT3JpZ2luID0gbnVsbDsKCgkJLyoqCgkJICogVGhlIGR1cmF0aW9uIGluIG1pbGxpc2Vjb25kcyB0byB3YWl0IGJlZm9yZSBhIHJlcXVlc3QgdGltZXMgb3V0LiBUaGlzIG9ubHkgYXBwbGllcyB0byB0YWctYmFzZWQgYW5kIGFuZCBYSFIKCQkgKiAobGV2ZWwgb25lKSBsb2FkaW5nLCBhcyBYSFIgKGxldmVsIDIpIHByb3ZpZGVzIGl0cyBvd24gdGltZW91dCBldmVudC4KCQkgKiBAcHJvcGVydHkgbG9hZFRpbWVvdXQKCQkgKiBAdHlwZSB7TnVtYmVyfQoJCSAqIEBkZWZhdWx0IDgwMDAgKDggc2Vjb25kcykKCQkgKi8KCQl0aGlzLmxvYWRUaW1lb3V0ID0gODAwMDsKCX07CgoJdmFyIHAgPSBMb2FkSXRlbS5wcm90b3R5cGUgPSB7fTsKCXZhciBzID0gTG9hZEl0ZW07CgoJLyoqCgkgKiBDcmVhdGUvdmFsaWRhdGUgYSBMb2FkSXRlbS4KCSAqIDx1bD4KCSAqICAgICA8bGk+U3RyaW5nLWJhc2VkIGl0ZW1zIGFyZSBjb252ZXJ0ZWQgdG8gYSBMb2FkSXRlbSB3aXRoIGEgcG9wdWxhdGVkIHt7I2Nyb3NzTGluayAic3JjOnByb3BlcnR5In19e3svY3Jvc3NMaW5rfX0uPC9saT4KCSAqICAgICA8bGk+TG9hZEl0ZW0gaW5zdGFuY2VzIGFyZSByZXR1cm5lZCBhcy1pczwvbGk+CgkgKiAgICAgPGxpPk9iamVjdHNzIGFyZSByZXR1cm5lZCBhcy1pczwvbGk+CgkgKiA8L3VsPgoJICogQG1ldGhvZCBjcmVhdGUKCSAqIEBwYXJhbSB7TG9hZEl0ZW18U3RyaW5nfE9iamVjdH0gdmFsdWUgVGhlIGxvYWQgaXRlbSB2YWx1ZQoJICogQHJldHVybnMge09iamVjdHxMb2FkSXRlbX0KCSAqIEBzdGF0aWMKCSAqLwoJcy5jcmVhdGUgPSBmdW5jdGlvbiAodmFsdWUpIHsKCQlpZiAodHlwZW9mIHZhbHVlID09ICJzdHJpbmciKSB7CgkJCXZhciBpdGVtID0gbmV3IExvYWRJdGVtKCk7CgkJCWl0ZW0uc3JjID0gdmFsdWU7CgkJCXJldHVybiBpdGVtOwoJCX0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBzKSB7CgkJCXJldHVybiB2YWx1ZTsKCQl9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgT2JqZWN0KSB7IC8vIERvbid0IG1vZGlmeSBvYmplY3QsIGFsbG93cyB1c2VycyB0byBhdHRhY2ggcmFuZG9tIGRhdGEgdG8gdGhlIGl0ZW0uCgkJCS8vIFRPRE86IERpc2FsbG93IG9iamVjdHMgd2l0aCBubyBzcmM/CgkJCXJldHVybiB2YWx1ZTsKCQl9IGVsc2UgewoJCQl0aHJvdyBuZXcgRXJyb3IoIlR5cGUgbm90IHJlY29nbml6ZWQuIik7CgkJfQoJfTsKCgkvKioKCSAqIFByb3ZpZGVzIGEgY2hhaW5hYmxlIHNob3J0Y3V0IG1ldGhvZCBmb3Igc2V0dGluZyBhIG51bWJlciBvZiBwcm9wZXJ0aWVzIG9uIHRoZSBpbnN0YW5jZS4KCSAqCgkgKiA8aDQ+RXhhbXBsZTwvaDQ+CgkgKgoJICogICAgICB2YXIgbG9hZEl0ZW0gPSBuZXcgY3JlYXRlanMuTG9hZEl0ZW0oKS5zZXQoe3NyYzoiaW1hZ2UucG5nIiwgbWFpbnRhaW5PcmRlcjp0cnVlfSk7CgkgKgoJICogQG1ldGhvZCBzZXQKCSAqIEBwYXJhbSB7T2JqZWN0fSBwcm9wcyBBIGdlbmVyaWMgb2JqZWN0IGNvbnRhaW5pbmcgcHJvcGVydGllcyB0byBjb3B5IHRvIHRoZSBMb2FkSXRlbSBpbnN0YW5jZS4KCSAqIEByZXR1cm4ge0xvYWRJdGVtfSBSZXR1cm5zIHRoZSBpbnN0YW5jZSB0aGUgbWV0aG9kIGlzIGNhbGxlZCBvbiAodXNlZnVsIGZvciBjaGFpbmluZyBjYWxscy4pCgkqLwoJcC5zZXQgPSBmdW5jdGlvbihwcm9wcykgewoJCWZvciAodmFyIG4gaW4gcHJvcHMpIHsgdGhpc1tuXSA9IHByb3BzW25dOyB9CgkJcmV0dXJuIHRoaXM7Cgl9OwoKCWNyZWF0ZWpzLkxvYWRJdGVtID0gczsKCn0oKSk7CgovLyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwovLyBSZXF1ZXN0VXRpbHMuanMKLy8jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCihmdW5jdGlvbiAoKSB7CgoJLyoqCgkgKiBVdGlsaXRpZXMgdGhhdCBhc3Npc3Qgd2l0aCBwYXJzaW5nIGxvYWQgaXRlbXMsIGFuZCBkZXRlcm1pbmluZyBmaWxlIHR5cGVzLCBldGMuCgkgKiBAY2xhc3MgUmVxdWVzdFV0aWxzCgkgKi8KCXZhciBzID0ge307CgoJLyoqCgkgKiBUaGUgUmVndWxhciBFeHByZXNzaW9uIHVzZWQgdG8gdGVzdCBmaWxlIFVSTFMgZm9yIGFuIGFic29sdXRlIHBhdGguCgkgKiBAcHJvcGVydHkgQUJTT0xVVEVfUEFUSAoJICogQHR5cGUge1JlZ0V4cH0KCSAqIEBzdGF0aWMKCSAqLwoJcy5BQlNPTFVURV9QQVRUID0gL14oPzpcdys6KT9cL3syfS9pOwoKCS8qKgoJICogVGhlIFJlZ3VsYXIgRXhwcmVzc2lvbiB1c2VkIHRvIHRlc3QgZmlsZSBVUkxTIGZvciBhIHJlbGF0aXZlIHBhdGguCgkgKiBAcHJvcGVydHkgUkVMQVRJVkVfUEFUSAoJICogQHR5cGUge1JlZ0V4cH0KCSAqIEBzdGF0aWMKCSAqLwoJcy5SRUxBVElWRV9QQVRUID0gKC9eWy4vXSo/XC8vaSk7CgoJLyoqCgkgKiBUaGUgUmVndWxhciBFeHByZXNzaW9uIHVzZWQgdG8gdGVzdCBmaWxlIFVSTFMgZm9yIGFuIGV4dGVuc2lvbi4gTm90ZSB0aGF0IFVSSXMgbXVzdCBhbHJlYWR5IGhhdmUgdGhlIHF1ZXJ5IHN0cmluZwoJICogcmVtb3ZlZC4KCSAqIEBwcm9wZXJ0eSBFWFRFTlNJT05fUEFUVAoJICogQHR5cGUge1JlZ0V4cH0KCSAqIEBzdGF0aWMKCSAqLwoJcy5FWFRFTlNJT05fUEFUVCA9IC9cLz9bXi9dK1wuKFx3ezEsNX0pJC9pOwoKCS8qKgoJICogUGFyc2UgYSBmaWxlIHBhdGggdG8gZGV0ZXJtaW5lIHRoZSBpbmZvcm1hdGlvbiB3ZSBuZWVkIHRvIHdvcmsgd2l0aCBpdC4gQ3VycmVudGx5LCBQcmVsb2FkSlMgbmVlZHMgdG8ga25vdzoKCSAqIDx1bD4KCSAqICAgICA8bGk+SWYgdGhlIHBhdGggaXMgYWJzb2x1dGUuIEFic29sdXRlIHBhdGhzIHN0YXJ0IHdpdGggYSBwcm90b2NvbCAoc3VjaCBhcyBgaHR0cDovL2AsIGBmaWxlOi8vYCwgb3IKCSAqICAgICBgLy9uZXR3b3JrUGF0aGApPC9saT4KCSAqICAgICA8bGk+SWYgdGhlIHBhdGggaXMgcmVsYXRpdmUuIFJlbGF0aXZlIHBhdGhzIHN0YXJ0IHdpdGggYC4uL2Agb3IgYC9wYXRoYCAob3Igc2ltaWxhcik8L2xpPgoJICogICAgIDxsaT5UaGUgZmlsZSBleHRlbnNpb24uIFRoaXMgaXMgZGV0ZXJtaW5lZCBieSB0aGUgZmlsZW5hbWUgd2l0aCBhbiBleHRlbnNpb24uIFF1ZXJ5IHN0cmluZ3MgYXJlIGRyb3BwZWQsIGFuZAoJICogICAgIHRoZSBmaWxlIHBhdGggaXMgZXhwZWN0ZWQgdG8gZm9sbG93IHRoZSBmb3JtYXQgYG5hbWUuZXh0YC48L2xpPgoJICogPC91bD4KCSAqIEBtZXRob2QgcGFyc2VVUkkKCSAqIEBwYXJhbSB7U3RyaW5nfSBwYXRoCgkgKiBAcmV0dXJucyB7T2JqZWN0fSBBbiBPYmplY3Qgd2l0aCBhbiBgYWJzb2x1dGVgIGFuZCBgcmVsYXRpdmVgIEJvb2xlYW4gdmFsdWVzLCBhcyB3ZWxsIGFzIGFuIG9wdGlvbmFsICdleHRlbnNpb25gCgkgKiBwcm9wZXJ0eSwgd2hpY2ggaXMgdGhlIGxvd2VyY2FzZSBleHRlbnNpb24uCgkgKiBAc3RhdGljCgkgKi8KCXMucGFyc2VVUkkgPSBmdW5jdGlvbiAocGF0aCkgewoJCXZhciBpbmZvID0ge2Fic29sdXRlOiBmYWxzZSwgcmVsYXRpdmU6IGZhbHNlfTsKCQlpZiAocGF0aCA9PSBudWxsKSB7IHJldHVybiBpbmZvOyB9CgoJCS8vIERyb3AgdGhlIHF1ZXJ5IHN0cmluZwoJCXZhciBxdWVyeUluZGV4ID0gcGF0aC5pbmRleE9mKCI/Iik7CgkJaWYgKHF1ZXJ5SW5kZXggPiAtMSkgewoJCQlwYXRoID0gcGF0aC5zdWJzdHIoMCwgcXVlcnlJbmRleCk7CgkJfQoKCQkvLyBBYnNvbHV0ZQoJCXZhciBtYXRjaDsKCQlpZiAocy5BQlNPTFVURV9QQVRULnRlc3QocGF0aCkpIHsKCQkJaW5mby5hYnNvbHV0ZSA9IHRydWU7CgoJCQkvLyBSZWxhdGl2ZQoJCX0gZWxzZSBpZiAocy5SRUxBVElWRV9QQVRULnRlc3QocGF0aCkpIHsKCQkJaW5mby5yZWxhdGl2ZSA9IHRydWU7CgkJfQoKCQkvLyBFeHRlbnNpb24KCQlpZiAobWF0Y2ggPSBwYXRoLm1hdGNoKHMuRVhURU5TSU9OX1BBVFQpKSB7CgkJCWluZm8uZXh0ZW5zaW9uID0gbWF0Y2hbMV0udG9Mb3dlckNhc2UoKTsKCQl9CgkJcmV0dXJuIGluZm87Cgl9OwoKCS8qKgoJICogRm9ybWF0cyBhbiBvYmplY3QgaW50byBhIHF1ZXJ5IHN0cmluZyBmb3IgZWl0aGVyIGEgUE9TVCBvciBHRVQgcmVxdWVzdC4KCSAqIEBtZXRob2QgZm9ybWF0UXVlcnlTdHJpbmcKCSAqIEBwYXJhbSB7T2JqZWN0fSBkYXRhIFRoZSBkYXRhIHRvIGNvbnZlcnQgdG8gYSBxdWVyeSBzdHJpbmcuCgkgKiBAcGFyYW0ge0FycmF5fSBbcXVlcnldIEV4aXN0aW5nIG5hbWUvdmFsdWUgcGFpcnMgdG8gYXBwZW5kIG9uIHRvIHRoaXMgcXVlcnkuCgkgKiBAc3RhdGljCgkgKi8KCXMuZm9ybWF0UXVlcnlTdHJpbmcgPSBmdW5jdGlvbiAoZGF0YSwgcXVlcnkpIHsKCQlpZiAoZGF0YSA9PSBudWxsKSB7CgkJCXRocm93IG5ldyBFcnJvcignWW91IG11c3Qgc3BlY2lmeSBkYXRhLicpOwoJCX0KCQl2YXIgcGFyYW1zID0gW107CgkJZm9yICh2YXIgbiBpbiBkYXRhKSB7CgkJCXBhcmFtcy5wdXNoKG4gKyAnPScgKyBlc2NhcGUoZGF0YVtuXSkpOwoJCX0KCQlpZiAocXVlcnkpIHsKCQkJcGFyYW1zID0gcGFyYW1zLmNvbmNhdChxdWVyeSk7CgkJfQoJCXJldHVybiBwYXJhbXMuam9pbignJicpOwoJfTsKCgkvKioKCSAqIEEgdXRpbGl0eSBtZXRob2QgdGhhdCBidWlsZHMgYSBmaWxlIHBhdGggdXNpbmcgYSBzb3VyY2UgYW5kIGEgZGF0YSBvYmplY3QsIGFuZCBmb3JtYXRzIGl0IGludG8gYSBuZXcgcGF0aC4KCSAqIEBtZXRob2QgYnVpbGRQYXRoCgkgKiBAcGFyYW0ge1N0cmluZ30gc3JjIFRoZSBzb3VyY2UgcGF0aCB0byBhZGQgdmFsdWVzIHRvLgoJICogQHBhcmFtIHtPYmplY3R9IFtkYXRhXSBPYmplY3QgdXNlZCB0byBhcHBlbmQgdmFsdWVzIHRvIHRoaXMgcmVxdWVzdCBhcyBhIHF1ZXJ5IHN0cmluZy4gRXhpc3RpbmcgcGFyYW1ldGVycyBvbiB0aGUKCSAqIHBhdGggd2lsbCBiZSBwcmVzZXJ2ZWQuCgkgKiBAcmV0dXJucyB7c3RyaW5nfSBBIGZvcm1hdHRlZCBzdHJpbmcgdGhhdCBjb250YWlucyB0aGUgcGF0aCBhbmQgdGhlIHN1cHBsaWVkIHBhcmFtZXRlcnMuCgkgKiBAc3RhdGljCgkgKi8KCXMuYnVpbGRQYXRoID0gZnVuY3Rpb24gKHNyYywgZGF0YSkgewoJCWlmIChkYXRhID09IG51bGwpIHsKCQkJcmV0dXJuIHNyYzsKCQl9CgoJCXZhciBxdWVyeSA9IFtdOwoJCXZhciBpZHggPSBzcmMuaW5kZXhPZignPycpOwoKCQlpZiAoaWR4ICE9IC0xKSB7CgkJCXZhciBxID0gc3JjLnNsaWNlKGlkeCArIDEpOwoJCQlxdWVyeSA9IHF1ZXJ5LmNvbmNhdChxLnNwbGl0KCcmJykpOwoJCX0KCgkJaWYgKGlkeCAhPSAtMSkgewoJCQlyZXR1cm4gc3JjLnNsaWNlKDAsIGlkeCkgKyAnPycgKyB0aGlzLl9mb3JtYXRRdWVyeVN0cmluZyhkYXRhLCBxdWVyeSk7CgkJfSBlbHNlIHsKCQkJcmV0dXJuIHNyYyArICc/JyArIHRoaXMuX2Zvcm1hdFF1ZXJ5U3RyaW5nKGRhdGEsIHF1ZXJ5KTsKCQl9Cgl9OwoKCS8qKgoJICogQG1ldGhvZCBpc0Nyb3NzRG9tYWluCgkgKiBAcGFyYW0ge0xvYWRJdGVtfE9iamVjdH0gaXRlbSBBIGxvYWQgaXRlbSB3aXRoIGEgYHNyY2AgcHJvcGVydHkuCgkgKiBAcmV0dXJuIHtCb29sZWFufSBJZiB0aGUgbG9hZCBpdGVtIGlzIGxvYWRpbmcgZnJvbSBhIGRpZmZlcmVudCBkb21haW4gdGhhbiB0aGUgY3VycmVudCBsb2NhdGlvbi4KCSAqIEBzdGF0aWMKCSAqLwoJcy5pc0Nyb3NzRG9tYWluID0gZnVuY3Rpb24gKGl0ZW0pIHsKCQl2YXIgdGFyZ2V0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiYSIpOwoJCXRhcmdldC5ocmVmID0gaXRlbS5zcmM7CgoJCXZhciBob3N0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiYSIpOwoJCWhvc3QuaHJlZiA9IGxvY2F0aW9uLmhyZWY7CgoJCXZhciBjcm9zc2RvbWFpbiA9ICh0YXJnZXQuaG9zdG5hbWUgIT0gIiIpICYmCgkJCQkJCSAgKHRhcmdldC5wb3J0ICE9IGhvc3QucG9ydCB8fAoJCQkJCQkgICB0YXJnZXQucHJvdG9jb2wgIT0gaG9zdC5wcm90b2NvbCB8fAoJCQkJCQkgICB0YXJnZXQuaG9zdG5hbWUgIT0gaG9zdC5ob3N0bmFtZSk7CgkJcmV0dXJuIGNyb3NzZG9tYWluOwoJfTsKCgkvKioKCSAqIEBtZXRob2QgaXNMb2NhbAoJICogQHBhcmFtIHtMb2FkSXRlbXxPYmplY3R9IGl0ZW0gQSBsb2FkIGl0ZW0gd2l0aCBhIGBzcmNgIHByb3BlcnR5CgkgKiBAcmV0dXJuIHtCb29sZWFufSBJZiB0aGUgbG9hZCBpdGVtIGlzIGxvYWRpbmcgZnJvbSB0aGUgImZpbGU6IiBwcm90b2NvbC4gQXNzdW1lIHRoYXQgdGhlIGhvc3QgbXVzdCBiZSBsb2NhbCBhcwoJICogd2VsbC4KCSAqIEBzdGF0aWMKCSAqLwoJcy5pc0xvY2FsID0gZnVuY3Rpb24gKGl0ZW0pIHsKCQl2YXIgdGFyZ2V0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiYSIpOwoJCXRhcmdldC5ocmVmID0gaXRlbS5zcmM7CgkJcmV0dXJuIHRhcmdldC5ob3N0bmFtZSA9PSAiIiAmJiB0YXJnZXQucHJvdG9jb2wgPT0gImZpbGU6IjsKCX07CgoJLyoqCgkgKiBEZXRlcm1pbmUgaWYgYSBzcGVjaWZpYyB0eXBlIHNob3VsZCBiZSBsb2FkZWQgYXMgYSBiaW5hcnkgZmlsZS4gQ3VycmVudGx5LCBvbmx5IGltYWdlcyBhbmQgaXRlbXMgbWFya2VkCgkgKiBzcGVjaWZpY2FsbHkgYXMgImJpbmFyeSIgYXJlIGxvYWRlZCBhcyBiaW5hcnkuIE5vdGUgdGhhdCBhdWRpbyBpcyA8Yj5ub3Q8L2I+IGEgYmluYXJ5IHR5cGUsIGFzIHdlIGNhbiBub3QgcGxheQoJICogYmFjayB1c2luZyBhbiBhdWRpbyB0YWcgaWYgaXQgaXMgbG9hZGVkIGFzIGJpbmFyeS4gUGx1Z2lucyBjYW4gY2hhbmdlIHRoZSBpdGVtIHR5cGUgdG8gYmluYXJ5IHRvIGVuc3VyZSB0aGV5IGdldAoJICogYSBiaW5hcnkgcmVzdWx0IHRvIHdvcmsgd2l0aC4gQmluYXJ5IGZpbGVzIGFyZSBsb2FkZWQgdXNpbmcgWEhSMi4gVHlwZXMgYXJlIGRlZmluZWQgYXMgc3RhdGljIGNvbnN0YW50cyBvbgoJICoge3sjY3Jvc3NMaW5rICJBYnN0cmFjdExvYWRlciJ9fXt7L2Nyb3NzTGlua319LgoJICogQG1ldGhvZCBpc0JpbmFyeQoJICogQHBhcmFtIHtTdHJpbmd9IHR5cGUgVGhlIGl0ZW0gdHlwZS4KCSAqIEByZXR1cm4ge0Jvb2xlYW59IElmIHRoZSBzcGVjaWZpZWQgdHlwZSBpcyBiaW5hcnkuCgkgKiBAc3RhdGljCgkgKi8KCXMuaXNCaW5hcnkgPSBmdW5jdGlvbiAodHlwZSkgewoJCXN3aXRjaCAodHlwZSkgewoJCQljYXNlIGNyZWF0ZWpzLkFic3RyYWN0TG9hZGVyLklNQUdFOgoJCQljYXNlIGNyZWF0ZWpzLkFic3RyYWN0TG9hZGVyLkJJTkFSWToKCQkJCXJldHVybiB0cnVlOwoJCQlkZWZhdWx0OgoJCQkJcmV0dXJuIGZhbHNlOwoJCX0KCX07CgoJLyoqCgkgKiBDaGVjayBpZiBpdGVtIGlzIGEgdmFsaWQgSFRNTEltYWdlRWxlbWVudAoJICogQG1ldGhvZCBpc0ltYWdlVGFnCgkgKiBAcGFyYW0ge09iamVjdH0gaXRlbQoJICogQHJldHVybnMge0Jvb2xlYW59CgkgKiBAc3RhdGljCgkgKi8KCXMuaXNJbWFnZVRhZyA9IGZ1bmN0aW9uKGl0ZW0pIHsKCQlyZXR1cm4gaXRlbSBpbnN0YW5jZW9mIEhUTUxJbWFnZUVsZW1lbnQ7Cgl9OwoKCS8qKgoJICogQ2hlY2sgaWYgaXRlbSBpcyBhIHZhbGlkIEhUTUxBdWRpb0VsZW1lbnQKCSAqIEBtZXRob2QgaXNBdWRpb1RhZwoJICogQHBhcmFtIHtPYmplY3R9IGl0ZW0KCSAqIEByZXR1cm5zIHtCb29sZWFufQoJICogQHN0YXRpYwoJICovCglzLmlzQXVkaW9UYWcgPSBmdW5jdGlvbihpdGVtKSB7CgkJaWYgKHdpbmRvdy5IVE1MQXVkaW9FbGVtZW50KSB7CgkJCXJldHVybiBpdGVtIGluc3RhbmNlb2YgSFRNTEF1ZGlvRWxlbWVudDsKCQl9IGVsc2UgewoJCQlyZXR1cm4gZmFsc2U7CgkJfQoJfTsKCgkvKioKCSAqIENoZWNrIGlmIGl0ZW0gaXMgYSB2YWxpZCBIVE1MVmlkZW9FbGVtZW50CgkgKiBAbWV0aG9kIGlzVmlkZW9UYWcKCSAqIEBwYXJhbSB7T2JqZWN0aXRlbQoJICogQHJldHVybnMge0Jvb2xlYW59CgkgKiBAc3RhdGljCgkgKi8KCXMuaXNWaWRlb1RhZyA9IGZ1bmN0aW9uKGl0ZW0pIHsKCQlpZiAod2luZG93LkhUTUxWaWRlb0VsZW1lbnQpIHsKCQkJcmV0dXJuIGl0ZW0gaW5zdGFuY2VvZiBIVE1MVmlkZW9FbGVtZW50OwoJCX0gZWxzZSB7CgkJCWZhbHNlOwoJCX0KCX07CgoJLyoqCgkgKiBEZXRlcm1pbmUgaWYgYSBzcGVjaWZpYyB0eXBlIGlzIGEgdGV4dC1iYXNlZCBhc3NldCwgYW5kIHNob3VsZCBiZSBsb2FkZWQgYXMgVVRGLTguCgkgKiBAbWV0aG9kIGlzVGV4dAoJICogQHBhcmFtIHtTdHJpbmd9IHR5cGUgVGhlIGl0ZW0gdHlwZS4KCSAqIEByZXR1cm4ge0Jvb2xlYW59IElmIHRoZSBzcGVjaWZpZWQgdHlwZSBpcyB0ZXh0LgoJICogQHN0YXRpYwoJICovCglzLmlzVGV4dCA9IGZ1bmN0aW9uICh0eXBlKSB7CgkJc3dpdGNoICh0eXBlKSB7CgkJCWNhc2UgY3JlYXRlanMuQWJzdHJhY3RMb2FkZXIuVEVYVDoKCQkJY2FzZSBjcmVhdGVqcy5BYnN0cmFjdExvYWRlci5KU09OOgoJCQljYXNlIGNyZWF0ZWpzLkFic3RyYWN0TG9hZGVyLk1BTklGRVNUOgoJCQljYXNlIGNyZWF0ZWpzLkFic3RyYWN0TG9hZGVyLlhNTDoKCQkJY2FzZSBjcmVhdGVqcy5BYnN0cmFjdExvYWRlci5DU1M6CgkJCWNhc2UgY3JlYXRlanMuQWJzdHJhY3RMb2FkZXIuU1ZHOgoJCQljYXNlIGNyZWF0ZWpzLkFic3RyYWN0TG9hZGVyLkpBVkFTQ1JJUFQ6CgkJCWNhc2UgY3JlYXRlanMuQWJzdHJhY3RMb2FkZXIuU1BSSVRFU0hFRVQ6CgkJCQlyZXR1cm4gdHJ1ZTsKCQkJZGVmYXVsdDoKCQkJCXJldHVybiBmYWxzZTsKCQl9Cgl9OwoKCS8qKgoJICogRGV0ZXJtaW5lIHRoZSB0eXBlIG9mIHRoZSBvYmplY3QgdXNpbmcgY29tbW9uIGV4dGVuc2lvbnMuIE5vdGUgdGhhdCB0aGUgdHlwZSBjYW4gYmUgcGFzc2VkIGluIHdpdGggdGhlIGxvYWQgaXRlbQoJICogaWYgaXQgaXMgYW4gdW51c3VhbCBleHRlbnNpb24uCgkgKiBAbWV0aG9kIGdldFR5cGVCeUV4dGVuc2lvbgoJICogQHBhcmFtIHtTdHJpbmd9IGV4dGVuc2lvbiBUaGUgZmlsZSBleHRlbnNpb24gdG8gdXNlIHRvIGRldGVybWluZSB0aGUgbG9hZCB0eXBlLgoJICogQHJldHVybiB7U3RyaW5nfSBUaGUgZGV0ZXJtaW5lZCBsb2FkIHR5cGUgKGZvciBleGFtcGxlLCA8Y29kZT5BYnN0cmFjdExvYWRlci5JTUFHRTwvY29kZT4pLiBXaWxsIHJldHVybiBgbnVsbGAgaWYKCSAqIHRoZSB0eXBlIGNhbiBub3QgYmUgZGV0ZXJtaW5lZCBieSB0aGUgZXh0ZW5zaW9uLgoJICogQHN0YXRpYwoJICovCglzLmdldFR5cGVCeUV4dGVuc2lvbiA9IGZ1bmN0aW9uIChleHRlbnNpb24pIHsKCQlpZiAoZXh0ZW5zaW9uID09IG51bGwpIHsKCQkJcmV0dXJuIGNyZWF0ZWpzLkFic3RyYWN0TG9hZGVyLlRFWFQ7CgkJfQoKCQlzd2l0Y2ggKGV4dGVuc2lvbi50b0xvd2VyQ2FzZSgpKSB7CgkJCWNhc2UgImpwZWciOgoJCQljYXNlICJqcGciOgoJCQljYXNlICJnaWYiOgoJCQljYXNlICJwbmciOgoJCQljYXNlICJ3ZWJwIjoKCQkJY2FzZSAiYm1wIjoKCQkJCXJldHVybiBjcmVhdGVqcy5BYnN0cmFjdExvYWRlci5JTUFHRTsKCQkJY2FzZSAib2dnIjoKCQkJY2FzZSAibXAzIjoKCQkJY2FzZSAid2VibSI6CgkJCQlyZXR1cm4gY3JlYXRlanMuQWJzdHJhY3RMb2FkZXIuU09VTkQ7CgkJCWNhc2UgIm1wNCI6CgkJCWNhc2UgIndlYm0iOgoJCQljYXNlICJ0cyI6CgkJCQlyZXR1cm4gY3JlYXRlanMuQWJzdHJhY3RMb2FkZXIuVklERU87CgkJCWNhc2UgImpzb24iOgoJCQkJcmV0dXJuIGNyZWF0ZWpzLkFic3RyYWN0TG9hZGVyLkpTT047CgkJCWNhc2UgInhtbCI6CgkJCQlyZXR1cm4gY3JlYXRlanMuQWJzdHJhY3RMb2FkZXIuWE1MOwoJCQljYXNlICJjc3MiOgoJCQkJcmV0dXJuIGNyZWF0ZWpzLkFic3RyYWN0TG9hZGVyLkNTUzsKCQkJY2FzZSAianMiOgoJCQkJcmV0dXJuIGNyZWF0ZWpzLkFic3RyYWN0TG9hZGVyLkpBVkFTQ1JJUFQ7CgkJCWNhc2UgJ3N2Zyc6CgkJCQlyZXR1cm4gY3JlYXRlanMuQWJzdHJhY3RMb2FkZXIuU1ZHOwoJCQlkZWZhdWx0OgoJCQkJcmV0dXJuIGNyZWF0ZWpzLkFic3RyYWN0TG9hZGVyLlRFWFQ7CgkJfQoJfTsKCgljcmVhdGVqcy5SZXF1ZXN0VXRpbHMgPSBzOwoKfSgpKTsKCi8vIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi8vIEFic3RyYWN0TG9hZGVyLmpzCi8vIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgp0aGlzLmNyZWF0ZWpzID0gdGhpcy5jcmVhdGVqcyB8fCB7fTsKCihmdW5jdGlvbiAoKSB7CgkidXNlIHN0cmljdCI7CgovLyBjb25zdHJ1Y3RvcgoJLyoqCgkgKiBUaGUgYmFzZSBsb2FkZXIsIHdoaWNoIGRlZmluZXMgYWxsIHRoZSBnZW5lcmljIG1ldGhvZHMsIHByb3BlcnRpZXMsIGFuZCBldmVudHMuIEFsbCBsb2FkZXJzIGV4dGVuZCB0aGlzIGNsYXNzLAoJICogaW5jbHVkaW5nIHRoZSB7eyNjcm9zc0xpbmsgIkxvYWRRdWV1ZSJ9fXt7L2Nyb3NzTGlua319LgoJICogQGNsYXNzIEFic3RyYWN0TG9hZGVyCgkgKiBAcGFyYW0ge0xvYWRJdGVtfG9iamVjdHxzdHJpbmd9IFRoZSBpdGVtIHRvIGJlIGxvYWRlZC4KCSAqIEBwYXJhbSB7Qm9vbGVhbn0gW3ByZWZlclhIUl0gRGV0ZXJtaW5lcyBpZiB0aGUgTG9hZEl0ZW0gc2hvdWxkIDxlbT50cnk8L2VtPiBhbmQgbG9hZCB1c2luZyBYSFIsIG9yIHRha2UgYQoJICogdGFnLWJhc2VkIGFwcHJvYWNoLCB3aGljaCBjYW4gYmUgYmV0dGVyIGluIGNyb3NzLWRvbWFpbiBzaXR1YXRpb25zLiBOb3QgYWxsIGxvYWRlcnMgY2FuIGxvYWQgdXNpbmcgb25lIG9yIHRoZQoJICogb3RoZXIsIHNvIHRoaXMgaXMgYSBzdWdnZXN0ZWQgZGlyZWN0aXZlLgoJICogQG9hcmFtIHtTdHJpbmd9IFt0eXBlXSBUaGUgdHlwZSBvZiBsb2FkZXIuIExvYWRlciB0eXBlcyBhcmUgZGVmaW5lZCBhcyBjb25zdGFudHMgb24gdGhlIEFic3RyYWN0TG9hZGVyIGNsYXNzLAoJICogc3VjaCBhcyB7eyNjcm9zc0xpbmsgIklNQUdFOnByb3BlcnR5In19e3svY3Jvc3NMaW5rfX0sIHt7I2Nyb3NzTGluayAiQ1NTOnByb3BlcnR5In19e3svY3Jvc3NMaW5rfX0sIGV0Yy4KCSAqIEBleHRlbmRzIEV2ZW50RGlzcGF0Y2hlcgoJICovCglmdW5jdGlvbiBBYnN0cmFjdExvYWRlcihsb2FkSXRlbSwgcHJlZmVyWEhSLCB0eXBlKSB7CgkJdGhpcy5FdmVudERpc3BhdGNoZXJfY29uc3RydWN0b3IoKTsKCgkJLy8gcHVibGljIHByb3BlcnRpZXMKCQkvKioKCQkgKiBJZiB0aGUgbG9hZGVyIGhhcyBjb21wbGV0ZWQgbG9hZGluZy4gVGhpcyBwcm92aWRlcyBhIHF1aWNrIGNoZWNrLCBidXQgYWxzbyBlbnN1cmVzIHRoYXQgdGhlIGRpZmZlcmVudCBhcHByb2FjaGVzCgkJICogdXNlZCBmb3IgbG9hZGluZyBkbyBub3QgcGlsZSB1cCByZXN1bHRpbmcgaW4gbW9yZSB0aGFuIG9uZSBgY29tcGxldGVgIHt7I2Nyb3NzTGluayAiRXZlbnQifX17ey9jcm9zc0xpbmt9fS4KCQkgKiBAcHJvcGVydHkgbG9hZGVkCgkJICogQHR5cGUge0Jvb2xlYW59CgkJICogQGRlZmF1bHQgZmFsc2UKCQkgKi8KCQl0aGlzLmxvYWRlZCA9IGZhbHNlOwoKCQkvKioKCQkgKiBEZXRlcm1pbmUgaWYgdGhlIGxvYWRlciB3YXMgY2FuY2VsZWQuIENhbmNlbGVkIGxvYWRzIHdpbGwgbm90IGZpcmUgY29tcGxldGUgZXZlbnRzLiBOb3RlIHRoYXQgdGhpcyBwcm9wZXJ0eQoJCSAqIGlzIHJlYWRvbmx5LCBzbyB7eyNjcm9zc0xpbmsgIkxvYWRRdWV1ZSJ9fXt7L2Nyb3NzTGlua319IHF1ZXVlcyBzaG91bGQgYmUgY2xvc2VkIHVzaW5nIHt7I2Nyb3NzTGluayAiTG9hZFF1ZXVlL2Nsb3NlIn19e3svY3Jvc3NMaW5rfX0KCQkgKiBpbnN0ZWFkLgoJCSAqIEBwcm9wZXJ0eSBjYW5jZWxlZAoJCSAqIEB0eXBlIHtCb29sZWFufQoJCSAqIEBkZWZhdWx0IGZhbHNlCgkJICovCgkJdGhpcy5jYW5jZWxlZCA9IGZhbHNlOwoKCQkvKioKCQkgKiBUaGUgY3VycmVudCBsb2FkIHByb2dyZXNzIChwZXJjZW50YWdlKSBmb3IgdGhpcyBpdGVtLiBUaGlzIHdpbGwgYmUgYSBudW1iZXIgYmV0d2VlbiAwIGFuZCAxLgoJCSAqCgkJICogPGg0PkV4YW1wbGU8L2g0PgoJCSAqCgkJICogICAgIHZhciBxdWV1ZSA9IG5ldyBjcmVhdGVqcy5Mb2FkUXVldWUoKTsKCQkgKiAgICAgcXVldWUubG9hZEZpbGUoImxhcmdlSW1hZ2UucG5nIik7CgkJICogICAgIHF1ZXVlLm9uKCJwcm9ncmVzcyIsIGZ1bmN0aW9uKCkgewoJCSAqICAgICAgICAgY29uc29sZS5sb2coIlByb2dyZXNzOiIsIHF1ZXVlLnByb2dyZXNzLCBldmVudC5wcm9ncmVzcyk7CgkJICogICAgIH0pOwoJCSAqCgkJICogQHByb3BlcnR5IHByb2dyZXNzCgkJICogQHR5cGUge051bWJlcn0KCQkgKiBAZGVmYXVsdCAwCgkJICovCgkJdGhpcy5wcm9ncmVzcyA9IDA7CgoJCS8qKgoJCSAqIFRoZSB0eXBlIG9mIGl0ZW0gdGhpcyBsb2FkZXIgd2lsbCBsb2FkLiBTZWUge3sjY3Jvc3NMaW5rICJBYnN0cmFjdExvYWRlciJ9fXt7L2Nyb3NzTGlua319IGZvciBhIGZ1bGwgbGlzdCBvZgoJCSAqIHN1cHBvcnRlZCB0eXBlcy4KCQkgKiBAcHJvcGVydHkgdHlwZQoJCSAqIEB0eXBlIHtTdHJpbmd9CgkJICovCgkJdGhpcy50eXBlID0gdHlwZTsKCgkJLyoqCgkJICogQSBmb3JtYXR0ZXIgZnVuY3Rpb24gdGhhdCBjb252ZXJ0cyB0aGUgbG9hZGVkIHJhdyByZXN1bHQgaW50byB0aGUgZmluYWwgcmVzdWx0LiBGb3IgZXhhbXBsZSwgdGhlIEpTT05Mb2FkZXIKCQkgKiBjb252ZXJ0cyBhIHN0cmluZyBvZiB0ZXh0IGludG8gYSBKYXZhU2NyaXB0IG9iamVjdC4gTm90IGFsbCBsb2FkZXJzIGhhdmUgYSByZXN1bHRGb3JtYXR0ZXIsIGFuZCB0aGlzIHByb3BlcnR5CgkJICogY2FuIGJlIG92ZXJyaWRkZW4gdG8gcHJvdmlkZSBjdXN0b20gZm9ybWF0dGluZy4KCQkgKgoJCSAqIE9wdGlvbmFsbHksIGEgcmVzdWx0Rm9ybWF0dGVyIGNhbiByZXR1cm4gYSBjYWxsYmFjayBmdW5jdGlvbiBpbiBjYXNlcyB3aGVyZSB0aGUgZm9ybWF0dGluZyBuZWVkcyB0byBiZQoJCSAqIGFzeW5jaHJvbm91cywgc3VjaCBhcyBjcmVhdGluZyBhIG5ldyBpbWFnZS4KCQkgKiBAcHJvcGVydHkgcmVzdWx0Rm9ybWF0dGVyCgkJICogQHR5cGUge0Z1bmN0aW9ufQoJCSAqIEBkZWZhdWx0IG51bGwKCQkgKi8KCQl0aGlzLnJlc3VsdEZvcm1hdHRlciA9IG51bGw7CgoJCS8vIHByb3RlY3RlZCBwcm9wZXJ0aWVzCgkJLyoqCgkJICogVGhlIHt7I2Nyb3NzTGluayAiTG9hZEl0ZW0ifX17ey9jcm9zc0xpbmt9fSB0aGlzIGxvYWRlciByZXByZXNlbnRzLiBOb3RlIHRoYXQgdGhpcyBpcyBudWxsIGluIGEge3sjY3Jvc3NMaW5rICJMb2FkUXVldWUifX17ey9jcm9zc0xpbmt9fSwKCQkgKiBidXQgd2lsbCBiZSBhdmFpbGFibGUgb24gbG9hZGVycyBzdWNoIGFzIHt7I2Nyb3NzTGluayAiWE1MTG9hZGVyIn19e3svY3Jvc3NMaW5rfX0gYW5kIHt7I2Nyb3NzTGluayAiSW1hZ2VMb2FkZXIifX17ey9jcm9zc0xpbmt9fS4KCQkgKiBAcHJvcGVydHkgX2l0ZW0KCQkgKiBAdHlwZSB7TG9hZEl0ZW18T2JqZWN0fQoJCSAqIEBwcml2YXRlCgkJICovCgkJaWYgKGxvYWRJdGVtKSB7CgkJCXRoaXMuX2l0ZW0gPSBjcmVhdGVqcy5Mb2FkSXRlbS5jcmVhdGUobG9hZEl0ZW0pOwoJCX0gZWxzZSB7CgkJCXRoaXMuX2l0ZW0gPSBudWxsOwoJCX0KCgkJLyoqCgkJICogV2hldGhlciB0aGUgbG9hZGVyIHdpbGwgdHJ5IGFuZCBsb2FkIGNvbnRlbnQgdXNpbmcgWEhSICh0cnVlKSBvciBIVE1MIHRhZ3MgKGZhbHNlKS4KCQkgKiBAcHJvcGVydHkgX3ByZWZlclhIUgoJCSAqIEB0eXBlIHtCb29sZWFufQoJCSAqIEBwcml2YXRlCgkJICovCgkJdGhpcy5fcHJlZmVyWEhSID0gcHJlZmVyWEhSOwoKCQkvKioKCQkgKiBUaGUgbG9hZGVkIHJlc3VsdCBhZnRlciBpdCBpcyBmb3JtYXR0ZWQgYnkgYW4gb3B0aW9uYWwge3sjY3Jvc3NMaW5rICJyZXN1bHRGb3JtYXR0ZXIifX17ey9jcm9zc0xpbmt9fS4gRm9yCgkJICogaXRlbXMgdGhhdCBhcmUgbm90IGZvcm1hdHRlZCwgdGhpcyB3aWxsIGJlIHRoZSBzYW1lIGFzIHRoZSB7eyNjcm9zc0xpbmsgIl9yYXdSZXN1bHQ6cHJvcGVydHkifX17ey9jcm9zc0xpbmt9fS4KCQkgKiBUaGUgcmVzdWx0IGlzIGFjY2Vzc2VkIHVzaW5nIHRoZSB7eyNjcm9zc0xpbmsgImdldFJlc3VsdCJ9fXt7L2Nyb3NzTGlua319IG1ldGhvZC4KCQkgKiBAcHJvcGVydHkgX3Jlc3VsdAoJCSAqIEB0eXBlIHtPYmplY3R8U3RyaW5nfQoJCSAqIEBwcml2YXRlCgkJICovCgkJdGhpcy5fcmVzdWx0ID0gbnVsbDsKCgkJLyoqCgkJICogVGhlIGxvYWRlZCByZXN1bHQgYmVmb3JlIGl0IGlzIGZvcm1hdHRlZC4gVGhlIHJhd1Jlc3VsdCBpcyBhY2Nlc3NlZCB1c2luZyB0aGUge3sjY3Jvc3NMaW5rICJnZXRSZXN1bHQifX17ey9jcm9zc0xpbmt9fQoJCSAqIG1ldGhvZCwgYW5kIHBhc3NpbmcgYHRydWVgLgoJCSAqIEBwcm9wZXJ0eSBfcmF3UmVzdWx0CgkJICogQHR5cGUge09iamVjdHxTdHJpbmd9CgkJICogQHByaXZhdGUKCQkgKi8KCQl0aGlzLl9yYXdSZXN1bHQgPSBudWxsOwoKCQkvKioKCQkgKiBBIGxpc3Qgb2YgaXRlbXMgdGhhdCBsb2FkZXJzIGxvYWQgYmVoaW5kIHRoZSBzY2VuZXMuIFRoaXMgZG9lcyBub3QgaW5jbHVkZSB0aGUgbWFpbiBpdGVtIHRoZSBsb2FkZXIgaXMKCQkgKiByZXNwb25zaWJsZSBmb3IgbG9hZGluZy4gRXhhbXBsZXMgb2YgbG9hZGVycyB0aGF0IGhhdmUgc3ViLWl0ZW1zIGluY2x1ZGUgdGhlIHt7I2Nyb3NzTGluayAiU3ByaXRlU2hlZXRMb2FkZXIifX17ey9jcm9zc0xpbmt9fSBhbmQKCQkgKiB7eyNjcm9zc0xpbmsgIk1hbmlmZXN0TG9hZGVyIn19e3svY3Jvc3NMaW5rfX0uCgkJICogQHByb3BlcnR5IF9sb2FkSXRlbXMKCQkgKiBAdHlwZSB7bnVsbH0KCQkgKiBAcHJvdGVjdGVkCgkJICovCgkJdGhpcy5fbG9hZGVkSXRlbXMgPSBudWxsOwoKCQkvKioKCQkgKiBUaGUgYXR0cmlidXRlIHRoZSBpdGVtcyBsb2FkZWQgdXNpbmcgdGFncyB1c2UgZm9yIHRoZSBzb3VyY2UuCgkJICogQHR5cGUge3N0cmluZ30KCQkgKiBAZGVmYXVsdCBudWxsCgkJICogQHByaXZhdGUKCQkgKi8KCQl0aGlzLl90YWdTcmNBdHRyaWJ1dGUgPSBudWxsOwoKCQkvKioKCQkgKiBBbiBIVE1MIHRhZyAob3Igc2ltaWxhcikgdGhhdCBhIGxvYWRlciBtYXkgdXNlIHRvIGxvYWQgSFRNTCBjb250ZW50LCBzdWNoIGFzIGltYWdlcywgc2NyaXB0cywgZXRjLgoJCSAqIEBwcm9wZXJ0eSBfdGFnCgkJICogQHR5cGUge09iamVjdH0KCQkgKiBAcHJpdmF0ZQoJCSAqLwoJCXRoaXMuX3RhZyA9IG51bGw7Cgl9OwoKCXZhciBwID0gY3JlYXRlanMuZXh0ZW5kKEFic3RyYWN0TG9hZGVyLCBjcmVhdGVqcy5FdmVudERpc3BhdGNoZXIpOwoJdmFyIHMgPSBBYnN0cmFjdExvYWRlcjsKCgkvLyBUT0RPOiBkZXByZWNhdGVkCgkvLyBwLmluaXRpYWxpemUgPSBmdW5jdGlvbigpIHt9OyAvLyBzZWFyY2hhYmxlIGZvciBkZXZzIHdvbmRlcmluZyB3aGVyZSBpdCBpcy4gUkVNT1ZFRC4gU2VlIGRvY3MgZm9yIGRldGFpbHMuCgoKCS8qKgoJICogRGVmaW5lcyBhIFBPU1QgcmVxdWVzdCwgdXNlIGZvciBhIG1ldGhvZCB2YWx1ZSB3aGVuIGxvYWRpbmcgZGF0YS4KCSAqIEBwcm9wZXJ0eSBQT1NUCgkgKiBAdHlwZSB7c3RyaW5nfQoJICogQGRlZmF1bHQgcG9zdAoJICovCglzLlBPU1QgPSAiUE9TVCI7CgoJLyoqCgkgKiBEZWZpbmVzIGEgR0VUIHJlcXVlc3QsIHVzZSBmb3IgYSBtZXRob2QgdmFsdWUgd2hlbiBsb2FkaW5nIGRhdGEuCgkgKiBAcHJvcGVydHkgR0VUCgkgKiBAdHlwZSB7c3RyaW5nfQoJICogQGRlZmF1bHQgZ2V0CgkgKi8KCXMuR0VUID0gIkdFVCI7CgoJLyoqCgkgKiBUaGUgcHJlbG9hZCB0eXBlIGZvciBnZW5lcmljIGJpbmFyeSB0eXBlcy4gTm90ZSB0aGF0IGltYWdlcyBhcmUgbG9hZGVkIGFzIGJpbmFyeSBmaWxlcyB3aGVuIHVzaW5nIFhIUi4KCSAqIEBwcm9wZXJ0eSBCSU5BUlkKCSAqIEB0eXBlIHtTdHJpbmd9CgkgKiBAZGVmYXVsdCBiaW5hcnkKCSAqIEBzdGF0aWMKCSAqIEBzaW5jZSAwLjYuMAoJICovCglzLkJJTkFSWSA9ICJiaW5hcnkiOwoKCS8qKgoJICogVGhlIHByZWxvYWQgdHlwZSBmb3IgY3NzIGZpbGVzLiBDU1MgZmlsZXMgYXJlIGxvYWRlZCB1c2luZyBhICZsdDtsaW5rJmd0OyB3aGVuIGxvYWRlZCB3aXRoIFhIUiwgb3IgYQoJICogJmx0O3N0eWxlJmd0OyB0YWcgd2hlbiBsb2FkZWQgd2l0aCB0YWdzLgoJICogQHByb3BlcnR5IENTUwoJICogQHR5cGUge1N0cmluZ30KCSAqIEBkZWZhdWx0IGNzcwoJICogQHN0YXRpYwoJICogQHNpbmNlIDAuNi4wCgkgKi8KCXMuQ1NTID0gImNzcyI7CgoJLyoqCgkgKiBUaGUgcHJlbG9hZCB0eXBlIGZvciBpbWFnZSBmaWxlcywgdXN1YWxseSBwbmcsIGdpZiwgb3IganBnL2pwZWcuIEltYWdlcyBhcmUgbG9hZGVkIGludG8gYW4gJmx0O2ltYWdlJmd0OyB0YWcuCgkgKiBAcHJvcGVydHkgSU1BR0UKCSAqIEB0eXBlIHtTdHJpbmd9CgkgKiBAZGVmYXVsdCBpbWFnZQoJICogQHN0YXRpYwoJICogQHNpbmNlIDAuNi4wCgkgKi8KCXMuSU1BR0UgPSAiaW1hZ2UiOwoKCS8qKgoJICogVGhlIHByZWxvYWQgdHlwZSBmb3IgamF2YXNjcmlwdCBmaWxlcywgdXN1YWxseSB3aXRoIHRoZSAianMiIGZpbGUgZXh0ZW5zaW9uLiBKYXZhU2NyaXB0IGZpbGVzIGFyZSBsb2FkZWQgaW50byBhCgkgKiAmbHQ7c2NyaXB0Jmd0OyB0YWcuCgkgKgoJICogU2luY2UgdmVyc2lvbiAwLjQuMSssIGR1ZSB0byBob3cgdGFnLWxvYWRlZCBzY3JpcHRzIHdvcmssIGFsbCBKYXZhU2NyaXB0IGZpbGVzIGFyZSBhdXRvbWF0aWNhbGx5IGluamVjdGVkIGludG8KCSAqIHRoZSBib2R5IG9mIHRoZSBkb2N1bWVudCB0byBtYWludGFpbiBwYXJpdHkgYmV0d2VlbiBYSFIgYW5kIHRhZy1sb2FkZWQgc2NyaXB0cy4gSW4gdmVyc2lvbiAwLjQuMCBhbmQgZWFybGllciwKCSAqIG9ubHkgdGFnLWxvYWRlZCBzY3JpcHRzIGFyZSBpbmplY3RlZC4KCSAqIEBwcm9wZXJ0eSBKQVZBU0NSSVBUCgkgKiBAdHlwZSB7U3RyaW5nfQoJICogQGRlZmF1bHQgamF2YXNjcmlwdAoJICogQHN0YXRpYwoJICogQHNpbmNlIDAuNi4wCgkgKi8KCXMuSkFWQVNDUklQVCA9ICJqYXZhc2NyaXB0IjsKCgkvKioKCSAqIFRoZSBwcmVsb2FkIHR5cGUgZm9yIGpzb24gZmlsZXMsIHVzdWFsbHkgd2l0aCB0aGUgImpzb24iIGZpbGUgZXh0ZW5zaW9uLiBKU09OIGRhdGEgaXMgbG9hZGVkIGFuZCBwYXJzZWQgaW50byBhCgkgKiBKYXZhU2NyaXB0IG9iamVjdC4gTm90ZSB0aGF0IGlmIGEgYGNhbGxiYWNrYCBpcyBwcmVzZW50IG9uIHRoZSBsb2FkIGl0ZW0sIHRoZSBmaWxlIHdpbGwgYmUgbG9hZGVkIHdpdGggSlNPTlAsCgkgKiBubyBtYXR0ZXIgd2hhdCB0aGUge3sjY3Jvc3NMaW5rICJMb2FkUXVldWUvcHJlZmVyWEhSOnByb3BlcnR5In19e3svY3Jvc3NMaW5rfX0gcHJvcGVydHkgaXMgc2V0IHRvLCBhbmQgdGhlIEpTT04KCSAqIG11c3QgY29udGFpbiBhIG1hdGNoaW5nIHdyYXBwZXIgZnVuY3Rpb24uCgkgKiBAcHJvcGVydHkgSlNPTgoJICogQHR5cGUge1N0cmluZ30KCSAqIEBkZWZhdWx0IGpzb24KCSAqIEBzdGF0aWMKCSAqIEBzaW5jZSAwLjYuMAoJICovCglzLkpTT04gPSAianNvbiI7CgoJLyoqCgkgKiBUaGUgcHJlbG9hZCB0eXBlIGZvciBqc29ucCBmaWxlcywgdXN1YWxseSB3aXRoIHRoZSAianNvbiIgZmlsZSBleHRlbnNpb24uIEpTT04gZGF0YSBpcyBsb2FkZWQgYW5kIHBhcnNlZCBpbnRvIGEKCSAqIEphdmFTY3JpcHQgb2JqZWN0LiBZb3UgYXJlIHJlcXVpcmVkIHRvIHBhc3MgYSBjYWxsYmFjayBwYXJhbWV0ZXIgdGhhdCBtYXRjaGVzIHRoZSBmdW5jdGlvbiB3cmFwcGVyIGluIHRoZSBKU09OLgoJICogTm90ZSB0aGF0IEpTT05QIHdpbGwgYWx3YXlzIGJlIHVzZWQgaWYgdGhlcmUgaXMgYSBjYWxsYmFjayBwcmVzZW50LCBubyBtYXR0ZXIgd2hhdCB0aGUge3sjY3Jvc3NMaW5rICJMb2FkUXVldWUvcHJlZmVyWEhSOnByb3BlcnR5In19e3svY3Jvc3NMaW5rfX0KCSAqIHByb3BlcnR5IGlzIHNldCB0by4KCSAqIEBwcm9wZXJ0eSBKU09OUAoJICogQHR5cGUge1N0cmluZ30KCSAqIEBkZWZhdWx0IGpzb25wCgkgKiBAc3RhdGljCgkgKiBAc2luY2UgMC42LjAKCSAqLwoJcy5KU09OUCA9ICJqc29ucCI7CgoJLyoqCgkgKiBUaGUgcHJlbG9hZCB0eXBlIGZvciBqc29uLWJhc2VkIG1hbmlmZXN0IGZpbGVzLCB1c3VhbGx5IHdpdGggdGhlICJqc29uIiBmaWxlIGV4dGVuc2lvbi4gVGhlIEpTT04gZGF0YSBpcyBsb2FkZWQKCSAqIGFuZCBwYXJzZWQgaW50byBhIEphdmFTY3JpcHQgb2JqZWN0LiBQcmVsb2FkSlMgd2lsbCB0aGVuIGxvb2sgZm9yIGEgIm1hbmlmZXN0IiBwcm9wZXJ0eSBpbiB0aGUgSlNPTiwgd2hpY2ggaXMgYW4KCSAqIEFycmF5IG9mIGZpbGVzIHRvIGxvYWQsIGZvbGxvd2luZyB0aGUgc2FtZSBmb3JtYXQgYXMgdGhlIHt7I2Nyb3NzTGluayAiTG9hZFF1ZXVlL2xvYWRNYW5pZmVzdCJ9fXt7L2Nyb3NzTGlua319CgkgKiBtZXRob2QuIElmIGEgImNhbGxiYWNrIiBpcyBzcGVjaWZpZWQgb24gdGhlIG1hbmlmZXN0IG9iamVjdCwgdGhlbiBpdCB3aWxsIGJlIGxvYWRlZCB1c2luZyBKU09OUCBpbnN0ZWFkLAoJICogcmVnYXJkbGVzcyBvZiB3aGF0IHRoZSB7eyNjcm9zc0xpbmsgIkxvYWRRdWV1ZS9wcmVmZXJYSFI6cHJvcGVydHkifX17ey9jcm9zc0xpbmt9fSBwcm9wZXJ0eSBpcyBzZXQgdG8uCgkgKiBAcHJvcGVydHkgTUFOSUZFU1QKCSAqIEB0eXBlIHtTdHJpbmd9CgkgKiBAZGVmYXVsdCBtYW5pZmVzdAoJICogQHN0YXRpYwoJICogQHNpbmNlIDAuNi4wCgkgKi8KCXMuTUFOSUZFU1QgPSAibWFuaWZlc3QiOwoKCS8qKgoJICogVGhlIHByZWxvYWQgdHlwZSBmb3Igc291bmQgZmlsZXMsIHVzdWFsbHkgbXAzLCBvZ2csIG9yIHdhdi4gV2hlbiBsb2FkaW5nIHZpYSB0YWdzLCBhdWRpbyBpcyBsb2FkZWQgaW50byBhbgoJICogJmx0O2F1ZGlvJmd0OyB0YWcuCgkgKiBAcHJvcGVydHkgU09VTkQKCSAqIEB0eXBlIHtTdHJpbmd9CgkgKiBAZGVmYXVsdCBzb3VuZAoJICogQHN0YXRpYwoJICogQHNpbmNlIDAuNi4wCgkgKi8KCXMuU09VTkQgPSAic291bmQiOwoKCS8qKgoJICogVGhlIHByZWxvYWQgdHlwZSBmb3IgdmlkZW8gZmlsZXMsIHVzdWFsbHkgbXA0LCB0cywgb3Igb2dnLiBXaGVuIGxvYWRpbmcgdmlhIHRhZ3MsIHZpZGVvIGlzIGxvYWRlZCBpbnRvIGFuCgkgKiAmbHQ7dmlkZW8mZ3Q7IHRhZy4KCSAqIEBwcm9wZXJ0eSBWSURFTwoJICogQHR5cGUge1N0cmluZ30KCSAqIEBkZWZhdWx0IHZpZGVvCgkgKiBAc3RhdGljCgkgKiBAc2luY2UgMC42LjAKCSAqLwoJcy5WSURFTyA9ICJ2aWRlbyI7CgoJLyoqCgkgKiBUaGUgcHJlbG9hZCB0eXBlIGZvciBTcHJpdGVTaGVldCBmaWxlcy4gU3ByaXRlU2hlZXQgZmlsZXMgYXJlIEpTT04gZmlsZXMgdGhhdCBjb250YWluIHN0cmluZyBpbWFnZSBwYXRocy4KCSAqIEBwcm9wZXJ0eSBTUFJJVEVTSEVFVAoJICogQHR5cGUge1N0cmluZ30KCSAqIEBkZWZhdWx0IHNwcml0ZXNoZWV0CgkgKiBAc3RhdGljCgkgKiBAc2luY2UgMC42LjAKCSAqLwoJcy5TUFJJVEVTSEVFVCA9ICJzcHJpdGVzaGVldCI7CgoJLyoqCgkgKiBUaGUgcHJlbG9hZCB0eXBlIGZvciBTVkcgZmlsZXMuCgkgKiBAcHJvcGVydHkgU1ZHCgkgKiBAdHlwZSB7U3RyaW5nfQoJICogQGRlZmF1bHQgc3ZnCgkgKiBAc3RhdGljCgkgKiBAc2luY2UgMC42LjAKCSAqLwoJcy5TVkcgPSAic3ZnIjsKCgkvKioKCSAqIFRoZSBwcmVsb2FkIHR5cGUgZm9yIHRleHQgZmlsZXMsIHdoaWNoIGlzIGFsc28gdGhlIGRlZmF1bHQgZmlsZSB0eXBlIGlmIHRoZSB0eXBlIGNhbiBub3QgYmUgZGV0ZXJtaW5lZC4gVGV4dCBpcwoJICogbG9hZGVkIGFzIHJhdyB0ZXh0LgoJICogQHByb3BlcnR5IFRFWFQKCSAqIEB0eXBlIHtTdHJpbmd9CgkgKiBAZGVmYXVsdCB0ZXh0CgkgKiBAc3RhdGljCgkgKiBAc2luY2UgMC42LjAKCSAqLwoJcy5URVhUID0gInRleHQiOwoKCS8qKgoJICogVGhlIHByZWxvYWQgdHlwZSBmb3IgeG1sIGZpbGVzLiBYTUwgaXMgbG9hZGVkIGludG8gYW4gWE1MIGRvY3VtZW50LgoJICogQHByb3BlcnR5IFhNTAoJICogQHR5cGUge1N0cmluZ30KCSAqIEBkZWZhdWx0IHhtbAoJICogQHN0YXRpYwoJICogQHNpbmNlIDAuNi4wCgkgKi8KCXMuWE1MID0gInhtbCI7CgovLyBFdmVudHMKCS8qKgoJICogVGhlIHt7I2Nyb3NzTGluayAiUHJvZ3Jlc3NFdmVudCJ9fXt7L2Nyb3NzTGlua319IHRoYXQgaXMgZmlyZWQgd2hlbiB0aGUgb3ZlcmFsbCBwcm9ncmVzcyBjaGFuZ2VzLiBQcmlvciB0bwoJICogdmVyc2lvbiAwLjYuMCwgdGhpcyB3YXMganVzdCBhIHJlZ3VsYXIge3sjY3Jvc3NMaW5rICJFdmVudCJ9fXt7L2Nyb3NzTGlua319LgoJICogQGV2ZW50IHByb2dyZXNzCgkgKiBAc2luY2UgMC4zLjAKCSAqLwoKCS8qKgoJICogVGhlIHt7I2Nyb3NzTGluayAiRXZlbnQifX17ey9jcm9zc0xpbmt9fSB0aGF0IGlzIGZpcmVkIHdoZW4gYSBsb2FkIHN0YXJ0cy4KCSAqIEBldmVudCBsb2Fkc3RhcnQKCSAqIEBwYXJhbSB7T2JqZWN0fSB0YXJnZXQgVGhlIG9iamVjdCB0aGF0IGRpc3BhdGNoZWQgdGhlIGV2ZW50LgoJICogQHBhcmFtIHtTdHJpbmd9IHR5cGUgVGhlIGV2ZW50IHR5cGUuCgkgKiBAc2luY2UgMC4zLjEKCSAqLwoKCS8qKgoJICogVGhlIHt7I2Nyb3NzTGluayAiRXZlbnQifX17ey9jcm9zc0xpbmt9fSB0aGF0IGlzIGZpcmVkIHdoZW4gdGhlIGVudGlyZSBxdWV1ZSBoYXMgYmVlbiBsb2FkZWQuCgkgKiBAZXZlbnQgY29tcGxldGUKCSAqIEBwYXJhbSB7T2JqZWN0fSB0YXJnZXQgVGhlIG9iamVjdCB0aGF0IGRpc3BhdGNoZWQgdGhlIGV2ZW50LgoJICogQHBhcmFtIHtTdHJpbmd9IHR5cGUgVGhlIGV2ZW50IHR5cGUuCgkgKiBAc2luY2UgMC4zLjAKCSAqLwoKCS8qKgoJICogVGhlIHt7I2Nyb3NzTGluayAiRXJyb3JFdmVudCJ9fXt7L2Nyb3NzTGlua319IHRoYXQgaXMgZmlyZWQgd2hlbiB0aGUgbG9hZGVyIGVuY291bnRlcnMgYW4gZXJyb3IuIElmIHRoZSBlcnJvciB3YXMKCSAqIGVuY291bnRlcmVkIGJ5IGEgZmlsZSwgdGhlIGV2ZW50IHdpbGwgY29udGFpbiB0aGUgaXRlbSB0aGF0IGNhdXNlZCB0aGUgZXJyb3IuIFByaW9yIHRvIHZlcnNpb24gMC42LjAsIHRoaXMgd2FzCgkgKiBqdXN0IGEgcmVndWxhciB7eyNjcm9zc0xpbmsgIkV2ZW50In19e3svY3Jvc3NMaW5rfX0uCgkgKiBAZXZlbnQgZXJyb3IKCSAqIEBzaW5jZSAwLjMuMAoJICovCgoJLyoqCgkgKiBUaGUge3sjY3Jvc3NMaW5rICJFdmVudCJ9fXt7L2Nyb3NzTGlua319IHRoYXQgaXMgZmlyZWQgd2hlbiB0aGUgbG9hZGVyIGVuY291bnRlcnMgYW4gaW50ZXJuYWwgZmlsZSBsb2FkIGVycm9yLgoJICogVGhpcyBlbmFibGVzIGxvYWRlcnMgdG8gbWFpbnRhaW4gaW50ZXJuYWwgcXVldWVzLCBhbmQgc3VyZmFjZSBmaWxlIGxvYWQgZXJyb3JzLgoJICogQGV2ZW50IGZpbGVlcnJvcgoJICogQHBhcmFtIHtPYmplY3R9IHRhcmdldCBUaGUgb2JqZWN0IHRoYXQgZGlzcGF0Y2hlZCB0aGUgZXZlbnQuCgkgKiBAcGFyYW0ge1N0cmluZ30gdHlwZSBUaGUgZXZlbiB0eXBlICgiZmlsZWVycm9yIikKCSAqIEBwYXJhbSB7TG9hZEl0ZW18b2JqZWN0fSBUaGUgaXRlbSB0aGF0IGVuY291bnRlcmVkIHRoZSBlcnJvcgoJICogQHNpbmNlIDAuNi4wCgkgKi8KCgkvKioKCSAqIFRoZSB7eyNjcm9zc0xpbmsgIkV2ZW50In19e3svY3Jvc3NMaW5rfX0gdGhhdCBpcyBmaXJlZCB3aGVuIGEgbG9hZGVyIGludGVybmFsbHkgbG9hZHMgYSBmaWxlLiBUaGlzIGVuYWJsZXMKCSAqIGxvYWRlcnMgc3VjaCBhcyB7eyNjcm9zc0xpbmsgIk1hbmlmZXN0TG9hZGVyIn19e3svY3Jvc3NMaW5rfX0gdG8gbWFpbnRhaW4gaW50ZXJuYWwge3sjY3Jvc3NMaW5rICJMb2FkUXVldWUifX17ey9jcm9zc0xpbmt9fXMKCSAqIGFuZCBub3RpZnkgd2hlbiB0aGV5IGhhdmUgbG9hZGVkIGEgZmlsZS4gVGhlIHt7I2Nyb3NzTGluayAiTG9hZFF1ZXVlIn19e3svY3Jvc3NMaW5rfX0gY2xhc3MgZGlzcGF0Y2hlcyBhCgkgKiBzbGlnaHRseSBkaWZmZXJlbnQge3sjY3Jvc3NMaW5rICJMb2FkUXVldWUvZmlsZWxvYWQ6ZXZlbnQifX17ey9jcm9zc0xpbmt9fSBldmVudC4KCSAqIEBldmVudCBmaWxlbG9hZAoJICogQHBhcmFtIHtPYmplY3R9IHRhcmdldCBUaGUgb2JqZWN0IHRoYXQgZGlzcGF0Y2hlZCB0aGUgZXZlbnQuCgkgKiBAcGFyYW0ge1N0cmluZ30gdHlwZSBUaGUgZXZlbnQgdHlwZSAoImZpbGVsb2FkIikKCSAqIEBwYXJhbSB7T2JqZWN0fSBpdGVtIFRoZSBmaWxlIGl0ZW0gd2hpY2ggd2FzIHNwZWNpZmllZCBpbiB0aGUge3sjY3Jvc3NMaW5rICJMb2FkUXVldWUvbG9hZEZpbGUifX17ey9jcm9zc0xpbmt9fQoJICogb3Ige3sjY3Jvc3NMaW5rICJMb2FkUXVldWUvbG9hZE1hbmlmZXN0In19e3svY3Jvc3NMaW5rfX0gY2FsbC4gSWYgb25seSBhIHN0cmluZyBwYXRoIG9yIHRhZyB3YXMgc3BlY2lmaWVkLCB0aGUKCSAqIG9iamVjdCB3aWxsIGNvbnRhaW4gdGhhdCB2YWx1ZSBhcyBhIGBzcmNgIHByb3BlcnR5LgoJICogQHBhcmFtIHtPYmplY3R9IHJlc3VsdCBUaGUgSFRNTCB0YWcgb3IgcGFyc2VkIHJlc3VsdCBvZiB0aGUgbG9hZGVkIGl0ZW0uCgkgKiBAcGFyYW0ge09iamVjdH0gcmF3UmVzdWx0IFRoZSB1bnByb2Nlc3NlZCByZXN1bHQsIHVzdWFsbHkgdGhlIHJhdyB0ZXh0IG9yIGJpbmFyeSBkYXRhIGJlZm9yZSBpdCBpcyBjb252ZXJ0ZWQKCSAqIHRvIGEgdXNhYmxlIG9iamVjdC4KCSAqIEBzaW5jZSAwLjYuMAoJICovCgoJLyoqCgkgKiBUaGUge3sjY3Jvc3NMaW5rICJFdmVudCJ9fXt7L2Nyb3NzTGlua319IHRoYXQgaXMgZmlyZWQgYWZ0ZXIgdGhlIGludGVybmFsIHJlcXVlc3QgaXMgY3JlYXRlZCwgYnV0IGJlZm9yZSBhIGxvYWQuCgkgKiBUaGlzIGFsbG93cyB1cGRhdGVzIHRvIHRoZSBsb2FkZXIgZm9yIHNwZWNpZmljIGxvYWRpbmcgbmVlZHMsIHN1Y2ggYXMgYmluYXJ5IG9yIFhIUiBpbWFnZSBsb2FkaW5nLgoJICogQGV2ZW50IGluaXRpYWxpemUKCSAqIEBwYXJhbSB7T2JqZWN0fSB0YXJnZXQgVGhlIG9iamVjdCB0aGF0IGRpc3BhdGNoZWQgdGhlIGV2ZW50LgoJICogQHBhcmFtIHtTdHJpbmd9IHR5cGUgVGhlIGV2ZW50IHR5cGUgKCJpbml0aWFsaXplIikKCSAqIEBwYXJhbSB7QWJzdHJhY3RMb2FkZXJ9IGxvYWRlciBUaGUgbG9hZGVyIHRoYXQgaGFzIGJlZW4gaW5pdGlhbGl6ZWQuCgkgKi8KCgoJLyoqCgkgKiBHZXQgYSByZWZlcmVuY2UgdG8gdGhlIG1hbmlmZXN0IGl0ZW0gdGhhdCBpcyBsb2FkZWQgYnkgdGhpcyBsb2FkZXIuIEluIHNvbWUgY2FzZXMgdGhpcyB3aWxsIGJlIHRoZSB2YWx1ZSB0aGF0IHdhcwoJICogcGFzc2VkIGludG8ge3sjY3Jvc3NMaW5rICJMb2FkUXVldWUifX17ey9jcm9zc0xpbmt9fSB1c2luZyB7eyNjcm9zc0xpbmsgIkxvYWRRdWV1ZS9sb2FkRmlsZSJ9fXt7L2Nyb3NzTGlua319IG9yCgkgKiB7eyNjcm9zc0xpbmsgIkxvYWRRdWV1ZS9sb2FkTWFuaWZlc3QifX17ey9jcm9zc0xpbmt9fS4gSG93ZXZlciBpZiBvbmx5IGEgU3RyaW5nIHBhdGggd2FzIHBhc3NlZCBpbiwgdGhlbiBpdCB3aWxsCgkgKiBiZSBhIHt7I2Nyb3NzTGluayAiTG9hZEl0ZW0ifX17ey9jcm9zc0xpbmt9fS4KCSAqIEBtZXRob2QgZ2V0SXRlbQoJICogQHJldHVybiB7T2JqZWN0fSBUaGUgbWFuaWZlc3QgaXRlbSB0aGF0IHRoaXMgbG9hZGVyIGlzIHJlc3BvbnNpYmxlIGZvciBsb2FkaW5nLgoJICogQHNpbmNlIDAuNi4wCgkgKi8KCXAuZ2V0SXRlbSA9IGZ1bmN0aW9uICgpIHsKCQlyZXR1cm4gdGhpcy5faXRlbTsKCX07CgoJLyoqCgkgKiBHZXQgYSByZWZlcmVuY2UgdG8gdGhlIGNvbnRlbnQgdGhhdCB3YXMgbG9hZGVkIGJ5IHRoZSBsb2FkZXIgKG9ubHkgYXZhaWxhYmxlIGFmdGVyIHRoZSB7eyNjcm9zc0xpbmsgImNvbXBsZXRlOmV2ZW50In19e3svY3Jvc3NMaW5rfX0KCSAqIGV2ZW50IGlzIGRpc3BhdGNoZWQuCgkgKiBAbWV0aG9kIGdldFJlc3VsdAoJICogQHBhcmFtIHtCb29sZWFufSBbcmF3PWZhbHNlXSBEZXRlcm1pbmVzIGlmIHRoZSByZXR1cm5lZCByZXN1bHQgd2lsbCBiZSB0aGUgZm9ybWF0dGVkIGNvbnRlbnQsIG9yIHRoZSByYXcgbG9hZGVkCgkgKiBkYXRhIChpZiBpdCBleGlzdHMpLgoJICogQHJldHVybiB7T2JqZWN0fQoJICogQHNpbmNlIDAuNi4wCgkgKi8KCXAuZ2V0UmVzdWx0ID0gZnVuY3Rpb24gKHJhdykgewoJCXJldHVybiByYXcgPyB0aGlzLl9yYXdSZXN1bHQgOiB0aGlzLl9yZXN1bHQ7Cgl9OwoKCS8qKgoJICogUmV0dXJuIHRoZSBgdGFnYCB0aGlzIG9iamVjdCBjcmVhdGVzIG9yIHVzZXMgZm9yIGxvYWRpbmcuCgkgKiBAbWV0aG9kIGdldFRhZwoJICogQHJldHVybiB7T2JqZWN0fSBUaGUgdGFnIGluc3RhbmNlCgkgKiBAc2luY2UgMC42LjAKCSAqLwoJcC5nZXRUYWcgPSBmdW5jdGlvbiAoKSB7CgkJcmV0dXJuIHRoaXMuX3RhZzsKCX07CgoJLyoqCgkgKiBTZXQgdGhlIGB0YWdgIHRoaXMgaXRlbSB1c2VzIGZvciBsb2FkaW5nLgoJICogQG1ldGhvZCBzZXRUYWcKCSAqIEBwYXJhbSB7T2JqZWN0fSB0YWcgVGhlIHRhZyBpbnN0YW5jZQoJICogQHNpbmNlIDAuNi4wCgkgKi8KCXAuc2V0VGFnID0gZnVuY3Rpb24odGFnKSB7CgkgIHRoaXMuX3RhZyA9IHRhZzsKCX07CgoJLyoqCgkgKiBCZWdpbiBsb2FkaW5nIHRoZSBpdGVtLiBUaGlzIG1ldGhvZCBpcyByZXF1aXJlZCB3aGVuIHVzaW5nIGEgbG9hZGVyIGJ5IGl0c2VsZi4KCSAqCgkgKiA8aDQ+RXhhbXBsZTwvaDQ+CgkgKgoJICogICAgICB2YXIgcXVldWUgPSBuZXcgY3JlYXRlanMuTG9hZFF1ZXVlKCk7CgkgKiAgICAgIHF1ZXVlLm9uKCJjb21wbGV0ZSIsIGhhbmRsZUNvbXBsZXRlKTsKCSAqICAgICAgcXVldWUubG9hZE1hbmlmZXN0KGZpbGVBcnJheSwgZmFsc2UpOyAvLyBOb3RlIHRoZSAybmQgYXJndW1lbnQgdGhhdCB0ZWxscyB0aGUgcXVldWUgbm90IHRvIHN0YXJ0IGxvYWRpbmcgeWV0CgkgKiAgICAgIHF1ZXVlLmxvYWQoKTsKCSAqCgkgKiBAbWV0aG9kIGxvYWQKCSAqLwoJcC5sb2FkID0gZnVuY3Rpb24gKCkgewoJCXRoaXMuX2NyZWF0ZVJlcXVlc3QoKTsKCgkJdGhpcy5fcmVxdWVzdC5vbigiY29tcGxldGUiLCB0aGlzLCB0aGlzKTsKCQl0aGlzLl9yZXF1ZXN0Lm9uKCJwcm9ncmVzcyIsIHRoaXMsIHRoaXMpOwoJCXRoaXMuX3JlcXVlc3Qub24oImxvYWRTdGFydCIsIHRoaXMsIHRoaXMpOwoJCXRoaXMuX3JlcXVlc3Qub24oImFib3J0IiwgdGhpcywgdGhpcyk7CgkJdGhpcy5fcmVxdWVzdC5vbigidGltZW91dCIsIHRoaXMsIHRoaXMpOwoJCXRoaXMuX3JlcXVlc3Qub24oImVycm9yIiwgdGhpcywgdGhpcyk7CgoJCXZhciBldnQgPSBuZXcgY3JlYXRlanMuRXZlbnQoImluaXRpYWxpemUiKTsKCQlldnQubG9hZGVyID0gdGhpcy5fcmVxdWVzdDsKCQl0aGlzLmRpc3BhdGNoRXZlbnQoZXZ0KTsKCgkJdGhpcy5fcmVxdWVzdC5sb2FkKCk7Cgl9OwoKCS8qKgoJICogQ2xvc2UgdGhlIHRoZSBpdGVtLiBUaGlzIHdpbGwgc3RvcCBhbnkgb3BlbiByZXF1ZXN0cyAoYWx0aG91Z2ggZG93bmxvYWRzIHVzaW5nIEhUTUwgdGFncyBtYXkgc3RpbGwgY29udGludWUgaW4KCSAqIHRoZSBiYWNrZ3JvdW5kKSwgYnV0IGV2ZW50cyB3aWxsIG5vdCBsb25nZXIgYmUgZGlzcGF0Y2hlZC4KCSAqIEBtZXRob2QgY2FuY2VsCgkgKi8KCXAuY2FuY2VsID0gZnVuY3Rpb24gKCkgewoJCXRoaXMuY2FuY2VsZWQgPSB0cnVlOwoJCXRoaXMuZGVzdHJveSgpOwoJfTsKCgkvKioKCSAqIENsZWFuIHVwIHRoZSBsb2FkZXIuCgkgKiBAbWV0aG9kIGRlc3Ryb3kKCSAqLwoJcC5kZXN0cm95ID0gZnVuY3Rpb24oKSB7CgkJaWYgKHRoaXMuX3JlcXVlc3QpIHsKCQkJdGhpcy5fcmVxdWVzdC5yZW1vdmVBbGxFdmVudExpc3RlbmVycygpOwoJCQl0aGlzLl9yZXF1ZXN0LmRlc3Ryb3koKTsKCQl9CgoJCXRoaXMuX3JlcXVlc3QgPSBudWxsOwoKCQl0aGlzLl9pdGVtID0gbnVsbDsKCQl0aGlzLl9yYXdSZXN1bHQgPSBudWxsOwoJCXRoaXMuX3Jlc3VsdCA9IG51bGw7CgoJCXRoaXMuX2xvYWRJdGVtcyA9IG51bGw7CgoJCXRoaXMucmVtb3ZlQWxsRXZlbnRMaXN0ZW5lcnMoKTsKCX07CgoJLyoqCgkgKiBHZXQgYW55IGl0ZW1zIGxvYWRlZCBpbnRlcm5hbGx5IGJ5IHRoZSBsb2FkZXIuIFRoZSBlbmFibGVzIGxvYWRlcnMgc3VjaCBhcyB7eyNjcm9zc0xpbmsgIk1hbmlmZXN0TG9hZGVyIn19e3svY3Jvc3NMaW5rfX0KCSAqIHRvIGV4cG9zZSBpdGVtcyBpdCBsb2FkcyBpbnRlcm5hbGx5LgoJICogQG1ldGhvZCBnZXRMb2FkZWRJdGVtcwoJICogQHJldHVybiB7QXJyYXl9IEEgbGlzdCBvZiB0aGUgaXRlbXMgbG9hZGVkIGJ5IHRoZSBsb2FkZXIuCgkgKiBAc2luY2UgMC42LjAKCSAqLwoJcC5nZXRMb2FkZWRJdGVtcyA9IGZ1bmN0aW9uICgpIHsKCQlyZXR1cm4gdGhpcy5fbG9hZGVkSXRlbXM7Cgl9OwoKCgkvLyBQcml2YXRlIG1ldGhvZHMKCS8qKgoJICogQ3JlYXRlIGFuIGludGVybmFsIHJlcXVlc3QgdXNlZCBmb3IgbG9hZGluZy4gQnkgZGVmYXVsdCwgYW4ge3sjY3Jvc3NMaW5rICJYSFJSZXF1ZXN0In19e3svY3Jvc3NMaW5rfX0gb3IKCSAqIHt7I2Nyb3NzTGluayAiVGFnUmVxdWVzdCJ9fXt7L2Nyb3NzTGlua319IGlzIGNyZWF0ZWQsIGRlcGVuZGluZyBvbiB0aGUgdmFsdWUgb2Yge3sjY3Jvc3NMaW5rICJwcmVmZXJYSFI6cHJvcGVydHkifX17ey9jcm9zc0xpbmt9fS4KCSAqIE90aGVyIGxvYWRlcnMgbWF5IG92ZXJyaWRlIHRoaXMgdG8gdXNlIGRpZmZlcmVudCByZXF1ZXN0IHR5cGVzLCBzdWNoIGFzIHt7I2Nyb3NzTGluayAiTWFuaWZlc3RMb2FkZXIifX17ey9jcm9zc0xpbmt9fSwKCSAqIHdoaWNoIHVzZXMge3sjY3Jvc3NMaW5rICJKU09OTG9hZGVyIn19e3svY3Jvc3NMaW5rfX0gb3Ige3sjY3Jvc3NMaW5rICJKU09OUExvYWRlciJ9fXt7L2Nyb3NzTGlua319IHVuZGVyIHRoZSBob29kLgoJICogQG1ldGhvZCBfY3JlYXRlUmVxdWVzdAoJICogQHByb3RlY3RlZAoJICovCglwLl9jcmVhdGVSZXF1ZXN0ID0gZnVuY3Rpb24oKSB7CgkJaWYgKCF0aGlzLl9wcmVmZXJYSFIpIHsKCQkJdGhpcy5fcmVxdWVzdCA9IG5ldyBjcmVhdGVqcy5UYWdSZXF1ZXN0KHRoaXMuX2l0ZW0sIHRoaXMuX3RhZyB8fCB0aGlzLl9jcmVhdGVUYWcoKSwgdGhpcy5fdGFnU3JjQXR0cmlidXRlKTsKCQl9IGVsc2UgewoJCQl0aGlzLl9yZXF1ZXN0ID0gbmV3IGNyZWF0ZWpzLlhIUlJlcXVlc3QodGhpcy5faXRlbSk7CgkJfQoJfTsKCgkvKioKCSAqIENyZWF0ZSB0aGUgSFRNTCB0YWcgdXNlZCBmb3IgbG9hZGluZy4gVGhpcyBtZXRob2QgZG9lcyBub3RoaW5nIGJ5IGRlZmF1bHQsIGFuZCBuZWVkcyB0byBiZSBpbXBsZW1lbnRlZAoJICogYnkgbG9hZGVycyB0aGF0IHJlcXVpcmUgdGFnIGxvYWRpbmcuCgkgKiBAbWV0aG9kIF9jcmVhdGVUYWcKCSAqIEBwYXJhbSB7U3RyaW5nfSBzcmMgVGhlIHRhZyBzb3VyY2UKCSAqIEByZXR1cm4ge0hUTUxFbGVtZW50fSBUaGUgdGFnIHRoYXQgd2FzIGNyZWF0ZWQKCSAqIEBwcm90ZWN0ZWQKCSAqLwoJcC5fY3JlYXRlVGFnID0gZnVuY3Rpb24oc3JjKSB7IHJldHVybiBudWxsOyB9OwoKCS8qKgoJICogRGlzcGF0Y2ggYSBsb2Fkc3RhcnQge3sjY3Jvc3NMaW5rICJFdmVudCJ9fXt7L2Nyb3NzTGlua319LiBQbGVhc2Ugc2VlIHRoZSB7eyNjcm9zc0xpbmsgIkFic3RyYWN0TG9hZGVyL2xvYWRzdGFydDpldmVudCJ9fXt7L2Nyb3NzTGlua319CgkgKiBldmVudCBmb3IgZGV0YWlscyBvbiB0aGUgZXZlbnQgcGF5bG9hZC4KCSAqIEBtZXRob2QgX3NlbmRMb2FkU3RhcnQKCSAqIEBwcm90ZWN0ZWQKCSAqLwoJcC5fc2VuZExvYWRTdGFydCA9IGZ1bmN0aW9uICgpIHsKCQlpZiAodGhpcy5faXNDYW5jZWxlZCgpKSB7IHJldHVybjsgfQoJCXRoaXMuZGlzcGF0Y2hFdmVudCgibG9hZHN0YXJ0Iik7Cgl9OwoKCS8qKgoJICogRGlzcGF0Y2ggYSB7eyNjcm9zc0xpbmsgIlByb2dyZXNzRXZlbnQifX17ey9jcm9zc0xpbmt9fS4KCSAqIEBtZXRob2QgX3NlbmRQcm9ncmVzcwoJICogQHBhcmFtIHtOdW1iZXIgfCBPYmplY3R9IHZhbHVlIFRoZSBwcm9ncmVzcyBvZiB0aGUgbG9hZGVkIGl0ZW0sIG9yIGFuIG9iamVjdCBjb250YWluaW5nIDxjb2RlPmxvYWRlZDwvY29kZT4KCSAqIGFuZCA8Y29kZT50b3RhbDwvY29kZT4gcHJvcGVydGllcy4KCSAqIEBwcm90ZWN0ZWQKCSAqLwoJcC5fc2VuZFByb2dyZXNzID0gZnVuY3Rpb24gKHZhbHVlKSB7CgkJaWYgKHRoaXMuX2lzQ2FuY2VsZWQoKSkgeyByZXR1cm47IH0KCQl2YXIgZXZlbnQgPSBudWxsOwoJCWlmICh0eXBlb2YodmFsdWUpID09ICJudW1iZXIiKSB7CgkJCXRoaXMucHJvZ3Jlc3MgPSB2YWx1ZTsKCQkJZXZlbnQgPSBuZXcgY3JlYXRlanMuUHJvZ3Jlc3NFdmVudCh0aGlzLnByb2dyZXNzKTsKCQl9IGVsc2UgewoJCQlldmVudCA9IHZhbHVlOwoJCQl0aGlzLnByb2dyZXNzID0gdmFsdWUubG9hZGVkIC8gdmFsdWUudG90YWw7CgkJCWV2ZW50LnByb2dyZXNzID0gdGhpcy5wcm9ncmVzczsKCQkJaWYgKGlzTmFOKHRoaXMucHJvZ3Jlc3MpIHx8IHRoaXMucHJvZ3Jlc3MgPT0gSW5maW5pdHkpIHsgdGhpcy5wcm9ncmVzcyA9IDA7IH0KCQl9CgkJdGhpcy5oYXNFdmVudExpc3RlbmVyKCJwcm9ncmVzcyIpICYmIHRoaXMuZGlzcGF0Y2hFdmVudChldmVudCk7Cgl9OwoKCS8qKgoJICogRGlzcGF0Y2ggYSBjb21wbGV0ZSB7eyNjcm9zc0xpbmsgIkV2ZW50In19e3svY3Jvc3NMaW5rfX0uIFBsZWFzZSBzZWUgdGhlIHt7I2Nyb3NzTGluayAiQWJzdHJhY3RMb2FkZXIvY29tcGxldGU6ZXZlbnQifX17ey9jcm9zc0xpbmt9fSBldmVudAoJICogQG1ldGhvZCBfc2VuZENvbXBsZXRlCgkgKiBAcHJvdGVjdGVkCgkgKi8KCXAuX3NlbmRDb21wbGV0ZSA9IGZ1bmN0aW9uICgpIHsKCQlpZiAodGhpcy5faXNDYW5jZWxlZCgpKSB7IHJldHVybjsgfQoKCQl0aGlzLmxvYWRlZCA9IHRydWU7CgoJCXZhciBldmVudCA9IG5ldyBjcmVhdGVqcy5FdmVudCgiY29tcGxldGUiKTsKCQlldmVudC5yYXdSZXN1bHQgPSB0aGlzLl9yYXdSZXN1bHQ7CgoJCWlmICh0aGlzLl9yZXN1bHQgIT0gbnVsbCkgewoJCQlldmVudC5yZXN1bHQgPSB0aGlzLl9yZXN1bHQ7CgkJfQoKCQl0aGlzLmRpc3BhdGNoRXZlbnQoZXZlbnQpOwoJfTsKCgkvKioKCSAqIERpc3BhdGNoIGFuIGVycm9yIHt7I2Nyb3NzTGluayAiRXZlbnQifX17ey9jcm9zc0xpbmt9fS4gUGxlYXNlIHNlZSB0aGUge3sjY3Jvc3NMaW5rICJBYnN0cmFjdExvYWRlci9lcnJvcjpldmVudCJ9fXt7L2Nyb3NzTGlua319CgkgKiBldmVudCBmb3IgZGV0YWlscyBvbiB0aGUgZXZlbnQgcGF5bG9hZC4KCSAqIEBtZXRob2QgX3NlbmRFcnJvcgoJICogQHBhcmFtIHtFcnJvckV2ZW50fSBldmVudCBUaGUgZXZlbnQgb2JqZWN0IGNvbnRhaW5pbmcgc3BlY2lmaWMgZXJyb3IgcHJvcGVydGllcy4KCSAqIEBwcm90ZWN0ZWQKCSAqLwoJcC5fc2VuZEVycm9yID0gZnVuY3Rpb24gKGV2ZW50KSB7CgkJaWYgKHRoaXMuX2lzQ2FuY2VsZWQoKSB8fCAhdGhpcy5oYXNFdmVudExpc3RlbmVyKCJlcnJvciIpKSB7IHJldHVybjsgfQoJCWlmIChldmVudCA9PSBudWxsKSB7CgkJCWV2ZW50ID0gbmV3IGNyZWF0ZWpzLkVycm9yRXZlbnQoIlBSRUxPQURfRVJST1JfRU1QVFkiKTsgLy8gVE9ETzogUG9wdWxhdGUgZXJyb3IKCQl9CgkJdGhpcy5kaXNwYXRjaEV2ZW50KGV2ZW50KTsKCX07CgoJLyoqCgkgKiBEZXRlcm1pbmUgaWYgdGhlIGxvYWQgaGFzIGJlZW4gY2FuY2VsZWQuIFRoaXMgaXMgaW1wb3J0YW50IHRvIGVuc3VyZSB0aGF0IG1ldGhvZCBjYWxscyBvciBhc3luY2hyb25vdXMgZXZlbnRzCgkgKiBkbyBub3QgY2F1c2UgaXNzdWVzIGFmdGVyIHRoZSBxdWV1ZSBoYXMgYmVlbiBjbGVhbmVkIHVwLgoJICogQG1ldGhvZCBfaXNDYW5jZWxlZAoJICogQHJldHVybiB7Qm9vbGVhbn0gSWYgdGhlIGxvYWRlciBoYXMgYmVlbiBjYW5jZWxlZC4KCSAqIEBwcm90ZWN0ZWQKCSAqLwoJcC5faXNDYW5jZWxlZCA9IGZ1bmN0aW9uICgpIHsKCQlpZiAod2luZG93LmNyZWF0ZWpzID09IG51bGwgfHwgdGhpcy5jYW5jZWxlZCkgewoJCQlyZXR1cm4gdHJ1ZTsKCQl9CgkJcmV0dXJuIGZhbHNlOwoJfTsKCgkvKioKCSAqIEEgY3VzdG9tIHJlc3VsdCBmb3JtYXR0ZXIgZnVuY3Rpb24sIHdoaWNoIGlzIGNhbGxlZCBqdXN0IGJlZm9yZSBhIHJlcXVlc3QgZGlzcGF0Y2hlcyBpdHMgY29tcGxldGUgZXZlbnQuIE1vc3QKCSAqIGxvYWRlciB0eXBlcyBhbHJlYWR5IGhhdmUgYW4gaW50ZXJuYWwgZm9ybWF0dGVyLCBidXQgdGhpcyBjYW4gYmUgdXNlci1vdmVycmlkZGVuIGZvciBjdXN0b20gZm9ybWF0dGluZy4gVGhlCgkgKiBmb3JtYXR0ZWQgcmVzdWx0IHdpbGwgYmUgYXZhaWxhYmxlIG9uIExvYWRlcnMgdXNpbmcge3sjY3Jvc3NMaW5rICJnZXRSZXN1bHQifX17ey9jcm9zc0xpbmt9fSwgYW5kIHBhc3NpbmcgYHRydWVgLgoJICogQHByb3BlcnR5IHJlc3VsdEZvcm1hdHRlcgoJICogQHR5cGUgRnVuY3Rpb24KCSAqIEByZXR1cm4ge09iamVjdH0gVGhlIGZvcm1hdHRlZCByZXN1bHQKCSAqIEBzaW5jZSAwLjYuMAoJICovCglwLnJlc3VsdEZvcm1hdHRlciA9IG51bGw7IC8vVE9ETzogQWRkIHN1cHBvcnQgZm9yIGFzeW5jIGZvcm1hdHRpbmcuCgoJLyoqCgkgKiBIYW5kbGUgZXZlbnRzIGZyb20gaW50ZXJuYWwgcmVxdWVzdHMuIEJ5IGRlZmF1bHQsIGxvYWRlcnMgd2lsbCBoYW5kbGUsIGFuZCByZWRpc3BhdGNoIHRoZSBuZWNlc3NhcnkgZXZlbnRzLCBidXQKCSAqIHRoaXMgbWV0aG9kIGNhbiBiZSBvdmVycmlkZGVuIGZvciBjdXN0b20gYmVoYXZpb3Vycy4KCSAqIEBtZXRob2QgaGFuZGxlRXZlbnQKCSAqIEBwYXJhbSB7RXZlbnR9IFRoZSBldmVudCB0aGF0IHRoZSBpbnRlcm5hbCByZXF1ZXN0IGRpc3BhdGNoZXMuCgkgKiBAcHJvdGVjdGVkCgkgKiBAc2luY2UgMC42LjAKCSAqLwoJcC5oYW5kbGVFdmVudCA9IGZ1bmN0aW9uIChldmVudCkgewoJCXN3aXRjaCAoZXZlbnQudHlwZSkgewoJCQljYXNlICJjb21wbGV0ZSI6CgkJCQl0aGlzLl9yYXdSZXN1bHQgPSBldmVudC50YXJnZXQuX3Jlc3BvbnNlOwoJCQkJdmFyIHJlc3VsdCA9IHRoaXMucmVzdWx0Rm9ybWF0dGVyICYmIHRoaXMucmVzdWx0Rm9ybWF0dGVyKHRoaXMpOwoJCQkJdmFyIF90aGlzID0gdGhpczsKCQkJCWlmIChyZXN1bHQgaW5zdGFuY2VvZiBGdW5jdGlvbikgewoJCQkJCXJlc3VsdChmdW5jdGlvbihyZXN1bHQpIHsKCQkJCQkJX3RoaXMuX3Jlc3VsdCA9IHJlc3VsdDsKCQkJCQkJX3RoaXMuX3NlbmRDb21wbGV0ZSgpOwoJCQkJCX0pOwoJCQkJfSBlbHNlIHsKCQkJCQl0aGlzLl9yZXN1bHQgPSAgcmVzdWx0IHx8IHRoaXMuX3Jhd1Jlc3VsdDsKCQkJCQl0aGlzLl9zZW5kQ29tcGxldGUoKTsKCQkJCX0KCQkJCWJyZWFrOwoJCQljYXNlICJwcm9ncmVzcyI6CgkJCQl0aGlzLl9zZW5kUHJvZ3Jlc3MoZXZlbnQpOwoJCQkJYnJlYWs7CgkJCWNhc2UgImVycm9yIjoKCQkJCXRoaXMuX3NlbmRFcnJvcihldmVudCk7CgkJCQlicmVhazsKCQkJY2FzZSAibG9hZHN0YXJ0IjoKCQkJCXRoaXMuX3NlbmRMb2FkU3RhcnQoKTsKCQkJCWJyZWFrOwoJCQljYXNlICJhYm9ydCI6CgkJCWNhc2UgInRpbWVvdXQiOgoJCQkJaWYgKCF0aGlzLl9pc0NhbmNlbGVkKCkpIHsKCQkJCQl0aGlzLmRpc3BhdGNoRXZlbnQoZXZlbnQudHlwZSk7CgkJCQl9CgkJCQlicmVhazsKCQl9Cgl9OwoKCS8qKgoJICogQG1ldGhvZCBidWlsZFBhdGgKCSAqIEBwcm90ZWN0ZWQKCSAqIEBkZXByZWNhdGVkIFVzZSB0aGUge3sjY3Jvc3NMaW5rICJSZXF1ZXN0VXRpbHMifX17ey9jcm9zc0xpbmt9fSBtZXRob2Qge3sjY3Jvc3NMaW5rICJSZXF1ZXN0VXRpbHMvYnVpbGRQYXRoIn19e3svY3Jvc3NMaW5rfX0KCSAqIGluc3RlYWQuCgkgKi8KCXAuYnVpbGRQYXRoID0gZnVuY3Rpb24gKHNyYywgZGF0YSkgewoJCXJldHVybiBjcmVhdGVqcy5SZXF1ZXN0VXRpbHMuYnVpbGRQYXRoKHNyYywgZGF0YSk7Cgl9OwoKCS8qKgoJICogQG1ldGhvZCB0b1N0cmluZwoJICogQHJldHVybiB7U3RyaW5nfSBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgaW5zdGFuY2UuCgkgKi8KCXAudG9TdHJpbmcgPSBmdW5jdGlvbiAoKSB7CgkJcmV0dXJuICJbUHJlbG9hZEpTIEFic3RyYWN0TG9hZGVyXSI7Cgl9OwoKCWNyZWF0ZWpzLkFic3RyYWN0TG9hZGVyID0gY3JlYXRlanMucHJvbW90ZShBYnN0cmFjdExvYWRlciwgIkV2ZW50RGlzcGF0Y2hlciIpOwoKfSgpKTsKCi8vIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi8vIEFic3RyYWN0TWVkaWFMb2FkZXIuanMKLy8jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCnRoaXMuY3JlYXRlanMgPSB0aGlzLmNyZWF0ZWpzIHx8IHt9OwoKKGZ1bmN0aW9uICgpIHsKCSJ1c2Ugc3RyaWN0IjsKCgkvLyBjb25zdHJ1Y3RvcgoJLyoqCgkgKiBUaGUgQWJzdHJhY3RNZWRpYUxvYWRlciBpcyBhIGJhc2UgY2xhc3MgdGhhdCBoYW5kbGVzIHNvbWUgb2YgdGhlIHNoYXJlZCBtZXRob2RzIGFuZCBwcm9wZXJ0aWVzIG9mIGxvYWRlcnMgdGhhdAoJICogaGFuZGxlIEhUTUwgbWVkaWEgZWxlbWVudHMsIHN1Y2ggYXMgVmlkZW8gYW5kIEF1ZGlvLgoJICogQGNsYXNzIEFic3RyYWN0TWVkaWFMb2FkZXIKCSAqIEBwYXJhbSB7TG9hZEl0ZW18T2JqZWN0fSBsb2FkSXRlbQoJICogQHBhcmFtIHtCb29sZWFufSBwcmVmZXJYSFIKCSAqIEBwYXJhbSB7U3RyaW5nfSB0eXBlIFRoZSB0eXBlIG9mIG1lZGlhIHRvIGxvYWQuIFVzdWFsbHkgInZpZGVvIiBvciAiYXVkaW8iLgoJICogQGNvbnN0cnVjdG9yCgkgKi8KCWZ1bmN0aW9uIEFic3RyYWN0TWVkaWFMb2FkZXIobG9hZEl0ZW0sIHByZWZlclhIUiwgdHlwZSkgewoJCXRoaXMuQWJzdHJhY3RMb2FkZXJfY29uc3RydWN0b3IobG9hZEl0ZW0sIHByZWZlclhIUiwgdHlwZSk7CgoJCS8vIHB1YmxpYyBwcm9wZXJ0aWVzCgkJdGhpcy5yZXN1bHRGb3JtYXR0ZXIgPSB0aGlzLl9mb3JtYXRSZXN1bHQ7CgoJCS8vIHByb3RlY3RlZCBwcm9wZXJ0aWVzCgkJdGhpcy5fdGFnU3JjQXR0cmlidXRlID0gInNyYyI7Cgl9OwoKCXZhciBwID0gY3JlYXRlanMuZXh0ZW5kKEFic3RyYWN0TWVkaWFMb2FkZXIsIGNyZWF0ZWpzLkFic3RyYWN0TG9hZGVyKTsKCgkvLyBzdGF0aWMgcHJvcGVydGllcwoJLy8gcHVibGljIG1ldGhvZHMKCXAubG9hZCA9IGZ1bmN0aW9uICgpIHsKCQkvLyBUYWdSZXF1ZXN0IHdpbGwgaGFuZGxlIG1vc3Qgb2YgdGhpcywgYnV0IFNvdW5kIC8gVmlkZW8gbmVlZCBhIGZldyBjdXN0b20gcHJvcGVydGllcywgc28ganVzdCBoYW5kbGUgdGhlbSBoZXJlLgoJCWlmICghdGhpcy5fdGFnKSB7CgkJCXRoaXMuX3RhZyA9IHRoaXMuX2NyZWF0ZVRhZyh0aGlzLl9pdGVtLnNyYyk7CgkJfQoKCQl0aGlzLl90YWcucHJlbG9hZCA9ICJhdXRvIjsKCQl0aGlzLl90YWcubG9hZCgpOwoKCQl0aGlzLkFic3RyYWN0TG9hZGVyX2xvYWQoKTsKCX07CgoJLy8gcHJvdGVjdGVkIG1ldGhvZHMKCS8qKgoJICogQ3JlYXRlcyBhIG5ldyB0YWcgZm9yIGxvYWRpbmcgaWYgaXQgZG9lc24ndCBleGlzdCB5ZXQuCgkgKiBAbWV0aG9kIF9jcmVhdGVUYWcKCSAqIEBwcml2YXRlCgkgKi8KCXAuX2NyZWF0ZVRhZyA9IGZ1bmN0aW9uICgpIHt9OwoKCglwLl9jcmVhdGVSZXF1ZXN0ID0gZnVuY3Rpb24oKSB7CgkJaWYgKCF0aGlzLl9wcmVmZXJYSFIpIHsKCQkJdGhpcy5fcmVxdWVzdCA9IG5ldyBjcmVhdGVqcy5NZWRpYVRhZ1JlcXVlc3QodGhpcy5faXRlbSwgdGhpcy5fdGFnIHx8IHRoaXMuX2NyZWF0ZVRhZygpLCB0aGlzLl90YWdTcmNBdHRyaWJ1dGUpOwoJCX0gZWxzZSB7CgkJCXRoaXMuX3JlcXVlc3QgPSBuZXcgY3JlYXRlanMuWEhSUmVxdWVzdCh0aGlzLl9pdGVtKTsKCQl9Cgl9OwoKCS8qKgoJICogVGhlIHJlc3VsdCBmb3JtYXR0ZXIgZm9yIG1lZGlhIGZpbGVzLgoJICogQG1ldGhvZCBfZm9ybWF0UmVzdWx0CgkgKiBAcGFyYW0ge0Fic3RyYWN0TG9hZGVyfSBsb2FkZXIKCSAqIEByZXR1cm5zIHtIVE1MVmlkZW9FbGVtZW50fEhUTUxBdWRpb0VsZW1lbnR9CgkgKiBAcHJpdmF0ZQoJICovCglwLl9mb3JtYXRSZXN1bHQgPSBmdW5jdGlvbiAobG9hZGVyKSB7CgkJdGhpcy5fdGFnLnJlbW92ZUV2ZW50TGlzdGVuZXIgJiYgdGhpcy5fdGFnLnJlbW92ZUV2ZW50TGlzdGVuZXIoImNhbnBsYXl0aHJvdWdoIiwgdGhpcy5fbG9hZGVkSGFuZGxlcik7CgkJdGhpcy5fdGFnLm9uc3RhbGxlZCA9IG51bGw7CgkJaWYgKHRoaXMuX3ByZWZlclhIUikgewoJCQlsb2FkZXIuZ2V0VGFnKCkuc3JjID0gbG9hZGVyLmdldFJlc3VsdCh0cnVlKTsKCQl9CgkJcmV0dXJuIGxvYWRlci5nZXRUYWcoKTsKCX07CgoJY3JlYXRlanMuQWJzdHJhY3RNZWRpYUxvYWRlciA9IGNyZWF0ZWpzLnByb21vdGUoQWJzdHJhY3RNZWRpYUxvYWRlciwgIkFic3RyYWN0TG9hZGVyIik7Cgp9KCkpOwoKLy8jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLy8gQWJzdHJhY3RSZXF1ZXN0LmpzCi8vIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgp0aGlzLmNyZWF0ZWpzID0gdGhpcy5jcmVhdGVqcyB8fCB7fTsKCihmdW5jdGlvbiAoKSB7CgkidXNlIHN0cmljdCI7CgoJLyoqCgkgKiBBIGJhc2UgY2xhc3MgZm9yIGFjdHVhbCBkYXRhIHJlcXVlc3RzLCBzdWNoIGFzIHt7I2Nyb3NzTGluayAiWEhSUmVxdWVzdCJ9fXt7L2Nyb3NzTGlua319LCB7eyNjcm9zc0xpbmsgIlRhZ1JlcXVlc3QifX17ey9jcm9zc0xpbmt9fSwKCSAqIGFuZCB7eyNjcm9zc0xpbmsgIk1lZGlhUmVxdWVzdCJ9fXt7L2Nyb3NzTGlua319LiBQcmVsb2FkSlMgbG9hZGVycyB3aWxsIHR5cGljYWxseSB1c2UgYSBkYXRhIGxvYWRlciB1bmRlciB0aGUKCSAqIGhvb2QgdG8gZ2V0IGRhdGEuCgkgKiBAY2xhc3MgQWJzdHJhY3RSZXF1ZXN0CgkgKiBAcGFyYW0ge0xvYWRJdGVtfSBpdGVtCgkgKiBAY29uc3RydWN0b3IKCSAqLwoJdmFyIEFic3RyYWN0UmVxdWVzdCA9IGZ1bmN0aW9uIChpdGVtKSB7CgkJdGhpcy5faXRlbSA9IGl0ZW07Cgl9OwoKCXZhciBwID0gY3JlYXRlanMuZXh0ZW5kKEFic3RyYWN0UmVxdWVzdCwgY3JlYXRlanMuRXZlbnREaXNwYXRjaGVyKTsKCgkvLyBwdWJsaWMgbWV0aG9kcwoJLyoqCgkgKiBCZWdpbiBhIGxvYWQuCgkgKiBAbWV0aG9kIGxvYWQKCSAqLwoJcC5sb2FkID0gIGZ1bmN0aW9uKCkge307CgoJLyoqCgkgKiBDbGVhbiB1cCBhIHJlcXVlc3QuCgkgKiBAbWV0aG9kIGRlc3Ryb3kKCSAqLwoJcC5kZXN0cm95ID0gZnVuY3Rpb24oKSB7fTsKCgkvKioKCSAqIENhbmNlbCBhbiBpbi1wcm9ncmVzcyByZXF1ZXN0LgoJICogQG1ldGhvZCBjYW5jZWwKCSAqLwoJcC5jYW5jZWwgPSBmdW5jdGlvbigpIHt9OwoKCWNyZWF0ZWpzLkFic3RyYWN0UmVxdWVzdCA9IGNyZWF0ZWpzLnByb21vdGUoQWJzdHJhY3RSZXF1ZXN0LCAiRXZlbnREaXNwYXRjaGVyIik7Cgp9KCkpOwoKLy8jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLy8gVGFnUmVxdWVzdC5qcwovLyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKdGhpcy5jcmVhdGVqcyA9IHRoaXMuY3JlYXRlanMgfHwge307CgooZnVuY3Rpb24gKCkgewoJInVzZSBzdHJpY3QiOwoKCS8vIGNvbnN0cnVjdG9yCgkvKioKCSAqIEFuIHt7I2Nyb3NzTGluayAiQWJzdHJhY3RSZXF1ZXN0In19e3svY3Jvc3NMaW5rfX0gdGhhdCBsb2FkcyBIVE1MIHRhZ3MsIHN1Y2ggYXMgaW1hZ2VzIGFuZCBzY3JpcHRzLgoJICogQGNsYXNzIFRhZ1JlcXVlc3QKCSAqIEBwYXJhbSB7TG9hZEl0ZW19IGxvYWRJdGVtCgkgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSB0YWcKCSAqIEBwYXJhbSB7U3RyaW5nfSBzcmNBdHRyaWJ1dGUgVGhlIHRhZyBhdHRyaWJ1dGUgdGhhdCBzcGVjaWZpZXMgdGhlIHNvdXJjZSwgc3VjaCBhcyAic3JjIiwgImhyZWYiLCBldGMuCgkgKi8KCWZ1bmN0aW9uIFRhZ1JlcXVlc3QobG9hZEl0ZW0sIHRhZywgc3JjQXR0cmlidXRlKSB7CgkJdGhpcy5BYnN0cmFjdFJlcXVlc3RfY29uc3RydWN0b3IobG9hZEl0ZW0pOwoKCQkvLyBwcm90ZWN0ZWQgcHJvcGVydGllcwoJCS8qKgoJCSAqIFRoZSBIVE1MIHRhZyBpbnN0YW5jZSB0aGF0IGlzIHVzZWQgdG8gbG9hZC4KCQkgKiBAcHJvcGVydHkgX3RhZwoJCSAqIEB0eXBlIHtIVE1MRWxlbWVudH0KCQkgKiBAcHJvdGVjdGVkCgkJICovCgkJdGhpcy5fdGFnID0gdGFnOwoKCQkvKioKCQkgKiBUaGUgdGFnIGF0dHJpYnV0ZSB0aGF0IHNwZWNpZmllcyB0aGUgc291cmNlLCBzdWNoIGFzICJzcmMiLCAiaHJlZiIsIGV0Yy4KCQkgKiBAcHJvcGVydHkgX3RhZ1NyY0F0dHJpYnV0ZQoJCSAqIEB0eXBlIHtTdHJpbmd9CgkJICogQHByb3RlY3RlZAoJCSAqLwoJCXRoaXMuX3RhZ1NyY0F0dHJpYnV0ZSA9IHNyY0F0dHJpYnV0ZTsKCgkJLyoqCgkJICogQSBtZXRob2QgY2xvc3VyZSB1c2VkIGZvciBoYW5kbGluZyB0aGUgdGFnIGxvYWQgZXZlbnQuCgkJICogQHByb3BlcnR5IF9sb2FkZWRIYW5kbGVyCgkJICogQHR5cGUge0Z1bmN0aW9ufQoJCSAqIEBwcml2YXRlCgkJICovCgkJdGhpcy5fbG9hZGVkSGFuZGxlciA9IGNyZWF0ZWpzLnByb3h5KHRoaXMuX2hhbmRsZVRhZ0NvbXBsZXRlLCB0aGlzKTsKCgkJLyoqCgkJICogRGV0ZXJtaW5lcyBpZiB0aGUgZWxlbWVudCB3YXMgYWRkZWQgdG8gdGhlIERPTSBhdXRvbWF0aWNhbGx5IGJ5IFByZWxvYWRKUywgc28gaXQgY2FuIGJlIGNsZWFuZWQgdXAgYWZ0ZXIuCgkJICogQHByb3BlcnR5IF9hZGRlZFRvRE9NCgkJICogQHR5cGUge0Jvb2xlYW59CgkJICogQHByaXZhdGUKCQkgKi8KCQl0aGlzLl9hZGRlZFRvRE9NID0gZmFsc2U7CgoJCS8qKgoJCSAqIERldGVybWluZXMgd2hhdCB0aGUgdGFncyBpbml0aWFsIHN0eWxlLnZpc2liaWxpdHkgd2FzLCBzbyB3ZSBjYW4gc2V0IGl0IGNvcnJlY3RseSBhZnRlciBhIGxvYWQuCgkJICoKCQkgKiBAdHlwZSB7bnVsbH0KCQkgKiBAcHJpdmF0ZQoJCSAqLwoJCXRoaXMuX3N0YXJ0VGFnVmlzaWJpbGl0eSA9IG51bGw7Cgl9OwoKCXZhciBwID0gY3JlYXRlanMuZXh0ZW5kKFRhZ1JlcXVlc3QsIGNyZWF0ZWpzLkFic3RyYWN0UmVxdWVzdCk7CgoJLy8gcHVibGljIG1ldGhvZHMKCXAubG9hZCA9IGZ1bmN0aW9uICgpIHsKCQlpZiAodGhpcy5fdGFnLnBhcmVudE5vZGUgPT0gbnVsbCkgewoJCQl3aW5kb3cuZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0aGlzLl90YWcpOwoJCQl0aGlzLl9hZGRlZFRvRE9NID0gdHJ1ZTsKCQl9CgoJCXRoaXMuX3RhZy5vbmxvYWQgPSBjcmVhdGVqcy5wcm94eSh0aGlzLl9oYW5kbGVUYWdDb21wbGV0ZSwgdGhpcyk7CgkJdGhpcy5fdGFnLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGNyZWF0ZWpzLnByb3h5KHRoaXMuX2hhbmRsZVJlYWR5U3RhdGVDaGFuZ2UsIHRoaXMpOwoKCQl2YXIgZXZ0ID0gbmV3IGNyZWF0ZWpzLkV2ZW50KCJpbml0aWFsaXplIik7CgkJZXZ0LmxvYWRlciA9IHRoaXMuX3RhZzsKCgkJdGhpcy5kaXNwYXRjaEV2ZW50KGV2dCk7CgoJCXRoaXMuX2hpZGVUYWcoKTsKCgkJdGhpcy5fdGFnW3RoaXMuX3RhZ1NyY0F0dHJpYnV0ZV0gPSB0aGlzLl9pdGVtLnNyYzsKCX07CgoJcC5kZXN0cm95ID0gZnVuY3Rpb24oKSB7CgkJdGhpcy5fY2xlYW4oKTsKCQl0aGlzLl90YWcgPSBudWxsOwoKCQl0aGlzLkFic3RyYWN0UmVxdWVzdF9kZXN0cm95KCk7Cgl9OwoKCS8vIHByaXZhdGUgbWV0aG9kcwoJLyoqCgkgKiBIYW5kbGUgdGhlIHJlYWR5U3RhdGVDaGFuZ2UgZXZlbnQgZnJvbSBhIHRhZy4gV2UgbmVlZCB0aGlzIGluIHBsYWNlIG9mIHRoZSBgb25sb2FkYCBjYWxsYmFjayAobWFpbmx5IFNDUklQVAoJICogYW5kIExJTksgdGFncyksIGJ1dCBvdGhlciBjYXNlcyBtYXkgZXhpc3QuCgkgKiBAbWV0aG9kIF9oYW5kbGVSZWFkeVN0YXRlQ2hhbmdlCgkgKiBAcHJpdmF0ZQoJICovCglwLl9oYW5kbGVSZWFkeVN0YXRlQ2hhbmdlID0gZnVuY3Rpb24gKCkgewoJCWNsZWFyVGltZW91dCh0aGlzLl9sb2FkVGltZW91dCk7CgkJLy8gVGhpcyBpcyBzdHJpY3RseSBmb3IgdGFncyBpbiBicm93c2VycyB0aGF0IGRvIG5vdCBzdXBwb3J0IG9ubG9hZC4KCQl2YXIgdGFnID0gdGhpcy5fdGFnOwoKCQkvLyBDb21wbGV0ZSBpcyBmb3Igb2xkIElFIHN1cHBvcnQuCgkJaWYgKHRhZy5yZWFkeVN0YXRlID09ICJsb2FkZWQiIHx8IHRhZy5yZWFkeVN0YXRlID09ICJjb21wbGV0ZSIpIHsKCQkJdGhpcy5faGFuZGxlVGFnQ29tcGxldGUoKTsKCQl9Cgl9OwoKCS8qKgoJICogSGFuZGxlIHRoZSB0YWcncyBvbmxvYWQgY2FsbGJhY2suCgkgKiBAbWV0aG9kIF9oYW5kbGVUYWdDb21wbGV0ZQoJICogQHByaXZhdGUKCSAqLwoJcC5faGFuZGxlVGFnQ29tcGxldGUgPSBmdW5jdGlvbiAoKSB7CgkJdGhpcy5fcmF3UmVzdWx0ID0gdGhpcy5fdGFnOwoJCXRoaXMuX3Jlc3VsdCA9IHRoaXMucmVzdWx0Rm9ybWF0dGVyICYmIHRoaXMucmVzdWx0Rm9ybWF0dGVyKHRoaXMpIHx8IHRoaXMuX3Jhd1Jlc3VsdDsKCgkJdGhpcy5fY2xlYW4oKTsKCQl0aGlzLl9zaG93VGFnKCk7CgoJCXRoaXMuZGlzcGF0Y2hFdmVudCgiY29tcGxldGUiKTsKCX07CgoJLyoqCgkgKiBSZW1vdmUgZXZlbnQgbGlzdGVuZXJzLCBidXQgZG9uJ3QgZGVzdHJveSB0aGUgcmVxdWVzdCBvYmplY3QKCSAqIEBtZXRob2QgX2NsZWFuCgkgKiBAcHJpdmF0ZQoJICovCglwLl9jbGVhbiA9IGZ1bmN0aW9uKCkgewoJCXRoaXMuX3RhZy5vbmxvYWQgPSBudWxsOwoJCXRoaXMuX3RhZy5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBudWxsOwoJCWlmICh0aGlzLl9hZGRlZFRvRE9NICYmIHRoaXMuX3RhZy5wYXJlbnROb2RlICE9IG51bGwpIHsKCQkJdGhpcy5fdGFnLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5fdGFnKTsKCQl9Cgl9OwoKCXAuX2hpZGVUYWcgPSBmdW5jdGlvbigpIHsKCQl0aGlzLl9zdGFydFRhZ1Zpc2liaWxpdHkgPSB0aGlzLl90YWcuc3R5bGUudmlzaWJpbGl0eTsKCQl0aGlzLl90YWcuc3R5bGUudmlzaWJpbGl0eSA9ICJoaWRkZW4iOwoJfTsKCglwLl9zaG93VGFnID0gZnVuY3Rpb24oKSB7CgkJdGhpcy5fdGFnLnN0eWxlLnZpc2liaWxpdHkgPSB0aGlzLl9zdGFydFRhZ1Zpc2liaWxpdHk7Cgl9OwoKCS8qKgoJICogSGFuZGxlIGEgc3RhbGxlZCBhdWRpbyBldmVudC4gVGhlIG1haW4gcGxhY2UgdGhpcyBoYXBwZW5zIGlzIHdpdGggSFRNTEF1ZGlvIGluIENocm9tZSB3aGVuIHBsYXlpbmcgYmFjayBhdWRpbwoJICogdGhhdCBpcyBhbHJlYWR5IGluIGEgbG9hZCwgYnV0IG5vdCBjb21wbGV0ZS4KCSAqIEBtZXRob2QgX2hhbmRsZVN0YWxsZWQKCSAqIEBwcml2YXRlCgkgKi8KCXAuX2hhbmRsZVN0YWxsZWQgPSBmdW5jdGlvbiAoKSB7CgkJLy9JZ25vcmUsIGxldCB0aGUgdGltZW91dCB0YWtlIGNhcmUgb2YgaXQuIFNvbWV0aW1lcyBpdHMgbm90IHJlYWxseSBzdG9wcGVkLgoJfTsKCgljcmVhdGVqcy5UYWdSZXF1ZXN0ID0gY3JlYXRlanMucHJvbW90ZShUYWdSZXF1ZXN0LCAiQWJzdHJhY3RSZXF1ZXN0Iik7Cgp9KCkpOwoKLy8jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLy8gTWVkaWFUYWdSZXF1ZXN0LmpzCi8vIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgp0aGlzLmNyZWF0ZWpzID0gdGhpcy5jcmVhdGVqcyB8fCB7fTsKCihmdW5jdGlvbiAoKSB7CgkidXNlIHN0cmljdCI7CgoJLy8gY29uc3RydWN0b3IKCS8qKgoJICogQW4ge3sjY3Jvc3NMaW5rICJUYWdSZXF1ZXN0In19e3svY3Jvc3NMaW5rfX0gdGhhdCBsb2FkcyBIVE1MIHRhZ3MgZm9yIHZpZGVvIGFuZCBhdWRpby4KCSAqIEBjbGFzcyBNZWRpYVRhZ1JlcXVlc3QKCSAqIEBwYXJhbSB7TG9hZEl0ZW19IGxvYWRJdGVtCgkgKiBAcGFyYW0ge0hUTUxBdWRpb0VsZW1lbnR8SFRNTFZpZGVvRWxlbWVudH0gdGFnCgkgKiBAcGFyYW0ge1N0cmluZ30gc3JjQXR0cmlidXRlIFRoZSB0YWcgYXR0cmlidXRlIHRoYXQgc3BlY2lmaWVzIHRoZSBzb3VyY2UsIHN1Y2ggYXMgInNyYyIsICJocmVmIiwgZXRjLgoJICogQGNvbnN0cnVjdG9yCgkgKi8KCWZ1bmN0aW9uIE1lZGlhVGFnUmVxdWVzdChsb2FkSXRlbSwgdGFnLCBzcmNBdHRyaWJ1dGUpIHsKCQl0aGlzLkFic3RyYWN0UmVxdWVzdF9jb25zdHJ1Y3Rvcihsb2FkSXRlbSk7CgoJCS8vIHByb3RlY3RlZCBwcm9wZXJ0aWVzCgkJdGhpcy5fdGFnID0gdGFnOwoJCXRoaXMuX3RhZ1NyY0F0dHJpYnV0ZSA9IHNyY0F0dHJpYnV0ZTsKCQl0aGlzLl9sb2FkZWRIYW5kbGVyID0gY3JlYXRlanMucHJveHkodGhpcy5faGFuZGxlVGFnQ29tcGxldGUsIHRoaXMpOwoJfTsKCgl2YXIgcCA9IGNyZWF0ZWpzLmV4dGVuZChNZWRpYVRhZ1JlcXVlc3QsIGNyZWF0ZWpzLlRhZ1JlcXVlc3QpOwoJdmFyIHMgPSBNZWRpYVRhZ1JlcXVlc3Q7CgoJLy8gcHVibGljIG1ldGhvZHMKCXAubG9hZCA9IGZ1bmN0aW9uICgpIHsKCQl0aGlzLl90YWcub25zdGFsbGVkID0gY3JlYXRlanMucHJveHkodGhpcy5faGFuZGxlU3RhbGxlZCwgdGhpcyk7CgkJdGhpcy5fdGFnLm9ucHJvZ3Jlc3MgPSBjcmVhdGVqcy5wcm94eSh0aGlzLl9oYW5kbGVQcm9ncmVzcywgdGhpcyk7CgoJCS8vIFRoaXMgd2lsbCB0ZWxsIHVzIHdoZW4gYXVkaW8gaXMgYnVmZmVyZWQgZW5vdWdoIHRvIHBsYXkgdGhyb3VnaCwgYnV0IG5vdCB3aGVuIGl0cyBsb2FkZWQuCgkJLy8gVGhlIHRhZyBkb2Vzbid0IGtlZXAgbG9hZGluZyBpbiBDaHJvbWUgb25jZSBlbm91Z2ggaGFzIGJ1ZmZlcmVkLCBhbmQgd2UgaGF2ZSBkZWNpZGVkIHRoYXQgYmVoYXZpb3VyIGlzIHN1ZmZpY2llbnQuCgkJdGhpcy5fdGFnLmFkZEV2ZW50TGlzdGVuZXIgJiYgdGhpcy5fdGFnLmFkZEV2ZW50TGlzdGVuZXIoImNhbnBsYXl0aHJvdWdoIiwgdGhpcy5fbG9hZGVkSGFuZGxlciwgZmFsc2UpOyAvLyBjYW5wbGF5dGhyb3VnaCBjYWxsYmFjayBkb2Vzbid0IHdvcmsgaW4gQ2hyb21lLCBzbyB3ZSB1c2UgYW4gZXZlbnQuCgoJCXRoaXMuVGFnUmVxdWVzdF9sb2FkKCk7Cgl9OwoKCS8vIHByaXZhdGUgbWV0aG9kcwoJcC5faGFuZGxlUmVhZHlTdGF0ZUNoYW5nZSA9IGZ1bmN0aW9uICgpIHsKCQljbGVhclRpbWVvdXQodGhpcy5fbG9hZFRpbWVvdXQpOwoJCS8vIFRoaXMgaXMgc3RyaWN0bHkgZm9yIHRhZ3MgaW4gYnJvd3NlcnMgdGhhdCBkbyBub3Qgc3VwcG9ydCBvbmxvYWQuCgkJdmFyIHRhZyA9IHRoaXMuX3RhZzsKCgkJLy8gQ29tcGxldGUgaXMgZm9yIG9sZCBJRSBzdXBwb3J0LgoJCWlmICh0YWcucmVhZHlTdGF0ZSA9PSAibG9hZGVkIiB8fCB0YWcucmVhZHlTdGF0ZSA9PSAiY29tcGxldGUiKSB7CgkJCXRoaXMuX2hhbmRsZVRhZ0NvbXBsZXRlKCk7CgkJfQoJfTsKCglwLl9oYW5kbGVTdGFsbGVkID0gZnVuY3Rpb24gKCkgewoJCS8vSWdub3JlLCBsZXQgdGhlIHRpbWVvdXQgdGFrZSBjYXJlIG9mIGl0LiBTb21ldGltZXMgaXRzIG5vdCByZWFsbHkgc3RvcHBlZC4KCX07CgoJLyoqCgkgKiBBbiBYSFIgcmVxdWVzdCBoYXMgcmVwb3J0ZWQgcHJvZ3Jlc3MuCgkgKiBAbWV0aG9kIF9oYW5kbGVQcm9ncmVzcwoJICogQHBhcmFtIHtPYmplY3R9IGV2ZW50IFRoZSBYSFIgcHJvZ3Jlc3MgZXZlbnQuCgkgKiBAcHJpdmF0ZQoJICovCglwLl9oYW5kbGVQcm9ncmVzcyA9IGZ1bmN0aW9uIChldmVudCkgewoJCWlmICghZXZlbnQgfHwgZXZlbnQubG9hZGVkID4gMCAmJiBldmVudC50b3RhbCA9PSAwKSB7CgkJCXJldHVybjsgLy8gU29tZXRpbWVzIHdlIGdldCBubyAidG90YWwiLCBzbyBqdXN0IGlnbm9yZSB0aGUgcHJvZ3Jlc3MgZXZlbnQuCgkJfQoKCQl2YXIgbmV3RXZlbnQgPSBuZXcgY3JlYXRlanMuUHJvZ3Jlc3NFdmVudChldmVudC5sb2FkZWQsIGV2ZW50LnRvdGFsKTsKCQl0aGlzLmRpc3BhdGNoRXZlbnQobmV3RXZlbnQpOwoJfTsKCgkvLyBwcm90ZWN0ZWQgbWV0aG9kcwoJcC5fY2xlYW4gPSBmdW5jdGlvbiAoKSB7CgkJdGhpcy5fdGFnLnJlbW92ZUV2ZW50TGlzdGVuZXIgJiYgdGhpcy5fdGFnLnJlbW92ZUV2ZW50TGlzdGVuZXIoImNhbnBsYXl0aHJvdWdoIiwgdGhpcy5fbG9hZGVkSGFuZGxlcik7CgkJdGhpcy5fdGFnLm9uc3RhbGxlZCA9IG51bGw7CgkJdGhpcy5fdGFnLm9ucHJvZ3Jlc3MgPSBudWxsOwoKCQl0aGlzLlRhZ1JlcXVlc3RfX2NsZWFuKCk7Cgl9OwoKCWNyZWF0ZWpzLk1lZGlhVGFnUmVxdWVzdCA9IGNyZWF0ZWpzLnByb21vdGUoTWVkaWFUYWdSZXF1ZXN0LCAiVGFnUmVxdWVzdCIpOwoKfSgpKTsKCi8vIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi8vIFhIUlJlcXVlc3QuanMKLy8jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCnRoaXMuY3JlYXRlanMgPSB0aGlzLmNyZWF0ZWpzIHx8IHt9OwoKKGZ1bmN0aW9uICgpIHsKCSJ1c2Ugc3RyaWN0IjsKCi8vIGNvbnN0cnVjdG9yCgkvKioKCSAqIEEgcHJlbG9hZGVyIHRoYXQgbG9hZHMgaXRlbXMgdXNpbmcgWEhSIHJlcXVlc3RzLCB1c3VhbGx5IFhNTEh0dHBSZXF1ZXN0LiBIb3dldmVyIFhEb21haW5SZXF1ZXN0cyB3aWxsIGJlIHVzZWQKCSAqIGZvciBjcm9zcy1kb21haW4gcmVxdWVzdHMgaWYgcG9zc2libGUsIGFuZCBvbGRlciB2ZXJzaW9ucyBvZiBJRSBmYWxsIGJhY2sgb24gdG8gQWN0aXZlWCBvYmplY3RzIHdoZW4gbmVjZXNzYXJ5LgoJICogWEhSIHJlcXVlc3RzIGxvYWQgdGhlIGNvbnRlbnQgYXMgdGV4dCBvciBiaW5hcnkgZGF0YSwgcHJvdmlkZSBwcm9ncmVzcyBhbmQgY29uc2lzdGVudCBjb21wbGV0aW9uIGV2ZW50cywgYW5kCgkgKiBjYW4gYmUgY2FuY2VsZWQgZHVyaW5nIGxvYWQuIE5vdGUgdGhhdCBYSFIgaXMgbm90IHN1cHBvcnRlZCBpbiBJRSA2IG9yIGVhcmxpZXIsIGFuZCBpcyBub3QgcmVjb21tZW5kZWQgZm9yCgkgKiBjcm9zcy1kb21haW4gbG9hZGluZy4KCSAqIEBjbGFzcyBYSFJSZXF1ZXN0CgkgKiBAY29uc3RydWN0b3IKCSAqIEBwYXJhbSB7T2JqZWN0fSBpdGVtIFRoZSBvYmplY3QgdGhhdCBkZWZpbmVzIHRoZSBmaWxlIHRvIGxvYWQuIFBsZWFzZSBzZWUgdGhlIHt7I2Nyb3NzTGluayAiTG9hZFF1ZXVlL2xvYWRGaWxlIn19e3svY3Jvc3NMaW5rfX0KCSAqIGZvciBhbiBvdmVydmlldyBvZiBzdXBwb3J0ZWQgZmlsZSBwcm9wZXJ0aWVzLgoJICogQGV4dGVuZHMgQWJzdHJhY3RMb2FkZXIKCSAqLwoJZnVuY3Rpb24gWEhSUmVxdWVzdChpdGVtKSB7CgkJdGhpcy5BYnN0cmFjdFJlcXVlc3RfY29uc3RydWN0b3IoaXRlbSk7CgoJCS8vIHByb3RlY3RlZCBwcm9wZXJ0aWVzCgkJLyoqCgkJICogQSByZWZlcmVuY2UgdG8gdGhlIFhIUiByZXF1ZXN0IHVzZWQgdG8gbG9hZCB0aGUgY29udGVudC4KCQkgKiBAcHJvcGVydHkgX3JlcXVlc3QKCQkgKiBAdHlwZSB7WE1MSHR0cFJlcXVlc3QgfCBYRG9tYWluUmVxdWVzdCB8IEFjdGl2ZVguWE1MSFRUUH0KCQkgKiBAcHJpdmF0ZQoJCSAqLwoJCXRoaXMuX3JlcXVlc3QgPSBudWxsOwoKCQkvKioKCQkgKiBBIG1hbnVhbCBsb2FkIHRpbWVvdXQgdGhhdCBpcyB1c2VkIGZvciBicm93c2VycyB0aGF0IGRvIG5vdCBzdXBwb3J0IHRoZSBvblRpbWVvdXQgZXZlbnQgb24gWEhSIChYSFIgbGV2ZWwgMSwKCQkgKiB0eXBpY2FsbHkgSUU5KS4KCQkgKiBAcHJvcGVydHkgX2xvYWRUaW1lb3V0CgkJICogQHR5cGUge051bWJlcn0KCQkgKiBAcHJpdmF0ZQoJCSAqLwoJCXRoaXMuX2xvYWRUaW1lb3V0ID0gbnVsbDsKCgkJLyoqCgkJICogVGhlIGJyb3dzZXIncyBYSFIgKFhNTEhUVFBSZXF1ZXN0KSB2ZXJzaW9uLiBTdXBwb3J0ZWQgdmVyc2lvbnMgYXJlIDEgYW5kIDIuIFRoZXJlIGlzIG5vIG9mZmljaWFsIHdheSB0byBkZXRlY3QKCQkgKiB0aGUgdmVyc2lvbiwgc28gd2UgdXNlIGNhcGFiaWxpdGllcyB0byBtYWtlIGEgYmVzdCBndWVzcy4KCQkgKiBAcHJvcGVydHkgX3hockxldmVsCgkJICogQHR5cGUge051bWJlcn0KCQkgKiBAZGVmYXVsdCAxCgkJICogQHByaXZhdGUKCQkgKi8KCQl0aGlzLl94aHJMZXZlbCA9IDE7CgoJCS8qKgoJCSAqIFRoZSByZXNwb25zZSBvZiBhIGxvYWRlZCBmaWxlLiBUaGlzIGlzIHNldCBiZWNhdXNlIGl0IGlzIGV4cGVuc2l2ZSB0byBsb29rIHVwIGNvbnN0YW50bHkuIFRoaXMgcHJvcGVydHkgd2lsbCBiZQoJCSAqIG51bGwgdW50aWwgdGhlIGZpbGUgaXMgbG9hZGVkLgoJCSAqIEBwcm9wZXJ0eSBfcmVzcG9uc2UKCQkgKiBAdHlwZSB7bWl4ZWR9CgkJICogQHByaXZhdGUKCQkgKi8KCQl0aGlzLl9yZXNwb25zZSA9IG51bGw7CgoJCS8qKgoJCSAqIFRoZSByZXNwb25zZSBvZiB0aGUgbG9hZGVkIGZpbGUgYmVmb3JlIGl0IGlzIG1vZGlmaWVkLiBJbiBtb3N0IGNhc2VzLCBjb250ZW50IGlzIGNvbnZlcnRlZCBmcm9tIHJhdyB0ZXh0IHRvCgkJICogYW4gSFRNTCB0YWcgb3IgYSBmb3JtYXR0ZWQgb2JqZWN0IHdoaWNoIGlzIHNldCB0byB0aGUgPGNvZGU+cmVzdWx0PC9jb2RlPiBwcm9wZXJ0eSwgYnV0IHRoZSBkZXZlbG9wZXIgbWF5IHN0aWxsCgkJICogd2FudCB0byBhY2Nlc3MgdGhlIHJhdyBjb250ZW50IGFzIGl0IHdhcyBsb2FkZWQuCgkJICogQHByb3BlcnR5IF9yYXdSZXNwb25zZQoJCSAqIEB0eXBlIHtTdHJpbmd8T2JqZWN0fQoJCSAqIEBwcml2YXRlCgkJICovCgkJdGhpcy5fcmF3UmVzcG9uc2UgPSBudWxsOwoKCQl0aGlzLl9jYW5jZWxlZCA9IGZhbHNlOwoKCQkvLyBTZXR1cCBvdXIgZXZlbnQgaGFuZGxlcnMgbm93LgoJCXRoaXMuX2hhbmRsZUxvYWRTdGFydFByb3h5ID0gY3JlYXRlanMucHJveHkodGhpcy5faGFuZGxlTG9hZFN0YXJ0LCB0aGlzKTsKCQl0aGlzLl9oYW5kbGVQcm9ncmVzc1Byb3h5ID0gY3JlYXRlanMucHJveHkodGhpcy5faGFuZGxlUHJvZ3Jlc3MsIHRoaXMpOwoJCXRoaXMuX2hhbmRsZUFib3J0UHJveHkgPSBjcmVhdGVqcy5wcm94eSh0aGlzLl9oYW5kbGVBYm9ydCwgdGhpcyk7CgkJdGhpcy5faGFuZGxlRXJyb3JQcm94eSA9IGNyZWF0ZWpzLnByb3h5KHRoaXMuX2hhbmRsZUVycm9yLCB0aGlzKTsKCQl0aGlzLl9oYW5kbGVUaW1lb3V0UHJveHkgPSBjcmVhdGVqcy5wcm94eSh0aGlzLl9oYW5kbGVUaW1lb3V0LCB0aGlzKTsKCQl0aGlzLl9oYW5kbGVMb2FkUHJveHkgPSBjcmVhdGVqcy5wcm94eSh0aGlzLl9oYW5kbGVMb2FkLCB0aGlzKTsKCQl0aGlzLl9oYW5kbGVSZWFkeVN0YXRlQ2hhbmdlUHJveHkgPSBjcmVhdGVqcy5wcm94eSh0aGlzLl9oYW5kbGVSZWFkeVN0YXRlQ2hhbmdlLCB0aGlzKTsKCgkJaWYgKCF0aGlzLl9jcmVhdGVYSFIoaXRlbSkpIHsKCQkJLy9UT0RPOiBUaHJvdyBlcnJvcj8KCQl9Cgl9OwoKCXZhciBwID0gY3JlYXRlanMuZXh0ZW5kKFhIUlJlcXVlc3QsIGNyZWF0ZWpzLkFic3RyYWN0UmVxdWVzdCk7CgovLyBzdGF0aWMgcHJvcGVydGllcwoJLyoqCgkgKiBBIGxpc3Qgb2YgWE1MSFRUUCBvYmplY3QgSURzIHRvIHRyeSB3aGVuIGJ1aWxkaW5nIGFuIEFjdGl2ZVggb2JqZWN0IGZvciBYSFIgcmVxdWVzdHMgaW4gZWFybGllciB2ZXJzaW9ucyBvZiBJRS4KCSAqIEBwcm9wZXJ0eSBBQ1RJVkVYX1ZFUlNJT05TCgkgKiBAdHlwZSB7QXJyYXl9CgkgKiBAc2luY2UgMC40LjIKCSAqIEBwcml2YXRlCgkgKi8KCVhIUlJlcXVlc3QuQUNUSVZFWF9WRVJTSU9OUyA9IFsKCQkiTXN4bWwyLlhNTEhUVFAuNi4wIiwKCQkiTXN4bWwyLlhNTEhUVFAuNS4wIiwKCQkiTXN4bWwyLlhNTEhUVFAuNC4wIiwKCQkiTVNYTUwyLlhNTEhUVFAuMy4wIiwKCQkiTVNYTUwyLlhNTEhUVFAiLAoJCSJNaWNyb3NvZnQuWE1MSFRUUCIKCV07CgovLyBQdWJsaWMgbWV0aG9kcwoJLyoqCgkgKiBMb29rIHVwIHRoZSBsb2FkZWQgcmVzdWx0LgoJICogQG1ldGhvZCBnZXRSZXN1bHQKCSAqIEBwYXJhbSB7Qm9vbGVhbn0gW3Jhdz1mYWxzZV0gUmV0dXJuIGEgcmF3IHJlc3VsdCBpbnN0ZWFkIG9mIGEgZm9ybWF0dGVkIHJlc3VsdC4gVGhpcyBhcHBsaWVzIHRvIGNvbnRlbnQKCSAqIGxvYWRlZCB2aWEgWEhSIHN1Y2ggYXMgc2NyaXB0cywgWE1MLCBDU1MsIGFuZCBJbWFnZXMuIElmIHRoZXJlIGlzIG5vIHJhdyByZXN1bHQsIHRoZSBmb3JtYXR0ZWQgcmVzdWx0IHdpbGwgYmUKCSAqIHJldHVybmVkIGluc3RlYWQuCgkgKiBAcmV0dXJuIHtPYmplY3R9IEEgcmVzdWx0IG9iamVjdCBjb250YWluaW5nIHRoZSBjb250ZW50IHRoYXQgd2FzIGxvYWRlZCwgc3VjaCBhczoKCSAqIDx1bD4KCSAqICAgICAgPGxpPkFuIGltYWdlIHRhZyAoJmx0O2ltYWdlIC8mZ3Q7KSBmb3IgaW1hZ2VzPC9saT4KCSAqICAgICAgPGxpPkEgc2NyaXB0IHRhZyBmb3IgSmF2YVNjcmlwdCAoJmx0O3NjcmlwdCAvJmd0OykuIE5vdGUgdGhhdCBzY3JpcHRzIGxvYWRlZCB3aXRoIHRhZ3MgbWF5IGJlIGFkZGVkIHRvIHRoZQoJICogICAgICBIVE1MIGhlYWQuPC9saT4KCSAqICAgICAgPGxpPkEgc3R5bGUgdGFnIGZvciBDU1MgKCZsdDtzdHlsZSAvJmd0Oyk8L2xpPgoJICogICAgICA8bGk+UmF3IHRleHQgZm9yIFRFWFQ8L2xpPgoJICogICAgICA8bGk+QSBmb3JtYXR0ZWQgSmF2YVNjcmlwdCBvYmplY3QgZGVmaW5lZCBieSBKU09OPC9saT4KCSAqICAgICAgPGxpPkFuIFhNTCBkb2N1bWVudDwvbGk+CgkgKiAgICAgIDxsaT5BbiBiaW5hcnkgYXJyYXlidWZmZXIgbG9hZGVkIGJ5IFhIUjwvbGk+CgkgKiA8L3VsPgoJICogTm90ZSB0aGF0IGlmIGEgcmF3IHJlc3VsdCBpcyByZXF1ZXN0ZWQsIGJ1dCBub3QgZm91bmQsIHRoZSByZXN1bHQgd2lsbCBiZSByZXR1cm5lZCBpbnN0ZWFkLgoJICovCglwLmdldFJlc3VsdCA9IGZ1bmN0aW9uIChyYXcpIHsKCQlpZiAocmF3ICYmIHRoaXMuX3Jhd1Jlc3BvbnNlKSB7CgkJCXJldHVybiB0aGlzLl9yYXdSZXNwb25zZTsKCQl9CgkJcmV0dXJuIHRoaXMuX3Jlc3BvbnNlOwoJfTsKCgkvLyBPdmVycmlkZXMgYWJzdHJhY3QgbWV0aG9kIGluIEFic3RyYWN0UmVxdWVzdAoJcC5jYW5jZWwgPSBmdW5jdGlvbiAoKSB7CgkJdGhpcy5jYW5jZWxlZCA9IHRydWU7CgkJdGhpcy5fY2xlYW4oKTsKCQl0aGlzLl9yZXF1ZXN0LmFib3J0KCk7Cgl9OwoKCS8vIE92ZXJyaWRlcyBhYnN0cmFjdCBtZXRob2QgaW4gQWJzdHJhY3RMb2FkZXIKCXAubG9hZCA9IGZ1bmN0aW9uICgpIHsKCQlpZiAodGhpcy5fcmVxdWVzdCA9PSBudWxsKSB7CgkJCXRoaXMuX2hhbmRsZUVycm9yKCk7CgkJCXJldHVybjsKCQl9CgoJCS8vRXZlbnRzCgkJdGhpcy5fcmVxdWVzdC5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLCB0aGlzLl9oYW5kbGVMb2FkU3RhcnRQcm94eSwgZmFsc2UpOwoJCXRoaXMuX3JlcXVlc3QuYWRkRXZlbnRMaXN0ZW5lcigicHJvZ3Jlc3MiLCB0aGlzLl9oYW5kbGVQcm9ncmVzc1Byb3h5LCBmYWxzZSk7CgkJdGhpcy5fcmVxdWVzdC5hZGRFdmVudExpc3RlbmVyKCJhYm9ydCIsIHRoaXMuX2hhbmRsZUFib3J0UHJveHksIGZhbHNlKTsKCQl0aGlzLl9yZXF1ZXN0LmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLl9oYW5kbGVFcnJvclByb3h5LCBmYWxzZSk7CgkJdGhpcy5fcmVxdWVzdC5hZGRFdmVudExpc3RlbmVyKCJ0aW1lb3V0IiwgdGhpcy5faGFuZGxlVGltZW91dFByb3h5LCBmYWxzZSk7CgoJCS8vIE5vdGU6IFdlIGRvbid0IGdldCBvbmxvYWQgaW4gYWxsIGJyb3dzZXJzIChlYXJsaWVyIEZGIGFuZCBJRSkuIG9uUmVhZHlTdGF0ZUNoYW5nZSBoYW5kbGVzIHRoZXNlLgoJCXRoaXMuX3JlcXVlc3QuYWRkRXZlbnRMaXN0ZW5lcigibG9hZCIsIHRoaXMuX2hhbmRsZUxvYWRQcm94eSwgZmFsc2UpOwoJCXRoaXMuX3JlcXVlc3QuYWRkRXZlbnRMaXN0ZW5lcigicmVhZHlzdGF0ZWNoYW5nZSIsIHRoaXMuX2hhbmRsZVJlYWR5U3RhdGVDaGFuZ2VQcm94eSwgZmFsc2UpOwoKCQkvLyBTZXQgdXAgYSB0aW1lb3V0IGlmIHdlIGRvbid0IGhhdmUgWEhSMgoJCWlmICh0aGlzLl94aHJMZXZlbCA9PSAxKSB7CgkJCXRoaXMuX2xvYWRUaW1lb3V0ID0gc2V0VGltZW91dChjcmVhdGVqcy5wcm94eSh0aGlzLl9oYW5kbGVUaW1lb3V0LCB0aGlzKSwgdGhpcy5faXRlbS5sb2FkVGltZW91dCk7CgkJfQoKCQkvLyBTb21ldGltZXMgd2UgZ2V0IGJhY2sgNDA0cyBpbW1lZGlhdGVseSwgcGFydGljdWxhcmx5IHdoZW4gdGhlcmUgaXMgYSBjcm9zcyBvcmlnaW4gcmVxdWVzdC4gIC8vIG5vdGUgdGhpcyBkb2VzIG5vdCBjYXRjaCBpbiBDaHJvbWUKCQl0cnkgewoJCQlpZiAoIXRoaXMuX2l0ZW0udmFsdWVzIHx8IHRoaXMuX2l0ZW0ubWV0aG9kID09IGNyZWF0ZWpzLkFic3RyYWN0TG9hZGVyLkdFVCkgewoJCQkJdGhpcy5fcmVxdWVzdC5zZW5kKCk7CgkJCX0gZWxzZSBpZiAodGhpcy5faXRlbS5tZXRob2QgPT0gY3JlYXRlanMuQWJzdHJhY3RMb2FkZXIuUE9TVCkgewoJCQkJdGhpcy5fcmVxdWVzdC5zZW5kKGNyZWF0ZWpzLlJlcXVlc3RVdGlscy5mb3JtYXRRdWVyeVN0cmluZyh0aGlzLl9pdGVtLnZhbHVlcykpOwoJCQl9CgkJfSBjYXRjaCAoZXJyb3IpIHsKCQkJdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBjcmVhdGVqcy5FcnJvckV2ZW50KCJYSFJfU0VORCIsIG51bGwsIGVycm9yKSk7CgkJfQoJfTsKCglwLnNldFJlc3BvbnNlVHlwZSA9IGZ1bmN0aW9uICh0eXBlKSB7CgkJdGhpcy5fcmVxdWVzdC5yZXNwb25zZVR5cGUgPSB0eXBlOwoJfTsKCgkvKioKCSAqIEdldCBhbGwgdGhlIHJlc3BvbnNlIGhlYWRlcnMgZnJvbSB0aGUgWG1sSHR0cFJlcXVlc3QuCgkgKgoJICogPHN0cm9uZz5Gcm9tIHRoZSBkb2NzOjwvc3Ryb25nPiBSZXR1cm4gYWxsIHRoZSBIVFRQIGhlYWRlcnMsIGV4Y2x1ZGluZyBoZWFkZXJzIHRoYXQgYXJlIGEgY2FzZS1pbnNlbnNpdGl2ZSBtYXRjaAoJICogZm9yIFNldC1Db29raWUgb3IgU2V0LUNvb2tpZTIsIGFzIGEgc2luZ2xlIHN0cmluZywgd2l0aCBlYWNoIGhlYWRlciBsaW5lIHNlcGFyYXRlZCBieSBhIFUrMDAwRCBDUiBVKzAwMEEgTEYgcGFpciwKCSAqIGV4Y2x1ZGluZyB0aGUgc3RhdHVzIGxpbmUsIGFuZCB3aXRoIGVhY2ggaGVhZGVyIG5hbWUgYW5kIGhlYWRlciB2YWx1ZSBzZXBhcmF0ZWQgYnkgYSBVKzAwM0EgQ09MT04gVSswMDIwIFNQQUNFCgkgKiBwYWlyLgoJICogQG1ldGhvZCBnZXRBbGxSZXNwb25zZUhlYWRlcnMKCSAqIEByZXR1cm4ge1N0cmluZ30KCSAqIEBzaW5jZSAwLjQuMQoJICovCglwLmdldEFsbFJlc3BvbnNlSGVhZGVycyA9IGZ1bmN0aW9uICgpIHsKCQlpZiAodGhpcy5fcmVxdWVzdC5nZXRBbGxSZXNwb25zZUhlYWRlcnMgaW5zdGFuY2VvZiBGdW5jdGlvbikgewoJCQlyZXR1cm4gdGhpcy5fcmVxdWVzdC5nZXRBbGxSZXNwb25zZUhlYWRlcnMoKTsKCQl9IGVsc2UgewoJCQlyZXR1cm4gbnVsbDsKCQl9Cgl9OwoKCS8qKgoJICogR2V0IGEgc3BlY2lmaWMgcmVzcG9uc2UgaGVhZGVyIGZyb20gdGhlIFhtbEh0dHBSZXF1ZXN0LgoJICoKCSAqIDxzdHJvbmc+RnJvbSB0aGUgZG9jczo8L3N0cm9uZz4gUmV0dXJucyB0aGUgaGVhZGVyIGZpZWxkIHZhbHVlIGZyb20gdGhlIHJlc3BvbnNlIG9mIHdoaWNoIHRoZSBmaWVsZCBuYW1lIG1hdGNoZXMKCSAqIGhlYWRlciwgdW5sZXNzIHRoZSBmaWVsZCBuYW1lIGlzIFNldC1Db29raWUgb3IgU2V0LUNvb2tpZTIuCgkgKiBAbWV0aG9kIGdldFJlc3BvbnNlSGVhZGVyCgkgKiBAcGFyYW0ge1N0cmluZ30gaGVhZGVyIFRoZSBoZWFkZXIgbmFtZSB0byByZXRyaWV2ZS4KCSAqIEByZXR1cm4ge1N0cmluZ30KCSAqIEBzaW5jZSAwLjQuMQoJICovCglwLmdldFJlc3BvbnNlSGVhZGVyID0gZnVuY3Rpb24gKGhlYWRlcikgewoJCWlmICh0aGlzLl9yZXF1ZXN0LmdldFJlc3BvbnNlSGVhZGVyIGluc3RhbmNlb2YgRnVuY3Rpb24pIHsKCQkJcmV0dXJuIHRoaXMuX3JlcXVlc3QuZ2V0UmVzcG9uc2VIZWFkZXIoaGVhZGVyKTsKCQl9IGVsc2UgewoJCQlyZXR1cm4gbnVsbDsKCQl9Cgl9OwoKLy8gcHJvdGVjdGVkIG1ldGhvZHMKCS8qKgoJICogVGhlIFhIUiByZXF1ZXN0IGhhcyByZXBvcnRlZCBwcm9ncmVzcy4KCSAqIEBtZXRob2QgX2hhbmRsZVByb2dyZXNzCgkgKiBAcGFyYW0ge09iamVjdH0gZXZlbnQgVGhlIFhIUiBwcm9ncmVzcyBldmVudC4KCSAqIEBwcml2YXRlCgkgKi8KCXAuX2hhbmRsZVByb2dyZXNzID0gZnVuY3Rpb24gKGV2ZW50KSB7CgkJaWYgKCFldmVudCB8fCBldmVudC5sb2FkZWQgPiAwICYmIGV2ZW50LnRvdGFsID09IDApIHsKCQkJcmV0dXJuOyAvLyBTb21ldGltZXMgd2UgZ2V0IG5vICJ0b3RhbCIsIHNvIGp1c3QgaWdub3JlIHRoZSBwcm9ncmVzcyBldmVudC4KCQl9CgoJCXZhciBuZXdFdmVudCA9IG5ldyBjcmVhdGVqcy5Qcm9ncmVzc0V2ZW50KGV2ZW50LmxvYWRlZCwgZXZlbnQudG90YWwpOwoJCXRoaXMuZGlzcGF0Y2hFdmVudChuZXdFdmVudCk7Cgl9OwoKCS8qKgoJICogVGhlIFhIUiByZXF1ZXN0IGhhcyByZXBvcnRlZCBhIGxvYWQgc3RhcnQuCgkgKiBAbWV0aG9kIF9oYW5kbGVMb2FkU3RhcnQKCSAqIEBwYXJhbSB7T2JqZWN0fSBldmVudCBUaGUgWEhSIGxvYWRTdGFydCBldmVudC4KCSAqIEBwcml2YXRlCgkgKi8KCXAuX2hhbmRsZUxvYWRTdGFydCA9IGZ1bmN0aW9uIChldmVudCkgewoJCWNsZWFyVGltZW91dCh0aGlzLl9sb2FkVGltZW91dCk7CgkJdGhpcy5kaXNwYXRjaEV2ZW50KCJsb2Fkc3RhcnQiKTsKCX07CgoJLyoqCgkgKiBUaGUgWEhSIHJlcXVlc3QgaGFzIHJlcG9ydGVkIGFuIGFib3J0IGV2ZW50LgoJICogQG1ldGhvZCBoYW5kbGVBYm9ydAoJICogQHBhcmFtIHtPYmplY3R9IGV2ZW50IFRoZSBYSFIgYWJvcnQgZXZlbnQuCgkgKiBAcHJpdmF0ZQoJICovCglwLl9oYW5kbGVBYm9ydCA9IGZ1bmN0aW9uIChldmVudCkgewoJCXRoaXMuX2NsZWFuKCk7CgkJdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBjcmVhdGVqcy5FcnJvckV2ZW50KCJYSFJfQUJPUlRFRCIsIG51bGwsIGV2ZW50KSk7Cgl9OwoKCS8qKgoJICogVGhlIFhIUiByZXF1ZXN0IGhhcyByZXBvcnRlZCBhbiBlcnJvciBldmVudC4KCSAqIEBtZXRob2QgX2hhbmRsZUVycm9yCgkgKiBAcGFyYW0ge09iamVjdH0gZXZlbnQgVGhlIFhIUiBlcnJvciBldmVudC4KCSAqIEBwcml2YXRlCgkgKi8KCXAuX2hhbmRsZUVycm9yID0gZnVuY3Rpb24gKGV2ZW50KSB7CgkJdGhpcy5fY2xlYW4oKTsKCQl0aGlzLmRpc3BhdGNoRXZlbnQobmV3IGNyZWF0ZWpzLkVycm9yRXZlbnQoZXZlbnQubWVzc2FnZSkpOwoJfTsKCgkvKioKCSAqIFRoZSBYSFIgcmVxdWVzdCBoYXMgcmVwb3J0ZWQgYSByZWFkeVN0YXRlIGNoYW5nZS4gTm90ZSB0aGF0IG9sZGVyIGJyb3dzZXJzIChJRSA3ICYgOCkgZG8gbm90IHByb3ZpZGUgYW4gb25sb2FkCgkgKiBldmVudCwgc28gd2UgbXVzdCBtb25pdG9yIHRoZSByZWFkeVN0YXRlQ2hhbmdlIHRvIGRldGVybWluZSBpZiB0aGUgZmlsZSBpcyBsb2FkZWQuCgkgKiBAbWV0aG9kIF9oYW5kbGVSZWFkeVN0YXRlQ2hhbmdlCgkgKiBAcGFyYW0ge09iamVjdH0gZXZlbnQgVGhlIFhIUiByZWFkeVN0YXRlQ2hhbmdlIGV2ZW50LgoJICogQHByaXZhdGUKCSAqLwoJcC5faGFuZGxlUmVhZHlTdGF0ZUNoYW5nZSA9IGZ1bmN0aW9uIChldmVudCkgewoJCWlmICh0aGlzLl9yZXF1ZXN0LnJlYWR5U3RhdGUgPT0gNCkgewoJCQl0aGlzLl9oYW5kbGVMb2FkKCk7CgkJfQoJfTsKCgkvKioKCSAqIFRoZSBYSFIgcmVxdWVzdCBoYXMgY29tcGxldGVkLiBUaGlzIGlzIGNhbGxlZCBieSB0aGUgWEhSIHJlcXVlc3QgZGlyZWN0bHksIG9yIGJ5IGEgcmVhZHlTdGF0ZUNoYW5nZSB0aGF0IGhhcwoJICogPGNvZGU+cmVxdWVzdC5yZWFkeVN0YXRlID09IDQ8L2NvZGU+LiBPbmx5IHRoZSBmaXJzdCBjYWxsIHRvIHRoaXMgbWV0aG9kIHdpbGwgYmUgcHJvY2Vzc2VkLgoJICogQG1ldGhvZCBfaGFuZGxlTG9hZAoJICogQHBhcmFtIHtPYmplY3R9IGV2ZW50IFRoZSBYSFIgbG9hZCBldmVudC4KCSAqIEBwcml2YXRlCgkgKi8KCXAuX2hhbmRsZUxvYWQgPSBmdW5jdGlvbiAoZXZlbnQpIHsKCQlpZiAodGhpcy5sb2FkZWQpIHsKCQkJcmV0dXJuOwoJCX0KCQl0aGlzLmxvYWRlZCA9IHRydWU7CgoJCXZhciBlcnJvciA9IHRoaXMuX2NoZWNrRXJyb3IoKTsKCQlpZiAoZXJyb3IpIHsKCQkJdGhpcy5faGFuZGxlRXJyb3IoZXJyb3IpOwoJCQlyZXR1cm47CgkJfQoKCQl0aGlzLl9yZXNwb25zZSA9IHRoaXMuX2dldFJlc3BvbnNlKCk7CgkJdGhpcy5fY2xlYW4oKTsKCgkJdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBjcmVhdGVqcy5FdmVudCgiY29tcGxldGUiKSk7Cgl9OwoKCS8qKgoJICogVGhlIFhIUiByZXF1ZXN0IGhhcyB0aW1lZCBvdXQuIFRoaXMgaXMgY2FsbGVkIGJ5IHRoZSBYSFIgcmVxdWVzdCBkaXJlY3RseSwgb3IgdmlhIGEgPGNvZGU+c2V0VGltZW91dDwvY29kZT4KCSAqIGNhbGxiYWNrLgoJICogQG1ldGhvZCBfaGFuZGxlVGltZW91dAoJICogQHBhcmFtIHtPYmplY3R9IFtldmVudF0gVGhlIFhIUiB0aW1lb3V0IGV2ZW50LiBUaGlzIGlzIG9jY2FzaW9uYWxseSBudWxsIHdoZW4gY2FsbGVkIGJ5IHRoZSBiYWNrdXAgc2V0VGltZW91dC4KCSAqIEBwcml2YXRlCgkgKi8KCXAuX2hhbmRsZVRpbWVvdXQgPSBmdW5jdGlvbiAoZXZlbnQpIHsKCQl0aGlzLl9jbGVhbigpOwoKCQl0aGlzLmRpc3BhdGNoRXZlbnQobmV3IGNyZWF0ZWpzLkVycm9yRXZlbnQoIlBSRUxPQURfVElNRU9VVCIsIG51bGwsIGV2ZW50KSk7Cgl9OwoKLy8gUHJvdGVjdGVkCgkvKioKCSAqIERldGVybWluZSBpZiB0aGVyZSBpcyBhbiBlcnJvciBpbiB0aGUgY3VycmVudCBsb2FkLiBUaGlzIGNoZWNrcyB0aGUgc3RhdHVzIG9mIHRoZSByZXF1ZXN0IGZvciBwcm9ibGVtIGNvZGVzLiBOb3RlCgkgKiB0aGF0IHRoaXMgZG9lcyBub3QgY2hlY2sgZm9yIGFuIGFjdHVhbCByZXNwb25zZS4gQ3VycmVudGx5LCBpdCBvbmx5IGNoZWNrcyBmb3IgNDA0IG9yIDAgZXJyb3IgY29kZS4KCSAqIEBtZXRob2QgX2NoZWNrRXJyb3IKCSAqIEByZXR1cm4ge2ludH0gSWYgdGhlIHJlcXVlc3Qgc3RhdHVzIHJldHVybnMgYW4gZXJyb3IgY29kZS4KCSAqIEBwcml2YXRlCgkgKi8KCXAuX2NoZWNrRXJyb3IgPSBmdW5jdGlvbiAoKSB7CgkJLy9MTTogUHJvYmFibHkgbmVlZCBhZGRpdGlvbmFsIGhhbmRsZXJzIGhlcmUsIG1heWJlIDUwMQoJCXZhciBzdGF0dXMgPSBwYXJzZUludCh0aGlzLl9yZXF1ZXN0LnN0YXR1cyk7CgoJCXN3aXRjaCAoc3RhdHVzKSB7CgkJCWNhc2UgNDA0OiAgIC8vIE5vdCBGb3VuZAoJCQljYXNlIDA6ICAgICAvLyBOb3QgTG9hZGVkCgkJCQlyZXR1cm4gbmV3IEVycm9yKHN0YXR1cyk7CgkJfQoJCXJldHVybiBudWxsOwoJfTsKCgkvKioKCSAqIFZhbGlkYXRlIHRoZSByZXNwb25zZS4gRGlmZmVyZW50IGJyb3dzZXJzIGhhdmUgZGlmZmVyZW50IGFwcHJvYWNoZXMsIHNvbWUgb2Ygd2hpY2ggdGhyb3cgZXJyb3JzIHdoZW4gYWNjZXNzZWQKCSAqIGluIG90aGVyIGJyb3dzZXJzLiBJZiB0aGVyZSBpcyBubyByZXNwb25zZSwgdGhlIDxjb2RlPl9yZXNwb25zZTwvY29kZT4gcHJvcGVydHkgd2lsbCByZW1haW4gbnVsbC4KCSAqIEBtZXRob2QgX2dldFJlc3BvbnNlCgkgKiBAcHJpdmF0ZQoJICovCglwLl9nZXRSZXNwb25zZSA9IGZ1bmN0aW9uICgpIHsKCQlpZiAodGhpcy5fcmVzcG9uc2UgIT0gbnVsbCkgewoJCQlyZXR1cm4gdGhpcy5fcmVzcG9uc2U7CgkJfQoKCQlpZiAodGhpcy5fcmVxdWVzdC5yZXNwb25zZSAhPSBudWxsKSB7CgkJCXJldHVybiB0aGlzLl9yZXF1ZXN0LnJlc3BvbnNlOwoJCX0KCgkJLy8gQW5kcm9pZCAyLjIgdXNlcyAucmVzcG9uc2VUZXh0CgkJdHJ5IHsKCQkJaWYgKHRoaXMuX3JlcXVlc3QucmVzcG9uc2VUZXh0ICE9IG51bGwpIHsKCQkJCXJldHVybiB0aGlzLl9yZXF1ZXN0LnJlc3BvbnNlVGV4dDsKCQkJfQoJCX0gY2F0Y2ggKGUpIHsKCQl9CgoJCS8vIFdoZW4gbG9hZGluZyBYTUwsIElFOSBkb2VzIG5vdCByZXR1cm4gLnJlc3BvbnNlLCBpbnN0ZWFkIGl0IHJldHVybnMgcmVzcG9uc2VYTUwueG1sCgkJdHJ5IHsKCQkJaWYgKHRoaXMuX3JlcXVlc3QucmVzcG9uc2VYTUwgIT0gbnVsbCkgewoJCQkJcmV0dXJuIHRoaXMuX3JlcXVlc3QucmVzcG9uc2VYTUw7CgkJCX0KCQl9IGNhdGNoIChlKSB7CgkJfQoKCQlyZXR1cm4gbnVsbDsKCX07CgoJLyoqCgkgKiBDcmVhdGUgYW4gWEhSIHJlcXVlc3QuIERlcGVuZGluZyBvbiBhIG51bWJlciBvZiBmYWN0b3JzLCB3ZSBnZXQgdG90YWxseSBkaWZmZXJlbnQgcmVzdWx0cy4KCSAqIDxvbD48bGk+U29tZSBicm93c2VycyBnZXQgYW4gPGNvZGU+WERvbWFpblJlcXVlc3Q8L2NvZGU+IHdoZW4gbG9hZGluZyBjcm9zcy1kb21haW4uPC9saT4KCSAqICAgICAgPGxpPlhNTEh0dHBSZXF1ZXN0IGFyZSBjcmVhdGVkIHdoZW4gYXZhaWxhYmxlLjwvbGk+CgkgKiAgICAgIDxsaT5BY3RpdmVYLlhNTEhUVFAgb2JqZWN0cyBhcmUgdXNlZCBpbiBvbGRlciBJRSBicm93c2Vycy48L2xpPgoJICogICAgICA8bGk+VGV4dCByZXF1ZXN0cyBvdmVycmlkZSB0aGUgbWltZSB0eXBlIGlmIHBvc3NpYmxlPC9saT4KCSAqICAgICAgPGxpPk9yaWdpbiBoZWFkZXJzIGFyZSBzZW50IGZvciBjcm9zc2RvbWFpbiByZXF1ZXN0cyBpbiBzb21lIGJyb3dzZXJzLjwvbGk+CgkgKiAgICAgIDxsaT5CaW5hcnkgbG9hZHMgc2V0IHRoZSByZXNwb25zZSB0eXBlIHRvICJhcnJheWJ1ZmZlciI8L2xpPjwvb2w+CgkgKiBAbWV0aG9kIF9jcmVhdGVYSFIKCSAqIEBwYXJhbSB7T2JqZWN0fSBpdGVtIFRoZSByZXF1ZXN0ZWQgaXRlbSB0aGF0IGlzIGJlaW5nIGxvYWRlZC4KCSAqIEByZXR1cm4ge0Jvb2xlYW59IElmIGFuIFhIUiByZXF1ZXN0IG9yIGVxdWl2YWxlbnQgd2FzIHN1Y2Nlc3NmdWxseSBjcmVhdGVkLgoJICogQHByaXZhdGUKCSAqLwoJcC5fY3JlYXRlWEhSID0gZnVuY3Rpb24gKGl0ZW0pIHsKCQkvLyBDaGVjayBmb3IgY3Jvc3MtZG9tYWluIGxvYWRzLiBXZSBjYW4ndCBmdWxseSBzdXBwb3J0IHRoZW0sIGJ1dCB3ZSBjYW4gdHJ5LgoJCXZhciBjcm9zc2RvbWFpbiA9IGNyZWF0ZWpzLlJlcXVlc3RVdGlscy5pc0Nyb3NzRG9tYWluKGl0ZW0pOwoJCXZhciBoZWFkZXJzID0ge307CgoJCS8vIENyZWF0ZSB0aGUgcmVxdWVzdC4gRmFsbGJhY2sgdG8gd2hhdGV2ZXIgc3VwcG9ydCB3ZSBoYXZlLgoJCXZhciByZXEgPSBudWxsOwoJCWlmICh3aW5kb3cuWE1MSHR0cFJlcXVlc3QpIHsKCQkJcmVxID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7CgkJCS8vIFRoaXMgaXMgOCBvciA5LCBzbyB1c2UgWERvbWFpblJlcXVlc3QgaW5zdGVhZC4KCQkJaWYgKGNyb3NzZG9tYWluICYmIHJlcS53aXRoQ3JlZGVudGlhbHMgPT09IHVuZGVmaW5lZCAmJiB3aW5kb3cuWERvbWFpblJlcXVlc3QpIHsKCQkJCXJlcSA9IG5ldyBYRG9tYWluUmVxdWVzdCgpOwoJCQl9CgkJfSBlbHNlIHsgLy8gT2xkIElFIHZlcnNpb25zIHVzZSBhIGRpZmZlcmVudCBhcHByb2FjaAoJCQlmb3IgKHZhciBpID0gMCwgbCA9IHMuQUNUSVZFWF9WRVJTSU9OUy5sZW5ndGg7IGkgPCBsOyBpKyspIHsKCQkJCXZhciBheFZlcnNpb24gPSBzLkFDVElWRVhfVkVSU0lPTlNbaV07CgkJCQl0cnkgewoJCQkJCXJlcSA9IG5ldyBBY3RpdmVYT2JqZWN0KGF4VmVyc2lvbnMpOwoJCQkJCWJyZWFrOwoJCQkJfSBjYXRjaCAoZSkge30KCQkJfQoJCQlpZiAocmVxID09IG51bGwpIHsgcmV0dXJuIGZhbHNlOyB9CgkJfQoKCQkvLyBEZWZhdWx0IHRvIHV0Zi04IGZvciBUZXh0IHJlcXVlc3RzLgoJCWlmIChpdGVtLm1pbWVUeXBlID09IG51bGwgJiYgY3JlYXRlanMuUmVxdWVzdFV0aWxzLmlzVGV4dChpdGVtLnR5cGUpKSB7CgkJCWl0ZW0ubWltZVR5cGUgPSAidGV4dC9wbGFpbjsgY2hhcnNldD11dGYtOCI7CgkJfQoKCQkvLyBJRTkgZG9lc24ndCBzdXBwb3J0IG92ZXJyaWRlTWltZVR5cGUoKSwgc28gd2UgbmVlZCB0byBjaGVjayBmb3IgaXQuCgkJaWYgKGl0ZW0ubWltZVR5cGUgJiYgcmVxLm92ZXJyaWRlTWltZVR5cGUpIHsKCQkJcmVxLm92ZXJyaWRlTWltZVR5cGUoaXRlbS5taW1lVHlwZSk7CgkJfQoKCQkvLyBEZXRlcm1pbmUgdGhlIFhIUiBsZXZlbAoJCXRoaXMuX3hockxldmVsID0gKHR5cGVvZiByZXEucmVzcG9uc2VUeXBlID09PSAic3RyaW5nIikgPyAyIDogMTsKCgkJdmFyIHNyYyA9IG51bGw7CgkJaWYgKGl0ZW0ubWV0aG9kID09IGNyZWF0ZWpzLkFic3RyYWN0TG9hZGVyLkdFVCkgewoJCQlzcmMgPSBjcmVhdGVqcy5SZXF1ZXN0VXRpbHMuYnVpbGRQYXRoKGl0ZW0uc3JjLCBpdGVtLnZhbHVlcyk7CgkJfSBlbHNlIHsKCQkJc3JjID0gaXRlbS5zcmM7CgkJfQoKCQkvLyBPcGVuIHRoZSByZXF1ZXN0LiAgU2V0IGNyb3NzLWRvbWFpbiBmbGFncyBpZiBpdCBpcyBzdXBwb3J0ZWQgKFhIUiBsZXZlbCAxIG9ubHkpCgkJcmVxLm9wZW4oaXRlbS5tZXRob2QgfHwgY3JlYXRlanMuQWJzdHJhY3RMb2FkZXIuR0VULCBzcmMsIHRydWUpOwoKCQlpZiAoY3Jvc3Nkb21haW4gJiYgcmVxIGluc3RhbmNlb2YgWE1MSHR0cFJlcXVlc3QgJiYgdGhpcy5feGhyTGV2ZWwgPT0gMSkgewoJCQloZWFkZXJzWyJPcmlnaW4iXSA9IGxvY2F0aW9uLm9yaWdpbjsKCQl9CgoJCS8vIFRvIHNlbmQgZGF0YSB3ZSBuZWVkIHRvIHNldCB0aGUgQ29udGVudC10eXBlIGhlYWRlcikKCQlpZiAoaXRlbS52YWx1ZXMgJiYgaXRlbS5tZXRob2QgPT0gY3JlYXRlanMuQWJzdHJhY3RMb2FkZXIuUE9TVCkgewoJCQloZWFkZXJzWyJDb250ZW50LVR5cGUiXSA9ICJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiOwoJCX0KCgkJaWYgKCFjcm9zc2RvbWFpbiAmJiAhaGVhZGVyc1siWC1SZXF1ZXN0ZWQtV2l0aCJdKSB7CgkJCWhlYWRlcnNbIlgtUmVxdWVzdGVkLVdpdGgiXSA9ICJYTUxIdHRwUmVxdWVzdCI7CgkJfQoKCQlpZiAoaXRlbS5oZWFkZXJzKSB7CgkJCWZvciAodmFyIG4gaW4gaXRlbS5oZWFkZXJzKSB7CgkJCQloZWFkZXJzW25dID0gaXRlbS5oZWFkZXJzW25dOwoJCQl9CgkJfQoKCQlmb3IgKG4gaW4gaGVhZGVycykgewoJCQlyZXEuc2V0UmVxdWVzdEhlYWRlcihuLCBoZWFkZXJzW25dKQoJCX0KCgkJaWYgKHJlcSBpbnN0YW5jZW9mIFhNTEh0dHBSZXF1ZXN0ICYmIGl0ZW0ud2l0aENyZWRlbnRpYWxzICE9PSB1bmRlZmluZWQpIHsKCQkJcmVxLndpdGhDcmVkZW50aWFscyA9IGl0ZW0ud2l0aENyZWRlbnRpYWxzOwoJCX0KCgkJdGhpcy5fcmVxdWVzdCA9IHJlcTsKCgkJcmV0dXJuIHRydWU7Cgl9OwoKCS8qKgoJICogQSByZXF1ZXN0IGhhcyBjb21wbGV0ZWQgKG9yIGZhaWxlZCBvciBjYW5jZWxlZCksIGFuZCBuZWVkcyB0byBiZSBkaXNwb3NlZC4KCSAqIEBtZXRob2QgX2NsZWFuCgkgKiBAcHJpdmF0ZQoJICovCglwLl9jbGVhbiA9IGZ1bmN0aW9uICgpIHsKCQljbGVhclRpbWVvdXQodGhpcy5fbG9hZFRpbWVvdXQpOwoKCQl0aGlzLl9yZXF1ZXN0LnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsIHRoaXMuX2hhbmRsZUxvYWRTdGFydFByb3h5KTsKCQl0aGlzLl9yZXF1ZXN0LnJlbW92ZUV2ZW50TGlzdGVuZXIoInByb2dyZXNzIiwgdGhpcy5faGFuZGxlUHJvZ3Jlc3NQcm94eSk7CgkJdGhpcy5fcmVxdWVzdC5yZW1vdmVFdmVudExpc3RlbmVyKCJhYm9ydCIsIHRoaXMuX2hhbmRsZUFib3J0UHJveHkpOwoJCXRoaXMuX3JlcXVlc3QucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZXJyb3IiLHRoaXMuX2hhbmRsZUVycm9yUHJveHkpOwoJCXRoaXMuX3JlcXVlc3QucmVtb3ZlRXZlbnRMaXN0ZW5lcigidGltZW91dCIsIHRoaXMuX2hhbmRsZVRpbWVvdXRQcm94eSk7CgkJdGhpcy5fcmVxdWVzdC5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2FkIiwgdGhpcy5faGFuZGxlTG9hZFByb3h5KTsKCQl0aGlzLl9yZXF1ZXN0LnJlbW92ZUV2ZW50TGlzdGVuZXIoInJlYWR5c3RhdGVjaGFuZ2UiLCB0aGlzLl9oYW5kbGVSZWFkeVN0YXRlQ2hhbmdlUHJveHkpOwoJfTsKCglwLnRvU3RyaW5nID0gZnVuY3Rpb24gKCkgewoJCXJldHVybiAiW1ByZWxvYWRKUyBYSFJSZXF1ZXN0XSI7Cgl9OwoKCWNyZWF0ZWpzLlhIUlJlcXVlc3QgPSBjcmVhdGVqcy5wcm9tb3RlKFhIUlJlcXVlc3QsICJBYnN0cmFjdFJlcXVlc3QiKTsKCn0oKSk7CgovLyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwovLyBMb2FkUXVldWUuanMKLy8jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCnRoaXMuY3JlYXRlanMgPSB0aGlzLmNyZWF0ZWpzIHx8IHt9OwoKLyoKIFRPRE86IFdJTkRPV1MgSVNTVUVTCiAqIE5vIGVycm9yIGZvciBIVE1MIGF1ZGlvIGluIElFIDY3OAogKiBTVkcgbm8gZmFpbHVyZSBlcnJvciBpbiBJRSA2NyAobWF5YmUgOCkgVEFHUyBBTkQgWEhSCiAqIE5vIHNjcmlwdCBjb21wbGV0ZSBoYW5kbGVyIGluIElFIDY3IFRBR1MgKFhIUiBpcyBmaW5lKQogKiBObyBYTUwvSlNPTiBpbiBJRTYgVEFHUwogKiBOZWVkIHRvIGhpZGUgbG9hZGluZyBTVkcgaW4gT3BlcmEgVEFHUwogKiBObyBDU1Mgb25sb2FkL3JlYWR5c3RhdGVjaGFuZ2UgaW4gU2FmYXJpIG9yIEFuZHJvaWQgVEFHUyAocmVxdWlyZXMgcnVsZSBjaGVja2luZykKICogU1ZHIG5vIGxvYWQgb3IgZmFpbHVyZSBpbiBPcGVyYSBYSFIKICogUmVwb3J0ZWQgaXNzdWVzIHdpdGggSUU3LzgKICovCgooZnVuY3Rpb24gKCkgewoJInVzZSBzdHJpY3QiOwoKLy8gY29uc3RydWN0b3IKCS8qKgoJICogVGhlIExvYWRRdWV1ZSBjbGFzcyBpcyB0aGUgbWFpbiBBUEkgZm9yIHByZWxvYWRpbmcgY29udGVudC4gTG9hZFF1ZXVlIGlzIGEgbG9hZCBtYW5hZ2VyLCB3aGljaCBjYW4gcHJlbG9hZCBlaXRoZXIKCSAqIGEgc2luZ2xlIGZpbGUsIG9yIHF1ZXVlIG9mIGZpbGVzLgoJICoKCSAqIDxiPkNyZWF0aW5nIGEgUXVldWU8L2I+PGJyIC8+CgkgKiBUbyB1c2UgTG9hZFF1ZXVlLCBjcmVhdGUgYSBMb2FkUXVldWUgaW5zdGFuY2UuIElmIHlvdSB3YW50IHRvIGZvcmNlIHRhZyBsb2FkaW5nIHdoZXJlIHBvc3NpYmxlLCBzZXQgdGhlIHByZWZlclhIUgoJICogYXJndW1lbnQgdG8gZmFsc2UuCgkgKgoJICogICAgICB2YXIgcXVldWUgPSBuZXcgY3JlYXRlanMuTG9hZFF1ZXVlKHRydWUpOwoJICoKCSAqIDxiPkxpc3RlbmluZyBmb3IgRXZlbnRzPC9iPjxiciAvPgoJICogQWRkIGFueSBsaXN0ZW5lcnMgeW91IHdhbnQgdG8gdGhlIHF1ZXVlLiBTaW5jZSBQcmVsb2FkSlMgMC4zLjAsIHRoZSB7eyNjcm9zc0xpbmsgIkV2ZW50RGlzcGF0Y2hlciJ9fXt7L2Nyb3NzTGlua319CgkgKiBsZXRzIHlvdSBhZGQgYXMgbWFueSBsaXN0ZW5lcnMgYXMgeW91IHdhbnQgZm9yIGV2ZW50cy4gWW91IGNhbiBzdWJzY3JpYmUgdG8gdGhlIGZvbGxvd2luZyBldmVudHM6PHVsPgoJICogICAgIDxsaT57eyNjcm9zc0xpbmsgIkFic3RyYWN0TG9hZGVyL2NvbXBsZXRlOmV2ZW50In19e3svY3Jvc3NMaW5rfX06IGZpcmVkIHdoZW4gYSBxdWV1ZSBjb21wbGV0ZXMgbG9hZGluZyBhbGwKCSAqICAgICBmaWxlczwvbGk+CgkgKiAgICAgPGxpPnt7I2Nyb3NzTGluayAiQWJzdHJhY3RMb2FkZXIvZXJyb3I6ZXZlbnQifX17ey9jcm9zc0xpbmt9fTogZmlyZWQgd2hlbiB0aGUgcXVldWUgZW5jb3VudGVycyBhbiBlcnJvciB3aXRoCgkgKiAgICAgYW55IGZpbGUuPC9saT4KCSAqICAgICA8bGk+e3sjY3Jvc3NMaW5rICJBYnN0cmFjdExvYWRlci9wcm9ncmVzczpldmVudCJ9fXt7L2Nyb3NzTGlua319OiBQcm9ncmVzcyBmb3IgdGhlIGVudGlyZSBxdWV1ZSBoYXMKCSAqICAgICBjaGFuZ2VkLjwvbGk+CgkgKiAgICAgPGxpPnt7I2Nyb3NzTGluayAiTG9hZFF1ZXVlL2ZpbGVsb2FkOmV2ZW50In19e3svY3Jvc3NMaW5rfX06IEEgc2luZ2xlIGZpbGUgaGFzIGNvbXBsZXRlZCBsb2FkaW5nLjwvbGk+CgkgKiAgICAgPGxpPnt7I2Nyb3NzTGluayAiTG9hZFF1ZXVlL2ZpbGVwcm9ncmVzczpldmVudCJ9fXt7L2Nyb3NzTGlua319OiBQcm9ncmVzcyBmb3IgYSBzaW5nbGUgZmlsZSBoYXMgY2hhbmdlcy4gTm90ZQoJICogICAgIHRoYXQgb25seSBmaWxlcyBsb2FkZWQgd2l0aCBYSFIgKG9yIHBvc3NpYmx5IGJ5IHBsdWdpbnMpIHdpbGwgZmlyZSBwcm9ncmVzcyBldmVudHMgb3RoZXIgdGhhbiAwIG9yIDEwMCUuPC9saT4KCSAqIDwvdWw+CgkgKgoJICogICAgICBxdWV1ZS5vbigiZmlsZWxvYWQiLCBoYW5kbGVGaWxlTG9hZCwgdGhpcyk7CgkgKiAgICAgIHF1ZXVlLm9uKCJjb21wbGV0ZSIsIGhhbmRsZUNvbXBsZXRlLCB0aGlzKTsKCSAqCgkgKiA8Yj5BZGRpbmcgZmlsZXMgYW5kIG1hbmlmZXN0czwvYj48YnIgLz4KCSAqIEFkZCBmaWxlcyB5b3Ugd2FudCB0byBsb2FkIHVzaW5nIHt7I2Nyb3NzTGluayAiTG9hZFF1ZXVlL2xvYWRGaWxlIn19e3svY3Jvc3NMaW5rfX0gb3IgYWRkIG11bHRpcGxlIGZpbGVzIGF0IGEKCSAqIHRpbWUgdXNpbmcgYSBsaXN0IG9yIGEgbWFuaWZlc3QgZGVmaW5pdGlvbiB1c2luZyB7eyNjcm9zc0xpbmsgIkxvYWRRdWV1ZS9sb2FkTWFuaWZlc3QifX17ey9jcm9zc0xpbmt9fS4gRmlsZXMgYXJlCgkgKiBhcHBlbmRlZCB0byB0aGUgZW5kIG9mIHRoZSBhY3RpdmUgcXVldWUsIHNvIHlvdSBjYW4gdXNlIHRoZXNlIG1ldGhvZHMgYXMgbWFueSB0aW1lcyBhcyB5b3UgbGlrZSwgd2hlbmV2ZXIgeW91CgkgKiBsaWtlLgoJICoKCSAqICAgICAgcXVldWUubG9hZEZpbGUoImZpbGVQYXRoL2ZpbGUuanBnIik7CgkgKiAgICAgIHF1ZXVlLmxvYWRGaWxlKHtpZDoiaW1hZ2UiLCBzcmM6ImZpbGVQYXRoL2ZpbGUuanBnIn0pOwoJICogICAgICBxdWV1ZS5sb2FkTWFuaWZlc3QoWyJmaWxlUGF0aC9maWxlLmpwZyIsIHtpZDoiaW1hZ2UiLCBzcmM6ImZpbGVQYXRoL2ZpbGUuanBnIn1dKTsKCSAqCgkgKiAgICAgIC8vIFVzZSBhbiBleHRlcm5hbCBtYW5pZmVzdAoJICogICAgICBxdWV1ZS5sb2FkTWFuaWZlc3QoInBhdGgvdG8vbWFuaWZlc3QuanNvbiIpOwoJICogICAgICBxdWV1ZS5sb2FkTWFuaWZlc3Qoe3NyYzoibWFuaWZlc3QuanNvbiIsIHR5cGU6Im1hbmlmZXN0In0pOwoJICoKCSAqIElmIHlvdSBwYXNzIGBmYWxzZWAgYXMgdGhlIGBsb2FkTm93YCBwYXJhbWV0ZXIsIHRoZSBxdWV1ZSB3aWxsIG5vdCBraWNrIG9mIHRoZSBsb2FkIG9mIHRoZSBmaWxlcywgYnV0IGl0IHdpbGwgbm90CgkgKiBzdG9wIGlmIGl0IGhhcyBhbHJlYWR5IGJlZW4gc3RhcnRlZC4gQ2FsbCB0aGUge3sjY3Jvc3NMaW5rICJBYnN0cmFjdExvYWRlci9sb2FkIn19e3svY3Jvc3NMaW5rfX0gbWV0aG9kIHRvIGJlZ2luCgkgKiBhIHBhdXNlZCBxdWV1ZS4gTm90ZSB0aGF0IGEgcGF1c2VkIHF1ZXVlIHdpbGwgYXV0b21hdGljYWxseSByZXN1bWUgd2hlbiBuZXcgZmlsZXMgYXJlIGFkZGVkIHRvIGl0IHdpdGggYQoJICogYGxvYWROb3dgIGFyZ3VtZW50IG9mIGB0cnVlYC4KCSAqCgkgKiAgICAgIHF1ZXVlLmxvYWQoKTsKCSAqCgkgKiA8Yj5GaWxlIFR5cGVzPC9iPjxiciAvPgoJICogVGhlIGZpbGUgdHlwZSBvZiBhIG1hbmlmZXN0IGl0ZW0gaXMgYXV0by1kZXRlcm1pbmVkIGJ5IHRoZSBmaWxlIGV4dGVuc2lvbi4gVGhlIHBhdHRlcm4gbWF0Y2hpbmcgaW4gUHJlbG9hZEpTCgkgKiBzaG91bGQgaGFuZGxlIHRoZSBtYWpvcml0eSBvZiBzdGFuZGFyZCBmaWxlIGFuZCB1cmwgZm9ybWF0cywgYW5kIHdvcmtzIHdpdGggY29tbW9uIGZpbGUgZXh0ZW5zaW9ucy4gSWYgeW91IGhhdmUKCSAqIGVpdGhlciBhIG5vbi1zdGFuZGFyZCBmaWxlIGV4dGVuc2lvbiwgb3IgYXJlIHNlcnZpbmcgdGhlIGZpbGUgdXNpbmcgYSBwcm94eSBzY3JpcHQsIHRoZW4geW91IGNhbiBwYXNzIGluIGEKCSAqIDxjb2RlPnR5cGU8L2NvZGU+IHByb3BlcnR5IHdpdGggYW55IG1hbmlmZXN0IGl0ZW0uCgkgKgoJICogICAgICBxdWV1ZS5sb2FkRmlsZSh7c3JjOiJwYXRoL3RvL215RmlsZS5tcDN4IiwgdHlwZTpjcmVhdGVqcy5BYnN0cmFjdExvYWRlci5TT1VORH0pOwoJICoKCSAqICAgICAgLy8gTm90ZSB0aGF0IFByZWxvYWRKUyB3aWxsIG5vdCByZWFkIGEgZmlsZSBleHRlbnNpb24gZnJvbSB0aGUgcXVlcnkgc3RyaW5nCgkgKiAgICAgIHF1ZXVlLmxvYWRGaWxlKHtzcmM6Imh0dHA6Ly9zZXJ2ZXIuY29tL3Byb3h5P2ZpbGU9aW1hZ2UuanBnIiwgdHlwZTpjcmVhdGVqcy5BYnN0cmFjdExvYWRlci5JTUFHRX0pOwoJICoKCSAqIFN1cHBvcnRlZCB0eXBlcyBhcmUgZGVmaW5lZCBvbiB0aGUge3sjY3Jvc3NMaW5rICJBYnN0cmFjdExvYWRlciJ9fXt7L2Nyb3NzTGlua319IGNsYXNzLCBhbmQgaW5jbHVkZToKCSAqIDx1bD4KCSAqICAgICA8bGk+e3sjY3Jvc3NMaW5rICJBYnN0cmFjdExvYWRlci9CSU5BUlk6cHJvcGVydHkifX17ey9jcm9zc0xpbmt9fTogUmF3IGJpbmFyeSBkYXRhIHZpYSBYSFI8L2xpPgoJICogICAgIDxsaT57eyNjcm9zc0xpbmsgIkFic3RyYWN0TG9hZGVyL0NTUzpwcm9wZXJ0eSJ9fXt7L2Nyb3NzTGlua319OiBDU1MgZmlsZXM8L2xpPgoJICogICAgIDxsaT57eyNjcm9zc0xpbmsgIkFic3RyYWN0TG9hZGVyL0lNQUdFOnByb3BlcnR5In19e3svY3Jvc3NMaW5rfX06IENvbW1vbiBpbWFnZSBmb3JtYXRzPC9saT4KCSAqICAgICA8bGk+e3sjY3Jvc3NMaW5rICJBYnN0cmFjdExvYWRlci9KQVZBU0NSSVBUOnByb3BlcnR5In19e3svY3Jvc3NMaW5rfX06IEphdmFTY3JpcHQgZmlsZXM8L2xpPgoJICogICAgIDxsaT57eyNjcm9zc0xpbmsgIkFic3RyYWN0TG9hZGVyL0pTT046cHJvcGVydHkifX17ey9jcm9zc0xpbmt9fTogSlNPTiBkYXRhPC9saT4KCSAqICAgICA8bGk+e3sjY3Jvc3NMaW5rICJBYnN0cmFjdExvYWRlci9KU09OUDpwcm9wZXJ0eSJ9fXt7L2Nyb3NzTGlua319OiBKU09OIGZpbGVzIGNyb3NzLWRvbWFpbjwvbGk+CgkgKiAgICAgPGxpPnt7I2Nyb3NzTGluayAiQWJzdHJhY3RMb2FkZXIvTUFOSUZFU1Q6cHJvcGVydHkifX17ey9jcm9zc0xpbmt9fTogQSBsaXN0IG9mIGZpbGVzIHRvIGxvYWQgaW4gSlNPTiBmb3JtYXQsIHNlZQoJICogICAgIHt7I2Nyb3NzTGluayAiQWJzdHJhY3RMb2FkZXIvbG9hZE1hbmlmZXN0In19e3svY3Jvc3NMaW5rfX08L2xpPgoJICogICAgIDxsaT57eyNjcm9zc0xpbmsgIkFic3RyYWN0TG9hZGVyL1NPVU5EOnByb3BlcnR5In19e3svY3Jvc3NMaW5rfX06IEF1ZGlvIGZpbGUgZm9ybWF0czwvbGk+CgkgKiAgICAgPGxpPnt7I2Nyb3NzTGluayAiQWJzdHJhY3RMb2FkZXIvU1BSSVRFU0hFRVQ6cHJvcGVydHkifX17ey9jcm9zc0xpbmt9fTogSlNPTiBTcHJpdGVTaGVldCBkZWZpbml0ZWlvbnMuIFRoaXMKCSAqICAgICB3aWxsIGFsc28gbG9hZCBzdWItaW1hZ2VzLCBhbmQgcHJvdmlkZSBhIHt7I2Nyb3NzTGluayAiU3ByaXRlU2hlZXQifX17ey9jcm9zc0xpbmt9fSBpbnN0YW5jZS48L2xpPgoJICogICAgIDxsaT57eyNjcm9zc0xpbmsgIkFic3RyYWN0TG9hZGVyL1NWRzpwcm9wZXJ0eSJ9fXt7L2Nyb3NzTGlua319OiBTVkcgZmlsZXM8L2xpPgoJICogICAgIDxsaT57eyNjcm9zc0xpbmsgIkFic3RyYWN0TG9hZGVyL1RFWFQ6cHJvcGVydHkifX17ey9jcm9zc0xpbmt9fTogVGV4dCBmaWxlcyAtIFhIUiBvbmx5PC9saT4KCSAqICAgICA8bGk+e3sjY3Jvc3NMaW5rICJBYnN0cmFjdExvYWRlci9YTUw6cHJvcGVydHkifX17ey9jcm9zc0xpbmt9fTogWE1MIGRhdGE8L2xpPgoJICogPC91bD4KCSAqCgkgKiA8ZW0+Tm90ZTogTG9hZGVyIHR5cGVzIHVzZWQgdG8gYmUgZGVmaW5lZCBvbiBMb2FkUXVldWUsIGJ1dCBoYXZlIGJlZW4gbW92ZWQgdG8gQWJzdHJhY3RMb2FkZXIgZm9yIGJldHRlcgoJICogcG9ydGFiaWxpdHkgb2YgbG9hZGVyIGNsYXNzZXMsIHdoaWNoIGNhbiBiZSB1c2VkIGluZGl2aWR1YWxseSBub3cuIFRoZSBwcm9wZXJ0aWVzIG9uIExvYWRRdWV1ZSBzdGlsbCBleGlzdCwgYnV0CgkgKiBhcmUgZGVwcmVjYXRlZC48L2VtPgoJICoKCSAqIDxiPkhhbmRsaW5nIFJlc3VsdHM8L2I+PGJyIC8+CgkgKiBXaGVuIGEgZmlsZSBpcyBmaW5pc2hlZCBkb3dubG9hZGluZywgYSB7eyNjcm9zc0xpbmsgIkxvYWRRdWV1ZS9maWxlbG9hZDpldmVudCJ9fXt7L2Nyb3NzTGlua319IGV2ZW50IGlzCgkgKiBkaXNwYXRjaGVkLiBJbiBhbiBleGFtcGxlIGFib3ZlLCB0aGVyZSBpcyBhbiBldmVudCBsaXN0ZW5lciBzbmlwcGV0IGZvciBmaWxlbG9hZC4gTG9hZGVkIGZpbGVzIGFyZSB1c3VhbGx5IGEKCSAqIGZvcm1hdHRlZCBvYmplY3QgdGhhdCBjYW4gYmUgdXNlZCBpbW1lZGlhdGVseSwgaW5jbHVkaW5nOgoJICogPHVsPgoJICogICAgIDxsaT5CaW5hcnk6IFRoZSBiaW5hcnkgbG9hZGVkIHJlc3VsdDwvbGk+CgkgKiAgICAgPGxpPkNTUzogQSAmbHQ7bGluayAvJmd0OyB0YWc8L2xpPgoJICogICAgIDxsaT5JbWFnZTogQW4gJmx0O2ltZyAvJmd0OyB0YWc8L2xpPgoJICogICAgIDxsaT5KYXZhU2NyaXB0OiBBICZsdDtzY3JpcHQgLyZndDsgdGFnPC9saT4KCSAqICAgICA8bGk+SlNPTi9KU09OUDogQSBmb3JtYXR0ZWQgSmF2YVNjcmlwdCBPYmplY3Q8L2xpPgoJICogICAgIDxsaT5NYW5pZmVzdDogQSBKYXZhU2NyaXB0IG9iamVjdC4KCSAqICAgICA8bGk+U291bmQ6IEFuICZsdDthdWRpbyAvJmd0OyB0YWc8L2E+CgkgKiAgICAgPGxpPlNwcml0ZVNoZWV0OiBBIHt7I2Nyb3NzTGluayAiU3ByaXRlU2hlZXQifX17ey9jcm9zc0xpbmt9fSBpbnN0YW5jZSwgY29udGFpbmluZyBsb2FkZWQgaW1hZ2VzLgoJICogICAgIDxsaT5TVkc6IEFuICZsdDtvYmplY3QgLyZndDsgdGFnPC9saT4KCSAqICAgICA8bGk+VGV4dDogUmF3IHRleHQ8L2xpPgoJICogICAgIDxsaT5YTUw6IEFuIFhNTCBET00gbm9kZTwvbGk+CgkgKiA8L3VsPgoJICoKCSAqICAgICAgZnVuY3Rpb24gaGFuZGxlRmlsZUxvYWQoZXZlbnQpIHsKCSAqICAgICAgICAgIHZhciBpdGVtID0gZXZlbnQuaXRlbTsgLy8gQSByZWZlcmVuY2UgdG8gdGhlIGl0ZW0gdGhhdCB3YXMgcGFzc2VkIGluIHRvIHRoZSBMb2FkUXVldWUKCSAqICAgICAgICAgIHZhciB0eXBlID0gaXRlbS50eXBlOwoJICoKCSAqICAgICAgICAgIC8vIEFkZCBhbnkgaW1hZ2VzIHRvIHRoZSBwYWdlIGJvZHkuCgkgKiAgICAgICAgICBpZiAodHlwZSA9PSBjcmVhdGVqcy5Mb2FkUXVldWUuSU1BR0UpIHsKCSAqICAgICAgICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGV2ZW50LnJlc3VsdCk7CgkgKiAgICAgICAgICB9CgkgKiAgICAgIH0KCSAqCgkgKiBBdCBhbnkgdGltZSBhZnRlciB0aGUgZmlsZSBoYXMgYmVlbiBsb2FkZWQgKHVzdWFsbHkgYWZ0ZXIgdGhlIHF1ZXVlIGhhcyBjb21wbGV0ZWQpLCBhbnkgcmVzdWx0IGNhbiBiZSBsb29rZWQgdXAKCSAqIHZpYSBpdHMgImlkIiB1c2luZyB7eyNjcm9zc0xpbmsgIkxvYWRRdWV1ZS9nZXRSZXN1bHQifX17ey9jcm9zc0xpbmt9fS4gSWYgbm8gaWQgd2FzIHByb3ZpZGVkLCB0aGVuIHRoZQoJICogInNyYyIgb3IgZmlsZSBwYXRoIGNhbiBiZSB1c2VkIGluc3RlYWQsIGluY2x1ZGluZyB0aGUgYHBhdGhgIGRlZmluZWQgYnkgYSBtYW5pZmVzdCwgYnV0IDxzdHJvbmc+bm90IGluY2x1ZGluZzwvc3Ryb25nPgoJICogYSBiYXNlIHBhdGggZGVmaW5lZCBvbiB0aGUgTG9hZFF1ZXVlLiBJdCBpcyByZWNvbW1lbmRlZCB0byBhbHdheXMgcGFzcyBhbiBpZCBpZiB5b3Ugd2FudCB0byBsb29rIHVwIGNvbnRlbnQuCgkgKgoJICogICAgICB2YXIgaW1hZ2UgPSBxdWV1ZS5nZXRSZXN1bHQoImltYWdlIik7CgkgKiAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoaW1hZ2UpOwoJICoKCSAqIFJhdyBsb2FkZWQgY29udGVudCBjYW4gYmUgYWNjZXNzZWQgdXNpbmcgdGhlIDxjb2RlPnJhd1Jlc3VsdDwvY29kZT4gcHJvcGVydHkgb2YgdGhlIHt7I2Nyb3NzTGluayAiTG9hZFF1ZXVlL2ZpbGVsb2FkOmV2ZW50In19e3svY3Jvc3NMaW5rfX0KCSAqIGV2ZW50LCBvciBjYW4gYmUgbG9va2VkIHVwIHVzaW5nIHt7I2Nyb3NzTGluayAiTG9hZFF1ZXVlL2dldFJlc3VsdCJ9fXt7L2Nyb3NzTGlua319LCBwYXNzaW5nIGB0cnVlYCBhcyB0aGUgMm5kCgkgKiBhcmd1bWVudC4gVGhpcyBpcyBvbmx5IGFwcGxpY2FibGUgZm9yIGNvbnRlbnQgdGhhdCBoYXMgYmVlbiBwYXJzZWQgZm9yIHRoZSBicm93c2VyLCBzcGVjaWZpY2FsbHk6IEphdmFTY3JpcHQsCgkgKiBDU1MsIFhNTCwgU1ZHLCBhbmQgSlNPTiBvYmplY3RzLCBvciBhbnl0aGluZyBsb2FkZWQgd2l0aCBYSFIuCgkgKgoJICogICAgICB2YXIgaW1hZ2UgPSBxdWV1ZS5nZXRSZXN1bHQoImltYWdlIiwgdHJ1ZSk7IC8vIGxvYWQgdGhlIGJpbmFyeSBpbWFnZSBkYXRhIGxvYWRlZCB3aXRoIFhIUi4KCSAqCgkgKiA8Yj5QbHVnaW5zPC9iPjxiciAvPgoJICogTG9hZFF1ZXVlIGhhcyBhIHNpbXBsZSBwbHVnaW4gYXJjaGl0ZWN0dXJlIHRvIGhlbHAgcHJvY2VzcyBhbmQgcHJlbG9hZCBjb250ZW50LiBGb3IgZXhhbXBsZSwgdG8gcHJlbG9hZCBhdWRpbywKCSAqIG1ha2Ugc3VyZSB0byBpbnN0YWxsIHRoZSA8YSBocmVmPSJodHRwOi8vc291bmRqcy5jb20iPlNvdW5kSlM8L2E+IFNvdW5kIGNsYXNzLCB3aGljaCB3aWxsIGhlbHAgbG9hZCBIVE1MIGF1ZGlvLAoJICogRmxhc2ggYXVkaW8sIGFuZCBXZWJBdWRpbyBmaWxlcy4gVGhpcyBzaG91bGQgYmUgaW5zdGFsbGVkIDxzdHJvbmc+YmVmb3JlPC9zdHJvbmc+IGxvYWRpbmcgYW55IGF1ZGlvIGZpbGVzLgoJICoKCSAqICAgICAgcXVldWUuaW5zdGFsbFBsdWdpbihjcmVhdGVqcy5Tb3VuZCk7CgkgKgoJICogPGg0Pktub3duIEJyb3dzZXIgSXNzdWVzPC9oND4KCSAqIDx1bD4KCSAqICAgICA8bGk+QnJvd3NlcnMgd2l0aG91dCBhdWRpbyBzdXBwb3J0IGNhbiBub3QgbG9hZCBhdWRpbyBmaWxlcy48L2xpPgoJICogICAgIDxsaT5TYWZhcmkgb24gTWFjIE9TIFggY2FuIG9ubHkgcGxheSBIVE1MIGF1ZGlvIGlmIFF1aWNrVGltZSBpcyBpbnN0YWxsZWQ8L2xpPgoJICogICAgIDxsaT5IVE1MIEF1ZGlvIHRhZ3Mgd2lsbCBvbmx5IGRvd25sb2FkIHVudGlsIHRoZWlyIDxjb2RlPmNhblBsYXlUaHJvdWdoPC9jb2RlPiBldmVudCBpcyBmaXJlZC4gQnJvd3NlcnMgb3RoZXIKCSAqICAgICB0aGFuIENocm9tZSB3aWxsIGNvbnRpbnVlIHRvIGRvd25sb2FkIGluIHRoZSBiYWNrZ3JvdW5kLjwvbGk+CgkgKiAgICAgPGxpPldoZW4gbG9hZGluZyBzY3JpcHRzIHVzaW5nIHRhZ3MsIHRoZXkgYXJlIGF1dG9tYXRpY2FsbHkgYWRkZWQgdG8gdGhlIGRvY3VtZW50LjwvbGk+CgkgKiAgICAgPGxpPlNjcmlwdHMgbG9hZGVkIHZpYSBYSFIgbWF5IG5vdCBiZSBwcm9wZXJseSBpbnNwZWN0YWJsZSB3aXRoIGJyb3dzZXIgdG9vbHMuPC9saT4KCSAqICAgICA8bGk+SUU2IGFuZCBJRTcgKGFuZCBzb21lIG90aGVyIGJyb3dzZXJzKSBtYXkgbm90IGJlIGFibGUgdG8gbG9hZCBYTUwsIFRleHQsIG9yIEpTT04sIHNpbmNlIHRoZXkgcmVxdWlyZQoJICogICAgIFhIUiB0byB3b3JrLjwvbGk+CgkgKiAgICAgPGxpPkNvbnRlbnQgbG9hZGVkIHZpYSB0YWdzIHdpbGwgbm90IHNob3cgcHJvZ3Jlc3MsIGFuZCB3aWxsIGNvbnRpbnVlIHRvIGRvd25sb2FkIGluIHRoZSBiYWNrZ3JvdW5kIHdoZW4KCSAqICAgICBjYW5jZWxlZCwgYWx0aG91Z2ggbm8gZXZlbnRzIHdpbGwgYmUgZGlzcGF0Y2hlZC48L2xpPgoJICogPC91bD4KCSAqCgkgKiBAY2xhc3MgTG9hZFF1ZXVlCgkgKiBAcGFyYW0ge0Jvb2xlYW59IFtwcmVmZXJYSFI9dHJ1ZV0gRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBwcmVsb2FkIGluc3RhbmNlIHdpbGwgZmF2b3IgbG9hZGluZyB3aXRoIFhIUiAoWE1MIEhUVFAKCSAqIFJlcXVlc3RzKSwgb3IgSFRNTCB0YWdzLiBXaGVuIHRoaXMgaXMgYGZhbHNlYCwgdGhlIHF1ZXVlIHdpbGwgdXNlIHRhZyBsb2FkaW5nIHdoZW4gcG9zc2libGUsIGFuZCBmYWxsIGJhY2sgb24gWEhSCgkgKiB3aGVuIG5lY2Vzc2FyeS4KCSAqIEBwYXJhbSB7U3RyaW5nfSBbYmFzZVBhdGg9IiJdIEEgcGF0aCB0aGF0IHdpbGwgYmUgcHJlcGVuZGVkIG9uIHRvIHRoZSBzb3VyY2UgcGFyYW1ldGVyIG9mIGFsbCBpdGVtcyBpbiB0aGUgcXVldWUKCSAqIGJlZm9yZSB0aGV5IGFyZSBsb2FkZWQuICBTb3VyY2VzIGJlZ2lubmluZyB3aXRoIGEgcHJvdG9jb2wgc3VjaCBhcyBgaHR0cDovL2Agb3IgYSByZWxhdGl2ZSBwYXRoIHN1Y2ggYXMgYC4uL2AKCSAqIHdpbGwgbm90IHJlY2VpdmUgYSBiYXNlIHBhdGguCgkgKiBAcGFyYW0ge1N0cmluZ3xCb29sZWFufSBbY3Jvc3NPcmlnaW49IiJdIEFuIG9wdGlvbmFsIGZsYWcgdG8gc3VwcG9ydCBpbWFnZXMgbG9hZGVkIGZyb20gYSBDT1JTLWVuYWJsZWQgc2VydmVyLiBUbwoJICogdXNlIGl0LCBzZXQgdGhpcyB2YWx1ZSB0byBgdHJ1ZWAsIHdoaWNoIHdpbGwgZGVmYXVsdCB0aGUgY3Jvc3NPcmlnaW4gcHJvcGVydHkgb24gaW1hZ2VzIHRvICJBbm9ueW1vdXMiLiBBbnkKCSAqIHN0cmluZyB2YWx1ZSB3aWxsIGJlIHBhc3NlZCB0aHJvdWdoLCBidXQgb25seSAiIiBhbmQgIkFub255bW91cyIgYXJlIHJlY29tbWVuZGVkLiA8c3Ryb25nPk5vdGU6IFRoZSBjcm9zc09yaWdpbgoJICogcGFyYW1ldGVyIGlzIGRlcHJlY2F0ZWQuIFVzZSBMb2FkSXRlbS5jcm9zc09yaWdpbiBpbnN0ZWFkPC9zdHJvbmc+CgkgKgoJICogQGNvbnN0cnVjdG9yCgkgKiBAZXh0ZW5kcyBBYnN0cmFjdExvYWRlcgoJICovCglmdW5jdGlvbiBMb2FkUXVldWUocHJlZmVyWEhSLCBiYXNlUGF0aCwgY3Jvc3NPcmlnaW4pIHsKCQl0aGlzLkFic3RyYWN0TG9hZGVyX2NvbnN0cnVjdG9yKCk7CgkJdGhpcy5pbml0KHByZWZlclhIUiwgYmFzZVBhdGgsIGNyb3NzT3JpZ2luKTsKCX0KCgl2YXIgcCA9IGNyZWF0ZWpzLmV4dGVuZChMb2FkUXVldWUsIGNyZWF0ZWpzLkFic3RyYWN0TG9hZGVyKTsKCXZhciBzID0gTG9hZFF1ZXVlOwoKCS8qKgoJICogPHN0cm9uZz5SRU1PVkVEPC9zdHJvbmc+LiBSZW1vdmVkIGluIGZhdm9yIG9mIHVzaW5nIGBNeVN1cGVyQ2xhc3NfY29uc3RydWN0b3JgLgoJICogU2VlIHt7I2Nyb3NzTGluayAiVXRpbGl0eSBNZXRob2RzL2V4dGVuZCJ9fXt7L2Nyb3NzTGlua319IGFuZCB7eyNjcm9zc0xpbmsgIlV0aWxpdHkgTWV0aG9kcy9wcm9tb3RlIn19e3svY3Jvc3NMaW5rfX0KCSAqIGZvciBkZXRhaWxzLgoJICoKCSAqIFRoZXJlIGlzIGFuIGluaGVyaXRhbmNlIHR1dG9yaWFsIGRpc3RyaWJ1dGVkIHdpdGggRWFzZWxKUyBpbiAvdHV0b3JpYWxzL0luaGVyaXRhbmNlLgoJICoKCSAqIEBtZXRob2QgaW5pdGlhbGl6ZQoJICogQHByb3RlY3RlZAoJICogQGRlcHJlY2F0ZWQKCSAqLwoJLy8gcC5pbml0aWFsaXplID0gZnVuY3Rpb24oKSB7fTsgLy8gc2VhcmNoYWJsZSBmb3IgZGV2cyB3b25kZXJpbmcgd2hlcmUgaXQgaXMuCgoKCS8qKgoJICogQW4gaW50ZXJuYWwgaW5pdGlhbGl6YXRpb24gbWV0aG9kLCB3aGljaCBpcyB1c2VkIGZvciBpbml0aWFsIHNldCB1cCwgYnV0IGFsc28gdG8gcmVzZXQgdGhlIExvYWRRdWV1ZS4KCSAqIEBtZXRob2QgaW5pdAoJICogQHBhcmFtIHByZWZlclhIUgoJICogQHBhcmFtIGJhc2VQYXRoCgkgKiBAcGFyYW0gY3Jvc3NPcmlnaW4KCSAqIEBwcml2YXRlCgkgKi8KCXAuaW5pdCA9IGZ1bmN0aW9uKHByZWZlclhIUiwgYmFzZVBhdGgsIGNyb3NzT3JpZ2luKSB7CgoJCS8vIHB1YmxpYyBwcm9wZXJ0aWVzCgkJLyoqCgkJICogQHByb3BlcnR5IHVzZVhIUgoJCSAqIEB0eXBlIHtCb29sZWFufQoJCSAqIEByZWFkT25seQoJCSAqIEBkZWZhdWx0IHRydWUKCQkgKiBAZGVwcmVjYXRlZCBVc2UgcHJlZmVyWEhSIGluc3RlYWQuCgkJICovCgkJdGhpcy51c2VYSFIgPSB0cnVlOwoKCQkvKioKCQkgKiBUcnkgYW5kIHVzZSBYTUxIdHRwUmVxdWVzdCAoWEhSKSB3aGVuIHBvc3NpYmxlLiBOb3RlIHRoYXQgTG9hZFF1ZXVlIHdpbGwgZGVmYXVsdCB0byB0YWcgbG9hZGluZyBvciBYSFIKCQkgKiBsb2FkaW5nIGRlcGVuZGluZyBvbiB0aGUgcmVxdWlyZW1lbnRzIGZvciBhIG1lZGlhIHR5cGUuIEZvciBleGFtcGxlLCBIVE1MIGF1ZGlvIGNhbiBub3QgYmUgbG9hZGVkIHdpdGggWEhSLAoJCSAqIGFuZCBwbGFpbiB0ZXh0IGNhbiBub3QgYmUgbG9hZGVkIHdpdGggdGFncywgc28gaXQgd2lsbCBkZWZhdWx0IHRoZSB0aGUgY29ycmVjdCB0eXBlIGluc3RlYWQgb2YgdXNpbmcgdGhlCgkJICogdXNlci1kZWZpbmVkIHR5cGUuCgkJICogQHR5cGUge0Jvb2xlYW59CgkJICogQGRlZmF1bHQgdHJ1ZQoJCSAqIEBzaW5jZSAwLjYuMAoJCSAqLwoJCXRoaXMucHJlZmVyWEhSID0gdHJ1ZTsgLy9UT0RPOiBHZXQvU2V0CgkJdGhpcy5fcHJlZmVyWEhSID0gdHJ1ZTsKCQl0aGlzLnNldFByZWZlclhIUihwcmVmZXJYSFIpOwoKCQkvKioKCQkgKiBEZXRlcm1pbmVzIGlmIHRoZSBMb2FkUXVldWUgd2lsbCBzdG9wIHByb2Nlc3NpbmcgdGhlIGN1cnJlbnQgcXVldWUgd2hlbiBhbiBlcnJvciBpcyBlbmNvdW50ZXJlZC4KCQkgKiBAcHJvcGVydHkgc3RvcE9uRXJyb3IKCQkgKiBAdHlwZSB7Qm9vbGVhbn0KCQkgKiBAZGVmYXVsdCBmYWxzZQoJCSAqLwoJCXRoaXMuc3RvcE9uRXJyb3IgPSBmYWxzZTsKCgkJLyoqCgkJICogRW5zdXJlIGxvYWRlZCBzY3JpcHRzICJjb21wbGV0ZSIgaW4gdGhlIG9yZGVyIHRoZXkgYXJlIHNwZWNpZmllZC4gTG9hZGVkIHNjcmlwdHMgYXJlIGFkZGVkIHRvIHRoZSBkb2N1bWVudCBoZWFkCgkJICogb25jZSB0aGV5IGFyZSBsb2FkZWQuIFNjcmlwdHMgbG9hZGVkIHZpYSB0YWdzIHdpbGwgbG9hZCBvbmUtYXQtYS10aW1lIHdoZW4gdGhpcyBwcm9wZXJ0eSBpcyBgdHJ1ZWAsIHdoZXJlYXMKCQkgKiBzY3JpcHRzIGxvYWRlZCB1c2luZyBYSFIgY2FuIGxvYWQgaW4gYW55IG9yZGVyLCBidXQgd2lsbCAiZmluaXNoIiBhbmQgYmUgYWRkZWQgdG8gdGhlIGRvY3VtZW50IGluIHRoZSBvcmRlcgoJCSAqIHNwZWNpZmllZC4KCQkgKgoJCSAqIEFueSBpdGVtcyBjYW4gYmUgc2V0IHRvIGxvYWQgaW4gb3JkZXIgYnkgc2V0dGluZyB0aGUge3sjY3Jvc3NMaW5rICJtYWludGFpbk9yZGVyOnByb3BlcnR5In19e3svY3Jvc3NMaW5rfX0KCQkgKiBwcm9wZXJ0eSBvbiB0aGUgbG9hZCBpdGVtLCBvciBieSBlbnN1cmluZyB0aGF0IG9ubHkgb25lIGNvbm5lY3Rpb24gY2FuIGJlIG9wZW4gYXQgYSB0aW1lIHVzaW5nCgkJICoge3sjY3Jvc3NMaW5rICJMb2FkUXVldWUvc2V0TWF4Q29ubmVjdGlvbnMifX17ey9jcm9zc0xpbmt9fS4gTm90ZSB0aGF0IHdoZW4gdGhlIGBtYWludGFpblNjcmlwdE9yZGVyYCBwcm9wZXJ0eQoJCSAqIGlzIHNldCB0byBgdHJ1ZWAsIHNjcmlwdHMgaXRlbXMgYXJlIGF1dG9tYXRpY2FsbHkgc2V0IHRvIGBtYWludGFpbk9yZGVyPXRydWVgLCBhbmQgY2hhbmdpbmcgdGhlCgkJICogYG1haW50YWluU2NyaXB0T3JkZXJgIHRvIGBmYWxzZWAgZHVyaW5nIGEgbG9hZCB3aWxsIG5vdCBjaGFuZ2UgaXRlbXMgYWxyZWFkeSBpbiBhIHF1ZXVlLgoJCSAqCgkJICogPGg0PkV4YW1wbGU8L2g0PgoJCSAqCgkJICogICAgICB2YXIgcXVldWUgPSBuZXcgY3JlYXRlanMuTG9hZFF1ZXVlKCk7CgkJICogICAgICBxdWV1ZS5zZXRNYXhDb25uZWN0aW9ucygzKTsgLy8gU2V0IGEgaGlnaGVyIG51bWJlciB0byBsb2FkIG11bHRpcGxlIGl0ZW1zIGF0IG9uY2UKCQkgKiAgICAgIHF1ZXVlLm1haW50YWluU2NyaXB0T3JkZXIgPSB0cnVlOyAvLyBFbnN1cmUgc2NyaXB0cyBhcmUgbG9hZGVkIGluIG9yZGVyCgkJICogICAgICBxdWV1ZS5sb2FkTWFuaWZlc3QoWwoJCSAqICAgICAgICAgICJzY3JpcHQxLmpzIiwKCQkgKiAgICAgICAgICAic2NyaXB0Mi5qcyIsCgkJICogICAgICAgICAgImltYWdlLnBuZyIsIC8vIExvYWQgYW55IHRpbWUKCQkgKiAgICAgICAgICB7c3JjOiAiaW1hZ2UyLnBuZyIsIG1haW50YWluT3JkZXI6IHRydWV9IC8vIFdpbGwgd2FpdCBmb3Igc2NyaXB0Mi5qcwoJCSAqICAgICAgICAgICJpbWFnZTMucG5nIiwKCQkgKiAgICAgICAgICAic2NyaXB0My5qcyIgLy8gV2lsbCB3YWl0IGZvciBpbWFnZTIucG5nIGJlZm9yZSBsb2FkaW5nIChvciBjb21wbGV0aW5nIHdoZW4gbG9hZGluZyB3aXRoIFhIUikKCQkgKiAgICAgIF0pOwoJCSAqCgkJICogQHByb3BlcnR5IG1haW50YWluU2NyaXB0T3JkZXIKCQkgKiBAdHlwZSB7Qm9vbGVhbn0KCQkgKiBAZGVmYXVsdCB0cnVlCgkJICovCgkJdGhpcy5tYWludGFpblNjcmlwdE9yZGVyID0gdHJ1ZTsKCgkJLyoqCgkJICogVGhlIG5leHQgcHJlbG9hZCBxdWV1ZSB0byBwcm9jZXNzIHdoZW4gdGhpcyBvbmUgaXMgY29tcGxldGUuIElmIGFuIGVycm9yIGlzIHRocm93biBpbiB0aGUgY3VycmVudCBxdWV1ZSwgYW5kCgkJICoge3sjY3Jvc3NMaW5rICJMb2FkUXVldWUvc3RvcE9uRXJyb3I6cHJvcGVydHkifX17ey9jcm9zc0xpbmt9fSBpcyBgdHJ1ZWAsIHRoZSBuZXh0IHF1ZXVlIHdpbGwgbm90IGJlIHByb2Nlc3NlZC4KCQkgKiBAcHJvcGVydHkgbmV4dAoJCSAqIEB0eXBlIHtMb2FkUXVldWV9CgkJICogQGRlZmF1bHQgbnVsbAoJCSAqLwoJCXRoaXMubmV4dCA9IG51bGw7CgoJCS8vIHByb3RlY3RlZCBwcm9wZXJ0aWVzCgkJLyoqCgkJICogV2hldGhlciB0aGUgcXVldWUgaXMgY3VycmVudGx5IHBhdXNlZCBvciBub3QuCgkJICogQHByb3BlcnR5IF9wYXVzZWQKCQkgKiBAdHlwZSB7Ym9vbGVhbn0KCQkgKiBAcHJpdmF0ZQoJCSAqLwoJCXRoaXMuX3BhdXNlZCA9IGZhbHNlOwoKCQkvKioKCQkgKiBBIHBhdGggdGhhdCB3aWxsIGJlIHByZXBlbmRlZCBvbiB0byB0aGUgaXRlbSdzIHt7I2Nyb3NzTGluayAiTG9hZEl0ZW0vc3JjOnByb3BlcnR5In19e3svY3Jvc3NMaW5rfX0uIFRoZQoJCSAqIGBfYmFzZVBhdGhgIHByb3BlcnR5IHdpbGwgb25seSBiZSB1c2VkIGlmIGFuIGl0ZW0ncyBzb3VyY2UgaXMgcmVsYXRpdmUsIGFuZCBkb2VzIG5vdCBpbmNsdWRlIGEgcHJvdG9jb2wgc3VjaAoJCSAqIGFzIGBodHRwOi8vYCwgb3IgYSByZWxhdGl2ZSBwYXRoIHN1Y2ggYXMgYC4uL2AuCgkJICogQHByb3BlcnR5IF9iYXNlUGF0aAoJCSAqIEB0eXBlIHtTdHJpbmd9CgkJICogQHByaXZhdGUKCQkgKiBAc2luY2UgMC4zLjEKCQkgKi8KCQl0aGlzLl9iYXNlUGF0aCA9IGJhc2VQYXRoOwoKCQkvKioKCQkgKiBBbiBvcHRpb25hbCBmbGFnIHRvIHNldCBvbiBpbWFnZXMgdGhhdCBhcmUgbG9hZGVkIHVzaW5nIFByZWxvYWRKUywgd2hpY2ggZW5hYmxlcyBDT1JTIHN1cHBvcnQuIEltYWdlcyBsb2FkZWQKCQkgKiBjcm9zcy1kb21haW4gYnkgc2VydmVycyB0aGF0IHN1cHBvcnQgQ09SUyByZXF1aXJlIHRoZSBjcm9zc09yaWdpbiBmbGFnIHRvIGJlIGxvYWRlZCBhbmQgaW50ZXJhY3RlZCB3aXRoIGJ5CgkJICogYSBjYW52YXMuIFdoZW4gbG9hZGluZyBsb2NhbGx5LCBvciB3aXRoIGEgc2VydmVyIHdpdGggbm8gQ09SUyBzdXBwb3J0LCB0aGlzIGZsYWcgY2FuIGNhdXNlIG90aGVyIHNlY3VyaXR5IGlzc3VlcywKCQkgKiBzbyBpdCBpcyByZWNvbW1lbmRlZCB0byBvbmx5IHNldCBpdCBpZiB5b3UgYXJlIHN1cmUgdGhlIHNlcnZlciBzdXBwb3J0cyBpdC4gQ3VycmVudGx5LCBzdXBwb3J0ZWQgdmFsdWVzIGFyZSAiIgoJCSAqIGFuZCAiQW5vbnltb3VzIi4KCQkgKiBAcHJvcGVydHkgX2Nyb3NzT3JpZ2luCgkJICogQHR5cGUge1N0cmluZ30KCQkgKiBAZGVmYXVsdCAiIgoJCSAqIEBwcml2YXRlCgkJICogQHNpbmNlIDAuNC4xCgkJICovCgkJdGhpcy5fY3Jvc3NPcmlnaW4gPSBjcm9zc09yaWdpbjsKCgkJLyoqCgkJICogQW4gb2JqZWN0IGhhc2ggb2YgY2FsbGJhY2tzIHRoYXQgYXJlIGZpcmVkIGZvciBlYWNoIGZpbGUgdHlwZSBiZWZvcmUgdGhlIGZpbGUgaXMgbG9hZGVkLCBnaXZpbmcgcGx1Z2lucyB0aGUKCQkgKiBhYmlsaXR5IHRvIG92ZXJyaWRlIHByb3BlcnRpZXMgb2YgdGhlIGxvYWQuIFBsZWFzZSBzZWUgdGhlIHt7I2Nyb3NzTGluayAiTG9hZFF1ZXVlL2luc3RhbGxQbHVnaW4ifX17ey9jcm9zc0xpbmt9fQoJCSAqIG1ldGhvZCBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KCQkgKiBAcHJvcGVydHkgX3R5cGVDYWxsYmFja3MKCQkgKiBAdHlwZSB7T2JqZWN0fQoJCSAqIEBwcml2YXRlCgkJICovCgkJdGhpcy5fdHlwZUNhbGxiYWNrcyA9IHt9OwoKCQkvKioKCQkgKiBBbiBvYmplY3QgaGFzaCBvZiBjYWxsYmFja3MgdGhhdCBhcmUgZmlyZWQgZm9yIGVhY2ggZmlsZSBleHRlbnNpb24gYmVmb3JlIHRoZSBmaWxlIGlzIGxvYWRlZCwgZ2l2aW5nIHBsdWdpbnMgdGhlCgkJICogYWJpbGl0eSB0byBvdmVycmlkZSBwcm9wZXJ0aWVzIG9mIHRoZSBsb2FkLiBQbGVhc2Ugc2VlIHRoZSB7eyNjcm9zc0xpbmsgIkxvYWRRdWV1ZS9pbnN0YWxsUGx1Z2luIn19e3svY3Jvc3NMaW5rfX0KCQkgKiBtZXRob2QgZm9yIG1vcmUgaW5mb3JtYXRpb24uCgkJICogQHByb3BlcnR5IF9leHRlbnNpb25DYWxsYmFja3MKCQkgKiBAdHlwZSB7bnVsbH0KCQkgKiBAcHJpdmF0ZQoJCSAqLwoJCXRoaXMuX2V4dGVuc2lvbkNhbGxiYWNrcyA9IHt9OwoKCQkvKioKCQkgKiBEZXRlcm1pbmVzIGlmIHRoZSBsb2FkU3RhcnQgZXZlbnQgd2FzIGRpc3BhdGNoZWQgYWxyZWFkeS4gVGhpcyBldmVudCBpcyBvbmx5IGZpcmVkIG9uZSB0aW1lLCB3aGVuIHRoZSBmaXJzdAoJCSAqIGZpbGUgaXMgcmVxdWVzdGVkLgoJCSAqIEBwcm9wZXJ0eSBfbG9hZFN0YXJ0V2FzRGlzcGF0Y2hlZAoJCSAqIEB0eXBlIHtCb29sZWFufQoJCSAqIEBkZWZhdWx0IGZhbHNlCgkJICogQHByaXZhdGUKCQkgKi8KCQl0aGlzLl9sb2FkU3RhcnRXYXNEaXNwYXRjaGVkID0gZmFsc2U7CgoJCS8qKgoJCSAqIFRoZSBudW1iZXIgb2YgbWF4aW11bSBvcGVuIGNvbm5lY3Rpb25zIHRoYXQgYSBsb2FkUXVldWUgdHJpZXMgdG8gbWFpbnRhaW4uIFBsZWFzZSBzZWUKCQkgKiB7eyNjcm9zc0xpbmsgIkxvYWRRdWV1ZS9zZXRNYXhDb25uZWN0aW9ucyJ9fXt7L2Nyb3NzTGlua319IGZvciBtb3JlIGluZm9ybWF0aW9uLgoJCSAqIEBwcm9wZXJ0eSBfbWF4Q29ubmVjdGlvbnMKCQkgKiBAdHlwZSB7TnVtYmVyfQoJCSAqIEBkZWZhdWx0IDEKCQkgKiBAcHJpdmF0ZQoJCSAqLwoJCXRoaXMuX21heENvbm5lY3Rpb25zID0gMTsKCgkJLyoqCgkJICogRGV0ZXJtaW5lcyBpZiB0aGVyZSBpcyBjdXJyZW50bHkgYSBzY3JpcHQgbG9hZGluZy4gVGhpcyBoZWxwcyBlbnN1cmUgdGhhdCBvbmx5IGEgc2luZ2xlIHNjcmlwdCBsb2FkcyBhdCBvbmNlIHdoZW4KCQkgKiB1c2luZyBhIHNjcmlwdCB0YWcgdG8gZG8gcHJlbG9hZGluZy4KCQkgKiBAcHJvcGVydHkgX2N1cnJlbnRseUxvYWRpbmdTY3JpcHQKCQkgKiBAdHlwZSB7Qm9vbGVhbn0KCQkgKiBAcHJpdmF0ZQoJCSAqLwoJCXRoaXMuX2N1cnJlbnRseUxvYWRpbmdTY3JpcHQgPSBudWxsOwoKCQkvKioKCQkgKiBBbiBhcnJheSBjb250YWluaW5nIHRoZSBjdXJyZW50bHkgZG93bmxvYWRpbmcgZmlsZXMuCgkJICogQHByb3BlcnR5IF9jdXJyZW50TG9hZHMKCQkgKiBAdHlwZSB7QXJyYXl9CgkJICogQHByaXZhdGUKCQkgKi8KCQl0aGlzLl9jdXJyZW50TG9hZHMgPSBbXTsKCgkJLyoqCgkJICogQW4gYXJyYXkgY29udGFpbmluZyB0aGUgcXVldWVkIGl0ZW1zIHRoYXQgaGF2ZSBub3QgeWV0IHN0YXJ0ZWQgZG93bmxvYWRpbmcuCgkJICogQHByb3BlcnR5IF9sb2FkUXVldWUKCQkgKiBAdHlwZSB7QXJyYXl9CgkJICogQHByaXZhdGUKCQkgKi8KCQl0aGlzLl9sb2FkUXVldWUgPSBbXTsKCgkJLyoqCgkJICogQW4gYXJyYXkgY29udGFpbmluZyBkb3dubG9hZHMgdGhhdCBoYXZlIG5vdCBjb21wbGV0ZWQsIHNvIHRoYXQgdGhlIExvYWRRdWV1ZSBjYW4gYmUgcHJvcGVybHkgcmVzZXQuCgkJICogQHByb3BlcnR5IF9sb2FkUXVldWVCYWNrdXAKCQkgKiBAdHlwZSB7QXJyYXl9CgkJICogQHByaXZhdGUKCQkgKi8KCQl0aGlzLl9sb2FkUXVldWVCYWNrdXAgPSBbXTsKCgkJLyoqCgkJICogQW4gb2JqZWN0IGhhc2ggb2YgaXRlbXMgdGhhdCBoYXZlIGZpbmlzaGVkIGRvd25sb2FkaW5nLCBpbmRleGVkIGJ5IHRoZSB7eyNjcm9zc0xpbmsgIkxvYWRJdGVtIn19e3svY3Jvc3NMaW5rfX0KCQkgKiBpZC4KCQkgKiBAcHJvcGVydHkgX2xvYWRJdGVtc0J5SWQKCQkgKiBAdHlwZSB7T2JqZWN0fQoJCSAqIEBwcml2YXRlCgkJICovCgkJdGhpcy5fbG9hZEl0ZW1zQnlJZCA9IHt9OwoKCQkvKioKCQkgKiBBbiBvYmplY3QgaGFzaCBvZiBpdGVtcyB0aGF0IGhhdmUgZmluaXNoZWQgZG93bmxvYWRpbmcsIGluZGV4ZWQgYnkge3sjY3Jvc3NMaW5rICJMb2FkSXRlbSJ9fXt7L2Nyb3NzTGlua319CgkJICogc291cmNlLgoJCSAqIEBwcm9wZXJ0eSBfbG9hZEl0ZW1zQnlTcmMKCQkgKiBAdHlwZSB7T2JqZWN0fQoJCSAqIEBwcml2YXRlCgkJICovCgkJdGhpcy5fbG9hZEl0ZW1zQnlTcmMgPSB7fTsKCgkJLyoqCgkJICogQW4gb2JqZWN0IGhhc2ggb2YgbG9hZGVkIGl0ZW1zLCBpbmRleGVkIGJ5IHRoZSBJRCBvZiB0aGUge3sjY3Jvc3NMaW5rICJMb2FkSXRlbSJ9fXt7L2Nyb3NzTGlua319LgoJCSAqIEBwcm9wZXJ0eSBfbG9hZGVkUmVzdWx0cwoJCSAqIEB0eXBlIHtPYmplY3R9CgkJICogQHByaXZhdGUKCQkgKi8KCQl0aGlzLl9sb2FkZWRSZXN1bHRzID0ge307CgoJCS8qKgoJCSAqIEFuIG9iamVjdCBoYXNoIG9mIHVuLXBhcnNlZCBsb2FkZWQgaXRlbXMsIGluZGV4ZWQgYnkgdGhlIElEIG9mIHRoZSB7eyNjcm9zc0xpbmsgIkxvYWRJdGVtIn19e3svY3Jvc3NMaW5rfX0uCgkJICogQHByb3BlcnR5IF9sb2FkZWRSYXdSZXN1bHRzCgkJICogQHR5cGUge09iamVjdH0KCQkgKiBAcHJpdmF0ZQoJCSAqLwoJCXRoaXMuX2xvYWRlZFJhd1Jlc3VsdHMgPSB7fTsKCgkJLyoqCgkJICogVGhlIG51bWJlciBvZiBpdGVtcyB0aGF0IGhhdmUgYmVlbiByZXF1ZXN0ZWQuIFRoaXMgaGVscHMgbWFuYWdlIGFuIG92ZXJhbGwgcHJvZ3Jlc3Mgd2l0aG91dCBrbm93aW5nIGhvdyBsYXJnZQoJCSAqIHRoZSBmaWxlcyBhcmUgYmVmb3JlIHRoZXkgYXJlIGRvd25sb2FkZWQuIFRoaXMgZG9lcyBub3QgaW5jbHVkZSBpdGVtcyBpbnNpZGUgb2YgbG9hZGVycyBzdWNoIGFzIHRoZQoJCSAqIHt7I2Nyb3NzTGluayAiTWFuaWZlc3RMb2FkZXIifX17ey9jcm9zc0xpbmt9fS4KCQkgKiBAcHJvcGVydHkgX251bUl0ZW1zCgkJICogQHR5cGUge051bWJlcn0KCQkgKiBAZGVmYXVsdCAwCgkJICogQHByaXZhdGUKCQkgKi8KCQl0aGlzLl9udW1JdGVtcyA9IDA7CgoJCS8qKgoJCSAqIFRoZSBudW1iZXIgb2YgaXRlbXMgdGhhdCBoYXZlIGNvbXBsZXRlZCBsb2FkZWQuIFRoaXMgaGVscHMgbWFuYWdlIGFuIG92ZXJhbGwgcHJvZ3Jlc3Mgd2l0aG91dCBrbm93aW5nIGhvdyBsYXJnZQoJCSAqIHRoZSBmaWxlcyBhcmUgYmVmb3JlIHRoZXkgYXJlIGRvd25sb2FkZWQuCgkJICogQHByb3BlcnR5IF9udW1JdGVtc0xvYWRlZAoJCSAqIEB0eXBlIHtOdW1iZXJ9CgkJICogQGRlZmF1bHQgMAoJCSAqIEBwcml2YXRlCgkJICovCgkJdGhpcy5fbnVtSXRlbXNMb2FkZWQgPSAwOwoKCQkvKioKCQkgKiBBIGxpc3Qgb2Ygc2NyaXB0cyBpbiB0aGUgb3JkZXIgdGhleSB3ZXJlIHJlcXVlc3RlZC4gVGhpcyBoZWxwcyBlbnN1cmUgdGhhdCBzY3JpcHRzIGFyZSAiY29tcGxldGVkIiBpbiB0aGUgcmlnaHQKCQkgKiBvcmRlci4KCQkgKiBAcHJvcGVydHkgX3NjcmlwdE9yZGVyCgkJICogQHR5cGUge0FycmF5fQoJCSAqIEBwcml2YXRlCgkJICovCgkJdGhpcy5fc2NyaXB0T3JkZXIgPSBbXTsKCgkJLyoqCgkJICogQSBsaXN0IG9mIHNjcmlwdHMgdGhhdCBoYXZlIGJlZW4gbG9hZGVkLiBJdGVtcyBhcmUgYWRkZWQgdG8gdGhpcyBsaXN0IGFzIDxjb2RlPm51bGw8L2NvZGU+IHdoZW4gdGhleSBhcmUKCQkgKiByZXF1ZXN0ZWQsIGNvbnRhaW4gdGhlIGxvYWRlZCBpdGVtIGlmIGl0IGhhcyBjb21wbGV0ZWQsIGJ1dCBub3QgYmVlbiBkaXNwYXRjaGVkIHRvIHRoZSB1c2VyLCBhbmQgPGNvZGU+dHJ1ZTwvdHJ1ZT4KCQkgKiBvbmNlIHRoZXkgYXJlIGNvbXBsZXRlIGFuZCBoYXZlIGJlZW4gZGlzcGF0Y2hlZC4KCQkgKiBAcHJvcGVydHkgX2xvYWRlZFNjcmlwdHMKCQkgKiBAdHlwZSB7QXJyYXl9CgkJICogQHByaXZhdGUKCQkgKi8KCQl0aGlzLl9sb2FkZWRTY3JpcHRzID0gW107CgoJCS8qKgoJCSAqIFRoZSBsYXN0IHByb2dyZXNzIGFtb3VudC4gVGhpcyBpcyB1c2VkIHRvIHN1cHByZXNzIGR1cGxpY2F0ZSBwcm9ncmVzcyBldmVudHMuCgkJICogQHByb3BlcnR5IF9sYXN0UHJvZ3Jlc3MKCQkgKiBAdHlwZSB7TnVtYmVyfQoJCSAqIEBwcml2YXRlCgkJICogQHNpbmNlIDAuNi4wCgkJICovCgkJdGhpcy5fbGFzdFByb2dyZXNzID0gTmFOOwoKCQkvKioKCQkgKiBBbiBpbnRlcm5hbCBsaXN0IG9mIGFsbCB0aGUgZGVmYXVsdCBMb2FkZXJzIHRoYXQgYXJlIGluY2x1ZGVkIHdpdGggUHJlbG9hZEpTLiBCZWZvcmUgYW4gaXRlbSBpcyBsb2FkZWQsIHRoZQoJCSAqIGF2YWlsYWJsZSBsb2FkZXIgbGlzdCBpcyBpdGVyYXRlZCwgaW4gdGhlIG9yZGVyIHRoZXkgYXJlIGluY2x1ZGVkLCBhbmQgYXMgc29vbiBhcyBhIGxvYWRlciBpbmRpY2F0ZXMgaXQgY2FuCgkJICogaGFuZGxlIHRoZSBjb250ZW50LCBpdCB3aWxsIGJlIHNlbGVjdGVkLiBUaGUgZGVmYXVsdCBsb2FkZXIsICh7eyNjcm9zc0xpbmsgIlRleHRMb2FkZXIifX17ey9jcm9zc0xpbmt9fSBpcwoJCSAqIGxhc3QgaW4gdGhlIGxpc3QsIHNvIGl0IHdpbGwgYmUgdXNlZCBpZiBubyBvdGhlciBtYXRjaCBpcyBmb3VuZC4gVHlwaWNhbGx5LCBsb2FkZXJzIHdpbGwgbWF0Y2ggYmFzZWQgb24gdGhlCgkJICoge3sjY3Jvc3NMaW5rICJMb2FkSXRlbS90eXBlIn19e3svY3Jvc3NMaW5rfX0sIHdoaWNoIGlzIGF1dG9tYXRpY2FsbHkgZGV0ZXJtaW5lZCB1c2luZyB0aGUgZmlsZSBleHRlbnNpb24gb2YKCQkgKiB0aGUge3sjY3Jvc3NMaW5rICJMb2FkSXRlbS9zcmM6cHJvcGVydHkifX17ey9jcm9zc0xpbmt9fS4KCQkgKgoJCSAqIExvYWRlcnMgY2FuIGJlIHJlbW92ZWQgZnJvbSBQcmVsb2FkSlMgYnkgc2ltcGx5IG5vdCBpbmNsdWRpbmcgdGhlbS4KCQkgKgoJCSAqIEN1c3RvbSBsb2FkZXJzIGluc3RhbGxlZCB1c2luZyB7eyNjcm9zc0xpbmsgInJlZ2lzdGVyTG9hZGVyIn19e3svY3Jvc3NMaW5rfX0gd2lsbCBiZSBwcmVwZW5kZWQgdG8gdGhpcyBsaXN0CgkJICogc28gdGhhdCB0aGV5IGFyZSBjaGVja2VkIGZpcnN0LgoJCSAqIEBwcm9wZXJ0eSBfYXZhaWxhYmxlTG9hZGVycwoJCSAqIEB0eXBlIHtBcnJheX0KCQkgKiBAcHJpdmF0ZQoJCSAqIEBzaW5jZSAwLjYuMAoJCSAqLwoJCXRoaXMuX2F2YWlsYWJsZUxvYWRlcnMgPSBbCgkJCWNyZWF0ZWpzLkltYWdlTG9hZGVyLAoJCQljcmVhdGVqcy5KYXZhU2NyaXB0TG9hZGVyLAoJCQljcmVhdGVqcy5DU1NMb2FkZXIsCgkJCWNyZWF0ZWpzLkpTT05Mb2FkZXIsCgkJCWNyZWF0ZWpzLkpTT05QTG9hZGVyLAoJCQljcmVhdGVqcy5Tb3VuZExvYWRlciwKCQkJY3JlYXRlanMuTWFuaWZlc3RMb2FkZXIsCgkJCWNyZWF0ZWpzLlNwcml0ZVNoZWV0TG9hZGVyLAoJCQljcmVhdGVqcy5YTUxMb2FkZXIsCgkJCWNyZWF0ZWpzLlNWR0xvYWRlciwKCQkJY3JlYXRlanMuQmluYXJ5TG9hZGVyLAoJCQljcmVhdGVqcy5WaWRlb0xvYWRlciwKCQkJY3JlYXRlanMuVGV4dExvYWRlciwKCQldOwoKCQkvKioKCQkgKiBUaGUgbnVtYmVyIG9mIGJ1aWx0IGluIGxvYWRlcnMsIHNvIHRoZXkgY2FuJ3QgYmUgcmVtb3ZlZCBieSB7eyNjcm9zc0xpbmsgInVucmVnaXN0ZXJMb2FkZXIifX17ey9jcm9zc0xpbmt9LgoJCSAqIEBwcm9wZXJ0eSBfZGVmYXVsdExvYWRlckxlbmd0aAoJCSAqIEB0eXBlIHtOdW1iZXJ9CgkJICogQHByaXZhdGUKCQkgKiBAc2luY2UgMC42LjAKCQkgKi8KCQl0aGlzLl9kZWZhdWx0TG9hZGVyTGVuZ3RoID0gdGhpcy5fYXZhaWxhYmxlTG9hZGVycy5sZW5ndGg7Cgl9OwoKCi8vIHN0YXRpYyBwcm9wZXJ0aWVzCgkvKioKCSAqIFRoZSB0aW1lIGluIG1pbGxpc2Vjb25kcyB0byBhc3N1bWUgYSBsb2FkIGhhcyBmYWlsZWQuIEFuIHt7I2Nyb3NzTGluayAiQWJzdHJhY3RMb2FkZXIvZXJyb3I6ZXZlbnQifX17ey9jcm9zc0xpbmt9fQoJICogZXZlbnQgaXMgZGlzcGF0Y2hlZCBpZiB0aGUgdGltZW91dCBpcyByZWFjaGVkIGJlZm9yZSBhbnkgZGF0YSBpcyByZWNlaXZlZC4KCSAqIEBwcm9wZXJ0eSBsb2FkVGltZW91dAoJICogQHR5cGUge051bWJlcn0KCSAqIEBkZWZhdWx0IDgwMDAKCSAqIEBzdGF0aWMKCSAqIEBzaW5jZSAwLjQuMQoJICogQGRlcHJlY2F0ZWQgSW4gZmF2b3VyIG9mIExvYWRJdGVtLmxvYWRUaW1lb3V0CgkgKi8KCXMubG9hZFRpbWVvdXQgPSA4MDAwOwoKCS8qKgoJICogVGhlIHRpbWUgaW4gbWlsbGlzZWNvbmRzIHRvIGFzc3VtZSBhIGxvYWQgaGFzIGZhaWxlZC4KCSAqIEBwcm9wZXJ0eSBMT0FEX1RJTUVPVVQKCSAqIEB0eXBlIHtOdW1iZXJ9CgkgKiBAZGVmYXVsdCAwCgkgKiBAZGVwcmVjYXRlZCBpbiBmYXZvciBvZiB0aGUge3sjY3Jvc3NMaW5rICJMb2FkUXVldWUvbG9hZFRpbWVvdXQ6cHJvcGVydHkifX17ey9jcm9zc0xpbmt9fSBwcm9wZXJ0eS4KCSAqLwoJcy5MT0FEX1RJTUVPVVQgPSAwOwoKLy8gUHJlbG9hZCBUeXBlcwoJLyoqCgkgKiBAcHJvcGVydHkgQklOQVJZCgkgKiBAdHlwZSB7U3RyaW5nfQoJICogQGRlZmF1bHQgYmluYXJ5CgkgKiBAc3RhdGljCgkgKiBAZGVwcmVjYXRlZCBVc2UgdGhlIEFic3RyYWN0TG9hZGVyIHt7I2Nyb3NzTGluayAiQWJzdHJhY3RMb2FkZXIvQklOQVJZOnByb3BlcnR5In19e3svY3Jvc3NMaW5rfX0gaW5zdGVhZC4KCSAqLwoJcy5CSU5BUlkgPSBjcmVhdGVqcy5BYnN0cmFjdExvYWRlci5CSU5BUlk7CgoJLyoqCgkgKiBAcHJvcGVydHkgQ1NTCgkgKiBAdHlwZSB7U3RyaW5nfQoJICogQGRlZmF1bHQgY3NzCgkgKiBAc3RhdGljCgkgKiBAZGVwcmVjYXRlZCBVc2UgdGhlIEFic3RyYWN0TG9hZGVyIHt7I2Nyb3NzTGluayAiQWJzdHJhY3RMb2FkZXIvQ1NTOnByb3BlcnR5In19e3svY3Jvc3NMaW5rfX0gaW5zdGVhZC4KCSAqLwoJcy5DU1MgPSBjcmVhdGVqcy5BYnN0cmFjdExvYWRlci5DU1M7CgoJLyoqCgkgKiBAcHJvcGVydHkgSU1BR0UKCSAqIEB0eXBlIHtTdHJpbmd9CgkgKiBAZGVmYXVsdCBpbWFnZQoJICogQHN0YXRpYwoJICogQGRlcHJlY2F0ZWQgVXNlIHRoZSBBYnN0cmFjdExvYWRlciB7eyNjcm9zc0xpbmsgIkFic3RyYWN0TG9hZGVyL0NTUzpwcm9wZXJ0eSJ9fXt7L2Nyb3NzTGlua319IGluc3RlYWQuCgkgKi8KCXMuSU1BR0UgPSBjcmVhdGVqcy5BYnN0cmFjdExvYWRlci5JTUFHRTsKCgkvKioKCSAqIEBwcm9wZXJ0eSBKQVZBU0NSSVBUCgkgKiBAdHlwZSB7U3RyaW5nfQoJICogQGRlZmF1bHQgamF2YXNjcmlwdAoJICogQHN0YXRpYwoJICogQGRlcHJlY2F0ZWQgVXNlIHRoZSBBYnN0cmFjdExvYWRlciB7eyNjcm9zc0xpbmsgIkFic3RyYWN0TG9hZGVyL0pBVkFTQ1JJUFQ6cHJvcGVydHkifX17ey9jcm9zc0xpbmt9fSBpbnN0ZWFkLgoJICovCglzLkpBVkFTQ1JJUFQgPSBjcmVhdGVqcy5BYnN0cmFjdExvYWRlci5KQVZBU0NSSVBUOwoKCS8qKgoJICogQHByb3BlcnR5IEpTT04KCSAqIEB0eXBlIHtTdHJpbmd9CgkgKiBAZGVmYXVsdCBqc29uCgkgKiBAc3RhdGljCgkgKiBAZGVwcmVjYXRlZCBVc2UgdGhlIEFic3RyYWN0TG9hZGVyIHt7I2Nyb3NzTGluayAiQWJzdHJhY3RMb2FkZXIvSlNPTjpwcm9wZXJ0eSJ9fXt7L2Nyb3NzTGlua319IGluc3RlYWQuCgkgKi8KCXMuSlNPTiA9IGNyZWF0ZWpzLkFic3RyYWN0TG9hZGVyLkpTT047CgoJLyoqCgkgKiBAcHJvcGVydHkgSlNPTlAKCSAqIEB0eXBlIHtTdHJpbmd9CgkgKiBAZGVmYXVsdCBqc29ucAoJICogQHN0YXRpYwoJICogQGRlcHJlY2F0ZWQgVXNlIHRoZSBBYnN0cmFjdExvYWRlciB7eyNjcm9zc0xpbmsgIkFic3RyYWN0TG9hZGVyL0pTT05QOnByb3BlcnR5In19e3svY3Jvc3NMaW5rfX0gaW5zdGVhZC4KCSAqLwoJcy5KU09OUCA9IGNyZWF0ZWpzLkFic3RyYWN0TG9hZGVyLkpTT05QOwoKCS8qKgoJICogQHByb3BlcnR5IE1BTklGRVNUCgkgKiBAdHlwZSB7U3RyaW5nfQoJICogQGRlZmF1bHQgbWFuaWZlc3QKCSAqIEBzdGF0aWMKCSAqIEBzaW5jZSAwLjQuMQoJICogQGRlcHJlY2F0ZWQgVXNlIHRoZSBBYnN0cmFjdExvYWRlciB7eyNjcm9zc0xpbmsgIkFic3RyYWN0TG9hZGVyL01BTklGRVNUOnByb3BlcnR5In19e3svY3Jvc3NMaW5rfX0gaW5zdGVhZC4KCSAqLwoJcy5NQU5JRkVTVCA9IGNyZWF0ZWpzLkFic3RyYWN0TG9hZGVyLk1BTklGRVNUOwoKCS8qKgoJICogQHByb3BlcnR5IFNPVU5ECgkgKiBAdHlwZSB7U3RyaW5nfQoJICogQGRlZmF1bHQgc291bmQKCSAqIEBzdGF0aWMKCSAqIEBkZXByZWNhdGVkIFVzZSB0aGUgQWJzdHJhY3RMb2FkZXIge3sjY3Jvc3NMaW5rICJBYnN0cmFjdExvYWRlci9KQVZBU0NSSVBUOnByb3BlcnR5In19e3svY3Jvc3NMaW5rfX0gaW5zdGVhZC4KCSAqLwoJcy5TT1VORCA9IGNyZWF0ZWpzLkFic3RyYWN0TG9hZGVyLlNPVU5EOwoKCS8qKgoJICogQHByb3BlcnR5IFZJREVPCgkgKiBAdHlwZSB7U3RyaW5nfQoJICogQGRlZmF1bHQgdmlkZW8KCSAqIEBzdGF0aWMKCSAqIEBkZXByZWNhdGVkIFVzZSB0aGUgQWJzdHJhY3RMb2FkZXIge3sjY3Jvc3NMaW5rICJBYnN0cmFjdExvYWRlci9KQVZBU0NSSVBUOnByb3BlcnR5In19e3svY3Jvc3NMaW5rfX0gaW5zdGVhZC4KCSAqLwoJcy5WSURFTyA9IGNyZWF0ZWpzLkFic3RyYWN0TG9hZGVyLlZJREVPOwoKCS8qKgoJICogQHByb3BlcnR5IFNWRwoJICogQHR5cGUge1N0cmluZ30KCSAqIEBkZWZhdWx0IHN2ZwoJICogQHN0YXRpYwoJICogQGRlcHJlY2F0ZWQgVXNlIHRoZSBBYnN0cmFjdExvYWRlciB7eyNjcm9zc0xpbmsgIkFic3RyYWN0TG9hZGVyL1NWRzpwcm9wZXJ0eSJ9fXt7L2Nyb3NzTGlua319IGluc3RlYWQuCgkgKi8KCXMuU1ZHID0gY3JlYXRlanMuQWJzdHJhY3RMb2FkZXIuU1ZHOwoKCS8qKgoJICogQHByb3BlcnR5IFRFWFQKCSAqIEB0eXBlIHtTdHJpbmd9CgkgKiBAZGVmYXVsdCB0ZXh0CgkgKiBAc3RhdGljCgkgKiBAZGVwcmVjYXRlZCBVc2UgdGhlIEFic3RyYWN0TG9hZGVyIHt7I2Nyb3NzTGluayAiQWJzdHJhY3RMb2FkZXIvVEVYVDpwcm9wZXJ0eSJ9fXt7L2Nyb3NzTGlua319IGluc3RlYWQuCgkgKi8KCXMuVEVYVCA9IGNyZWF0ZWpzLkFic3RyYWN0TG9hZGVyLlRFWFQ7CgoJLyoqCgkgKiBAcHJvcGVydHkgWE1MCgkgKiBAdHlwZSB7U3RyaW5nfQoJICogQGRlZmF1bHQgeG1sCgkgKiBAc3RhdGljCgkgKiBAZGVwcmVjYXRlZCBVc2UgdGhlIEFic3RyYWN0TG9hZGVyIHt7I2Nyb3NzTGluayAiQWJzdHJhY3RMb2FkZXIvWE1MOnByb3BlcnR5In19e3svY3Jvc3NMaW5rfX0gaW5zdGVhZC4KCSAqLwoJcy5YTUwgPSBjcmVhdGVqcy5BYnN0cmFjdExvYWRlci5YTUw7CgoJLyoqCgkgKiBAcHJvcGVydHkgUE9TVAoJICogQHR5cGUge3N0cmluZ30KCSAqIEBkZXByZWNhdGVkIFVzZSB0aGUgQWJzdHJhY3RMb2FkZXIge3sjY3Jvc3NMaW5rICJBYnN0cmFjdExvYWRlci9QT1NUOnByb3BlcnR5In19e3svY3Jvc3NMaW5rfX0gaW5zdGVhZC4KCSAqLwoJcy5QT1NUID0gY3JlYXRlanMuQWJzdHJhY3RMb2FkZXIuUE9TVDsKCgkvKioKCSAqIEBwcm9wZXJ0eSBHRVQKCSAqIEB0eXBlIHtzdHJpbmd9CgkgKiBAZGVwcmVjYXRlZCBVc2UgdGhlIEFic3RyYWN0TG9hZGVyIHt7I2Nyb3NzTGluayAiQWJzdHJhY3RMb2FkZXIvR0VUOnByb3BlcnR5In19e3svY3Jvc3NMaW5rfX0gaW5zdGVhZC4KCSAqLwoJcy5HRVQgPSBjcmVhdGVqcy5BYnN0cmFjdExvYWRlci5HRVQ7CgovLyBldmVudHMKCS8qKgoJICogVGhpcyBldmVudCBpcyBmaXJlZCB3aGVuIGFuIGluZGl2aWR1YWwgZmlsZSBoYXMgbG9hZGVkLCBhbmQgYmVlbiBwcm9jZXNzZWQuCgkgKiBAZXZlbnQgZmlsZWxvYWQKCSAqIEBwYXJhbSB7T2JqZWN0fSB0YXJnZXQgVGhlIG9iamVjdCB0aGF0IGRpc3BhdGNoZWQgdGhlIGV2ZW50LgoJICogQHBhcmFtIHtTdHJpbmd9IHR5cGUgVGhlIGV2ZW50IHR5cGUuCgkgKiBAcGFyYW0ge09iamVjdH0gaXRlbSBUaGUgZmlsZSBpdGVtIHdoaWNoIHdhcyBzcGVjaWZpZWQgaW4gdGhlIHt7I2Nyb3NzTGluayAiTG9hZFF1ZXVlL2xvYWRGaWxlIn19e3svY3Jvc3NMaW5rfX0KCSAqIG9yIHt7I2Nyb3NzTGluayAiTG9hZFF1ZXVlL2xvYWRNYW5pZmVzdCJ9fXt7L2Nyb3NzTGlua319IGNhbGwuIElmIG9ubHkgYSBzdHJpbmcgcGF0aCBvciB0YWcgd2FzIHNwZWNpZmllZCwgdGhlCgkgKiBvYmplY3Qgd2lsbCBjb250YWluIHRoYXQgdmFsdWUgYXMgYSBgc3JjYCBwcm9wZXJ0eS4KCSAqIEBwYXJhbSB7T2JqZWN0fSByZXN1bHQgVGhlIEhUTUwgdGFnIG9yIHBhcnNlZCByZXN1bHQgb2YgdGhlIGxvYWRlZCBpdGVtLgoJICogQHBhcmFtIHtPYmplY3R9IHJhd1Jlc3VsdCBUaGUgdW5wcm9jZXNzZWQgcmVzdWx0LCB1c3VhbGx5IHRoZSByYXcgdGV4dCBvciBiaW5hcnkgZGF0YSBiZWZvcmUgaXQgaXMgY29udmVydGVkCgkgKiB0byBhIHVzYWJsZSBvYmplY3QuCgkgKiBAc2luY2UgMC4zLjAKCSAqLwoKCS8qKgoJICogVGhpcyB7eyNjcm9zc0xpbmsgIlByb2dyZXNzRXZlbnQifX17ey9jcm9zc0xpbmt9fSB0aGF0IGlzIGZpcmVkIHdoZW4gYW4gYW4gaW5kaXZpZHVhbCBmaWxlJ3MgcHJvZ3Jlc3MgY2hhbmdlcy4KCSAqIEBldmVudCBmaWxlcHJvZ3Jlc3MKCSAqIEBzaW5jZSAwLjMuMAoJICovCgoJLyoqCgkgKiBUaGlzIGV2ZW50IGlzIGZpcmVkIHdoZW4gYW4gaW5kaXZpZHVhbCBmaWxlIHN0YXJ0cyB0byBsb2FkLgoJICogQGV2ZW50IGZpbGVzdGFydAoJICogQHBhcmFtIHtPYmplY3R9IFRoZSBvYmplY3QgdGhhdCBkaXNwYXRjaGVkIHRoZSBldmVudC4KCSAqIEBwYXJhbSB7U3RyaW5nfSB0eXBlIFRoZSBldmVudCB0eXBlLgoJICogQHBhcmFtIHtPYmplY3R9IGl0ZW0gVGhlIGZpbGUgaXRlbSB3aGljaCB3YXMgc3BlY2lmaWVkIGluIHRoZSB7eyNjcm9zc0xpbmsgIkxvYWRRdWV1ZS9sb2FkRmlsZSJ9fXt7L2Nyb3NzTGlua319CgkgKiBvciB7eyNjcm9zc0xpbmsgIkxvYWRRdWV1ZS9sb2FkTWFuaWZlc3QifX17ey9jcm9zc0xpbmt9fSBjYWxsLiBJZiBvbmx5IGEgc3RyaW5nIHBhdGggb3IgdGFnIHdhcyBzcGVjaWZpZWQsIHRoZQoJICogb2JqZWN0IHdpbGwgY29udGFpbiB0aGF0IHZhbHVlIGFzIGEgcHJvcGVydHkuCgkgKi8KCi8vIHB1YmxpYyBtZXRob2RzCgkvKioKCSAqIFJlZ2lzdGVyIGEgY3VzdG9tIGxvYWRlcnMgY2xhc3MuIE5ldyBsb2FkZXJzIGFyZSBnaXZlbiBwcmVjZWRlbmNlIG92ZXIgbG9hZGVycyBhZGRlZCBlYXJsaWVyIGFuZCBkZWZhdWx0IGxvYWRlcnMuCgkgKiBJdCBpcyByZWNvbW1lbmRlZCB0aGF0IGxvYWRlcnMgZXh0ZW5kIHt7I2Nyb3NzTGluayAiQWJzdHJhY3RMb2FkZXIifX17ey9jcm9zc0xpbmt9fS4gTG9hZGVycyBjYW4gb25seSBiZSBhZGRlZAoJICogb25jZSwgYW5kIHdpbGwgYmUgcHJlcGVuZGVkIHRvIHRoZSBsaXN0IG9mIGF2YWlsYWJsZSBsb2FkZXJzLgoJICogQG1ldGhvZCByZWdpc3RlckxvYWRlcgoJICogQHBhcmFtIHtDbGFzc30gVGhlIEFic3RyYWN0TG9hZGVyIGNsYXNzIHRvIGFkZC4KCSAqIEBzaW5jZSAwLjYuMAoJICovCglwLnJlZ2lzdGVyTG9hZGVyID0gZnVuY3Rpb24gKGxvYWRlcikgewoJCWlmICghbG9hZGVyIHx8ICFsb2FkZXIuY2FuTG9hZEl0ZW0pIHsKCQkJdGhyb3cgbmV3IEVycm9yKCJsb2FkZXIgaXMgb2YgYW4gaW5jb3JyZWN0IHR5cGUuIik7CgkJfSBlbHNlIGlmICh0aGlzLl9hdmFpbGFibGVMb2FkZXJzLmluZGV4T2YobG9hZGVyKSAhPSAtMSkgewoJCQl0aHJvdyBuZXcgRXJyb3IoImxvYWRlciBhbHJlYWR5IGV4aXN0cy4iKTsgLy9MTTogTWF5YmUganVzdCBzaWxlbnRseSBmYWlsIGhlcmUKCQl9CgoJCXRoaXMuX2F2YWlsYWJsZUxvYWRlcnMudW5zaGlmdChsb2FkZXIpOwoJfTsKCgkvKioKCSAqIFJlbW92ZSBhIGN1c3RvbSBsb2FkZXIgYWRkZWQgdXNpZyB7eyNjcm9zc0xpbmsgInJlZ2lzdGVyTG9hZGVyIn19e3svY3Jvc3NMaW5rfX0uIE9ubHkgY3VzdG9tIGxvYWRlcnMgY2FuIGJlCgkgKiB1bnJlZ2lzdGVyZWQsIHRoZSBkZWZhdWx0IGxvYWRlcnMgd2lsbCBhbHdheXMgYmUgYXZhaWxhYmxlLgoJICogQG1ldGhvZCB1bnJlZ2lzdGVyTG9hZGVyCgkgKiBAcGFyYW0ge0NsYXNzfSBsb2FkZXIgVGhlIEFic3RyYWN0TG9hZGVyIGNsYXNzIHRvIHJlbW92ZQoJICovCglwLnVucmVnaXN0ZXJMb2FkZXIgPSBmdW5jdGlvbiAobG9hZGVyKSB7CgkJdmFyIGlkeCA9IHRoaXMuX2F2YWlsYWJsZUxvYWRlcnMuaW5kZXhPZihsb2FkZXIpOwoJCWlmIChpZHggIT0gLTEgJiYgaWR4IDwgdGhpcy5fZGVmYXVsdExvYWRlckxlbmd0aCAtIDEpIHsKCQkJdGhpcy5fYXZhaWxhYmxlTG9hZGVycy5zcGxpY2UoaWR4LCAxKTsKCQl9Cgl9OwoKCS8qKgoJICogQG1ldGhvZCBzZXRVc2VYSFIKCSAqIEBwYXJhbSB7Qm9vbGVhbn0gdmFsdWUgVGhlIG5ldyB1c2VYSFIgdmFsdWUgdG8gc2V0LgoJICogQHJldHVybiB7Qm9vbGVhbn0gVGhlIG5ldyB1c2VYSFIgdmFsdWUuIElmIFhIUiBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBicm93c2VyLCB0aGlzIHdpbGwgcmV0dXJuIGZhbHNlLCBldmVuIGlmCgkgKiB0aGUgcHJvdmlkZWQgdmFsdWUgYXJndW1lbnQgd2FzIHRydWUuCgkgKiBAc2luY2UgMC4zLjAKCSAqIEBkZXByZWNhdGVkIHVzZSB0aGUge3sjY3Jvc3NMaW5rICJwcmVmZXJYSFI6cHJvcGVydHkifX17ey9jcm9zc0xpbmt9fSBwcm9wZXJ0eSwgb3IgdGhlIHt7I2Nyb3NzTGluayAic2V0VXNlWEhSIn19e3svY3Jvc3NMaW5rfX0KCSAqIG1ldGhvZCBpbnN0ZWFkLgoJICovCglwLnNldFVzZVhIUiA9IGZ1bmN0aW9uICh2YWx1ZSkgewoJCXJldHVybiB0aGlzLnNldFByZWZlclhIUih2YWx1ZSk7Cgl9OwoKCS8qKgoJICogQ2hhbmdlIHRoZSB7eyNjcm9zc0xpbmsgInByZWZlclhIUjpwcm9wZXJ0eSJ9fXt7L2Nyb3NzTGlua319IHZhbHVlLiBOb3RlIHRoYXQgaWYgdGhpcyBpcyBzZXQgdG8gYHRydWVgLCBpdCBtYXkKCSAqIGZhaWwsIG9yIGJlIGlnbm9yZWQgZGVwZW5kaW5nIG9uIHRoZSBicm93c2VyJ3MgY2FwYWJpbGl0aWVzIGFuZCB0aGUgbG9hZCB0eXBlLgoJICogQG1ldGhvZCBzZXRQcmVmZXJYSFIKCSAqIEBwYXJhbSB7Qm9vbGVhbn0gdmFsdWUKCSAqIEByZXR1cm5zIHtCb29sZWFufSBUaGUgdmFsdWUgb2Yge3sjY3Jvc3NMaW5rICJwcmVmZXJYSFIifX17ey9jcm9zc0xpbmt9fSB0aGF0IHdhcyBzdWNjZXNzZnVsbHkgc2V0LgoJICogQHNpbmNlIDAuNi4wCgkgKi8KCXAuc2V0UHJlZmVyWEhSID0gZnVuY3Rpb24odmFsdWUpIHsKCQkvLyBEZXRlcm1pbmUgaWYgd2UgY2FuIHVzZSBYSFIuIFhIUiBkZWZhdWx0cyB0byBUUlVFLCBidXQgdGhlIGJyb3dzZXIgbWF5IG5vdCBzdXBwb3J0IGl0LgoJCS8vVE9ETzogU2hvdWxkIHdlIGJlIGNoZWNraW5nIGZvciB0aGUgb3RoZXIgWEhSIHR5cGVzPyBNaWdodCBoYXZlIHRvIGRvIGEgdHJ5L2NhdGNoIG9uIHRoZSBkaWZmZXJlbnQgdHlwZXMgc2ltaWxhciB0byBjcmVhdGVYSFIuCgkJdGhpcy5wcmVmZXJYSFIgPSAodmFsdWUgIT0gZmFsc2UgJiYgd2luZG93LlhNTEh0dHBSZXF1ZXN0ICE9IG51bGwpOwoJCXJldHVybiB0aGlzLnByZWZlclhIUjsKCX07CgoJLyoqCgkgKiBTdG9wcyBhbGwgcXVldWVkIGFuZCBsb2FkaW5nIGl0ZW1zLCBhbmQgY2xlYXJzIHRoZSBxdWV1ZS4gVGhpcyBhbHNvIHJlbW92ZXMgYWxsIGludGVybmFsIHJlZmVyZW5jZXMgdG8gbG9hZGVkCgkgKiBjb250ZW50LCBhbmQgYWxsb3dzIHRoZSBxdWV1ZSB0byBiZSB1c2VkIGFnYWluLgoJICogQG1ldGhvZCByZW1vdmVBbGwKCSAqIEBzaW5jZSAwLjMuMAoJICovCglwLnJlbW92ZUFsbCA9IGZ1bmN0aW9uICgpIHsKCQl0aGlzLnJlbW92ZSgpOwoJfTsKCgkvKioKCSAqIFN0b3BzIGFuIGl0ZW0gZnJvbSBiZWluZyBsb2FkZWQsIGFuZCByZW1vdmVzIGl0IGZyb20gdGhlIHF1ZXVlLiBJZiBub3RoaW5nIGlzIHBhc3NlZCwgYWxsIGl0ZW1zIGFyZSByZW1vdmVkLgoJICogVGhpcyBhbHNvIHJlbW92ZXMgaW50ZXJuYWwgcmVmZXJlbmNlcyB0byBsb2FkZWQgaXRlbShzKS4KCSAqCgkgKiA8aDQ+RXhhbXBsZTwvaDQ+CgkgKgoJICogICAgICBxdWV1ZS5sb2FkTWFuaWZlc3QoWwoJICogICAgICAgICAge3NyYzoidGVzdC5wbmciLCBpZDoicG5nIn0sCgkgKiAgICAgICAgICB7c3JjOiJ0ZXN0LmpwZyIsIGlkOiJqcGcifSwKCSAqICAgICAgICAgIHtzcmM6InRlc3QubXAzIiwgaWQ6Im1wMyJ9CgkgKiAgICAgIF0pOwoJICogICAgICBxdWV1ZS5yZW1vdmUoInBuZyIpOyAvLyBTaW5nbGUgaXRlbSBieSBJRAoJICogICAgICBxdWV1ZS5yZW1vdmUoInBuZyIsICJ0ZXN0LmpwZyIpOyAvLyBJdGVtcyBhcyBhcmd1bWVudHMuIE1peGVkIGlkIGFuZCBzcmMuCgkgKiAgICAgIHF1ZXVlLnJlbW92ZShbInRlc3QucG5nIiwgImpwZyJdKTsgLy8gSXRlbXMgaW4gYW4gQXJyYXkuIE1peGVkIGlkIGFuZCBzcmMuCgkgKgoJICogQG1ldGhvZCByZW1vdmUKCSAqIEBwYXJhbSB7U3RyaW5nIHwgQXJyYXl9IGlkc09yVXJscyogVGhlIGlkIG9yIGlkcyB0byByZW1vdmUgZnJvbSB0aGlzIHF1ZXVlLiBZb3UgY2FuIHBhc3MgYW4gaXRlbSwgYW4gYXJyYXkgb2YKCSAqIGl0ZW1zLCBvciBtdWx0aXBsZSBpdGVtcyBhcyBhcmd1bWVudHMuCgkgKiBAc2luY2UgMC4zLjAKCSAqLwoJcC5yZW1vdmUgPSBmdW5jdGlvbiAoaWRzT3JVcmxzKSB7CgkJdmFyIGFyZ3MgPSBudWxsOwoKCQlpZiAoaWRzT3JVcmxzICYmICEoaWRzT3JVcmxzIGluc3RhbmNlb2YgQXJyYXkpKSB7CgkJCWFyZ3MgPSBbaWRzT3JVcmxzXTsKCQl9IGVsc2UgaWYgKGlkc09yVXJscykgewoJCQlhcmdzID0gaWRzT3JVcmxzOwoJCX0gZWxzZSBpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDApIHsKCQkJcmV0dXJuOwoJCX0KCgkJdmFyIGl0ZW1zV2VyZVJlbW92ZWQgPSBmYWxzZTsKCgkJLy8gRGVzdHJveSBldmVyeXRoaW5nCgkJaWYgKCFhcmdzKSB7CgkJCXRoaXMuY2xvc2UoKTsKCQkJZm9yICh2YXIgbiBpbiB0aGlzLl9sb2FkSXRlbXNCeUlkKSB7CgkJCQl0aGlzLl9kaXNwb3NlSXRlbSh0aGlzLl9sb2FkSXRlbXNCeUlkW25dKTsKCQkJfQoJCQl0aGlzLmluaXQodGhpcy5wcmVmZXJYSFIsIHRoaXMuX2Jhc2VQYXRoKTsKCgkJCS8vIFJlbW92ZSBzcGVjaWZpYyBpdGVtcwoJCX0gZWxzZSB7CgkJCXdoaWxlIChhcmdzLmxlbmd0aCkgewoJCQkJdmFyIGl0ZW0gPSBhcmdzLnBvcCgpOwoJCQkJdmFyIHIgPSB0aGlzLmdldFJlc3VsdChpdGVtKTsKCgkJCQkvL1JlbW92ZSBmcm9tIHRoZSBtYWluIGxvYWQgUXVldWUKCQkJCWZvciAoaSA9IHRoaXMuX2xvYWRRdWV1ZS5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgewoJCQkJCWxvYWRJdGVtID0gdGhpcy5fbG9hZFF1ZXVlW2ldLmdldEl0ZW0oKTsKCQkJCQlpZiAobG9hZEl0ZW0uaWQgPT0gaXRlbSB8fCBsb2FkSXRlbS5zcmMgPT0gaXRlbSkgewoJCQkJCQl0aGlzLl9sb2FkUXVldWUuc3BsaWNlKGksIDEpWzBdLmNhbmNlbCgpOwoJCQkJCQlicmVhazsKCQkJCQl9CgkJCQl9CgoJCQkJLy9SZW1vdmUgZnJvbSB0aGUgYmFja3VwIHF1ZXVlCgkJCQlmb3IgKGkgPSB0aGlzLl9sb2FkUXVldWVCYWNrdXAubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsKCQkJCQlsb2FkSXRlbSA9IHRoaXMuX2xvYWRRdWV1ZUJhY2t1cFtpXS5nZXRJdGVtKCk7CgkJCQkJaWYgKGxvYWRJdGVtLmlkID09IGl0ZW0gfHwgbG9hZEl0ZW0uc3JjID09IGl0ZW0pIHsKCQkJCQkJdGhpcy5fbG9hZFF1ZXVlQmFja3VwLnNwbGljZShpLCAxKVswXS5jYW5jZWwoKTsKCQkJCQkJYnJlYWs7CgkJCQkJfQoJCQkJfQoKCQkJCWlmIChyKSB7CgkJCQkJdGhpcy5fZGlzcG9zZUl0ZW0odGhpcy5nZXRJdGVtKGl0ZW0pKTsKCQkJCX0gZWxzZSB7CgkJCQkJZm9yICh2YXIgaSA9IHRoaXMuX2N1cnJlbnRMb2Fkcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgewoJCQkJCQl2YXIgbG9hZEl0ZW0gPSB0aGlzLl9jdXJyZW50TG9hZHNbaV0uZ2V0SXRlbSgpOwoJCQkJCQlpZiAobG9hZEl0ZW0uaWQgPT0gaXRlbSB8fCBsb2FkSXRlbS5zcmMgPT0gaXRlbSkgewoJCQkJCQkJdGhpcy5fY3VycmVudExvYWRzLnNwbGljZShpLCAxKVswXS5jYW5jZWwoKTsKCQkJCQkJCWl0ZW1zV2VyZVJlbW92ZWQgPSB0cnVlOwoJCQkJCQkJYnJlYWs7CgkJCQkJCX0KCQkJCQl9CgkJCQl9CgkJCX0KCgkJCS8vIElmIHRoaXMgd2FzIGNhbGxlZCBkdXJpbmcgYSBsb2FkLCB0cnkgdG8gbG9hZCB0aGUgbmV4dCBpdGVtLgoJCQlpZiAoaXRlbXNXZXJlUmVtb3ZlZCkgewoJCQkJdGhpcy5fbG9hZE5leHQoKTsKCQkJfQoJCX0KCX07CgoJLyoqCgkgKiBTdG9wcyBhbGwgb3BlbiBsb2FkcywgZGVzdHJveXMgYW55IGxvYWRlZCBpdGVtcywgYW5kIHJlc2V0cyB0aGUgcXVldWUsIHNvIGFsbCBpdGVtcyBjYW4KCSAqIGJlIHJlbG9hZGVkIGFnYWluIGJ5IGNhbGxpbmcge3sjY3Jvc3NMaW5rICJBYnN0cmFjdExvYWRlci9sb2FkIn19e3svY3Jvc3NMaW5rfX0uIEl0ZW1zIGFyZSBub3QgcmVtb3ZlZCBmcm9tIHRoZQoJICogcXVldWUuIFRvIHJlbW92ZSBpdGVtcyB1c2UgdGhlIHt7I2Nyb3NzTGluayAiTG9hZFF1ZXVlL3JlbW92ZSJ9fXt7L2Nyb3NzTGlua319IG9yCgkgKiB7eyNjcm9zc0xpbmsgIkxvYWRRdWV1ZS9yZW1vdmVBbGwifX17ey9jcm9zc0xpbmt9fSBtZXRob2QuCgkgKiBAbWV0aG9kIHJlc2V0CgkgKiBAc2luY2UgMC4zLjAKCSAqLwoJcC5yZXNldCA9IGZ1bmN0aW9uICgpIHsKCQl0aGlzLmNsb3NlKCk7CgkJZm9yICh2YXIgbiBpbiB0aGlzLl9sb2FkSXRlbXNCeUlkKSB7CgkJCXRoaXMuX2Rpc3Bvc2VJdGVtKHRoaXMuX2xvYWRJdGVtc0J5SWRbbl0pOwoJCX0KCgkJLy9SZXNldCB0aGUgcXVldWUgdG8gaXRzIHN0YXJ0IHN0YXRlCgkJdmFyIGEgPSBbXTsKCQlmb3IgKHZhciBpID0gMCwgbCA9IHRoaXMuX2xvYWRRdWV1ZUJhY2t1cC5sZW5ndGg7IGkgPCBsOyBpKyspIHsKCQkJYS5wdXNoKHRoaXMuX2xvYWRRdWV1ZUJhY2t1cFtpXS5nZXRJdGVtKCkpOwoJCX0KCgkJdGhpcy5sb2FkTWFuaWZlc3QoYSwgZmFsc2UpOwoJfTsKCgkvKioKCSAqIFJlZ2lzdGVyIGEgcGx1Z2luLiBQbHVnaW5zIGNhbiBtYXAgdG8gbG9hZCB0eXBlcyAoc291bmQsIGltYWdlLCBldGMpLCBvciBzcGVjaWZpYyBleHRlbnNpb25zIChwbmcsIG1wMywgZXRjKS4KCSAqIEN1cnJlbnRseSwgb25seSBvbmUgcGx1Z2luIGNhbiBleGlzdCBwZXIgdHlwZS9leHRlbnNpb24uCgkgKgoJICogV2hlbiBhIHBsdWdpbiBpcyBpbnN0YWxsZWQsIGEgPGNvZGU+Z2V0UHJlbG9hZEhhbmRsZXJzKCk8L2NvZGU+IG1ldGhvZCB3aWxsIGJlIGNhbGxlZCBvbiBpdC4gRm9yIG1vcmUgaW5mb3JtYXRpb24KCSAqIG9uIHRoaXMgbWV0aG9kLCBjaGVjayBvdXQgdGhlIHt7I2Nyb3NzTGluayAiU2FtcGxlUGx1Z2luL2dldFByZWxvYWRIYW5kbGVycyJ9fXt7L2Nyb3NzTGlua319IG1ldGhvZCBpbiB0aGUKCSAqIHt7I2Nyb3NzTGluayAiU2FtcGxlUGx1Z2luIn19e3svY3Jvc3NMaW5rfX0gY2xhc3MuCgkgKgoJICogQmVmb3JlIGEgZmlsZSBpcyBsb2FkZWQsIGEgbWF0Y2hpbmcgcGx1Z2luIGhhcyBhbiBvcHBvcnR1bml0eSB0byBtb2RpZnkgdGhlIGxvYWQuIElmIGEgYGNhbGxiYWNrYCBpcyByZXR1cm5lZAoJICogZnJvbSB0aGUge3sjY3Jvc3NMaW5rICJTYW1wbGVQbHVnaW4vZ2V0UHJlbG9hZEhhbmRsZXJzIn19e3svY3Jvc3NMaW5rfX0gbWV0aG9kLCBpdCB3aWxsIGJlIGludm9rZWQgZmlyc3QsIGFuZCBpdHMKCSAqIHJlc3VsdCBtYXkgY2FuY2VsIG9yIG1vZGlmeSB0aGUgaXRlbS4gVGhlIGNhbGxiYWNrIG1ldGhvZCBjYW4gYWxzbyByZXR1cm4gYSBgY29tcGxldGVIYW5kbGVyYCB0byBiZSBmaXJlZCB3aGVuCgkgKiB0aGUgZmlsZSBpcyBsb2FkZWQsIG9yIGEgYHRhZ2Agb2JqZWN0LCB3aGljaCB3aWxsIG1hbmFnZSB0aGUgYWN0dWFsIGRvd25sb2FkLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGVzZQoJICogbWV0aG9kcywgY2hlY2sgb3V0IHRoZSB7eyNjcm9zc0xpbmsgIlNhbXBsZVBsdWdpbi9wcmVsb2FkSGFuZGxlciJ9fXt7L2Nyb3NzTGlua319IGFuZCB7eyNjcm9zc0xpbmsgIlNhbXBsZVBsdWdpbi9maWxlTG9hZEhhbmRsZXIifX17ey9jcm9zc0xpbmt9fQoJICogbWV0aG9kcyBvbiB0aGUge3sjY3Jvc3NMaW5rICJTYW1wbGVQbHVnaW4ifX17ey9jcm9zc0xpbmt9fS4KCSAqCgkgKiBAbWV0aG9kIGluc3RhbGxQbHVnaW4KCSAqIEBwYXJhbSB7RnVuY3Rpb259IHBsdWdpbiBUaGUgcGx1Z2luIGNsYXNzIHRvIGluc3RhbGwuCgkgKi8KCXAuaW5zdGFsbFBsdWdpbiA9IGZ1bmN0aW9uIChwbHVnaW4pIHsKCQlpZiAocGx1Z2luID09IG51bGwpIHsgcmV0dXJuOyB9CgoJCWlmIChwbHVnaW4uZ2V0UHJlbG9hZEhhbmRsZXJzICE9IG51bGwpIHsKCQkJdmFyIG1hcCA9IHBsdWdpbi5nZXRQcmVsb2FkSGFuZGxlcnMoKTsKCQkJbWFwLnNjb3BlID0gcGx1Z2luOwoKCQkJaWYgKG1hcC50eXBlcyAhPSBudWxsKSB7CgkJCQlmb3IgKHZhciBpID0gMCwgbCA9IG1hcC50eXBlcy5sZW5ndGg7IGkgPCBsOyBpKyspIHsKCQkJCQl0aGlzLl90eXBlQ2FsbGJhY2tzW21hcC50eXBlc1tpXV0gPSBtYXA7CgkJCQl9CgkJCX0KCgkJCWlmIChtYXAuZXh0ZW5zaW9ucyAhPSBudWxsKSB7CgkJCQlmb3IgKGkgPSAwLCBsID0gbWFwLmV4dGVuc2lvbnMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7CgkJCQkJdGhpcy5fZXh0ZW5zaW9uQ2FsbGJhY2tzW21hcC5leHRlbnNpb25zW2ldXSA9IG1hcDsKCQkJCX0KCQkJfQoJCX0KCX07CgoJLyoqCgkgKiBTZXQgdGhlIG1heGltdW0gbnVtYmVyIG9mIGNvbmN1cnJlbnQgY29ubmVjdGlvbnMuIE5vdGUgdGhhdCBicm93c2VycyBhbmQgc2VydmVycyBtYXkgaGF2ZSBhIGJ1aWx0LWluIG1heGltdW0KCSAqIG51bWJlciBvZiBvcGVuIGNvbm5lY3Rpb25zLCBzbyBhbnkgYWRkaXRpb25hbCBjb25uZWN0aW9ucyBtYXkgcmVtYWluIGluIGEgcGVuZGluZyBzdGF0ZSB1bnRpbCB0aGUgYnJvd3NlcgoJICogb3BlbnMgdGhlIGNvbm5lY3Rpb24uIFdoZW4gbG9hZGluZyBzY3JpcHRzIHVzaW5nIHRhZ3MsIGFuZCB3aGVuIHt7I2Nyb3NzTGluayAiTG9hZFF1ZXVlL21haW50YWluU2NyaXB0T3JkZXI6cHJvcGVydHkifX17ey9jcm9zc0xpbmt9fQoJICogaXMgYHRydWVgLCBvbmx5IG9uZSBzY3JpcHQgaXMgbG9hZGVkIGF0IGEgdGltZSBkdWUgdG8gYnJvd3NlciBsaW1pdGF0aW9ucy4KCSAqCgkgKiA8aDQ+RXhhbXBsZTwvaDQ+CgkgKgoJICogICAgICB2YXIgcXVldWUgPSBuZXcgY3JlYXRlanMuTG9hZFF1ZXVlKCk7CgkgKiAgICAgIHF1ZXVlLnNldE1heENvbm5lY3Rpb25zKDEwKTsgLy8gQWxsb3cgMTAgY29uY3VycmVudCBsb2FkcwoJICoKCSAqIEBtZXRob2Qgc2V0TWF4Q29ubmVjdGlvbnMKCSAqIEBwYXJhbSB7TnVtYmVyfSB2YWx1ZSBUaGUgbnVtYmVyIG9mIGNvbmN1cnJlbnQgbG9hZHMgdG8gYWxsb3cuIEJ5IGRlZmF1bHQsIG9ubHkgYSBzaW5nbGUgY29ubmVjdGlvbiBwZXIgTG9hZFF1ZXVlCgkgKiBpcyBvcGVuIGF0IGFueSB0aW1lLgoJICovCglwLnNldE1heENvbm5lY3Rpb25zID0gZnVuY3Rpb24gKHZhbHVlKSB7CgkJdGhpcy5fbWF4Q29ubmVjdGlvbnMgPSB2YWx1ZTsKCQlpZiAoIXRoaXMuX3BhdXNlZCAmJiB0aGlzLl9sb2FkUXVldWUubGVuZ3RoID4gMCkgewoJCQl0aGlzLl9sb2FkTmV4dCgpOwoJCX0KCX07CgoJLyoqCgkgKiBMb2FkIGEgc2luZ2xlIGZpbGUuIFRvIGFkZCBtdWx0aXBsZSBmaWxlcyBhdCBvbmNlLCB1c2UgdGhlIHt7I2Nyb3NzTGluayAiTG9hZFF1ZXVlL2xvYWRNYW5pZmVzdCJ9fXt7L2Nyb3NzTGlua319CgkgKiBtZXRob2QuCgkgKgoJICogRmlsZXMgYXJlIGFsd2F5cyBhcHBlbmRlZCB0byB0aGUgY3VycmVudCBxdWV1ZSwgc28gdGhpcyBtZXRob2QgY2FuIGJlIHVzZWQgbXVsdGlwbGUgdGltZXMgdG8gYWRkIGZpbGVzLgoJICogVG8gY2xlYXIgdGhlIHF1ZXVlIGZpcnN0LCB1c2UgdGhlIHt7I2Nyb3NzTGluayAiQWJzdHJhY3RMb2FkZXIvY2xvc2UifX17ey9jcm9zc0xpbmt9fSBtZXRob2QuCgkgKiBAbWV0aG9kIGxvYWRGaWxlCgkgKiBAcGFyYW0ge0xvYWRJdGVtfE9iamVjdHxTdHJpbmd9IGZpbGUgVGhlIGZpbGUgb2JqZWN0IG9yIHBhdGggdG8gbG9hZC4gQSBmaWxlIGNhbiBiZSBlaXRoZXIKCSAqIDx1bD4KCSAqICAgICA8bGk+QSB7eyNjcm9zc0xpbmsgIkxvYWRJdGVtIn19e3svY3Jvc3NMaW5rfX0gaW5zdGFuY2U8L2xpPgoJICogICAgIDxsaT5BbiBvYmplY3QgY29udGFpbmluZyBwcm9wZXJ0aWVzIGRlZmluZWQgYnkge3sjY3Jvc3NMaW5rICJMb2FkSXRlbSJ9fXt7L2Nyb3NzTGlua319PC9saT4KCSAqICAgICA8bGk+T1IgQSBzdHJpbmcgcGF0aCB0byBhIHJlc291cmNlLiBOb3RlIHRoYXQgdGhpcyBraW5kIG9mIGxvYWQgaXRlbSB3aWxsIGJlIGNvbnZlcnRlZCB0byBhIHt7I2Nyb3NzTGluayAiTG9hZEl0ZW0ifX17ey9jcm9zc0xpbmt9fQoJICogICAgIGluIHRoZSBiYWNrZ3JvdW5kLjwvbGk+CgkgKiA8L3VsPgoJICogQHBhcmFtIHtCb29sZWFufSBbbG9hZE5vdz10cnVlXSBLaWNrIG9mZiBhbiBpbW1lZGlhdGUgbG9hZCAodHJ1ZSkgb3Igd2FpdCBmb3IgYSBsb2FkIGNhbGwgKGZhbHNlKS4gVGhlIGRlZmF1bHQKCSAqIHZhbHVlIGlzIHRydWUuIElmIHRoZSBxdWV1ZSBpcyBwYXVzZWQgdXNpbmcge3sjY3Jvc3NMaW5rICJMb2FkUXVldWUvc2V0UGF1c2VkIn19e3svY3Jvc3NMaW5rfX0sIGFuZCB0aGUgdmFsdWUgaXMKCSAqIGB0cnVlYCwgdGhlIHF1ZXVlIHdpbGwgcmVzdW1lIGF1dG9tYXRpY2FsbHkuCgkgKiBAcGFyYW0ge1N0cmluZ30gW2Jhc2VQYXRoXSBBIGJhc2UgcGF0aCB0aGF0IHdpbGwgYmUgcHJlcGVuZGVkIHRvIGVhY2ggZmlsZS4gVGhlIGJhc2VQYXRoIGFyZ3VtZW50IG92ZXJyaWRlcyB0aGUKCSAqIHBhdGggc3BlY2lmaWVkIGluIHRoZSBjb25zdHJ1Y3Rvci4gTm90ZSB0aGF0IGlmIHlvdSBsb2FkIGEgbWFuaWZlc3QgdXNpbmcgYSBmaWxlIG9mIHR5cGUge3sjY3Jvc3NMaW5rICJBYnN0cmFjdExvYWRlci9NQU5JRkVTVDpwcm9wZXJ0eSJ9fXt7L2Nyb3NzTGlua319LAoJICogaXRzIGZpbGVzIHdpbGwgPHN0cm9uZz5OT1Q8L3N0cm9uZz4gdXNlIHRoZSBiYXNlUGF0aCBwYXJhbWV0ZXIuIDxzdHJvbmc+VGhlIGJhc2VQYXRoIHBhcmFtZXRlciBpcyBkZXByZWNhdGVkLjwvc3Ryb25nPgoJICogVGhpcyBwYXJhbWV0ZXIgd2lsbCBiZSByZW1vdmVkIGluIGEgZnV0dXJlIHZlcnNpb24uIFBsZWFzZSBlaXRoZXIgdXNlIHRoZSBgYmFzZVBhdGhgIHBhcmFtZXRlciBpbiB0aGUgTG9hZFF1ZXVlCgkgKiBjb25zdHJ1Y3Rvciwgb3IgYSBgcGF0aGAgcHJvcGVydHkgaW4gYSBtYW5pZmVzdCBkZWZpbml0aW9uLgoJICovCglwLmxvYWRGaWxlID0gZnVuY3Rpb24gKGZpbGUsIGxvYWROb3csIGJhc2VQYXRoKSB7CgkJaWYgKGZpbGUgPT0gbnVsbCkgewoJCQl2YXIgZXZlbnQgPSBuZXcgY3JlYXRlanMuRXJyb3JFdmVudCgiUFJFTE9BRF9OT19GSUxFIik7CgkJCXRoaXMuX3NlbmRFcnJvcihldmVudCk7CgkJCXJldHVybjsKCQl9CgkJdGhpcy5fYWRkSXRlbShmaWxlLCBudWxsLCBiYXNlUGF0aCk7CgoJCWlmIChsb2FkTm93ICE9PSBmYWxzZSkgewoJCQl0aGlzLnNldFBhdXNlZChmYWxzZSk7CgkJfSBlbHNlIHsKCQkJdGhpcy5zZXRQYXVzZWQodHJ1ZSk7CgkJfQoJfTsKCgkvKioKCSAqIExvYWQgYW4gYXJyYXkgb2YgZmlsZXMuIFRvIGxvYWQgYSBzaW5nbGUgZmlsZSwgdXNlIHRoZSB7eyNjcm9zc0xpbmsgIkxvYWRRdWV1ZS9sb2FkRmlsZSJ9fXt7L2Nyb3NzTGlua319IG1ldGhvZC4KCSAqIFRoZSBmaWxlcyBpbiB0aGUgbWFuaWZlc3QgYXJlIHJlcXVlc3RlZCBpbiB0aGUgc2FtZSBvcmRlciwgYnV0IG1heSBjb21wbGV0ZSBpbiBhIGRpZmZlcmVudCBvcmRlciBpZiB0aGUgbWF4CgkgKiBjb25uZWN0aW9ucyBhcmUgc2V0IGFib3ZlIDEgdXNpbmcge3sjY3Jvc3NMaW5rICJMb2FkUXVldWUvc2V0TWF4Q29ubmVjdGlvbnMifX17ey9jcm9zc0xpbmt9fS4gU2NyaXB0cyB3aWxsIGxvYWQKCSAqIGluIHRoZSByaWdodCBvcmRlciBhcyBsb25nIGFzIHt7I2Nyb3NzTGluayAiTG9hZFF1ZXVlL21haW50YWluU2NyaXB0T3JkZXIifX17ey9jcm9zc0xpbmt9fSBpcyB0cnVlICh3aGljaCBpcwoJICogZGVmYXVsdCkuCgkgKgoJICogRmlsZXMgYXJlIGFsd2F5cyBhcHBlbmRlZCB0byB0aGUgY3VycmVudCBxdWV1ZSwgc28gdGhpcyBtZXRob2QgY2FuIGJlIHVzZWQgbXVsdGlwbGUgdGltZXMgdG8gYWRkIGZpbGVzLgoJICogVG8gY2xlYXIgdGhlIHF1ZXVlIGZpcnN0LCB1c2UgdGhlIHt7I2Nyb3NzTGluayAiQWJzdHJhY3RMb2FkZXIvY2xvc2UifX17ey9jcm9zc0xpbmt9fSBtZXRob2QuCgkgKiBAbWV0aG9kIGxvYWRNYW5pZmVzdAoJICogQHBhcmFtIHtBcnJheXxTdHJpbmd8T2JqZWN0fSBtYW5pZmVzdCBBbiBsaXN0IG9mIGZpbGVzIHRvIGxvYWQuIFRoZSBsb2FkTWFuaWZlc3QgY2FsbCBzdXBwb3J0cyBmb3VyIHR5cGVzIG9mCgkgKiBtYW5pZmVzdHM6CgkgKiA8b2w+CgkgKiAgICAgPGxpPkEgc3RyaW5nIHBhdGgsIHdoaWNoIHBvaW50cyB0byBhIG1hbmlmZXN0IGZpbGUsIHdoaWNoIGlzIGEgSlNPTiBmaWxlIHRoYXQgY29udGFpbnMgYSAibWFuaWZlc3QiIHByb3BlcnR5LAoJICogICAgIHdoaWNoIGRlZmluZXMgdGhlIGxpc3Qgb2YgZmlsZXMgdG8gbG9hZCwgYW5kIGNhbiBvcHRpb25hbGx5IGNvbnRhaW4gYSAicGF0aCIgcHJvcGVydHksIHdoaWNoIHdpbGwgYmUKCSAqICAgICBwcmVwZW5kZWQgdG8gZWFjaCBmaWxlIGluIHRoZSBsaXN0LjwvbGk+CgkgKiAgICAgPGxpPkFuIG9iamVjdCB3aGljaCBkZWZpbmVzIGEgInNyYyIsIHdoaWNoIGlzIGEgSlNPTiBvciBKU09OUCBmaWxlLiBBICJjYWxsYmFjayIgY2FuIGJlIGRlZmluZWQgZm9yIEpTT05QCgkgKiAgICAgZmlsZS4gVGhlIEpTT04vSlNPTlAgZmlsZSBzaG91bGQgY29udGFpbiBhICJtYW5pZmVzdCIgcHJvcGVydHksIHdoaWNoIGRlZmluZXMgdGhlIGxpc3Qgb2YgZmlsZXMgdG8gbG9hZCwKCSAqICAgICBhbmQgY2FuIG9wdGlvbmFsbHkgY29udGFpbiBhICJwYXRoIiBwcm9wZXJ0eSwgd2hpY2ggd2lsbCBiZSBwcmVwZW5kZWQgdG8gZWFjaCBmaWxlIGluIHRoZSBsaXN0LjwvbGk+CgkgKiAgICAgPGxpPkFuIG9iamVjdCB3aGljaCBjb250YWlucyBhICJtYW5pZmVzdCIgcHJvcGVydHksIHdoaWNoIGRlZmluZXMgdGhlIGxpc3Qgb2YgZmlsZXMgdG8gbG9hZCwgYW5kIGNhbgoJICogICAgIG9wdGlvbmFsbHkgY29udGFpbiBhICJwYXRoIiBwcm9wZXJ0eSwgd2hpY2ggd2lsbCBiZSBwcmVwZW5kZWQgdG8gZWFjaCBmaWxlIGluIHRoZSBsaXN0LjwvbGk+CgkgKiAgICAgPGxpPkFuIEFycmF5IG9mIGZpbGVzIHRvIGxvYWQuPC9saT4KCSAqIDwvb2w+CgkgKgoJICogRWFjaCAiZmlsZSIgaW4gYSBtYW5pZmVzdCBjYW4gYmUgZWl0aGVyOgoJICogPHVsPgoJICogICAgIDxsaT5BIHt7I2Nyb3NzTGluayAiTG9hZEl0ZW0ifX17ey9jcm9zc0xpbmt9fSBpbnN0YW5jZTwvbGk+CgkgKiAgICAgPGxpPkFuIG9iamVjdCBjb250YWluaW5nIHByb3BlcnRpZXMgZGVmaW5lZCBieSB7eyNjcm9zc0xpbmsgIkxvYWRJdGVtIn19e3svY3Jvc3NMaW5rfX08L2xpPgoJICogICAgIDxsaT5PUiBBIHN0cmluZyBwYXRoIHRvIGEgcmVzb3VyY2UuIE5vdGUgdGhhdCB0aGlzIGtpbmQgb2YgbG9hZCBpdGVtIHdpbGwgYmUgY29udmVydGVkIHRvIGEge3sjY3Jvc3NMaW5rICJMb2FkSXRlbSJ9fXt7L2Nyb3NzTGlua319CgkgKiAgICAgaW4gdGhlIGJhY2tncm91bmQuPC9saT4KCSAqIDwvdWw+CgkgKgoJICogQHBhcmFtIHtCb29sZWFufSBbbG9hZE5vdz10cnVlXSBLaWNrIG9mZiBhbiBpbW1lZGlhdGUgbG9hZCAodHJ1ZSkgb3Igd2FpdCBmb3IgYSBsb2FkIGNhbGwgKGZhbHNlKS4gVGhlIGRlZmF1bHQKCSAqIHZhbHVlIGlzIHRydWUuIElmIHRoZSBxdWV1ZSBpcyBwYXVzZWQgdXNpbmcge3sjY3Jvc3NMaW5rICJMb2FkUXVldWUvc2V0UGF1c2VkIn19e3svY3Jvc3NMaW5rfX0gYW5kIHRoaXMgdmFsdWUgaXMKCSAqIGB0cnVlYCwgdGhlIHF1ZXVlIHdpbGwgcmVzdW1lIGF1dG9tYXRpY2FsbHkuCgkgKiBAcGFyYW0ge1N0cmluZ30gW2Jhc2VQYXRoXSBBIGJhc2UgcGF0aCB0aGF0IHdpbGwgYmUgcHJlcGVuZGVkIHRvIGVhY2ggZmlsZS4gVGhlIGJhc2VQYXRoIGFyZ3VtZW50IG92ZXJyaWRlcyB0aGUKCSAqIHBhdGggc3BlY2lmaWVkIGluIHRoZSBjb25zdHJ1Y3Rvci4gTm90ZSB0aGF0IGlmIHlvdSBsb2FkIGEgbWFuaWZlc3QgdXNpbmcgYSBmaWxlIG9mIHR5cGUge3sjY3Jvc3NMaW5rICJMb2FkUXVldWUvTUFOSUZFU1Q6cHJvcGVydHkifX17ey9jcm9zc0xpbmt9fSwKCSAqIGl0cyBmaWxlcyB3aWxsIDxzdHJvbmc+Tk9UPC9zdHJvbmc+IHVzZSB0aGUgYmFzZVBhdGggcGFyYW1ldGVyLiA8c3Ryb25nPlRoZSBiYXNlUGF0aCBwYXJhbWV0ZXIgaXMgZGVwcmVjYXRlZC48L3N0cm9uZz4KCSAqIFRoaXMgcGFyYW1ldGVyIHdpbGwgYmUgcmVtb3ZlZCBpbiBhIGZ1dHVyZSB2ZXJzaW9uLiBQbGVhc2UgZWl0aGVyIHVzZSB0aGUgYGJhc2VQYXRoYCBwYXJhbWV0ZXIgaW4gdGhlIExvYWRRdWV1ZQoJICogY29uc3RydWN0b3IsIG9yIGEgYHBhdGhgIHByb3BlcnR5IGluIGEgbWFuaWZlc3QgZGVmaW5pdGlvbi4KCSAqLwoJcC5sb2FkTWFuaWZlc3QgPSBmdW5jdGlvbiAobWFuaWZlc3QsIGxvYWROb3csIGJhc2VQYXRoKSB7CgkJdmFyIGZpbGVMaXN0ID0gbnVsbDsKCQl2YXIgcGF0aCA9IG51bGw7CgoJCS8vIEFycmF5LWJhc2VkIGxpc3Qgb2YgaXRlbXMKCQlpZiAobWFuaWZlc3QgaW5zdGFuY2VvZiBBcnJheSkgewoJCQlpZiAobWFuaWZlc3QubGVuZ3RoID09IDApIHsKCQkJCXZhciBldmVudCA9IG5ldyBjcmVhdGVqcy5FcnJvckV2ZW50KCJQUkVMT0FEX01BTklGRVNUX0VNUFRZIik7CgkJCQl0aGlzLl9zZW5kRXJyb3IoZXZlbnQpOwoJCQkJcmV0dXJuOwoJCQl9CgkJCWZpbGVMaXN0ID0gbWFuaWZlc3Q7CgoJCQkvLyBTdHJpbmctYmFzZWQuIE9ubHkgZmlsZSBtYW5pZmVzdHMgY2FuIGJlIHNwZWNpZmllZCB0aGlzIHdheS4gQW55IG90aGVyIHR5cGVzIHdpbGwgY2F1c2UgYW4gZXJyb3Igd2hlbiBsb2FkZWQuCgkJfSBlbHNlIGlmICh0eXBlb2YobWFuaWZlc3QpID09PSAic3RyaW5nIikgewoJCQlmaWxlTGlzdCA9IFsKCQkJCXsKCQkJCQlzcmM6IG1hbmlmZXN0LAoJCQkJCXR5cGU6IHMuTUFOSUZFU1QKCQkJCX0KCQkJXTsKCgkJfSBlbHNlIGlmICh0eXBlb2YobWFuaWZlc3QpID09ICJvYmplY3QiKSB7CgoJCQkvLyBBbiBvYmplY3QgdGhhdCBkZWZpbmVzIGEgbWFuaWZlc3QgcGF0aAoJCQlpZiAobWFuaWZlc3Quc3JjICE9PSB1bmRlZmluZWQpIHsKCQkJCWlmIChtYW5pZmVzdC50eXBlID09IG51bGwpIHsKCQkJCQltYW5pZmVzdC50eXBlID0gcy5NQU5JRkVTVDsKCQkJCX0gZWxzZSBpZiAobWFuaWZlc3QudHlwZSAhPSBzLk1BTklGRVNUKSB7CgkJCQkJdmFyIGV2ZW50ID0gbmV3IGNyZWF0ZWpzLkVycm9yRXZlbnQoIlBSRUxPQURfTUFOSUZFU1RfVFlQRSIpOwoJCQkJCXRoaXMuX3NlbmRFcnJvcihldmVudCk7CgkJCQl9CgkJCQlmaWxlTGlzdCA9IFttYW5pZmVzdF07CgoJCQkJLy8gQW4gb2JqZWN0IHRoYXQgZGVmaW5lcyBhIG1hbmlmZXN0CgkJCX0gZWxzZSBpZiAobWFuaWZlc3QubWFuaWZlc3QgIT09IHVuZGVmaW5lZCkgewoJCQkJZmlsZUxpc3QgPSBtYW5pZmVzdC5tYW5pZmVzdDsKCQkJCXBhdGggPSBtYW5pZmVzdC5wYXRoOwoJCQl9CgoJCQkvLyBVbnN1cHBvcnRlZC4gVGhpcyB3aWxsIHRocm93IGFuIGVycm9yLgoJCX0gZWxzZSB7CgkJCXZhciBldmVudCA9IG5ldyBjcmVhdGVqcy5FcnJvckV2ZW50KCJQUkVMT0FEX01BTklGRVNUX05VTEwiKTsKCQkJdGhpcy5fc2VuZEVycm9yKGV2ZW50KTsKCQkJcmV0dXJuOwoJCX0KCgkJZm9yICh2YXIgaSA9IDAsIGwgPSBmaWxlTGlzdC5sZW5ndGg7IGkgPCBsOyBpKyspIHsKCQkJdGhpcy5fYWRkSXRlbShmaWxlTGlzdFtpXSwgcGF0aCwgYmFzZVBhdGgpOwoJCX0KCgkJaWYgKGxvYWROb3cgIT09IGZhbHNlKSB7CgkJCXRoaXMuc2V0UGF1c2VkKGZhbHNlKTsKCQl9IGVsc2UgewoJCQl0aGlzLnNldFBhdXNlZCh0cnVlKTsKCQl9CgoJfTsKCgkvKioKCSAqIFN0YXJ0IGEgTG9hZFF1ZXVlIHRoYXQgd2FzIGNyZWF0ZWQsIGJ1dCBub3QgYXV0b21hdGljYWxseSBzdGFydGVkLgoJICogQG1ldGhvZCBsb2FkCgkgKi8KCXAubG9hZCA9IGZ1bmN0aW9uICgpIHsKCQl0aGlzLnNldFBhdXNlZChmYWxzZSk7Cgl9OwoKCS8qKgoJICogTG9vayB1cCBhIHt7I2Nyb3NzTGluayAiTG9hZEl0ZW0ifX17ey9jcm9zc0xpbmt9fSB1c2luZyBlaXRoZXIgdGhlICJpZCIgb3IgInNyYyIgdGhhdCB3YXMgc3BlY2lmaWVkIHdoZW4gbG9hZGluZyBpdC4gTm90ZSB0aGF0IGlmIG5vICJpZCIgd2FzCgkgKiBzdXBwbGllZCB3aXRoIHRoZSBsb2FkIGl0ZW0sIHRoZSBJRCB3aWxsIGJlIHRoZSAic3JjIiwgaW5jbHVkaW5nIGEgYHBhdGhgIHByb3BlcnR5IGRlZmluZWQgYnkgYSBtYW5pZmVzdC4gVGhlCgkgKiBgYmFzZVBhdGhgIHdpbGwgbm90IGJlIHBhcnQgb2YgdGhlIElELgoJICogQG1ldGhvZCBnZXRJdGVtCgkgKiBAcGFyYW0ge1N0cmluZ30gdmFsdWUgVGhlIDxjb2RlPmlkPC9jb2RlPiBvciA8Y29kZT5zcmM8L2NvZGU+IG9mIHRoZSBsb2FkIGl0ZW0uCgkgKiBAcmV0dXJuIHtPYmplY3R9IFRoZSBsb2FkIGl0ZW0gdGhhdCB3YXMgaW5pdGlhbGx5IHJlcXVlc3RlZCB1c2luZyB7eyNjcm9zc0xpbmsgIkxvYWRRdWV1ZS9sb2FkRmlsZSJ9fXt7L2Nyb3NzTGlua319CgkgKiBvciB7eyNjcm9zc0xpbmsgIkxvYWRRdWV1ZS9sb2FkTWFuaWZlc3QifX17ey9jcm9zc0xpbmt9fS4gVGhpcyBvYmplY3QgaXMgYWxzbyByZXR1cm5lZCB2aWEgdGhlIHt7I2Nyb3NzTGluayAiTG9hZFF1ZXVlL2ZpbGVsb2FkOmV2ZW50In19e3svY3Jvc3NMaW5rfX0KCSAqIGV2ZW50IGFzIHRoZSBgaXRlbWAgcGFyYW1ldGVyLgoJICovCglwLmdldEl0ZW0gPSBmdW5jdGlvbiAodmFsdWUpIHsKCQlyZXR1cm4gdGhpcy5fbG9hZEl0ZW1zQnlJZFt2YWx1ZV0gfHwgdGhpcy5fbG9hZEl0ZW1zQnlTcmNbdmFsdWVdOwoJfTsKCgkvKioKCSAqIExvb2sgdXAgYSBsb2FkZWQgcmVzdWx0IHVzaW5nIGVpdGhlciB0aGUgImlkIiBvciAic3JjIiB0aGF0IHdhcyBzcGVjaWZpZWQgd2hlbiBsb2FkaW5nIGl0LiBOb3RlIHRoYXQgaWYgbm8gImlkIgoJICogd2FzIHN1cHBsaWVkIHdpdGggdGhlIGxvYWQgaXRlbSwgdGhlIElEIHdpbGwgYmUgdGhlICJzcmMiLCBpbmNsdWRpbmcgYSBgcGF0aGAgcHJvcGVydHkgZGVmaW5lZCBieSBhIG1hbmlmZXN0LiBUaGUKCSAqIGBiYXNlUGF0aGAgd2lsbCBub3QgYmUgcGFydCBvZiB0aGUgSUQuCgkgKiBAbWV0aG9kIGdldFJlc3VsdAoJICogQHBhcmFtIHtTdHJpbmd9IHZhbHVlIFRoZSA8Y29kZT5pZDwvY29kZT4gb3IgPGNvZGU+c3JjPC9jb2RlPiBvZiB0aGUgbG9hZCBpdGVtLgoJICogQHBhcmFtIHtCb29sZWFufSBbcmF3UmVzdWx0PWZhbHNlXSBSZXR1cm4gYSByYXcgcmVzdWx0IGluc3RlYWQgb2YgYSBmb3JtYXR0ZWQgcmVzdWx0LiBUaGlzIGFwcGxpZXMgdG8gY29udGVudAoJICogbG9hZGVkIHZpYSBYSFIgc3VjaCBhcyBzY3JpcHRzLCBYTUwsIENTUywgYW5kIEltYWdlcy4gSWYgdGhlcmUgaXMgbm8gcmF3IHJlc3VsdCwgdGhlIGZvcm1hdHRlZCByZXN1bHQgd2lsbCBiZQoJICogcmV0dXJuZWQgaW5zdGVhZC4KCSAqIEByZXR1cm4ge09iamVjdH0gQSByZXN1bHQgb2JqZWN0IGNvbnRhaW5pbmcgdGhlIGNvbnRlbnQgdGhhdCB3YXMgbG9hZGVkLCBzdWNoIGFzOgoJICogPHVsPgoJICogICAgICA8bGk+QW4gaW1hZ2UgdGFnICgmbHQ7aW1hZ2UgLyZndDspIGZvciBpbWFnZXM8L2xpPgoJICogICAgICA8bGk+QSBzY3JpcHQgdGFnIGZvciBKYXZhU2NyaXB0ICgmbHQ7c2NyaXB0IC8mZ3Q7KS4gTm90ZSB0aGF0IHNjcmlwdHMgYXJlIGF1dG9tYXRpY2FsbHkgYWRkZWQgdG8gdGhlIEhUTUwKCSAqICAgICAgRE9NLjwvbGk+CgkgKiAgICAgIDxsaT5BIHN0eWxlIHRhZyBmb3IgQ1NTICgmbHQ7c3R5bGUgLyZndDsgb3IgJmx0O2xpbmsgJmd0Oyk8L2xpPgoJICogICAgICA8bGk+UmF3IHRleHQgZm9yIFRFWFQ8L2xpPgoJICogICAgICA8bGk+QSBmb3JtYXR0ZWQgSmF2YVNjcmlwdCBvYmplY3QgZGVmaW5lZCBieSBKU09OPC9saT4KCSAqICAgICAgPGxpPkFuIFhNTCBkb2N1bWVudDwvbGk+CgkgKiAgICAgIDxsaT5BIGJpbmFyeSBhcnJheWJ1ZmZlciBsb2FkZWQgYnkgWEhSPC9saT4KCSAqICAgICAgPGxpPkFuIGF1ZGlvIHRhZyAoJmx0O2F1ZGlvICZndDspIGZvciBIVE1MIGF1ZGlvLiBOb3RlIHRoYXQgaXQgaXMgcmVjb21tZW5kZWQgdG8gdXNlIFNvdW5kSlMgQVBJcyB0byBwbGF5CgkgKiAgICAgIGxvYWRlZCBhdWRpby4gU3BlY2lmaWNhbGx5LCBhdWRpbyBsb2FkZWQgYnkgRmxhc2ggYW5kIFdlYkF1ZGlvIHdpbGwgcmV0dXJuIGEgbG9hZGVyIG9iamVjdCB1c2luZyB0aGlzIG1ldGhvZAoJICogICAgICB3aGljaCBjYW4gbm90IGJlIHVzZWQgdG8gcGxheSBhdWRpbyBiYWNrLjwvbGk+CgkgKiA8L3VsPgoJICogVGhpcyBvYmplY3QgaXMgYWxzbyByZXR1cm5lZCB2aWEgdGhlIHt7I2Nyb3NzTGluayAiTG9hZFF1ZXVlL2ZpbGVsb2FkOmV2ZW50In19e3svY3Jvc3NMaW5rfX0gZXZlbnQgYXMgdGhlICdpdGVtYAoJICogcGFyYW1ldGVyLiBOb3RlIHRoYXQgaWYgYSByYXcgcmVzdWx0IGlzIHJlcXVlc3RlZCwgYnV0IG5vdCBmb3VuZCwgdGhlIHJlc3VsdCB3aWxsIGJlIHJldHVybmVkIGluc3RlYWQuCgkgKi8KCXAuZ2V0UmVzdWx0ID0gZnVuY3Rpb24gKHZhbHVlLCByYXdSZXN1bHQpIHsKCQl2YXIgaXRlbSA9IHRoaXMuX2xvYWRJdGVtc0J5SWRbdmFsdWVdIHx8IHRoaXMuX2xvYWRJdGVtc0J5U3JjW3ZhbHVlXTsKCQlpZiAoaXRlbSA9PSBudWxsKSB7IHJldHVybiBudWxsOyB9CgkJdmFyIGlkID0gaXRlbS5pZDsKCQlpZiAocmF3UmVzdWx0ICYmIHRoaXMuX2xvYWRlZFJhd1Jlc3VsdHNbaWRdKSB7CgkJCXJldHVybiB0aGlzLl9sb2FkZWRSYXdSZXN1bHRzW2lkXTsKCQl9CgkJcmV0dXJuIHRoaXMuX2xvYWRlZFJlc3VsdHNbaWRdOwoJfTsKCgkvKioKCSAqIEdlbmVyYXRlIGFuIGxpc3Qgb2YgaXRlbXMgbG9hZGVkIGJ5IHRoaXMgcXVldWUuCgkgKiBAbWV0aG9kIGdldEl0ZW1zCgkgKiBAcGFyYW0ge0Jvb2xlYW59IGxvYWRlZCBEZXRlcm1pbmVzIGlmIG9ubHkgaXRlbXMgdGhhdCBoYXZlIGJlZW4gbG9hZGVkIHNob3VsZCBiZSByZXR1cm5lZC4gSWYgZmFsc2UsIGluLXByb2dyZXNzCgkgKiBhbmQgZmFpbGVkIGxvYWQgaXRlbXMgd2lsbCBhbHNvIGJlIGluY2x1ZGVkLgoJICogQHJldHVybnMge0FycmF5fSBBIGxpc3Qgb2Ygb2JqZWN0cyB0aGF0IGhhdmUgYmVlbiBsb2FkZWQuIEVhY2ggaXRlbSBpbmNsdWRlcyB0aGUge3sjY3Jvc3NMaW5rICJMb2FkSXRlbSJ9fXt7L2Nyb3NzTGlua319LAoJICogcmVzdWx0LCBhbmQgcmF3UmVzdWx0LgoJICogQHNpbmNlIDAuNi4wCgkgKi8KCXAuZ2V0SXRlbXMgPSBmdW5jdGlvbihsb2FkZWQpIHsKCQl2YXIgYXJyID0gW107CgkJZm9yICh2YXIgaT0gMCwgbD10aGlzLl9sb2FkUXVldWVCYWNrdXAubGVuZ3RoOyBpPGw7IGkrKykgewoJCQl2YXIgbG9hZGVyID0gdGhpcy5fbG9hZFF1ZXVlQmFja3VwW2ldCgkJCXZhciBpdGVtID0gbG9hZGVyLmdldEl0ZW0oKTsKCQkJaWYgKGxvYWRlZCA9PT0gdHJ1ZSAmJiAhbG9hZGVyLmxvYWRlZCkgeyBjb250aW51ZTsgfQoJCQlhcnIucHVzaCh7CgkJCQlpdGVtOiBpdGVtLAoJCQkJcmVzdWx0OiB0aGlzLmdldFJlc3VsdChpdGVtLmlkKSwKCQkJCXJhd1Jlc3VsdDogdGhpcy5nZXRSZXN1bHQoaXRlbS5pZCwgdHJ1ZSkKCQkJIH0pOwoJCX0KCQlyZXR1cm4gYXJyOwoJfTsKCgkvKioKCSAqIFBhdXNlIG9yIHJlc3VtZSB0aGUgY3VycmVudCBsb2FkLiBBY3RpdmUgbG9hZHMgd2lsbCBub3QgYmUgY2FuY2VsbGVkLCBidXQgdGhlIG5leHQgaXRlbXMgaW4gdGhlIHF1ZXVlIHdpbGwgbm90CgkgKiBiZSBwcm9jZXNzZWQgd2hlbiBhY3RpdmUgbG9hZHMgY29tcGxldGUuIExvYWRRdWV1ZXMgYXJlIG5vdCBwYXVzZWQgYnkgZGVmYXVsdC4KCSAqCgkgKiBOb3RlIHRoYXQgaWYgbmV3IGl0ZW1zIGFyZSBhZGRlZCB0byB0aGUgcXVldWUgdXNpbmcge3sjY3Jvc3NMaW5rICJMb2FkUXVldWUvbG9hZEZpbGUifX17ey9jcm9zc0xpbmt9fSBvcgoJICoge3sjY3Jvc3NMaW5rICJMb2FkUXVldWUvbG9hZE1hbmlmZXN0In19e3svY3Jvc3NMaW5rfX0sIGEgcGF1c2VkIHF1ZXVlIHdpbGwgYmUgcmVzdW1lZCwgdW5sZXNzIHRoZSBgbG9hZE5vd2AKCSAqIGFyZ3VtZW50IGlzIGBmYWxzZWAuCgkgKiBAbWV0aG9kIHNldFBhdXNlZAoJICogQHBhcmFtIHtCb29sZWFufSB2YWx1ZSBXaGV0aGVyIHRoZSBxdWV1ZSBzaG91bGQgYmUgcGF1c2VkIG9yIG5vdC4KCSAqLwoJcC5zZXRQYXVzZWQgPSBmdW5jdGlvbiAodmFsdWUpIHsKCQl0aGlzLl9wYXVzZWQgPSB2YWx1ZTsKCQlpZiAoIXRoaXMuX3BhdXNlZCkgewoJCQl0aGlzLl9sb2FkTmV4dCgpOwoJCX0KCX07CgoJLyoqCgkgKiBDbG9zZSB0aGUgYWN0aXZlIHF1ZXVlLiBDbG9zaW5nIGEgcXVldWUgY29tcGxldGVseSBlbXB0aWVzIHRoZSBxdWV1ZSwgYW5kIHByZXZlbnRzIGFueSByZW1haW5pbmcgaXRlbXMgZnJvbQoJICogc3RhcnRpbmcgdG8gZG93bmxvYWQuIE5vdGUgdGhhdCBjdXJyZW50bHkgYW55IGFjdGl2ZSBsb2FkcyB3aWxsIHJlbWFpbiBvcGVuLCBhbmQgZXZlbnRzIG1heSBiZSBwcm9jZXNzZWQuCgkgKgoJICogVG8gc3RvcCBhbmQgcmVzdGFydCBhIHF1ZXVlLCB1c2UgdGhlIHt7I2Nyb3NzTGluayAiTG9hZFF1ZXVlL3NldFBhdXNlZCJ9fXt7L2Nyb3NzTGlua319IG1ldGhvZCBpbnN0ZWFkLgoJICogQG1ldGhvZCBjbG9zZQoJICovCglwLmNsb3NlID0gZnVuY3Rpb24gKCkgewoJCXdoaWxlICh0aGlzLl9jdXJyZW50TG9hZHMubGVuZ3RoKSB7CgkJCXRoaXMuX2N1cnJlbnRMb2Fkcy5wb3AoKS5jYW5jZWwoKTsKCQl9CgkJdGhpcy5fc2NyaXB0T3JkZXIubGVuZ3RoID0gMDsKCQl0aGlzLl9sb2FkZWRTY3JpcHRzLmxlbmd0aCA9IDA7CgkJdGhpcy5sb2FkU3RhcnRXYXNEaXNwYXRjaGVkID0gZmFsc2U7CgkJdGhpcy5faXRlbUNvdW50ID0gMDsKCQl0aGlzLl9sYXN0UHJvZ3Jlc3MgPSBOYU47Cgl9OwoKLy8gcHJvdGVjdGVkIG1ldGhvZHMKCS8qKgoJICogQWRkIGFuIGl0ZW0gdG8gdGhlIHF1ZXVlLiBJdGVtcyBhcmUgZm9ybWF0dGVkIGludG8gYSB1c2FibGUgb2JqZWN0IGNvbnRhaW5pbmcgYWxsIHRoZSBwcm9wZXJ0aWVzIG5lY2Vzc2FyeSB0bwoJICogbG9hZCB0aGUgY29udGVudC4gVGhlIGxvYWQgcXVldWUgaXMgcG9wdWxhdGVkIHdpdGggdGhlIGxvYWRlciBpbnN0YW5jZSB0aGF0IGhhbmRsZXMgcHJlbG9hZGluZywgYW5kIG5vdCB0aGUgbG9hZAoJICogaXRlbSB0aGF0IHdhcyBwYXNzZWQgaW4gYnkgdGhlIHVzZXIuIFRvIGxvb2sgdXAgdGhlIGxvYWQgaXRlbSBieSBpZCBvciBzcmMsIHVzZSB0aGUge3sjY3Jvc3NMaW5rICJMb2FkUXVldWUuZ2V0SXRlbSJ9fXt7L2Nyb3NzTGlua319CgkgKiBtZXRob2QuCgkgKiBAbWV0aG9kIF9hZGRJdGVtCgkgKiBAcGFyYW0ge1N0cmluZ3xPYmplY3R9IHZhbHVlIFRoZSBpdGVtIHRvIGFkZCB0byB0aGUgcXVldWUuCgkgKiBAcGFyYW0ge1N0cmluZ30gW3BhdGhdIEFuIG9wdGlvbmFsIHBhdGggcHJlcGVuZGVkIHRvIHRoZSBgc3JjYC4gVGhlIHBhdGggd2lsbCBvbmx5IGJlIHByZXBlbmRlZCBpZiB0aGUgc3JjIGlzCgkgKiByZWxhdGl2ZSwgYW5kIGRvZXMgbm90IHN0YXJ0IHdpdGggYSBwcm90b2NvbCBzdWNoIGFzIGBodHRwOi8vYCwgb3IgYSBwYXRoIGxpa2UgYC4uL2AuIElmIHRoZSBMb2FkUXVldWUgd2FzCgkgKiBwcm92aWRlZCBhIHt7I2Nyb3NzTGluayAiX2Jhc2VQYXRoIn19e3svY3Jvc3NMaW5rfX0sIHRoZW4gaXQgd2lsbCBvcHRpb25hbGx5IGJlIHByZXBlbmRlZCBhZnRlci4KCSAqIEBwYXJhbSB7U3RyaW5nfSBbYmFzZVBhdGhdIDxzdHJvbmc+RGVwcmVjYXRlZDwvc3Ryb25nPkFuIG9wdGlvbmFsIGJhc2VQYXRoIHBhc3NlZCBpbnRvIGEge3sjY3Jvc3NMaW5rICJMb2FkUXVldWUvbG9hZE1hbmlmZXN0In19e3svY3Jvc3NMaW5rfX0KCSAqIG9yIHt7I2Nyb3NzTGluayAiTG9hZFF1ZXVlL2xvYWRGaWxlIn19e3svY3Jvc3NMaW5rfX0gY2FsbC4gVGhpcyBwYXJhbWV0ZXIgd2lsbCBiZSByZW1vdmVkIGluIGEgZnV0dXJlIHRhZ2dlZAoJICogdmVyc2lvbi4KCSAqIEBwcml2YXRlCgkgKi8KCXAuX2FkZEl0ZW0gPSBmdW5jdGlvbiAodmFsdWUsIHBhdGgsIGJhc2VQYXRoKSB7CgkJdmFyIGl0ZW0gPSB0aGlzLl9jcmVhdGVMb2FkSXRlbSh2YWx1ZSwgcGF0aCwgYmFzZVBhdGgpOyAvLyBiYXNlUGF0aCBhbmQgbWFuaWZlc3QgcGF0aCBhcmUgYWRkZWQgdG8gdGhlIHNyYy4KCQlpZiAoaXRlbSA9PSBudWxsKSB7IHJldHVybjsgfSAvLyBTb21ldGltZXMgcGx1Z2lucyBvciB0eXBlcyBzaG91bGQgYmUgc2tpcHBlZC4KCQl2YXIgbG9hZGVyID0gdGhpcy5fY3JlYXRlTG9hZGVyKGl0ZW0pOwoJCWlmIChsb2FkZXIgIT0gbnVsbCkgewoJCQlpdGVtLl9sb2FkZXIgPSBsb2FkZXI7CgkJCXRoaXMuX2xvYWRRdWV1ZS5wdXNoKGxvYWRlcik7CgkJCXRoaXMuX2xvYWRRdWV1ZUJhY2t1cC5wdXNoKGxvYWRlcik7CgoJCQl0aGlzLl9udW1JdGVtcysrOwoJCQl0aGlzLl91cGRhdGVQcm9ncmVzcygpOwoKCQkJLy8gT25seSB3b3JyeSBhYm91dCBzY3JpcHQgb3JkZXIgd2hlbiB1c2luZyBYSFIgdG8gbG9hZCBzY3JpcHRzLiBUYWdzIGFyZSBvbmx5IGxvYWRpbmcgb25lIGF0IGEgdGltZS4KCQkJaWYgKCh0aGlzLm1haW50YWluU2NyaXB0T3JkZXIKCQkJCSAmJiBpdGVtLnR5cGUgPT0gY3JlYXRlanMuTG9hZFF1ZXVlLkpBVkFTQ1JJUFQKCQkJCQkvLyYmIGxvYWRlciBpbnN0YW5jZW9mIGNyZWF0ZWpzLlhIUkxvYWRlciAvL05PVEU6IEhhdmUgdG8gdHJhY2sgYWxsIEpTIGZpbGVzIHRoaXMgd2F5CgkJCQkpCgkJCQl8fCBpdGVtLm1haW50YWluT3JkZXIgPT09IHRydWUpIHsKCQkJCXRoaXMuX3NjcmlwdE9yZGVyLnB1c2goaXRlbSk7CgkJCQl0aGlzLl9sb2FkZWRTY3JpcHRzLnB1c2gobnVsbCk7CgkJCX0KCQl9Cgl9OwoKCS8qKgoJICogQ3JlYXRlIGEgcmVmaW5lZCB7eyNjcm9zc0xpbmsgIkxvYWRJdGVtIn19e3svY3Jvc3NMaW5rfX0sIHdoaWNoIGNvbnRhaW5zIGFsbCB0aGUgcmVxdWlyZWQgcHJvcGVydGllcy4gVGhlIHR5cGUgb2YKCSAqIGl0ZW0gaXMgZGV0ZXJtaW5lZCBieSBicm93c2VyIHN1cHBvcnQsIHJlcXVpcmVtZW50cyBiYXNlZCBvbiB0aGUgZmlsZSB0eXBlLCBhbmQgZGV2ZWxvcGVyIHNldHRpbmdzLiBGb3IgZXhhbXBsZSwKCSAqIFhIUiBpcyBvbmx5IHVzZWQgZm9yIGZpbGUgdHlwZXMgdGhhdCBzdXBwb3J0IGl0IGluIG5ldyBicm93c2Vycy4KCSAqCgkgKiBCZWZvcmUgdGhlIGl0ZW0gaXMgcmV0dXJuZWQsIGFueSBwbHVnaW5zIHJlZ2lzdGVyZWQgdG8gaGFuZGxlIHRoZSB0eXBlIG9yIGV4dGVuc2lvbiB3aWxsIGJlIGZpcmVkLCB3aGljaCBtYXkKCSAqIGFsdGVyIHRoZSBsb2FkIGl0ZW0uCgkgKiBAbWV0aG9kIF9jcmVhdGVMb2FkSXRlbQoJICogQHBhcmFtIHtTdHJpbmcgfCBPYmplY3QgfCBIVE1MQXVkaW9FbGVtZW50IHwgSFRNTEltYWdlRWxlbWVudH0gdmFsdWUgVGhlIGl0ZW0gdGhhdCBuZWVkcyB0byBiZSBwcmVsb2FkZWQuCgkgKiBAcGFyYW0ge1N0cmluZ30gW3BhdGhdIEEgcGF0aCB0byBwcmVwZW5kIHRvIHRoZSBpdGVtJ3Mgc291cmNlLiBTb3VyY2VzIGJlZ2lubmluZyB3aXRoIGh0dHA6Ly8gb3Igc2ltaWxhciB3aWxsCgkgKiBub3QgcmVjZWl2ZSBhIHBhdGguIFNpbmNlIFByZWxvYWRKUyAwLjQuMSwgdGhlIHNyYyB3aWxsIGJlIG1vZGlmaWVkIHRvIGluY2x1ZGUgdGhlIGBwYXRoYCBhbmQge3sjY3Jvc3NMaW5rICJMb2FkUXVldWUvX2Jhc2VQYXRoOnByb3BlcnR5In19e3svY3Jvc3NMaW5rfX0KCSAqIHdoZW4gaXQgaXMgYWRkZWQuCgkgKiBAcGFyYW0ge1N0cmluZ30gW2Jhc2VQYXRoXSA8c3Ryb25nPkRlcHJlY3RhdGVkPC9zdHJvbmc+IEEgYmFzZSBwYXRoIHRvIHByZXBlbmQgdG8gdGhlIGl0ZW1zIHNvdXJjZSBpbiBhZGRpdGlvbiB0bwoJICogdGhlIHBhdGggYXJndW1lbnQuCgkgKiBAcmV0dXJuIHtPYmplY3R9IFRoZSBsb2FkZXIgaW5zdGFuY2UgdGhhdCB3aWxsIGJlIHVzZWQuCgkgKiBAcHJpdmF0ZQoJICovCglwLl9jcmVhdGVMb2FkSXRlbSA9IGZ1bmN0aW9uICh2YWx1ZSwgcGF0aCwgYmFzZVBhdGgpIHsKCQl2YXIgaXRlbSA9IGNyZWF0ZWpzLkxvYWRJdGVtLmNyZWF0ZSh2YWx1ZSk7CgkJaWYgKGl0ZW0gPT0gbnVsbCkgeyByZXR1cm4gbnVsbDsgfQoKCQkvLyBEZXRlcm1pbmUgRXh0ZW5zaW9uLCBldGMuCgkJdmFyIG1hdGNoID0gY3JlYXRlanMuUmVxdWVzdFV0aWxzLnBhcnNlVVJJKGl0ZW0uc3JjKTsKCQlpZiAobWF0Y2guZXh0ZW5zaW9uKSB7IGl0ZW0uZXh0ID0gbWF0Y2guZXh0ZW5zaW9uOyB9CgkJaWYgKGl0ZW0udHlwZSA9PSBudWxsKSB7CgkJCWl0ZW0udHlwZSA9IGNyZWF0ZWpzLlJlcXVlc3RVdGlscy5nZXRUeXBlQnlFeHRlbnNpb24oaXRlbS5leHQpOwoJCX0KCgkJLy8gSW5qZWN0IHBhdGggJiBiYXNlUGF0aAoJCXZhciBicCA9ICIiOyAvLyBTdG9yZSB0aGUgZ2VuZXJhdGVkIGJhc2VQYXRoCgkJdmFyIHVzZUJhc2VQYXRoID0gYmFzZVBhdGggfHwgdGhpcy5fYmFzZVBhdGg7CgkJdmFyIGF1dG9JZCA9IGl0ZW0uc3JjOwoJCWlmICghbWF0Y2guYWJzb2x1dGUgJiYgIW1hdGNoLnJlbGF0aXZlKSB7CgkJCWlmIChwYXRoKSB7CgkJCQlicCA9IHBhdGg7CgkJCQl2YXIgcGF0aE1hdGNoID0gY3JlYXRlanMuUmVxdWVzdFV0aWxzLnBhcnNlVVJJKHBhdGgpOwoJCQkJYXV0b0lkID0gcGF0aCArIGF1dG9JZDsKCQkJCS8vIEFsc28gYXBwZW5kIGJhc2VQYXRoCgkJCQlpZiAodXNlQmFzZVBhdGggIT0gbnVsbCAmJiAhcGF0aE1hdGNoLmFic29sdXRlICYmICFwYXRoTWF0Y2gucmVsYXRpdmUpIHsKCQkJCQlicCA9IHVzZUJhc2VQYXRoICsgYnA7CgkJCQl9CgkJCX0gZWxzZSBpZiAodXNlQmFzZVBhdGggIT0gbnVsbCkgewoJCQkJYnAgPSB1c2VCYXNlUGF0aDsKCQkJfQoJCX0KCQlpdGVtLnNyYyA9IGJwICsgaXRlbS5zcmM7CgkJaXRlbS5wYXRoID0gYnA7CgoJCS8vIElmIHRoZXJlJ3Mgbm8gaWQsIHNldCBvbmUgbm93LgoJCWlmIChpdGVtLmlkID09PSB1bmRlZmluZWQgfHwgaXRlbS5pZCA9PT0gbnVsbCB8fCBpdGVtLmlkID09PSAiIikgewoJCQlpdGVtLmlkID0gYXV0b0lkOwoJCX0KCgkJLy8gR2l2ZSBwbHVnaW5zIGEgY2hhbmNlIHRvIG1vZGlmeSB0aGUgbG9hZEl0ZW06CgkJdmFyIGN1c3RvbUhhbmRsZXIgPSB0aGlzLl90eXBlQ2FsbGJhY2tzW2l0ZW0udHlwZV0gfHwgdGhpcy5fZXh0ZW5zaW9uQ2FsbGJhY2tzW2l0ZW0uZXh0XTsKCQlpZiAoY3VzdG9tSGFuZGxlcikgewoJCQkvLyBQbHVnaW5zIGFyZSBub3cgcGFzc2VkIGJvdGggdGhlIGZ1bGwgc291cmNlLCBhcyB3ZWxsIGFzIGEgY29tYmluZWQgcGF0aCtiYXNlUGF0aCAoYXBwcm9wcmlhdGVseSkKCQkJdmFyIHJlc3VsdCA9IGN1c3RvbUhhbmRsZXIuY2FsbGJhY2suY2FsbChjdXN0b21IYW5kbGVyLnNjb3BlLCBpdGVtLCB0aGlzKTsKCgkJCS8vIFRoZSBwbHVnaW4gd2lsbCBoYW5kbGUgdGhlIGxvYWQsIG9yIGhhcyBjYW5jZWxlZCBpdC4gSWdub3JlIGl0LgoJCQlpZiAocmVzdWx0ID09PSBmYWxzZSkgewoJCQkJcmV0dXJuIG51bGw7CgoJCQkJLy8gTG9hZCBhcyBub3JtYWw6CgkJCX0gZWxzZSBpZiAocmVzdWx0ID09PSB0cnVlKSB7CgkJCQkvLyBEbyBOb3RoaW5nCgoJCQkvLyBSZXN1bHQgaXMgYSBsb2FkZXIgY2xhc3M6CgkJCX0gZWxzZSBpZiAocmVzdWx0ICE9IG51bGwpIHsKCQkJCWl0ZW0uX2xvYWRlciA9IHJlc3VsdDsKCQkJfQoKCQkJLy8gVXBkYXRlIHRoZSBleHRlbnNpb24gaW4gY2FzZSB0aGUgdHlwZSBjaGFuZ2VkOgoJCQltYXRjaCA9IGNyZWF0ZWpzLlJlcXVlc3RVdGlscy5wYXJzZVVSSShpdGVtLnNyYyk7CgkJCWlmIChtYXRjaC5leHRlbnNpb24gIT0gbnVsbCkgewoJCQkJaXRlbS5leHQgPSBtYXRjaC5leHRlbnNpb247CgkJCX0KCQl9CgoJCS8vIFN0b3JlIHRoZSBpdGVtIGZvciBsb29rdXAuIFRoaXMgYWxzbyBoZWxwcyBjbGVhbi11cCBsYXRlci4KCQl0aGlzLl9sb2FkSXRlbXNCeUlkW2l0ZW0uaWRdID0gaXRlbTsKCQl0aGlzLl9sb2FkSXRlbXNCeVNyY1tpdGVtLnNyY10gPSBpdGVtOwoKCQlpZiAoaXRlbS5sb2FkVGltZW91dCA9PSBudWxsKSB7CgkJCWl0ZW0ubG9hZFRpbWVvdXQgPSBzLmxvYWRUaW1lb3V0OwoJCX0KCgkJaWYgKGl0ZW0uY3Jvc3NPcmlnaW4gPT0gbnVsbCkgewoJCQlpdGVtLmNyb3NzT3JpZ2luID0gdGhpcy5fY3Jvc3NPcmlnaW47CgkJfQoKCQlyZXR1cm4gaXRlbTsKCX07CgoJLyoqCgkgKiBDcmVhdGUgYSBsb2FkZXIgZm9yIGEgbG9hZCBpdGVtLgoJICogQG1ldGhvZCBfY3JlYXRlTG9hZGVyCgkgKiBAcGFyYW0ge09iamVjdH0gaXRlbSBBIGZvcm1hdHRlZCBsb2FkIGl0ZW0gdGhhdCBjYW4gYmUgdXNlZCB0byBnZW5lcmF0ZSBhIGxvYWRlci4KCSAqIEByZXR1cm4ge0Fic3RyYWN0TG9hZGVyfSBBIGxvYWRlciB0aGF0IGNhbiBiZSB1c2VkIHRvIGxvYWQgY29udGVudC4KCSAqIEBwcml2YXRlCgkgKi8KCXAuX2NyZWF0ZUxvYWRlciA9IGZ1bmN0aW9uIChpdGVtKSB7CgkJaWYgKGl0ZW0uX2xvYWRlciAhPSBudWxsKSB7IC8vIEEgcGx1Z2luIGFscmVhZHkgc3BlY2lmaWVkIGEgbG9hZGVyCgkJCXJldHVybiBpdGVtLl9sb2FkZXI7CgkJfQoKCQkvLyBJbml0aWFsbHksIHRyeSBhbmQgdXNlIHRoZSBwcm92aWRlZC9zdXBwb3J0ZWQgWEhSIG1vZGU6CgkJdmFyIHByZWZlclhIUiA9IHRoaXMucHJlZmVyWEhSOwoKCQlmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuX2F2YWlsYWJsZUxvYWRlcnMubGVuZ3RoOyBpKyspIHsKCQkJdmFyIGxvYWRlciA9IHRoaXMuX2F2YWlsYWJsZUxvYWRlcnNbaV07CgkJCWlmIChsb2FkZXIgJiYgbG9hZGVyLmNhbkxvYWRJdGVtKGl0ZW0pKSB7CgkJCQlyZXR1cm4gbmV3IGxvYWRlcihpdGVtLCBwcmVmZXJYSFIpOwoJCQl9CgkJfQoKCQkvLyBUT0RPOiBMb2cgZXJyb3IgKHJlcXVpcmVzIGNyZWF0ZWpzLmxvZykKCQlyZXR1cm4gbnVsbDsKCX07CgoJLyoqCgkgKiBMb2FkIHRoZSBuZXh0IGl0ZW0gaW4gdGhlIHF1ZXVlLiBJZiB0aGUgcXVldWUgaXMgZW1wdHkgKGFsbCBpdGVtcyBoYXZlIGJlZW4gbG9hZGVkKSwgdGhlbiB0aGUgY29tcGxldGUgZXZlbnQKCSAqIGlzIHByb2Nlc3NlZC4gVGhlIHF1ZXVlIHdpbGwgImZpbGwgdXAiIGFueSBlbXB0eSBzbG90cywgdXAgdG8gdGhlIG1heCBjb25uZWN0aW9uIHNwZWNpZmllZCB1c2luZwoJICoge3sjY3Jvc3NMaW5rICJMb2FkUXVldWUuc2V0TWF4Q29ubmVjdGlvbnMifX17ey9jcm9zc0xpbmt9fSBtZXRob2QuIFRoZSBvbmx5IGV4Y2VwdGlvbiBpcyBzY3JpcHRzIHRoYXQgYXJlIGxvYWRlZAoJICogdXNpbmcgdGFncywgd2hpY2ggaGF2ZSB0byBiZSBsb2FkZWQgb25lIGF0IGEgdGltZSB0byBtYWludGFpbiBsb2FkIG9yZGVyLgoJICogQG1ldGhvZCBfbG9hZE5leHQKCSAqIEBwcml2YXRlCgkgKi8KCXAuX2xvYWROZXh0ID0gZnVuY3Rpb24gKCkgewoJCWlmICh0aGlzLl9wYXVzZWQpIHsgcmV0dXJuOyB9CgoJCS8vIE9ubHkgZGlzcGF0Y2ggbG9hZHN0YXJ0IGV2ZW50IHdoZW4gdGhlIGZpcnN0IGZpbGUgaXMgbG9hZGVkLgoJCWlmICghdGhpcy5fbG9hZFN0YXJ0V2FzRGlzcGF0Y2hlZCkgewoJCQl0aGlzLl9zZW5kTG9hZFN0YXJ0KCk7CgkJCXRoaXMuX2xvYWRTdGFydFdhc0Rpc3BhdGNoZWQgPSB0cnVlOwoJCX0KCgkJLy8gVGhlIHF1ZXVlIGhhcyBjb21wbGV0ZWQuCgkJaWYgKHRoaXMuX251bUl0ZW1zID09IHRoaXMuX251bUl0ZW1zTG9hZGVkKSB7CgkJCXRoaXMubG9hZGVkID0gdHJ1ZTsKCQkJdGhpcy5fc2VuZENvbXBsZXRlKCk7CgoJCQkvLyBMb2FkIHRoZSBuZXh0IHF1ZXVlLCBpZiBpdCBoYXMgYmVlbiBkZWZpbmVkLgoJCQlpZiAodGhpcy5uZXh0ICYmIHRoaXMubmV4dC5sb2FkKSB7CgkJCQl0aGlzLm5leHQubG9hZCgpOwoJCQl9CgkJfSBlbHNlIHsKCQkJdGhpcy5sb2FkZWQgPSBmYWxzZTsKCQl9CgoJCS8vIE11c3QgaXRlcmF0ZSBmb3J3YXJkcyB0byBsb2FkIGluIHRoZSByaWdodCBvcmRlci4KCQlmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuX2xvYWRRdWV1ZS5sZW5ndGg7IGkrKykgewoJCQlpZiAodGhpcy5fY3VycmVudExvYWRzLmxlbmd0aCA+PSB0aGlzLl9tYXhDb25uZWN0aW9ucykgeyBicmVhazsgfQoJCQl2YXIgbG9hZGVyID0gdGhpcy5fbG9hZFF1ZXVlW2ldOwoKCQkJLy8gRGV0ZXJtaW5lIGlmIHdlIHNob3VsZCBiZSBvbmx5IGxvYWRpbmcgb25lIHRhZy1zY3JpcHQgYXQgYSB0aW1lOgoJCQkvLyBOb3RlOiBtYWludGFpbk9yZGVyIGl0ZW1zIGRvbid0IGRvIGFueXRoaW5nIGhlcmUgYmVjYXVzZSB3ZSBjYW4gaG9sZCBvbnRvIHRoZWlyIGxvYWRlZCB2YWx1ZQoJCQlpZiAoIXRoaXMuX2NhblN0YXJ0TG9hZChsb2FkZXIpKSB7IGNvbnRpbnVlOyB9CgkJCXRoaXMuX2xvYWRRdWV1ZS5zcGxpY2UoaSwgMSk7CgkJCWktLTsKCQkJdGhpcy5fbG9hZEl0ZW0obG9hZGVyKTsKCQl9Cgl9OwoKCS8qKgoJICogQmVnaW4gbG9hZGluZyBhbiBpdGVtLiBFdmVudCBsaXN0ZW5lcnMgYXJlIG5vdCBhZGRlZCB0byB0aGUgbG9hZGVycyB1bnRpbCB0aGUgbG9hZCBzdGFydHMuCgkgKiBAbWV0aG9kIF9sb2FkSXRlbQoJICogQHBhcmFtIHtBYnN0cmFjdExvYWRlcn0gbG9hZGVyIFRoZSBsb2FkZXIgaW5zdGFuY2UgdG8gc3RhcnQuIEN1cnJlbnRseSwgdGhpcyB3aWxsIGJlIGFuIFhIUkxvYWRlciBvciBUYWdMb2FkZXIuCgkgKiBAcHJpdmF0ZQoJICovCglwLl9sb2FkSXRlbSA9IGZ1bmN0aW9uIChsb2FkZXIpIHsKCQlsb2FkZXIub24oImZpbGVsb2FkIiwgdGhpcy5faGFuZGxlRmlsZUxvYWQsIHRoaXMpOwoJCWxvYWRlci5vbigicHJvZ3Jlc3MiLCB0aGlzLl9oYW5kbGVQcm9ncmVzcywgdGhpcyk7CgkJbG9hZGVyLm9uKCJjb21wbGV0ZSIsIHRoaXMuX2hhbmRsZUZpbGVDb21wbGV0ZSwgdGhpcyk7CgkJbG9hZGVyLm9uKCJlcnJvciIsIHRoaXMuX2hhbmRsZUVycm9yLCB0aGlzKTsKCQlsb2FkZXIub24oImZpbGVlcnJvciIsIHRoaXMuX2hhbmRsZUZpbGVFcnJvciwgdGhpcyk7CgkJdGhpcy5fY3VycmVudExvYWRzLnB1c2gobG9hZGVyKTsKCQl0aGlzLl9zZW5kRmlsZVN0YXJ0KGxvYWRlci5nZXRJdGVtKCkpOwoJCWxvYWRlci5sb2FkKCk7Cgl9OwoKCS8qKgoJICogVGhlIGNhbGxiYWNrIHRoYXQgaXMgZmlyZWQgd2hlbiBhIGxvYWRlciBsb2FkcyBhIGZpbGUuIFRoaXMgZW5hYmxlcyBsb2FkZXJzIGxpa2Uge3sjY3Jvc3NMaW5rICJNYW5pZmVzdExvYWRlciJ9fXt7L2Nyb3NzTGlua319CgkgKiB0byBtYWludGFpbiBpbnRlcm5hbCBxdWV1ZXMsIGJ1dCBmb3IgdGhpcyBxdWV1ZSB0byBkaXNwYXRjaCB0aGUge3sjY3Jvc3NMaW5rICJmaWxlbG9hZDpldmVudCJ9fXt7L2Nyb3NzTGlua319CgkgKiBldmVudHMuCgkgKiBAcGFyYW0ge0V2ZW50fSBUaGUge3sjY3Jvc3NMaW5rICJBYnN0cmFjdExvYWRlci9maWxlbG9hZDpldmVudCJ9fXt7L2Nyb3NzTGlua319IGV2ZW50IGZyb20gdGhlIGxvYWRlci4KCSAqIEBwcml2YXRlCgkgKiBAc2luY2UgMC42LjAKCSAqLwoJcC5faGFuZGxlRmlsZUxvYWQgPSBmdW5jdGlvbihldmVudCkgewoJCWV2ZW50LnRhcmdldCA9IG51bGw7CgkJdGhpcy5kaXNwYXRjaEV2ZW50KGV2ZW50KTsKCX07CgoJLyoqCgkgKiBUaGUgY2FsbGJhY2sgdGhhdCBpcyBmaXJlZCB3aGVuIGEgbG9hZGVyIGVuY291bnRlcnMgYW4gZXJyb3IgZnJvbSBhbiBpbnRlcm5hbCBmaWxlIGxvYWQgb3BlcmF0aW9uLiBUaGlzIGVuYWJsZXMKCSAqIGxvYWRlcnMgbGlrZSBNCgkgKiBAcGFyYW0gZXZlbnQKCSAqIEBwcml2YXRlCgkgKi8KCXAuX2hhbmRsZUZpbGVFcnJvciA9IGZ1bmN0aW9uKGV2ZW50KSB7CgkJdmFyIG5ld0V2ZW50ID0gbmV3IGNyZWF0ZWpzLkVycm9yRXZlbnQoIkZJTEVfTE9BRF9FUlJPUiIsIG51bGwsIGV2ZW50Lml0ZW0pOwoJCXRoaXMuX3NlbmRFcnJvcihuZXdFdmVudCk7Cgl9OwoKCS8qKgoJICogVGhlIGNhbGxiYWNrIHRoYXQgaXMgZmlyZWQgd2hlbiBhIGxvYWRlciBlbmNvdW50ZXJzIGFuIGVycm9yLiBUaGUgcXVldWUgd2lsbCBjb250aW51ZSBsb2FkaW5nIHVubGVzcyB7eyNjcm9zc0xpbmsgIkxvYWRRdWV1ZS9zdG9wT25FcnJvcjpwcm9wZXJ0eSJ9fXt7L2Nyb3NzTGlua319CgkgKiBpcyBzZXQgdG8gYHRydWVgLgoJICogQG1ldGhvZCBfaGFuZGxlRXJyb3IKCSAqIEBwYXJhbSB7RXJyb3JFdmVudH0gZXZlbnQgVGhlIGVycm9yIGV2ZW50LCBjb250YWluaW5nIHJlbGV2YW50IGVycm9yIGluZm9ybWF0aW9uLgoJICogQHByaXZhdGUKCSAqLwoJcC5faGFuZGxlRXJyb3IgPSBmdW5jdGlvbiAoZXZlbnQpIHsKCQl2YXIgbG9hZGVyID0gZXZlbnQudGFyZ2V0OwoJCXRoaXMuX251bUl0ZW1zTG9hZGVkKys7CgoJCXRoaXMuX2ZpbmlzaE9yZGVyZWRJdGVtKGxvYWRlciwgdHJ1ZSk7CgkJdGhpcy5fdXBkYXRlUHJvZ3Jlc3MoKTsKCgkJdmFyIG5ld0V2ZW50ID0gbmV3IGNyZWF0ZWpzLkVycm9yRXZlbnQoIkZJTEVfTE9BRF9FUlJPUiIsIG51bGwsIGxvYWRlci5nZXRJdGVtKCkpOwoJCS8vIFRPRE86IFByb3BhZ2F0ZSBhY3R1YWwgZXJyb3IgbWVzc2FnZS4KCgkJdGhpcy5fc2VuZEVycm9yKG5ld0V2ZW50KTsKCgkJaWYgKCF0aGlzLnN0b3BPbkVycm9yKSB7CgkJCXRoaXMuX3JlbW92ZUxvYWRJdGVtKGxvYWRlcik7CgkJCXRoaXMuX2xvYWROZXh0KCk7CgkJfQoJfTsKCgkvKioKCSAqIEFuIGl0ZW0gaGFzIGZpbmlzaGVkIGxvYWRpbmcuIFdlIGNhbiBhc3N1bWUgdGhhdCBpdCBpcyB0b3RhbGx5IGxvYWRlZCwgaGFzIGJlZW4gcGFyc2VkIGZvciBpbW1lZGlhdGUgdXNlLCBhbmQKCSAqIGlzIGF2YWlsYWJsZSBhcyB0aGUgInJlc3VsdCIgcHJvcGVydHkgb24gdGhlIGxvYWQgaXRlbS4gVGhlIHJhdyB0ZXh0IHJlc3VsdCBmb3IgYSBwYXJzZWQgaXRlbSAoc3VjaCBhcyBKU09OLCBYTUwsCgkgKiBDU1MsIEphdmFTY3JpcHQsIGV0YykgaXMgYXZhaWxhYmxlIGFzIHRoZSAicmF3UmVzdWx0IiBwcm9wZXJ0eSwgYW5kIGNhbiBhbHNvIGJlIGxvb2tlZCB1cCB1c2luZyB7eyNjcm9zc0xpbmsgIkxvYWRRdWV1ZS9nZXRSZXN1bHQifX17ey9jcm9zc0xpbmt9fS4KCSAqIEBtZXRob2QgX2hhbmRsZUZpbGVDb21wbGV0ZQoJICogQHBhcmFtIHtFdmVudH0gZXZlbnQgVGhlIGV2ZW50IG9iamVjdCBmcm9tIHRoZSBsb2FkZXIuCgkgKiBAcHJpdmF0ZQoJICovCglwLl9oYW5kbGVGaWxlQ29tcGxldGUgPSBmdW5jdGlvbiAoZXZlbnQpIHsKCQl2YXIgbG9hZGVyID0gZXZlbnQudGFyZ2V0OwoJCXZhciBpdGVtID0gbG9hZGVyLmdldEl0ZW0oKTsKCgkJdmFyIHJlc3VsdCA9IGxvYWRlci5nZXRSZXN1bHQoKTsKCQl0aGlzLl9sb2FkZWRSZXN1bHRzW2l0ZW0uaWRdID0gcmVzdWx0OwoJCXZhciByYXdSZXN1bHQgPSBsb2FkZXIuZ2V0UmVzdWx0KHRydWUpOwoJCWlmIChyYXdSZXN1bHQgIT0gbnVsbCAmJiByYXdSZXN1bHQgIT09IHJlc3VsdCkgewoJCQl0aGlzLl9sb2FkZWRSYXdSZXN1bHRzW2l0ZW0uaWRdID0gcmF3UmVzdWx0OwoJCX0KCgkJdGhpcy5fc2F2ZUxvYWRlZEl0ZW1zKGxvYWRlcik7CgoJCS8vIENsZWFuIHVwIHRoZSBsb2FkIGl0ZW0KCQl0aGlzLl9yZW1vdmVMb2FkSXRlbShsb2FkZXIpOwoKCQlpZiAoIXRoaXMuX2ZpbmlzaE9yZGVyZWRJdGVtKGxvYWRlcikpIHsKCQkJLy8gVGhlIGl0ZW0gd2FzIE5PVCBtYW5hZ2VkLCBzbyBwcm9jZXNzIGl0IG5vdwoJCQl0aGlzLl9wcm9jZXNzRmluaXNoZWRMb2FkKGl0ZW0sIGxvYWRlcik7CgkJfQoJfTsKCgkvKioKCSAqIFNvbWUgbG9hZGVycyBtaWdodCBsb2FkIGFkZGl0aW9uYWwgY29udGVudCwgb3RoZXIgdGhhbiB0aGUgaXRlbSB0aGV5IHdlcmUgcGFzc2VkIChzdWNoIGFzIHt7I2Nyb3NzTGluayAiTWFuaWZlc3RMb2FkZXIifX17ey9jcm9zc0xpbmt9fSkuCgkgKiBBbnkgaXRlbXMgZXhwb3NlZCBieSB0aGUgbG9hZGVyIHVzaW5nIHt7I2Nyb3NzTGluayAiQWJzdHJhY3RMb2FkZXIvZ2V0TG9hZEl0ZW1zIn19e3svY3Jvc3NMaW5rfX0gYXJlIGFkZGVkIHRvIHRoZQoJICogTG9hZFF1ZXVlJ3MgbG9vay11cHMsIGluY2x1ZGluZyB7eyNjcm9zc0xpbmsgImdldEl0ZW0ifX17ey9jcm9zc0xpbmt9fSBhbmQge3sjY3Jvc3NMaW5rICJnZXRSZXN1bHQifX17ey9jcm9zc0xpbmt9fQoJICogbWV0aG9kcy4KCSAqIEBtZXRob2QgX3NhdmVMb2FkZWRJdGVtcwoJICogQHBhcmFtIHtBYnN0cmFjdExvYWRlcn0gbG9hZGVyCgkgKiBAcHJvdGVjdGVkCgkgKiBAc2luY2UgMC42LjAKCSAqLwoJcC5fc2F2ZUxvYWRlZEl0ZW1zID0gZnVuY3Rpb24obG9hZGVyKSB7CgkJLy8gVE9ETzogTm90IHN1cmUgaG93IHRvIGhhbmRsZSB0aGlzLiBXb3VsZCBiZSBuaWNlIHRvIGV4cG9zZSB0aGUgaXRlbXMuCgkJLy8gTG9hZGVycyBtYXkgbG9hZCBzdWItaXRlbXMuIFRoaXMgYWRkcyB0aGVtIHRvIHRoaXMgcXVldWUKCQl2YXIgbGlzdCA9IGxvYWRlci5nZXRMb2FkZWRJdGVtcygpOwoJCWlmIChsaXN0ID09PSBudWxsKSB7IHJldHVybjsgfQoKCQlmb3IgKHZhciBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIHsKCQkJdmFyIGl0ZW0gPSBsaXN0W2ldLml0ZW07CgoJCQkvLyBTdG9yZSBpdGVtIGxvb2t1cHMKCQkJdGhpcy5fbG9hZEl0ZW1zQnlTcmNbaXRlbS5zcmNdID0gaXRlbTsKCQkJdGhpcy5fbG9hZEl0ZW1zQnlJZFtpdGVtLmlkXSA9IGl0ZW07CgoJCQkvLyBTdG9yZSBsb2FkZWQgY29udGVudAoJCQl0aGlzLl9sb2FkZWRSZXN1bHRzW2l0ZW0uaWRdID0gbGlzdFtpXS5yZXN1bHQ7CgkJCXRoaXMuX2xvYWRlZFJhd1Jlc3VsdHNbaXRlbS5pZF0gPSBsaXN0W2ldLnJhd1Jlc3VsdDsKCQl9Cgl9CgoJLyoqCgkgKiBGbGFnIGFuIGl0ZW0gYXMgZmluaXNoZWQuIElmIHRoZSBpdGVtJ3Mgb3JkZXIgaXMgYmVpbmcgbWFuYWdlZCwgdGhlbiBlbnN1cmUgdGhhdCBpdCBpcyBhbGxvd2VkIHRvIGZpbmlzaCwgYW5kIGlmCgkgKiBzbywgdHJpZ2dlciBwcmlvciBpdGVtcyB0byB0cmlnZ2VyIGFzIHdlbGwuCgkgKiBAbWV0aG9kIF9maW5pc2hPcmRlcmVkSXRlbQoJICogQHBhcmFtIHtBYnN0cmFjdExvYWRlcn0gbG9hZGVyCgkgKiBAcmV0dXJuIHtCb29sZWFufSBJZiB0aGUgaXRlbSdzIG9yZGVyIGlzIGJlaW5nIG1hbmFnZWQuIFRoaXMgYWxsb3dzIHRoZSBjYWxsZXIgdG8gdGFrZSBhbiBhbHRlcm5hdGUKCSAqIGJlaGF2aW91ciBpZiBpdCBpcy4KCSAqIEBwcml2YXRlCgkgKi8KCXAuX2ZpbmlzaE9yZGVyZWRJdGVtID0gZnVuY3Rpb24gKGxvYWRlciwgbG9hZEZhaWxlZCkgewoJCXZhciBpdGVtID0gbG9hZGVyLmdldEl0ZW0oKTsKCgkJaWYgKCh0aGlzLm1haW50YWluU2NyaXB0T3JkZXIgJiYgaXRlbS50eXBlID09IGNyZWF0ZWpzLkxvYWRRdWV1ZS5KQVZBU0NSSVBUKQoJCQl8fCBpdGVtLm1haW50YWluT3JkZXIpIHsKCgkJCS8vVE9ETzogRXZhbHVhdGUgcmVtb3ZhbCBvZiB0aGUgX2N1cnJlbnRseUxvYWRpbmdTY3JpcHQKCQkJaWYgKGxvYWRlciBpbnN0YW5jZW9mIGNyZWF0ZWpzLkphdmFTY3JpcHRMb2FkZXIpIHsKCQkJCXRoaXMuX2N1cnJlbnRseUxvYWRpbmdTY3JpcHQgPSBmYWxzZTsKCQkJfQoKCQkJdmFyIGluZGV4ID0gY3JlYXRlanMuaW5kZXhPZih0aGlzLl9zY3JpcHRPcmRlciwgaXRlbSk7CgkJCWlmIChpbmRleCA9PSAtMSkgeyByZXR1cm4gZmFsc2U7IH0gLy8gVGhpcyBsb2FkZXIgbm8gbG9uZ2VyIGV4aXN0cwoJCQl0aGlzLl9sb2FkZWRTY3JpcHRzW2luZGV4XSA9IChsb2FkRmFpbGVkID09PSB0cnVlKSA/IHRydWUgOiBpdGVtOwoKCQkJdGhpcy5fY2hlY2tTY3JpcHRMb2FkT3JkZXIoKTsKCQkJcmV0dXJuIHRydWU7CgkJfQoKCQlyZXR1cm4gZmFsc2U7Cgl9OwoKCS8qKgoJICogRW5zdXJlIHRoZSBzY3JpcHRzIGxvYWQgYW5kIGRpc3BhdGNoIGluIHRoZSBjb3JyZWN0IG9yZGVyLiBXaGVuIHVzaW5nIFhIUiwgc2NyaXB0cyBhcmUgc3RvcmVkIGluIGFuIGFycmF5IGluIHRoZQoJICogb3JkZXIgdGhleSB3ZXJlIGFkZGVkLCBidXQgd2l0aCBhICJudWxsIiB2YWx1ZS4gV2hlbiB0aGV5IGFyZSBjb21wbGV0ZWQsIHRoZSB2YWx1ZSBpcyBzZXQgdG8gdGhlIGxvYWQgaXRlbSwKCSAqIGFuZCB0aGVuIHdoZW4gdGhleSBhcmUgcHJvY2Vzc2VkIGFuZCBkaXNwYXRjaGVkLCB0aGUgdmFsdWUgaXMgc2V0IHRvIGB0cnVlYC4gVGhpcyBtZXRob2Qgc2ltcGx5CgkgKiBpdGVyYXRlcyB0aGUgYXJyYXksIGFuZCBlbnN1cmVzIHRoYXQgYW55IGxvYWRlZCBpdGVtcyB0aGF0IGFyZSBub3QgcHJlY2VkZWQgYnkgYSBgbnVsbGAgdmFsdWUgYXJlCgkgKiBkaXNwYXRjaGVkLgoJICogQG1ldGhvZCBfY2hlY2tTY3JpcHRMb2FkT3JkZXIKCSAqIEBwcml2YXRlCgkgKi8KCXAuX2NoZWNrU2NyaXB0TG9hZE9yZGVyID0gZnVuY3Rpb24gKCkgewoJCXZhciBsID0gdGhpcy5fbG9hZGVkU2NyaXB0cy5sZW5ndGg7CgoJCWZvciAodmFyIGkgPSAwOyBpIDwgbDsgaSsrKSB7CgkJCXZhciBpdGVtID0gdGhpcy5fbG9hZGVkU2NyaXB0c1tpXTsKCQkJaWYgKGl0ZW0gPT09IG51bGwpIHsgYnJlYWs7IH0gLy8gVGhpcyBpcyBzdGlsbCBsb2FkaW5nLiBEbyBub3QgcHJvY2VzcyBmdXJ0aGVyLgoJCQlpZiAoaXRlbSA9PT0gdHJ1ZSkgeyBjb250aW51ZTsgfSAvLyBUaGlzIGhhcyBjb21wbGV0ZWQsIGFuZCBiZWVuIHByb2Nlc3NlZC4gTW92ZSBvbi4KCgkJCXZhciBsb2FkSXRlbSA9IHRoaXMuX2xvYWRlZFJlc3VsdHNbaXRlbS5pZF07CgkJCWlmIChpdGVtLnR5cGUgPT0gY3JlYXRlanMuTG9hZFF1ZXVlLkpBVkFTQ1JJUFQpIHsKCQkJCS8vIEFwcGVuZCBzY3JpcHQgdGFncyB0byB0aGUgaGVhZCBhdXRvbWF0aWNhbGx5LiBUYWdzIGRvIHRoaXMgaW4gdGhlIGxvYWRlciwgYnV0IFhIUiBzY3JpcHRzIGhhdmUgdG8gbWFpbnRhaW4gb3JkZXIuCgkJCQkoZG9jdW1lbnQuYm9keSB8fCBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYm9keSIpWzBdKS5hcHBlbmRDaGlsZChsb2FkSXRlbSk7CgkJCX0KCgkJCXZhciBsb2FkZXIgPSBpdGVtLl9sb2FkZXI7CgkJCXRoaXMuX3Byb2Nlc3NGaW5pc2hlZExvYWQoaXRlbSwgbG9hZGVyKTsKCQkJdGhpcy5fbG9hZGVkU2NyaXB0c1tpXSA9IHRydWU7CgkJfQoJfTsKCgkvKioKCSAqIEEgZmlsZSBoYXMgY29tcGxldGVkIGxvYWRpbmcsIGFuZCB0aGUgTG9hZFF1ZXVlIGNhbiBtb3ZlIG9uLiBUaGlzIHRyaWdnZXJzIHRoZSBjb21wbGV0ZSBldmVudCwgYW5kIGtpY2stc3RhcnRzCgkgKiB0aGUgbmV4dCBpdGVtLgoJICogQG1ldGhvZCBfcHJvY2Vzc0ZpbmlzaGVkTG9hZAoJICogQHBhcmFtIHtMb2FkSXRlbXxPYmplY3R9IGl0ZW0KCSAqIEBwYXJhbSB7QWJzdHJhY3RMb2FkZXJ9IGxvYWRlcgoJICogQHByb3RlY3RlZAoJICovCglwLl9wcm9jZXNzRmluaXNoZWRMb2FkID0gZnVuY3Rpb24gKGl0ZW0sIGxvYWRlcikgewoJCXRoaXMuX251bUl0ZW1zTG9hZGVkKys7CgkJdGhpcy5fdXBkYXRlUHJvZ3Jlc3MoKTsKCQl0aGlzLl9zZW5kRmlsZUNvbXBsZXRlKGl0ZW0sIGxvYWRlcik7CgkJdGhpcy5fbG9hZE5leHQoKTsKCX07CgoJLyoqCgkgKiBFbnN1cmUgaXRlbXMgd2l0aCBgbWFpbnRhaW5PcmRlcj10cnVlYCB0aGF0IGFyZSBiZWZvcmUgdGhlIHNwZWNpZmllZCBpdGVtIGhhdmUgbG9hZGVkLiBUaGlzIG9ubHkgYXBwbGllcyB0bwoJICogSmF2YVNjcmlwdCBpdGVtcyB0aGF0IGFyZSBiZWluZyBsb2FkZWQgd2l0aCBhIFRhZ0xvYWRlciwgc2luY2UgdGhleSBoYXZlIHRvIGJlIGxvYWRlZCBhbmQgY29tcGxldGVkIDxzdHJvbmc+YmVmb3JlPC9zdHJvbmc+CgkgKiB0aGUgc2NyaXB0IGNhbiBldmVuIGJlIHN0YXJ0ZWQsIHNpbmNlIGl0IGV4aXN0IGluIHRoZSBET00gd2hpbGUgbG9hZGluZy4KCSAqIEBtZXRob2QgX2NhblN0YXJ0TG9hZAoJICogQHBhcmFtIHtBYnN0cmFjdExvYWRlcn0gbG9hZGVyIFRoZSBsb2FkZXIgZm9yIHRoZSBpdGVtCgkgKiBAcmV0dXJuIHtCb29sZWFufSBXaGV0aGVyIHRoZSBpdGVtIGNhbiBzdGFydCBhIGxvYWQgb3Igbm90LgoJICogQHByaXZhdGUKCSAqLwoJcC5fY2FuU3RhcnRMb2FkID0gZnVuY3Rpb24gKGxvYWRlcikgewoJCWlmICghdGhpcy5tYWludGFpblNjcmlwdE9yZGVyIHx8IGxvYWRlci5wcmVmZXJYSFIpIHsgcmV0dXJuIHRydWU7IH0KCQl2YXIgaXRlbSA9IGxvYWRlci5nZXRJdGVtKCk7CgkJaWYgKGl0ZW0udHlwZSAhPSBjcmVhdGVqcy5Mb2FkUXVldWUuSkFWQVNDUklQVCkgeyByZXR1cm4gdHJ1ZTsgfQoJCWlmICh0aGlzLl9jdXJyZW50bHlMb2FkaW5nU2NyaXB0KSB7IHJldHVybiBmYWxzZTsgfQoKCQl2YXIgaW5kZXggPSB0aGlzLl9zY3JpcHRPcmRlci5pbmRleE9mKGl0ZW0pOwoJCXZhciBpID0gMDsKCQl3aGlsZSAoaSA8IGluZGV4KSB7CgkJCXZhciBjaGVja0l0ZW0gPSB0aGlzLl9sb2FkZWRTY3JpcHRzW2ldOwoJCQlpZiAoY2hlY2tJdGVtID09IG51bGwpIHsgcmV0dXJuIGZhbHNlOyB9CgkJCWkrKzsKCQl9CgkJdGhpcy5fY3VycmVudGx5TG9hZGluZ1NjcmlwdCA9IHRydWU7CgkJcmV0dXJuIHRydWU7Cgl9OwoKCS8qKgoJICogQSBsb2FkIGl0ZW0gaXMgY29tcGxldGVkIG9yIHdhcyBjYW5jZWxlZCwgYW5kIG5lZWRzIHRvIGJlIHJlbW92ZWQgZnJvbSB0aGUgTG9hZFF1ZXVlLgoJICogQG1ldGhvZCBfcmVtb3ZlTG9hZEl0ZW0KCSAqIEBwYXJhbSB7QWJzdHJhY3RMb2FkZXJ9IGxvYWRlciBBIGxvYWRlciBpbnN0YW5jZSB0byByZW1vdmUuCgkgKiBAcHJpdmF0ZQoJICovCglwLl9yZW1vdmVMb2FkSXRlbSA9IGZ1bmN0aW9uIChsb2FkZXIpIHsKCQl2YXIgaXRlbSA9IGxvYWRlci5nZXRJdGVtKCk7CgkJZGVsZXRlIGl0ZW0uX2xvYWRlcjsKCgkJdmFyIGwgPSB0aGlzLl9jdXJyZW50TG9hZHMubGVuZ3RoOwoJCWZvciAodmFyIGkgPSAwOyBpIDwgbDsgaSsrKSB7CgkJCWlmICh0aGlzLl9jdXJyZW50TG9hZHNbaV0gPT0gbG9hZGVyKSB7CgkJCQl0aGlzLl9jdXJyZW50TG9hZHMuc3BsaWNlKGksIDEpOwoJCQkJYnJlYWs7CgkJCX0KCQl9Cgl9OwoKCS8qKgoJICogQW4gaXRlbSBoYXMgZGlzcGF0Y2hlZCBwcm9ncmVzcy4gUHJvcGFnYXRlIHRoYXQgcHJvZ3Jlc3MsIGFuZCB1cGRhdGUgdGhlIExvYWRRdWV1ZSdzIG92ZXJhbGwgcHJvZ3Jlc3MuCgkgKiBAbWV0aG9kIF9oYW5kbGVQcm9ncmVzcwoJICogQHBhcmFtIHtQcm9ncmVzc0V2ZW50fSBldmVudCBUaGUgcHJvZ3Jlc3MgZXZlbnQgZnJvbSB0aGUgaXRlbS4KCSAqIEBwcml2YXRlCgkgKi8KCXAuX2hhbmRsZVByb2dyZXNzID0gZnVuY3Rpb24gKGV2ZW50KSB7CgkJdmFyIGxvYWRlciA9IGV2ZW50LnRhcmdldDsKCQl0aGlzLl9zZW5kRmlsZVByb2dyZXNzKGxvYWRlci5nZXRJdGVtKCksIGxvYWRlci5wcm9ncmVzcyk7CgkJdGhpcy5fdXBkYXRlUHJvZ3Jlc3MoKTsKCX07CgoJLyoqCgkgKiBPdmVyYWxsIHByb2dyZXNzIGhhcyBjaGFuZ2VkLCBzbyBkZXRlcm1pbmUgdGhlIG5ldyBwcm9ncmVzcyBhbW91bnQgYW5kIGRpc3BhdGNoIGl0LiBUaGlzIGNoYW5nZXMgYW55IHRpbWUgYW4KCSAqIGl0ZW0gZGlzcGF0Y2hlcyBwcm9ncmVzcyBvciBjb21wbGV0ZXMuIE5vdGUgdGhhdCBzaW5jZSB3ZSBkb24ndCBhbHdheXMga25vdyB0aGUgYWN0dWFsIGZpbGVzaXplIG9mIGl0ZW1zIGJlZm9yZQoJICogdGhleSBhcmUgbG9hZGVkLiBJbiB0aGlzIGNhc2UsIHdlIGRlZmluZSBhICJzbG90IiBmb3IgZWFjaCBpdGVtICgxIGl0ZW0gaW4gMTAgd291bGQgZ2V0IDEwJSksIGFuZCB0aGVuIGFwcGVuZAoJICogbG9hZGVkIHByb2dyZXNzIG9uIHRvcCBvZiB0aGUgYWxyZWFkeS1sb2FkZWQgaXRlbXMuCgkgKgoJICogRm9yIGV4YW1wbGUsIGlmIDUvMTAgaXRlbXMgaGF2ZSBsb2FkZWQsIGFuZCBpdGVtIDYgaXMgMjAlIGxvYWRlZCwgdGhlIHRvdGFsIHByb2dyZXNzIHdvdWxkIGJlOgoJICogPHVsPgoJICogICAgICA8bGk+NS8xMCBvZiB0aGUgaXRlbXMgaW4gdGhlIHF1ZXVlICg1MCUpPC9saT4KCSAqICAgICAgPGxpPnBsdXMgMjAlIG9mIGl0ZW0gNidzIHNsb3QgKDIlKTwvbGk+CgkgKiAgICAgIDxsaT5lcXVhbHMgNTIlPC9saT4KCSAqIDwvdWw+CgkgKiBAbWV0aG9kIF91cGRhdGVQcm9ncmVzcwoJICogQHByaXZhdGUKCSAqLwoJcC5fdXBkYXRlUHJvZ3Jlc3MgPSBmdW5jdGlvbiAoKSB7CgkJdmFyIGxvYWRlZCA9IHRoaXMuX251bUl0ZW1zTG9hZGVkIC8gdGhpcy5fbnVtSXRlbXM7IC8vIEZ1bGx5IExvYWRlZCBQcm9ncmVzcwoJCXZhciByZW1haW5pbmcgPSB0aGlzLl9udW1JdGVtcyAtIHRoaXMuX251bUl0ZW1zTG9hZGVkOwoJCWlmIChyZW1haW5pbmcgPiAwKSB7CgkJCXZhciBjaHVuayA9IDA7CgkJCWZvciAodmFyIGkgPSAwLCBsID0gdGhpcy5fY3VycmVudExvYWRzLmxlbmd0aDsgaSA8IGw7IGkrKykgewoJCQkJY2h1bmsgKz0gdGhpcy5fY3VycmVudExvYWRzW2ldLnByb2dyZXNzOwoJCQl9CgkJCWxvYWRlZCArPSAoY2h1bmsgLyByZW1haW5pbmcpICogKHJlbWFpbmluZyAvIHRoaXMuX251bUl0ZW1zKTsKCQl9CgoJCWlmICh0aGlzLl9sYXN0UHJvZ3Jlc3MgIT0gbG9hZGVkKSB7CgkJCXRoaXMuX3NlbmRQcm9ncmVzcyhsb2FkZWQpOwoJCQl0aGlzLl9sYXN0UHJvZ3Jlc3MgPSBsb2FkZWQ7CgkJfQoJfTsKCgkvKioKCSAqIENsZWFuIG91dCBpdGVtIHJlc3VsdHMsIHRvIGZyZWUgdGhlbSBmcm9tIG1lbW9yeS4gTWFpbmx5LCB0aGUgbG9hZGVkIGl0ZW0gYW5kIHJlc3VsdHMgYXJlIGNsZWFyZWQgZnJvbSBpbnRlcm5hbAoJICogaGFzaGVzLgoJICogQG1ldGhvZCBfZGlzcG9zZUl0ZW0KCSAqIEBwYXJhbSB7TG9hZEl0ZW18T2JqZWN0fSBpdGVtIFRoZSBpdGVtIHRoYXQgd2FzIHBhc3NlZCBpbiBmb3IgcHJlbG9hZGluZy4KCSAqIEBwcml2YXRlCgkgKi8KCXAuX2Rpc3Bvc2VJdGVtID0gZnVuY3Rpb24gKGl0ZW0pIHsKCQlkZWxldGUgdGhpcy5fbG9hZGVkUmVzdWx0c1tpdGVtLmlkXTsKCQlkZWxldGUgdGhpcy5fbG9hZGVkUmF3UmVzdWx0c1tpdGVtLmlkXTsKCQlkZWxldGUgdGhpcy5fbG9hZEl0ZW1zQnlJZFtpdGVtLmlkXTsKCQlkZWxldGUgdGhpcy5fbG9hZEl0ZW1zQnlTcmNbaXRlbS5zcmNdOwoJfTsKCgkvKioKCSAqIERpc3BhdGNoIGEgImZpbGVwcm9ncmVzcyIge3sjY3Jvc3NMaW5rICJFdmVudCJ9fXt7L2Nyb3NzTGlua319LiBQbGVhc2Ugc2VlIHRoZSBMb2FkUXVldWUge3sjY3Jvc3NMaW5rICJMb2FkUXVldWUvZmlsZXByb2dyZXNzOmV2ZW50In19e3svY3Jvc3NMaW5rfX0KCSAqIGV2ZW50IGZvciBkZXRhaWxzIG9uIHRoZSBldmVudCBwYXlsb2FkLgoJICogQG1ldGhvZCBfc2VuZEZpbGVQcm9ncmVzcwoJICogQHBhcmFtIHtMb2FkSXRlbXxPYmplY3R9IGl0ZW0gVGhlIGl0ZW0gdGhhdCBpcyBiZWluZyBsb2FkZWQuCgkgKiBAcGFyYW0ge051bWJlcn0gcHJvZ3Jlc3MgVGhlIGFtb3VudCB0aGUgaXRlbSBoYXMgYmVlbiBsb2FkZWQgKGJldHdlZW4gMCBhbmQgMSkuCgkgKiBAcHJvdGVjdGVkCgkgKi8KCXAuX3NlbmRGaWxlUHJvZ3Jlc3MgPSBmdW5jdGlvbiAoaXRlbSwgcHJvZ3Jlc3MpIHsKCQlpZiAodGhpcy5faXNDYW5jZWxlZCgpKSB7CgkJCXRoaXMuX2NsZWFuVXAoKTsKCQkJcmV0dXJuOwoJCX0KCQlpZiAoIXRoaXMuaGFzRXZlbnRMaXN0ZW5lcigiZmlsZXByb2dyZXNzIikpIHsgcmV0dXJuOyB9CgoJCS8vTE06IFJld29yayBQcm9ncmVzc0V2ZW50IHRvIHN1cHBvcnQgdGhpcz8KCQl2YXIgZXZlbnQgPSBuZXcgY3JlYXRlanMuRXZlbnQoImZpbGVwcm9ncmVzcyIpOwoJCWV2ZW50LnByb2dyZXNzID0gcHJvZ3Jlc3M7CgkJZXZlbnQubG9hZGVkID0gcHJvZ3Jlc3M7CgkJZXZlbnQudG90YWwgPSAxOwoJCWV2ZW50Lml0ZW0gPSBpdGVtOwoKCQl0aGlzLmRpc3BhdGNoRXZlbnQoZXZlbnQpOwoJfTsKCgkvKioKCSAqIERpc3BhdGNoIGEgZmlsZWxvYWQge3sjY3Jvc3NMaW5rICJFdmVudCJ9fXt7L2Nyb3NzTGlua319LiBQbGVhc2Ugc2VlIHRoZSB7eyNjcm9zc0xpbmsgIkxvYWRRdWV1ZS9maWxlbG9hZDpldmVudCJ9fXt7L2Nyb3NzTGlua319IGV2ZW50IGZvcgoJICogZGV0YWlscyBvbiB0aGUgZXZlbnQgcGF5bG9hZC4KCSAqIEBtZXRob2QgX3NlbmRGaWxlQ29tcGxldGUKCSAqIEBwYXJhbSB7TG9hZEl0ZW1PYmplY3R9IGl0ZW0gVGhlIGl0ZW0gdGhhdCBpcyBiZWluZyBsb2FkZWQuCgkgKiBAcGFyYW0ge0Fic3RyYWN0TG9hZGVyfSBsb2FkZXIKCSAqIEBwcm90ZWN0ZWQKCSAqLwoJcC5fc2VuZEZpbGVDb21wbGV0ZSA9IGZ1bmN0aW9uIChpdGVtLCBsb2FkZXIpIHsKCQlpZiAodGhpcy5faXNDYW5jZWxlZCgpKSB7IHJldHVybjsgfQoKCQl2YXIgZXZlbnQgPSBuZXcgY3JlYXRlanMuRXZlbnQoImZpbGVsb2FkIik7CgkJZXZlbnQubG9hZGVyID0gbG9hZGVyOwoJCWV2ZW50Lml0ZW0gPSBpdGVtOwoJCWV2ZW50LnJlc3VsdCA9IHRoaXMuX2xvYWRlZFJlc3VsdHNbaXRlbS5pZF07CgkJZXZlbnQucmF3UmVzdWx0ID0gdGhpcy5fbG9hZGVkUmF3UmVzdWx0c1tpdGVtLmlkXTsKCgkJLy8gVGhpcyBjYWxscyBhIGhhbmRsZXIgc3BlY2lmaWVkIG9uIHRoZSBhY3R1YWwgbG9hZCBpdGVtLiBDdXJyZW50bHksIHRoZSBTb3VuZEpTIHBsdWdpbiB1c2VzIHRoaXMuCgkJaWYgKGl0ZW0uY29tcGxldGVIYW5kbGVyKSB7CgkJCWl0ZW0uY29tcGxldGVIYW5kbGVyKGV2ZW50KTsKCQl9CgoJCXRoaXMuaGFzRXZlbnRMaXN0ZW5lcigiZmlsZWxvYWQiKSAmJiB0aGlzLmRpc3BhdGNoRXZlbnQoZXZlbnQpOwoJfTsKCgkvKioKCSAqIERpc3BhdGNoIGEgZmlsZXN0YXJ0IHt7I2Nyb3NzTGluayAiRXZlbnQifX17ey9jcm9zc0xpbmt9fSBpbW1lZGlhdGVseSBiZWZvcmUgYSBmaWxlIHN0YXJ0cyB0byBsb2FkLiBQbGVhc2Ugc2VlCgkgKiB0aGUge3sjY3Jvc3NMaW5rICJMb2FkUXVldWUvZmlsZXN0YXJ0OmV2ZW50In19e3svY3Jvc3NMaW5rfX0gZXZlbnQgZm9yIGRldGFpbHMgb24gdGhlIGV2ZW50IHBheWxvYWQuCgkgKiBAbWV0aG9kIF9zZW5kRmlsZVN0YXJ0CgkgKiBAcGFyYW0ge0xvYWRJdGVtfE9iamVjdH0gaXRlbSBUaGUgaXRlbSB0aGF0IGlzIGJlaW5nIGxvYWRlZC4KCSAqIEBwcm90ZWN0ZWQKCSAqLwoJcC5fc2VuZEZpbGVTdGFydCA9IGZ1bmN0aW9uIChpdGVtKSB7CgkJdmFyIGV2ZW50ID0gbmV3IGNyZWF0ZWpzLkV2ZW50KCJmaWxlc3RhcnQiKTsKCQlldmVudC5pdGVtID0gaXRlbTsKCQl0aGlzLmhhc0V2ZW50TGlzdGVuZXIoImZpbGVzdGFydCIpICYmIHRoaXMuZGlzcGF0Y2hFdmVudChldmVudCk7Cgl9OwoKCXAudG9TdHJpbmcgPSBmdW5jdGlvbiAoKSB7CgkJcmV0dXJuICJbUHJlbG9hZEpTIExvYWRRdWV1ZV0iOwoJfTsKCgljcmVhdGVqcy5Mb2FkUXVldWUgPSBjcmVhdGVqcy5wcm9tb3RlKExvYWRRdWV1ZSwgIkFic3RyYWN0TG9hZGVyIik7Cn0oKSk7CgovLyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwovLyBUZXh0TG9hZGVyLmpzCi8vIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgp0aGlzLmNyZWF0ZWpzID0gdGhpcy5jcmVhdGVqcyB8fCB7fTsKCihmdW5jdGlvbiAoKSB7CgkidXNlIHN0cmljdCI7CgoJLy8gY29uc3RydWN0b3IKCS8qKgoJICogQSBsb2FkZXIgZm9yIFRleHQgZmlsZXMuCgkgKiBAY2xhc3MgVGV4dExvYWRlcgoJICogQHBhcmFtIHtMb2FkSXRlbXxPYmplY3R9IGxvYWRJdGVtCgkgKiBAY29uc3RydWN0b3IKCSAqLwoJZnVuY3Rpb24gVGV4dExvYWRlcihsb2FkSXRlbSkgewoJCXRoaXMuQWJzdHJhY3RMb2FkZXJfY29uc3RydWN0b3IobG9hZEl0ZW0sIHRydWUsIGNyZWF0ZWpzLkFic3RyYWN0TG9hZGVyLlRFWFQpOwoJfTsKCgl2YXIgcCA9IGNyZWF0ZWpzLmV4dGVuZChUZXh0TG9hZGVyLCBjcmVhdGVqcy5BYnN0cmFjdExvYWRlcik7Cgl2YXIgcyA9IFRleHRMb2FkZXI7CgoJLy8gc3RhdGljIG1ldGhvZHMKCS8qKgoJICogRGV0ZXJtaW5lcyBpZiB0aGUgbG9hZGVyIGNhbiBsb2FkIGEgc3BlY2lmaWMgaXRlbS4gVGhpcyBsb2FkZXIgbG9hZHMgaXRlbXMgdGhhdCBhcmUgb2YgdHlwZSB7eyNjcm9zc0xpbmsgIkFic3RyYWN0TG9hZGVyL1RFWFQ6cHJvcGVydHkifX17ey9jcm9zc0xpbmt9fSwKCSAqIGJ1dCBpcyBhbHNvIHRoZSBkZWZhdWx0IGxvYWRlciBpZiBhIGZpbGUgdHlwZSBjYW4gbm90IGJlIGRldGVybWluZWQuCgkgKiBAbWV0aG9kIGNhbkxvYWRJdGVtCgkgKiBAcGFyYW0ge0xvYWRJdGVtfE9iamVjdH0gaXRlbSBUaGUgTG9hZEl0ZW0gdGhhdCBhIExvYWRRdWV1ZSBpcyB0cnlpbmcgdG8gbG9hZC4KCSAqIEByZXR1cm5zIHtCb29sZWFufSBXaGV0aGVyIHRoZSBsb2FkZXIgY2FuIGxvYWQgdGhlIGl0ZW0uCgkgKiBAc3RhdGljCgkgKi8KCXMuY2FuTG9hZEl0ZW0gPSBmdW5jdGlvbiAoaXRlbSkgewoJCXJldHVybiBpdGVtLnR5cGUgPT0gY3JlYXRlanMuQWJzdHJhY3RMb2FkZXIuVEVYVDsKCX07CgoJY3JlYXRlanMuVGV4dExvYWRlciA9IGNyZWF0ZWpzLnByb21vdGUoVGV4dExvYWRlciwgIkFic3RyYWN0TG9hZGVyIik7Cgp9KCkpOwoKLy8jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLy8gQmluYXJ5TG9hZGVyLmpzCi8vIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgp0aGlzLmNyZWF0ZWpzID0gdGhpcy5jcmVhdGVqcyB8fCB7fTsKCihmdW5jdGlvbiAoKSB7CgkidXNlIHN0cmljdCI7CgoJLy8gY29uc3RydWN0b3IKCS8qKgoJICogQSBsb2FkZXIgZm9yIGJpbmFyeSBmaWxlcy4gVGhpcyBpcyB1c2VmdWwgZm9yIGxvYWRpbmcgd2ViIGF1ZGlvLCBvciBjb250ZW50IHRoYXQgcmVxdWlyZXMgYW4gQXJyYXlCdWZmZXIuCgkgKiBAY2xhc3MgQmluYXJ5TG9hZGVyCgkgKiBAcGFyYW0ge0xvYWRJdGVtfE9iamVjdH0gbG9hZEl0ZW0KCSAqIEBjb25zdHJ1Y3RvcgoJICovCglmdW5jdGlvbiBCaW5hcnlMb2FkZXIobG9hZEl0ZW0pIHsKCQl0aGlzLkFic3RyYWN0TG9hZGVyX2NvbnN0cnVjdG9yKGxvYWRJdGVtLCB0cnVlLCBjcmVhdGVqcy5BYnN0cmFjdExvYWRlci5CSU5BUlkpOwoJCXRoaXMub24oImluaXRpYWxpemUiLCB0aGlzLl91cGRhdGVYSFIsIHRoaXMpOwoJfTsKCgl2YXIgcCA9IGNyZWF0ZWpzLmV4dGVuZChCaW5hcnlMb2FkZXIsIGNyZWF0ZWpzLkFic3RyYWN0TG9hZGVyKTsKCXZhciBzID0gQmluYXJ5TG9hZGVyOwoKCS8vIHN0YXRpYyBtZXRob2RzCgkvKioKCSAqIERldGVybWluZXMgaWYgdGhlIGxvYWRlciBjYW4gbG9hZCBhIHNwZWNpZmljIGl0ZW0uIFRoaXMgbG9hZGVyIGNhbiBvbmx5IGxvYWQgaXRlbXMgdGhhdCBhcmUgb2YgdHlwZQoJICoge3sjY3Jvc3NMaW5rICJBYnN0cmFjdExvYWRlci9CSU5BUlk6cHJvcGVydHkifX17ey9jcm9zc0xpbmt9fQoJICogQG1ldGhvZCBjYW5Mb2FkSXRlbQoJICogQHBhcmFtIHtMb2FkSXRlbXxPYmplY3R9IGl0ZW0gVGhlIExvYWRJdGVtIHRoYXQgYSBMb2FkUXVldWUgaXMgdHJ5aW5nIHRvIGxvYWQuCgkgKiBAcmV0dXJucyB7Qm9vbGVhbn0gV2hldGhlciB0aGUgbG9hZGVyIGNhbiBsb2FkIHRoZSBpdGVtLgoJICogQHN0YXRpYwoJICovCglzLmNhbkxvYWRJdGVtID0gZnVuY3Rpb24gKGl0ZW0pIHsKCQlyZXR1cm4gaXRlbS50eXBlID09IGNyZWF0ZWpzLkFic3RyYWN0TG9hZGVyLkJJTkFSWTsKCX07CgoJLy8gcHJpdmF0ZSBtZXRob2RzCgkvKioKCSAqIEJlZm9yZSB0aGUgaXRlbSBsb2Fkcywgc2V0IHRoZSByZXNwb25zZSB0eXBlIHRvICJhcnJheWJ1ZmZlciIKCSAqIEBwcm9wZXJ0eSBfdXBkYXRlWEhSCgkgKiBAcGFyYW0ge0V2ZW50fSBldmVudAoJICogQHByaXZhdGUKCSAqLwoJcC5fdXBkYXRlWEhSID0gZnVuY3Rpb24gKGV2ZW50KSB7CgkJZXZlbnQubG9hZGVyLnNldFJlc3BvbnNlVHlwZSgiYXJyYXlidWZmZXIiKTsKCX07CgoJY3JlYXRlanMuQmluYXJ5TG9hZGVyID0gY3JlYXRlanMucHJvbW90ZShCaW5hcnlMb2FkZXIsICJBYnN0cmFjdExvYWRlciIpOwoKfSgpKTsKCi8vIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi8vIENTU0xvYWRlci5qcwovLyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKdGhpcy5jcmVhdGVqcyA9IHRoaXMuY3JlYXRlanMgfHwge307CgooZnVuY3Rpb24gKCkgewoJInVzZSBzdHJpY3QiOwoKCS8vIGNvbnN0cnVjdG9yCgkvKioKCSAqIEEgbG9hZGVyIGZvciBDU1MgZmlsZXMuCgkgKiBAY2xhc3MgQ1NTTG9hZGVyCgkgKiBAcGFyYW0ge0xvYWRJdGVtfE9iamVjdH0gbG9hZEl0ZW0KCSAqIEBwYXJhbSB7Qm9vbGVhbn0gcHJlZmVyWEhSCgkgKiBAY29uc3RydWN0b3IKCSAqLwoJZnVuY3Rpb24gQ1NTTG9hZGVyKGxvYWRJdGVtLCBwcmVmZXJYSFIpIHsKCQl0aGlzLkFic3RyYWN0TG9hZGVyX2NvbnN0cnVjdG9yKGxvYWRJdGVtLCBwcmVmZXJYSFIsIGNyZWF0ZWpzLkFic3RyYWN0TG9hZGVyLkNTUyk7CgoJCS8vIHB1YmxpYyBwcm9wZXJ0aWVzCgkJdGhpcy5yZXN1bHRGb3JtYXR0ZXIgPSB0aGlzLl9mb3JtYXRSZXN1bHQ7CgoJCS8vIHByb3RlY3RlZCBwcm9wZXJ0aWVzCgkJdGhpcy5fdGFnU3JjQXR0cmlidXRlID0gImhyZWYiOwoKCQlpZiAocHJlZmVyWEhSKSB7CgkJCXRoaXMuX3RhZyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInN0eWxlIik7CgkJfSBlbHNlIHsKCQkJdGhpcy5fdGFnID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgibGluayIpOwoJCX0KCgkJdGhpcy5fdGFnLnJlbCA9ICJzdHlsZXNoZWV0IjsKCQl0aGlzLl90YWcudHlwZSA9ICJ0ZXh0L2NzcyI7Cgl9OwoKCXZhciBwID0gY3JlYXRlanMuZXh0ZW5kKENTU0xvYWRlciwgY3JlYXRlanMuQWJzdHJhY3RMb2FkZXIpOwoJdmFyIHMgPSBDU1NMb2FkZXI7CgoJLy8gc3RhdGljIG1ldGhvZHMKCS8qKgoJICogRGV0ZXJtaW5lcyBpZiB0aGUgbG9hZGVyIGNhbiBsb2FkIGEgc3BlY2lmaWMgaXRlbS4gVGhpcyBsb2FkZXIgY2FuIG9ubHkgbG9hZCBpdGVtcyB0aGF0IGFyZSBvZiB0eXBlCgkgKiB7eyNjcm9zc0xpbmsgIkFic3RyYWN0TG9hZGVyL0NTUzpwcm9wZXJ0eSJ9fXt7L2Nyb3NzTGlua319LgoJICogQG1ldGhvZCBjYW5Mb2FkSXRlbQoJICogQHBhcmFtIHtMb2FkSXRlbXxPYmplY3R9IGl0ZW0gVGhlIExvYWRJdGVtIHRoYXQgYSBMb2FkUXVldWUgaXMgdHJ5aW5nIHRvIGxvYWQuCgkgKiBAcmV0dXJucyB7Qm9vbGVhbn0gV2hldGhlciB0aGUgbG9hZGVyIGNhbiBsb2FkIHRoZSBpdGVtLgoJICogQHN0YXRpYwoJICovCglzLmNhbkxvYWRJdGVtID0gZnVuY3Rpb24gKGl0ZW0pIHsKCQlyZXR1cm4gaXRlbS50eXBlID09IGNyZWF0ZWpzLkFic3RyYWN0TG9hZGVyLkNTUzsKCX07CgoJLy8gcHJvdGVjdGVkIG1ldGhvZHMKCS8qKgoJICogVGhlIHJlc3VsdCBmb3JtYXR0ZXIgZm9yIENTUyBmaWxlcy4KCSAqIEBtZXRob2QgX2Zvcm1hdFJlc3VsdAoJICogQHBhcmFtIHtBYnN0cmFjdExvYWRlcn0gbG9hZGVyCgkgKiBAcmV0dXJucyB7SFRNTExpbmtFbGVtZW50fEhUTUxTdHlsZUVsZW1lbnR9CgkgKiBAcHJpdmF0ZQoJICovCglwLl9mb3JtYXRSZXN1bHQgPSBmdW5jdGlvbiAobG9hZGVyKSB7CgkJaWYgKHRoaXMuX3ByZWZlclhIUikgewoJCQl2YXIgdGFnID0gbG9hZGVyLmdldFRhZygpOwoJCQl2YXIgaGVhZCA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJoZWFkIilbMF07IC8vTm90ZTogVGhpcyBpcyB1bmF2b2lkYWJsZSBpbiBJRTY3OAoJCQloZWFkLmFwcGVuZENoaWxkKHRhZyk7CgoJCQlpZiAodGFnLnN0eWxlU2hlZXQpIHsgLy8gSUUKCQkJCXRhZy5zdHlsZVNoZWV0LmNzc1RleHQgPSBsb2FkZXIuZ2V0UmVzdWx0KHRydWUpOwoJCQl9IGVsc2UgewoJCQkJdmFyIHRleHROb2RlID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUobG9hZGVyLmdldFJlc3VsdCh0cnVlKSk7CgkJCQl0YWcuYXBwZW5kQ2hpbGQodGV4dE5vZGUpOwoJCQl9CgkJfSBlbHNlIHsKCQkJdGFnID0gdGhpcy5fdGFnOwoJCX0KCgkJcmV0dXJuIHRhZzsKCX07CgoJY3JlYXRlanMuQ1NTTG9hZGVyID0gY3JlYXRlanMucHJvbW90ZShDU1NMb2FkZXIsICJBYnN0cmFjdExvYWRlciIpOwoKfSgpKTsKCi8vIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi8vIEltYWdlTG9hZGVyLmpzCi8vIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgp0aGlzLmNyZWF0ZWpzID0gdGhpcy5jcmVhdGVqcyB8fCB7fTsKCihmdW5jdGlvbiAoKSB7CgkidXNlIHN0cmljdCI7CgoJLy8gY29uc3RydWN0b3IKCS8qKgoJICogQSBsb2FkZXIgZm9yIGltYWdlIGZpbGVzLgoJICogQGNsYXNzIEltYWdlTG9hZGVyCgkgKiBAcGFyYW0ge0xvYWRJdGVtfE9iamVjdH0gbG9hZEl0ZW0KCSAqIEBwYXJhbSB7Qm9vbGVhbn0gcHJlZmVyWEhSCgkgKiBAY29uc3RydWN0b3IKCSAqLwoJZnVuY3Rpb24gSW1hZ2VMb2FkZXIgKGxvYWRJdGVtLCBwcmVmZXJYSFIpIHsKCQl0aGlzLkFic3RyYWN0TG9hZGVyX2NvbnN0cnVjdG9yKGxvYWRJdGVtLCBwcmVmZXJYSFIsIGNyZWF0ZWpzLkFic3RyYWN0TG9hZGVyLklNQUdFKTsKCgkJLy8gcHVibGljIHByb3BlcnRpZXMKCQl0aGlzLnJlc3VsdEZvcm1hdHRlciA9IHRoaXMuX2Zvcm1hdFJlc3VsdDsKCgkJLy8gcHJvdGVjdGVkIHByb3BlcnRpZXMKCQl0aGlzLl90YWdTcmNBdHRyaWJ1dGUgPSAic3JjIjsKCgkJLy8gQ2hlY2sgaWYgdGhlIHByZWxvYWQgaXRlbSBpcyBhbHJlYWR5IGEgdGFnLgoJCWlmIChjcmVhdGVqcy5SZXF1ZXN0VXRpbHMuaXNJbWFnZVRhZyhsb2FkSXRlbSkpIHsKCQkJdGhpcy5fdGFnID0gbG9hZEl0ZW07CgkJfSBlbHNlIGlmIChjcmVhdGVqcy5SZXF1ZXN0VXRpbHMuaXNJbWFnZVRhZyhsb2FkSXRlbS5zcmMpKSB7CgkJCXRoaXMuX3RhZyA9IGxvYWRJdGVtLnNyYzsKCQl9IGVsc2UgaWYgKGNyZWF0ZWpzLlJlcXVlc3RVdGlscy5pc0ltYWdlVGFnKGxvYWRJdGVtLnRhZykpIHsKCQkJdGhpcy5fdGFnID0gbG9hZEl0ZW0udGFnOwoJCX0KCgkJaWYgKHRoaXMuX3RhZyAhPSBudWxsKSB7CgkJCXRoaXMuX3ByZWZlclhIUiA9IGZhbHNlOwoJCX0gZWxzZSB7CgkJCXRoaXMuX3RhZyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImltZyIpOwoJCX0KCgkJdGhpcy5vbigiaW5pdGlhbGl6ZSIsIHRoaXMuX3VwZGF0ZVhIUiwgdGhpcyk7Cgl9OwoKCXZhciBwID0gY3JlYXRlanMuZXh0ZW5kKEltYWdlTG9hZGVyLCBjcmVhdGVqcy5BYnN0cmFjdExvYWRlcik7Cgl2YXIgcyA9IEltYWdlTG9hZGVyOwoKCS8vIHN0YXRpYyBtZXRob2RzCgkvKioKCSAqIERldGVybWluZXMgaWYgdGhlIGxvYWRlciBjYW4gbG9hZCBhIHNwZWNpZmljIGl0ZW0uIFRoaXMgbG9hZGVyIGNhbiBvbmx5IGxvYWQgaXRlbXMgdGhhdCBhcmUgb2YgdHlwZQoJICoge3sjY3Jvc3NMaW5rICJBYnN0cmFjdExvYWRlci9JTUFHRTpwcm9wZXJ0eSJ9fXt7L2Nyb3NzTGlua319LgoJICogQG1ldGhvZCBjYW5Mb2FkSXRlbQoJICogQHBhcmFtIHtMb2FkSXRlbXxPYmplY3R9IGl0ZW0gVGhlIExvYWRJdGVtIHRoYXQgYSBMb2FkUXVldWUgaXMgdHJ5aW5nIHRvIGxvYWQuCgkgKiBAcmV0dXJucyB7Qm9vbGVhbn0gV2hldGhlciB0aGUgbG9hZGVyIGNhbiBsb2FkIHRoZSBpdGVtLgoJICogQHN0YXRpYwoJICovCglzLmNhbkxvYWRJdGVtID0gZnVuY3Rpb24gKGl0ZW0pIHsKCQlyZXR1cm4gaXRlbS50eXBlID09IGNyZWF0ZWpzLkFic3RyYWN0TG9hZGVyLklNQUdFOwoJfTsKCgkvLyBwdWJsaWMgbWV0aG9kcwoJcC5sb2FkID0gZnVuY3Rpb24gKCkgewoJCWlmICh0aGlzLl90YWcuc3JjICE9ICIiICYmIHRoaXMuX3RhZy5jb21wbGV0ZSkgewoJCQl0aGlzLl9zZW5kQ29tcGxldGUoKTsKCQkJcmV0dXJuOwoJCX0KCgkJdmFyIGNyb3NzT3JpZ2luID0gdGhpcy5faXRlbS5jcm9zc09yaWdpbjsKCQlpZiAoY3Jvc3NPcmlnaW4gPT0gdHJ1ZSkgeyBjcm9zc09yaWdpbiA9ICJBbm9ueW1vdXMiOyB9CgkJaWYgKGNyb3NzT3JpZ2luICE9IG51bGwgJiYgIWNyZWF0ZWpzLlJlcXVlc3RVdGlscy5pc0xvY2FsKHRoaXMuX2l0ZW0uc3JjKSkgewoJCQl0aGlzLl90YWcuY3Jvc3NPcmlnaW4gPSBjcm9zc09yaWdpbjsKCQl9CgoJCXRoaXMuQWJzdHJhY3RMb2FkZXJfbG9hZCgpOwoJfTsKCgkvLyBwcm90ZWN0ZWQgbWV0aG9kcwoJLyoqCgkgKiBCZWZvcmUgdGhlIGl0ZW0gbG9hZHMsIHNldCBpdHMgbWltZXR5cGUgYW5kIHJlc3BvbnNlVHlwZS4KCSAqIEBwcm9wZXJ0eSBfdXBkYXRlWEhSCgkgKiBAcGFyYW0ge0V2ZW50fSBldmVudAoJICogQHByaXZhdGUKCSAqLwoJcC5fdXBkYXRlWEhSID0gZnVuY3Rpb24gKGV2ZW50KSB7CgkJZXZlbnQubG9hZGVyLm1pbWVUeXBlID0gJ3RleHQvcGxhaW47IGNoYXJzZXQ9eC11c2VyLWRlZmluZWQtYmluYXJ5JzsKCgkJLy8gT25seSBleGlzdHMgZm9yIFhIUgoJCWlmIChldmVudC5sb2FkZXIuc2V0UmVzcG9uc2VUeXBlKSB7CgkJCWV2ZW50LmxvYWRlci5zZXRSZXNwb25zZVR5cGUoImJsb2IiKTsKCQl9Cgl9OwoKCS8qKgoJICogVGhlIHJlc3VsdCBmb3JtYXR0ZXIgZm9yIEltYWdlIGZpbGVzLgoJICogQG1ldGhvZCBfZm9ybWF0UmVzdWx0CgkgKiBAcGFyYW0ge0Fic3RyYWN0TG9hZGVyfSBsb2FkZXIKCSAqIEByZXR1cm5zIHtIVE1MSW1hZ2VFbGVtZW50fQoJICogQHByaXZhdGUKCSAqLwoJcC5fZm9ybWF0UmVzdWx0ID0gZnVuY3Rpb24gKGxvYWRlcikgewoJCXZhciBfdGhpcyA9IHRoaXM7CgkJcmV0dXJuIGZ1bmN0aW9uIChkb25lKSB7CgkJCXZhciB0YWcgPSBfdGhpcy5fdGFnOwoJCQl2YXIgVVJMID0gd2luZG93LlVSTCB8fCB3aW5kb3cud2Via2l0VVJMOwoKCQkJaWYgKCFfdGhpcy5fcHJlZmVyWEhSKSB7CgkJCQkvL2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQodGFnKTsKCQkJfSBlbHNlIGlmIChVUkwpIHsKCQkJCXZhciBvYmpVUkwgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKGxvYWRlci5nZXRSZXN1bHQodHJ1ZSkpOwoJCQkJdGFnLnNyYyA9IG9ialVSTDsKCQkJCXRhZy5vbmxvYWQgPSBmdW5jdGlvbiAoKSB7CgkJCQkJVVJMLnJldm9rZU9iamVjdFVSTChfdGhpcy5zcmMpOwoJCQkJfQoJCQl9IGVsc2UgewoJCQkJdGFnLnNyYyA9IGxvYWRlci5nZXRJdGVtKCkuc3JjOwoJCQl9CgoJCQlpZiAodGFnLmNvbXBsZXRlKSB7CgkJCQlkb25lKHRhZyk7CgkJCX0gZWxzZSB7CgkJCQl0YWcub25sb2FkID0gZnVuY3Rpb24gKCkgewoJCQkJCWRvbmUodGhpcyk7CgkJCQl9CgkJCX0KCQl9OwoJfTsKCgljcmVhdGVqcy5JbWFnZUxvYWRlciA9IGNyZWF0ZWpzLnByb21vdGUoSW1hZ2VMb2FkZXIsICJBYnN0cmFjdExvYWRlciIpOwoKfSgpKTsKCi8vIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi8vIEphdmFTY3JpcHRMb2FkZXIuanMKLy8jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCnRoaXMuY3JlYXRlanMgPSB0aGlzLmNyZWF0ZWpzIHx8IHt9OwoKKGZ1bmN0aW9uICgpIHsKCSJ1c2Ugc3RyaWN0IjsKCgkvLyBjb25zdHJ1Y3RvcgoJLyoqCgkgKiBBIGxvYWRlciBmb3IgSmF2YVNjcmlwdCBmaWxlcy4KCSAqIEBjbGFzcyBKYXZhU2NyaXB0TG9hZGVyCgkgKiBAcGFyYW0ge0xvYWRJdGVtfE9iamVjdH0gbG9hZEl0ZW0KCSAqIEBwYXJhbSB7Qm9vbGVhbn0gcHJlZmVyWEhSCgkgKiBAY29uc3RydWN0b3IKCSAqLwoJZnVuY3Rpb24gSmF2YVNjcmlwdExvYWRlcihsb2FkSXRlbSwgcHJlZmVyWEhSKSB7CgkJdGhpcy5BYnN0cmFjdExvYWRlcl9jb25zdHJ1Y3Rvcihsb2FkSXRlbSwgcHJlZmVyWEhSLCBjcmVhdGVqcy5BYnN0cmFjdExvYWRlci5KQVZBU0NSSVBUKTsKCgkJLy8gcHVibGljIHByb3BlcnRpZXMKCQl0aGlzLnJlc3VsdEZvcm1hdHRlciA9IHRoaXMuX2Zvcm1hdFJlc3VsdDsKCgkJLy8gcHJvdGVjdGVkIHByb3BlcnRpZXMKCQl0aGlzLl90YWdTcmNBdHRyaWJ1dGUgPSAic3JjIjsKCQl0aGlzLnNldFRhZyhkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKSk7Cgl9OwoKCXZhciBwID0gY3JlYXRlanMuZXh0ZW5kKEphdmFTY3JpcHRMb2FkZXIsIGNyZWF0ZWpzLkFic3RyYWN0TG9hZGVyKTsKCXZhciBzID0gSmF2YVNjcmlwdExvYWRlcjsKCgkvLyBzdGF0aWMgbWV0aG9kcwoJLyoqCgkgKiBEZXRlcm1pbmVzIGlmIHRoZSBsb2FkZXIgY2FuIGxvYWQgYSBzcGVjaWZpYyBpdGVtLiBUaGlzIGxvYWRlciBjYW4gb25seSBsb2FkIGl0ZW1zIHRoYXQgYXJlIG9mIHR5cGUKCSAqIHt7I2Nyb3NzTGluayAiQWJzdHJhY3RMb2FkZXIvSkFWQVNDUklQVDpwcm9wZXJ0eSJ9fXt7L2Nyb3NzTGlua319CgkgKiBAbWV0aG9kIGNhbkxvYWRJdGVtCgkgKiBAcGFyYW0ge0xvYWRJdGVtfE9iamVjdH0gaXRlbSBUaGUgTG9hZEl0ZW0gdGhhdCBhIExvYWRRdWV1ZSBpcyB0cnlpbmcgdG8gbG9hZC4KCSAqIEByZXR1cm5zIHtCb29sZWFufSBXaGV0aGVyIHRoZSBsb2FkZXIgY2FuIGxvYWQgdGhlIGl0ZW0uCgkgKiBAc3RhdGljCgkgKi8KCXMuY2FuTG9hZEl0ZW0gPSBmdW5jdGlvbiAoaXRlbSkgewoJCXJldHVybiBpdGVtLnR5cGUgPT0gY3JlYXRlanMuQWJzdHJhY3RMb2FkZXIuSkFWQVNDUklQVDsKCX07CgoJLy8gcHJvdGVjdGVkIG1ldGhvZHMKCS8qKgoJICogVGhlIHJlc3VsdCBmb3JtYXR0ZXIgZm9yIEphdmFTY3JpcHQgZmlsZXMuCgkgKiBAbWV0aG9kIF9mb3JtYXRSZXN1bHQKCSAqIEBwYXJhbSB7QWJzdHJhY3RMb2FkZXJ9IGxvYWRlcgoJICogQHJldHVybnMge0hUTUxMaW5rRWxlbWVudHxIVE1MU3R5bGVFbGVtZW50fQoJICogQHByaXZhdGUKCSAqLwoJcC5fZm9ybWF0UmVzdWx0ID0gZnVuY3Rpb24gKGxvYWRlcikgewoJCXZhciB0YWcgPSBsb2FkZXIuZ2V0VGFnKCk7CgkJaWYgKHRoaXMuX3ByZWZlclhIUikgewoJCQl0YWcudGV4dCA9IGxvYWRlci5nZXRSZXN1bHQodHJ1ZSk7CgkJfQoJCXJldHVybiB0YWc7Cgl9CgoJY3JlYXRlanMuSmF2YVNjcmlwdExvYWRlciA9IGNyZWF0ZWpzLnByb21vdGUoSmF2YVNjcmlwdExvYWRlciwgIkFic3RyYWN0TG9hZGVyIik7Cgp9KCkpOwoKLy8jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLy8gSlNPTkxvYWRlci5qcwovLyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKdGhpcy5jcmVhdGVqcyA9IHRoaXMuY3JlYXRlanMgfHwge307CgooZnVuY3Rpb24gKCkgewoJInVzZSBzdHJpY3QiOwoKCS8vIGNvbnN0cnVjdG9yCgkvKioKCSAqIEEgbG9hZGVyIGZvciBKU09OIGZpbGVzLiBUbyBsb2FkIEpTT04gY3Jvc3MtZG9tYWluLCB1c2UgSlNPTlAgYW5kIHRoZSB7eyNjcm9zc0xpbmsgIkpTT05QTG9hZGVyIn19e3svY3Jvc3NMaW5rfX0KCSAqIGluc3RlYWQuIFRvIGxvYWQgSlNPTi1mb3JtYXR0ZWQgbWFuaWZlc3RzLCB1c2Uge3sjY3Jvc3NMaW5rICJNYW5pZmVzdExvYWRlciJ9fXt7L2Nyb3NzTGlua319LCBhbmQgdG8KCSAqIGxvYWQgRWFzZWxKUyBTcHJpdGVTaGVldHMsIHVzZSB7eyNjcm9zc0xpbmsgIlNwcml0ZVNoZWV0TG9hZGVyIn19e3svY3Jvc3NMaW5rfX0uCgkgKiBAY2xhc3MgSlNPTkxvYWRlcgoJICogQHBhcmFtIHtMb2FkSXRlbXxPYmplY3R9IGxvYWRJdGVtCgkgKiBAY29uc3RydWN0b3IKCSAqLwoJZnVuY3Rpb24gSlNPTkxvYWRlcihsb2FkSXRlbSkgewoJCXRoaXMuQWJzdHJhY3RMb2FkZXJfY29uc3RydWN0b3IobG9hZEl0ZW0sIHRydWUsIGNyZWF0ZWpzLkFic3RyYWN0TG9hZGVyLkpTT04pOwoKCQkvLyBwdWJsaWMgcHJvcGVydGllcwoJCXRoaXMucmVzdWx0Rm9ybWF0dGVyID0gdGhpcy5fZm9ybWF0UmVzdWx0OwoJfTsKCgl2YXIgcCA9IGNyZWF0ZWpzLmV4dGVuZChKU09OTG9hZGVyLCBjcmVhdGVqcy5BYnN0cmFjdExvYWRlcik7Cgl2YXIgcyA9IEpTT05Mb2FkZXI7CgoJLy8gc3RhdGljIG1ldGhvZHMKCS8qKgoJICogRGV0ZXJtaW5lcyBpZiB0aGUgbG9hZGVyIGNhbiBsb2FkIGEgc3BlY2lmaWMgaXRlbS4gVGhpcyBsb2FkZXIgY2FuIG9ubHkgbG9hZCBpdGVtcyB0aGF0IGFyZSBvZiB0eXBlCgkgKiB7eyNjcm9zc0xpbmsgIkFic3RyYWN0TG9hZGVyL0pTT046cHJvcGVydHkifX17ey9jcm9zc0xpbmt9fS4KCSAqIEBtZXRob2QgY2FuTG9hZEl0ZW0KCSAqIEBwYXJhbSB7TG9hZEl0ZW18T2JqZWN0fSBpdGVtIFRoZSBMb2FkSXRlbSB0aGF0IGEgTG9hZFF1ZXVlIGlzIHRyeWluZyB0byBsb2FkLgoJICogQHJldHVybnMge0Jvb2xlYW59IFdoZXRoZXIgdGhlIGxvYWRlciBjYW4gbG9hZCB0aGUgaXRlbS4KCSAqIEBzdGF0aWMKCSAqLwoJcy5jYW5Mb2FkSXRlbSA9IGZ1bmN0aW9uIChpdGVtKSB7CgkJcmV0dXJuIGl0ZW0udHlwZSA9PSBjcmVhdGVqcy5BYnN0cmFjdExvYWRlci5KU09OICYmICFpdGVtLl9sb2FkQXNKU09OUDsKCX07CgoJLy8gcHJvdGVjdGVkIG1ldGhvZHMKCS8qKgoJICogVGhlIHJlc3VsdCBmb3JtYXR0ZXIgZm9yIEpTT04gZmlsZXMuCgkgKiBAbWV0aG9kIF9mb3JtYXRSZXN1bHQKCSAqIEBwYXJhbSB7QWJzdHJhY3RMb2FkZXJ9IGxvYWRlcgoJICogQHJldHVybnMge0hUTUxMaW5rRWxlbWVudHxIVE1MU3R5bGVFbGVtZW50fQoJICogQHByaXZhdGUKCSAqLwoJcC5fZm9ybWF0UmVzdWx0ID0gZnVuY3Rpb24gKGxvYWRlcikgewoJCXZhciBqc29uID0gbnVsbDsKCQl0cnkgewoJCQlqc29uID0gY3JlYXRlanMuRGF0YVV0aWxzLnBhcnNlSlNPTihsb2FkZXIuZ2V0UmVzdWx0KHRydWUpKTsKCQl9IGNhdGNoIChlKSB7CgkJCXZhciBldmVudCA9IG5ldyBjcmVhdGVqcy5FcnJvckV2ZW50KCJKU09OX0ZPUk1BVCIsIG51bGwsIGUpOwoJCQl0aGlzLl9zZW5kRXJyb3IoZXZlbnQpOwoJCQlyZXR1cm4gZTsKCQl9CgoJCXJldHVybiBqc29uOwoJfTsKCgljcmVhdGVqcy5KU09OTG9hZGVyID0gY3JlYXRlanMucHJvbW90ZShKU09OTG9hZGVyLCAiQWJzdHJhY3RMb2FkZXIiKTsKCn0oKSk7CgovLyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwovLyBKU09OUExvYWRlci5qcwovLyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKdGhpcy5jcmVhdGVqcyA9IHRoaXMuY3JlYXRlanMgfHwge307CgooZnVuY3Rpb24gKCkgewoJInVzZSBzdHJpY3QiOwoKCS8vIGNvbnN0cnVjdG9yCgkvKioKCSAqIEEgbG9hZGVyIGZvciBKU09OUCBmaWxlcywgd2hpY2ggYXJlIEpTT04tZm9ybWF0dGVkIHRleHQgZmlsZXMsIHdyYXBwZWQgaW4gYSBjYWxsYmFjay4gVG8gbG9hZCByZWd1bGFyIEpTT04KCSAqIHdpdGhvdXQgYSBjYWxsYmFjayB1c2UgdGhlIHt7I2Nyb3NzTGluayAiSlNPTkxvYWRlciJ9fXt7L2Nyb3NzTGlua319IGluc3RlYWQuIFRvIGxvYWQgSlNPTi1mb3JtYXR0ZWQgbWFuaWZlc3RzLAoJICogdXNlIHt7I2Nyb3NzTGluayAiTWFuaWZlc3RMb2FkZXIifX17ey9jcm9zc0xpbmt9fSwgYW5kIHRvIGxvYWQgRWFzZWxKUyBTcHJpdGVTaGVldHMsIHVzZQoJICoge3sjY3Jvc3NMaW5rICJTcHJpdGVTaGVldExvYWRlciJ9fXt7L2Nyb3NzTGlua319LgoJICoKCSAqIE5vdGUgdGhhdCBKU09OUCBmaWxlcyBsb2FkZWQgY29uY3VycmVudGx5IHJlcXVpcmUgYSA8ZW0+dW5pcXVlPC9lbT4gY2FsbGJhY2suIFRvIGVuc3VyZSBKU09OUCBmaWxlcyBhcmUgbG9hZGVkCgkgKiBpbiBvcmRlciwgZWl0aGVyIHVzZSB0aGUge3sjY3Jvc3NMaW5rICJMb2FkUXVldWUvc2V0TWF4Q29ubmVjdGlvbnMifX17ey9jcm9zc0xpbmt9fSBtZXRob2QgKHNldCB0byAxKSwKCSAqIG9yIHNldCB7eyNjcm9zc0xpbmsgIkxvYWRJdGVtL21haW50YWluT3JkZXI6cHJvcGVydHkifX17ey9jcm9zc0xpbmt9fSBvbiBpdGVtcyB3aXRoIHRoZSBzYW1lIGNhbGxiYWNrLgoJICogQGNsYXNzIEpTT05QTG9hZGVyCgkgKiBAcGFyYW0ge0xvYWRJdGVtfE9iamVjdH0gbG9hZEl0ZW0KCSAqIEBjb25zdHJ1Y3RvcgoJICovCglmdW5jdGlvbiBKU09OUExvYWRlcihsb2FkSXRlbSkgewoJCXRoaXMuQWJzdHJhY3RMb2FkZXJfY29uc3RydWN0b3IobG9hZEl0ZW0sIGZhbHNlLCBjcmVhdGVqcy5BYnN0cmFjdExvYWRlci5KU09OUCk7CgkJdGhpcy5zZXRUYWcoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0IikpOwoJCXRoaXMuZ2V0VGFnKCkudHlwZSA9ICJ0ZXh0L2phdmFzY3JpcHQiOwoJfTsKCgl2YXIgcCA9IGNyZWF0ZWpzLmV4dGVuZChKU09OUExvYWRlciwgY3JlYXRlanMuQWJzdHJhY3RMb2FkZXIpOwoJdmFyIHMgPSBKU09OUExvYWRlcjsKCgoJLy8gc3RhdGljIG1ldGhvZHMKCS8qKgoJICogRGV0ZXJtaW5lcyBpZiB0aGUgbG9hZGVyIGNhbiBsb2FkIGEgc3BlY2lmaWMgaXRlbS4gVGhpcyBsb2FkZXIgY2FuIG9ubHkgbG9hZCBpdGVtcyB0aGF0IGFyZSBvZiB0eXBlCgkgKiB7eyNjcm9zc0xpbmsgIkFic3RyYWN0TG9hZGVyL0pTT05QOnByb3BlcnR5In19e3svY3Jvc3NMaW5rfX0uCgkgKiBAbWV0aG9kIGNhbkxvYWRJdGVtCgkgKiBAcGFyYW0ge0xvYWRJdGVtfE9iamVjdH0gaXRlbSBUaGUgTG9hZEl0ZW0gdGhhdCBhIExvYWRRdWV1ZSBpcyB0cnlpbmcgdG8gbG9hZC4KCSAqIEByZXR1cm5zIHtCb29sZWFufSBXaGV0aGVyIHRoZSBsb2FkZXIgY2FuIGxvYWQgdGhlIGl0ZW0uCgkgKiBAc3RhdGljCgkgKi8KCXMuY2FuTG9hZEl0ZW0gPSBmdW5jdGlvbiAoaXRlbSkgewoJCXJldHVybiBpdGVtLnR5cGUgPT0gY3JlYXRlanMuQWJzdHJhY3RMb2FkZXIuSlNPTlAgfHwgaXRlbS5fbG9hZEFzSlNPTlA7Cgl9OwoKCS8vIHB1YmxpYyBtZXRob2RzCglwLmNhbmNlbCA9IGZ1bmN0aW9uICgpIHsKCQl0aGlzLkFic3RyYWN0TG9hZGVyX2NhbmNlbCgpOwoJCXRoaXMuX2Rpc3Bvc2UoKTsKCX07CgoJcC5sb2FkID0gZnVuY3Rpb24gKCkgewoJCWlmICh0aGlzLl9pdGVtLmNhbGxiYWNrID09IG51bGwpIHsKCQkJdGhyb3cgbmV3IEVycm9yKCdjYWxsYmFjayBpcyByZXF1aXJlZCBmb3IgbG9hZGluZyBKU09OUCByZXF1ZXN0cy4nKTsKCQl9CgoJCS8vIFRPRE86IExvb2sgaW50byBjcmVhdGluZyBvdXIgb3duIGlGcmFtZSB0byBoYW5kbGUgdGhlIGxvYWQKCQkvLyBJbiB0aGUgZmlyc3QgYXR0ZW1wdCwgRkYgZGlkIG5vdCBnZXQgdGhlIHJlc3VsdAoJCS8vICAgcmVzdWx0IGluc3RhbmNlb2YgT2JqZWN0IGRpZCBub3Qgd29yayBlaXRoZXIKCQkvLyAgIHNvIHdlIHdvdWxkIG5lZWQgdG8gY2xvbmUgdGhlIHJlc3VsdC4KCQlpZiAod2luZG93W3RoaXMuX2l0ZW0uY2FsbGJhY2tdICE9IG51bGwpIHsKCQkJdGhyb3cgbmV3IEVycm9yKAoJCQkJIkpTT05QIGNhbGxiYWNrICciICsKCQkJCXRoaXMuX2l0ZW0uY2FsbGJhY2sgKwoJCQkJIicgYWxyZWFkeSBleGlzdHMgb24gd2luZG93LiBZb3UgbmVlZCB0byBzcGVjaWZ5IGEgZGlmZmVyZW50IGNhbGxiYWNrIG9yIHJlLW5hbWUgdGhlIGN1cnJlbnQgb25lLiIpOwoJCX0KCgkJd2luZG93W3RoaXMuX2l0ZW0uY2FsbGJhY2tdID0gY3JlYXRlanMucHJveHkodGhpcy5faGFuZGxlTG9hZCwgdGhpcyk7CgkJd2luZG93LmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGhpcy5fdGFnKTsKCgkJLy8gTG9hZCB0aGUgdGFnCgkJdGhpcy5fdGFnLnNyYyA9IHRoaXMuX2l0ZW0uc3JjOwoJfTsKCgkvLyBwcml2YXRlIG1ldGhvZHMKCS8qKgoJICogSGFuZGxlIHRoZSBKU09OUCBjYWxsYmFjaywgd2hpY2ggaXMgYSBwdWJsaWMgbWV0aG9kIGRlZmluZWQgb24gYHdpbmRvd2AuCgkgKiBAbWV0aG9kIF9oYW5kbGVMb2FkCgkgKiBAcGFyYW0ge09iamVjdH0gVGhlIGZvcm1hdHRlZCBKU09OIGRhdGEuCgkgKiBAcHJpdmF0ZQoJICovCglwLl9oYW5kbGVMb2FkID0gZnVuY3Rpb24gKGRhdGEpIHsKCQl0aGlzLl9yZXN1bHQgPSB0aGlzLl9yYXdSZXN1bHQgPSBkYXRhOwoJCXRoaXMuX3NlbmRDb21wbGV0ZSgpOwoKCQl0aGlzLl9kaXNwb3NlKCk7Cgl9OwoJCgkvKioKCSAqIENsZWFuIHVwIHRoZSBKU09OUCBsb2FkLiBUaGlzIGNsZWFycyBvdXQgdGhlIGNhbGxiYWNrIGFuZCBzY3JpcHQgdGFnIHRoYXQgdGhpcyBsb2FkZXIgY3JlYXRlcy4KCSAqIEBtZXRob2QgX2Rpc3Bvc2UKCSAqIEBwcml2YXRlCgkgKi8KCXAuX2Rpc3Bvc2UgPSBmdW5jdGlvbiAoKSB7CgkJd2luZG93LmRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQodGhpcy5fdGFnKTsKCQlkZWxldGUgd2luZG93W3RoaXMuX2l0ZW0uY2FsbGJhY2tdOwoJfTsKCgljcmVhdGVqcy5KU09OUExvYWRlciA9IGNyZWF0ZWpzLnByb21vdGUoSlNPTlBMb2FkZXIsICJBYnN0cmFjdExvYWRlciIpOwoKfSgpKTsKCi8vIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi8vIE1hbmlmZXN0TG9hZGVyLmpzCi8vIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgp0aGlzLmNyZWF0ZWpzID0gdGhpcy5jcmVhdGVqcyB8fCB7fTsKCihmdW5jdGlvbiAoKSB7CgkidXNlIHN0cmljdCI7CgoJLy8gY29uc3RydWN0b3IKCS8qKgoJICogQSBsb2FkZXIgZm9yIEpTT04gbWFuaWZlc3RzLiBJdGVtcyBpbnNpZGUgdGhlIG1hbmlmZXN0IGFyZSBsb2FkZWQgYmVmb3JlIHRoZSBsb2FkZXIgY29tcGxldGVzLiBUbyBsb2FkIG1hbmlmZXN0cwoJICogdXNpbmcgSlNPTlAsIHNwZWNpZnkgYSB7eyNjcm9zc0xpbmsgIkxvYWRJdGVtL2NhbGxiYWNrOnByb3BlcnR5In19e3svY3Jvc3NMaW5rfX0gYXMgcGFydCBvZiB0aGUKCSAqIHt7I2Nyb3NzTGluayAiTG9hZEl0ZW0ifX17ey9jcm9zc0xpbmt9fS4gTm90ZSB0aGF0IHRoZSB7eyNjcm9zc0xpbmsgIkpTT05Mb2FkZXIifX17ey9jcm9zc0xpbmt9fSBhbmQKCSAqIHt7I2Nyb3NzTGluayAiSlNPTlBMb2FkZXIifX17ey9jcm9zc0xpbmt9fSBhcmUgaGlnaGVyIHByaW9yaXR5IGxvYWRlcnMsIHNvIG1hbmlmZXN0cyA8c3Ryb25nPm11c3Q8L3N0cm9uZz4KCSAqIHNldCB0aGUge3sjY3Jvc3NMaW5rICJMb2FkSXRlbSJ9fXt7L2Nyb3NzTGlua319IHt7I2Nyb3NzTGluayAiTG9hZEl0ZW0vdHlwZTpwcm9wZXJ0eSJ9fXt7L2Nyb3NzTGlua319IHByb3BlcnR5CgkgKiB0byB7eyNjcm9zc0xpbmsgIkFic3RyYWN0TG9hZGVyL01BTklGRVNUOnByb3BlcnR5In19e3svY3Jvc3NMaW5rfX0uCgkgKiBAY2xhc3MgTWFuaWZlc3RMb2FkZXIKCSAqIEBwYXJhbSB7TG9hZEl0ZW18T2JqZWN0fSBsb2FkSXRlbQoJICogQGNvbnN0cnVjdG9yCgkgKi8KCWZ1bmN0aW9uIE1hbmlmZXN0TG9hZGVyKGxvYWRJdGVtKSB7CgkJdGhpcy5BYnN0cmFjdExvYWRlcl9jb25zdHJ1Y3Rvcihsb2FkSXRlbSwgbnVsbCwgY3JlYXRlanMuQWJzdHJhY3RMb2FkZXIuTUFOSUZFU1QpOwoKCQkvLyBwcm90ZWN0ZWQgcHJvcGVydGllcwoJCS8qKgoJCSAqIEFuIGludGVybmFsIHt7I2Nyb3NzTGluayAiTG9hZFF1ZXVlIn19e3svY3Jvc3NMaW5rfX0gdGhhdCBsb2FkcyB0aGUgY29udGVudHMgb2YgdGhlIG1hbmlmZXN0LgoJCSAqIEBwcm9wZXJ0eSBfbWFuaWZlc3RRdWV1ZQoJCSAqIEB0eXBlIHtMb2FkUXVldWV9CgkJICogQHByaXZhdGUKCQkgKi8KCQl0aGlzLl9tYW5pZmVzdFF1ZXVlID0gbnVsbDsKCX07CgoJdmFyIHAgPSBjcmVhdGVqcy5leHRlbmQoTWFuaWZlc3RMb2FkZXIsIGNyZWF0ZWpzLkFic3RyYWN0TG9hZGVyKTsKCXZhciBzID0gTWFuaWZlc3RMb2FkZXI7CgoJLy8gc3RhdGljIHByb3BlcnRpZXMKCS8qKgoJICogVGhlIGFtb3VudCBvZiBwcm9ncmVzcyB0aGF0IHRoZSBtYW5pZmVzdCBpdHNlbGYgdGFrZXMgdXAuCgkgKiBAcHJvcGVydHkgTUFOSUZFU1RfUFJPR1JFU1MKCSAqIEB0eXBlIHtudW1iZXJ9CgkgKiBAZGVmYXVsdCAwLjI1ICgyNSUpCgkgKiBAcHJpdmF0ZQoJICogQHN0YXRpYwoJICovCglzLk1BTklGRVNUX1BST0dSRVNTID0gMC4yNTsKCgkvLyBzdGF0aWMgbWV0aG9kcwoJLyoqCgkgKiBEZXRlcm1pbmVzIGlmIHRoZSBsb2FkZXIgY2FuIGxvYWQgYSBzcGVjaWZpYyBpdGVtLiBUaGlzIGxvYWRlciBjYW4gb25seSBsb2FkIGl0ZW1zIHRoYXQgYXJlIG9mIHR5cGUKCSAqIHt7I2Nyb3NzTGluayAiQWJzdHJhY3RMb2FkZXIvTUFOSUZFU1Q6cHJvcGVydHkifX17ey9jcm9zc0xpbmt9fQoJICogQG1ldGhvZCBjYW5Mb2FkSXRlbQoJICogQHBhcmFtIHtMb2FkSXRlbXxPYmplY3R9IGl0ZW0gVGhlIExvYWRJdGVtIHRoYXQgYSBMb2FkUXVldWUgaXMgdHJ5aW5nIHRvIGxvYWQuCgkgKiBAcmV0dXJucyB7Qm9vbGVhbn0gV2hldGhlciB0aGUgbG9hZGVyIGNhbiBsb2FkIHRoZSBpdGVtLgoJICogQHN0YXRpYwoJICovCglzLmNhbkxvYWRJdGVtID0gZnVuY3Rpb24gKGl0ZW0pIHsKCQlyZXR1cm4gaXRlbS50eXBlID09IGNyZWF0ZWpzLkFic3RyYWN0TG9hZGVyLk1BTklGRVNUOwoJfTsKCgkvLyBwdWJsaWMgbWV0aG9kcwoJcC5sb2FkID0gZnVuY3Rpb24gKCkgewoJCXRoaXMuQWJzdHJhY3RMb2FkZXJfbG9hZCgpOwoJfTsKCgkvLyBwcm90ZWN0ZWQgbWV0aG9kcwoJcC5fY3JlYXRlUmVxdWVzdCA9IGZ1bmN0aW9uKCkgewoJCXZhciBjYWxsYmFjayA9IHRoaXMuX2l0ZW0uY2FsbGJhY2sKCQlpZiAoY2FsbGJhY2sgIT0gbnVsbCkgewoJCQl0aGlzLl9yZXF1ZXN0ID0gbmV3IGNyZWF0ZWpzLkpTT05QTG9hZGVyKHRoaXMuX2l0ZW0pOwoJCX0gZWxzZSB7CgkJCXRoaXMuX3JlcXVlc3QgPSBuZXcgY3JlYXRlanMuSlNPTkxvYWRlcih0aGlzLl9pdGVtKTsKCQl9Cgl9OwoKCXAuaGFuZGxlRXZlbnQgPSBmdW5jdGlvbiAoZXZlbnQpIHsKCQlzd2l0Y2ggKGV2ZW50LnR5cGUpIHsKCQkJY2FzZSAiY29tcGxldGUiOgoJCQkJdGhpcy5fcmF3UmVzdWx0ID0gZXZlbnQudGFyZ2V0LmdldFJlc3VsdCh0cnVlKTsKCQkJCXRoaXMuX3Jlc3VsdCA9IGV2ZW50LnRhcmdldC5nZXRSZXN1bHQoKTsKCQkJCXRoaXMuX3NlbmRQcm9ncmVzcyhzLk1BTklGRVNUX1BST0dSRVNTKTsKCQkJCXRoaXMuX2xvYWRNYW5pZmVzdCh0aGlzLl9yZXN1bHQpOwoJCQkJcmV0dXJuOwoJCQljYXNlICJwcm9ncmVzcyI6CgkJCQlldmVudC5sb2FkZWQgKj0gcy5NQU5JRkVTVF9QUk9HUkVTUzsKCQkJCXRoaXMucHJvZ3Jlc3MgPSBldmVudC5sb2FkZWQgLyBldmVudC50b3RhbDsKCQkJCWlmIChpc05hTih0aGlzLnByb2dyZXNzKSB8fCB0aGlzLnByb2dyZXNzID09IEluZmluaXR5KSB7IHRoaXMucHJvZ3Jlc3MgPSAwOyB9CgkJCQl0aGlzLl9zZW5kUHJvZ3Jlc3MoZXZlbnQpOwoJCQkJcmV0dXJuOwoJCX0KCQl0aGlzLkFic3RyYWN0TG9hZGVyX2hhbmRsZUV2ZW50KGV2ZW50KTsKCX07CgoJcC5kZXN0cm95ID0gZnVuY3Rpb24oKSB7CgkJdGhpcy5BYnN0cmFjdExvYWRlcl9kZXN0cm95KCk7CgkJdGhpcy5fbWFuaWZlc3RRdWV1ZS5jbG9zZSgpOwoJfTsKCgkvKioKCSAqIENyZWF0ZSBhbmQgbG9hZCB0aGUgbWFuaWZlc3QgaXRlbXMgb25jZSB0aGUgYWN0dWFsIG1hbmlmZXN0IGhhcyBiZWVuIGxvYWRlZC4KCSAqIEBtZXRob2QgX2xvYWRNYW5pZmVzdAoJICogQHBhcmFtIHtPYmplY3R9IGpzb24KCSAqIEBwcml2YXRlCgkgKi8KCXAuX2xvYWRNYW5pZmVzdCA9IGZ1bmN0aW9uIChqc29uKSB7CgkJaWYgKGpzb24gJiYganNvbi5tYW5pZmVzdCkgewoJCQl2YXIgcXVldWUgPSB0aGlzLl9tYW5pZmVzdFF1ZXVlID0gbmV3IGNyZWF0ZWpzLkxvYWRRdWV1ZSgpOwoJCQlxdWV1ZS5vbigiZmlsZWxvYWQiLCB0aGlzLl9oYW5kbGVNYW5pZmVzdEZpbGVMb2FkLCB0aGlzKTsKCQkJcXVldWUub24oInByb2dyZXNzIiwgdGhpcy5faGFuZGxlTWFuaWZlc3RQcm9ncmVzcywgdGhpcyk7CgkJCXF1ZXVlLm9uKCJjb21wbGV0ZSIsIHRoaXMuX2hhbmRsZU1hbmlmZXN0Q29tcGxldGUsIHRoaXMsIHRydWUpOwoJCQlxdWV1ZS5vbigiZXJyb3IiLCB0aGlzLl9oYW5kbGVNYW5pZmVzdEVycm9yLCB0aGlzLCB0cnVlKTsKCQkJcXVldWUubG9hZE1hbmlmZXN0KGpzb24pOwoJCX0gZWxzZSB7CgkJCXRoaXMuX3NlbmRDb21wbGV0ZSgpOwoJCX0KCX07CgoJLyoqCgkgKiBBbiBpdGVtIGZyb20gdGhlIHt7I2Nyb3NzTGluayAiX21hbmlmZXN0UXVldWU6cHJvcGVydHkifX17ey9jcm9zc0xpbmt9fSBoYXMgY29tcGxldGVkLgoJICogQG1ldGhvZCBfaGFuZGxlTWFuaWZlc3RGaWxlTG9hZAoJICogQHBhcmFtIHtFdmVudH0gZXZlbnQKCSAqIEBwcml2YXRlCgkgKi8KCXAuX2hhbmRsZU1hbmlmZXN0RmlsZUxvYWQgPSBmdW5jdGlvbiAoZXZlbnQpIHsKCQlldmVudC50YXJnZXQgPSBudWxsOwoJCXRoaXMuZGlzcGF0Y2hFdmVudChldmVudCk7Cgl9OwoKCS8qKgoJICogVGhlIG1hbmlmZXN0IGhhcyBjb21wbGV0ZWQgbG9hZGluZy4gVGhpcyB0cmlnZ2VycyB0aGUge3sjY3Jvc3NMaW5rICJBYnN0cmFjdExvYWRlci9jb21wbGV0ZTpldmVudCJ9fXt7L2Nyb3NzTGlua319CgkgKiB7eyNjcm9zc0xpbmsgIkV2ZW50In19e3svY3Jvc3NMaW5rfX0gZnJvbSB0aGUgTWFuaWZlc3RMb2FkZXIuCgkgKiBAbWV0aG9kIF9oYW5kbGVNYW5pZmVzdENvbXBsZXRlCgkgKiBAcGFyYW0ge0V2ZW50fSBldmVudAoJICogQHByaXZhdGUKCSAqLwoJcC5faGFuZGxlTWFuaWZlc3RDb21wbGV0ZSA9IGZ1bmN0aW9uIChldmVudCkgewoJCXRoaXMuX2xvYWRlZEl0ZW1zID0gdGhpcy5fbWFuaWZlc3RRdWV1ZS5nZXRJdGVtcyh0cnVlKTsKCQl0aGlzLl9zZW5kQ29tcGxldGUoKTsKCX07CgoJLyoqCgkgKiBUaGUgbWFuaWZlc3QgaGFzIHJlcG9ydGVkIHByb2dyZXNzLgoJICogQG1ldGhvZCBfaGFuZGxlTWFuaWZlc3RQcm9ncmVzcwoJICogQHBhcmFtIHtQcm9ncmVzc0V2ZW50fSBldmVudAoJICogQHByaXZhdGUKCSAqLwoJcC5faGFuZGxlTWFuaWZlc3RQcm9ncmVzcyA9IGZ1bmN0aW9uIChldmVudCkgewoJCXRoaXMucHJvZ3Jlc3MgPSBldmVudC5wcm9ncmVzcyAqICgxIC0gcy5NQU5JRkVTVF9QUk9HUkVTUykgKyBzLk1BTklGRVNUX1BST0dSRVNTOwoJCXRoaXMuX3NlbmRQcm9ncmVzcyh0aGlzLnByb2dyZXNzKTsKCX07CgoJLyoqCgkgKiBUaGUgbWFuaWZlc3QgaGFzIHJlcG9ydGVkIGFuIGVycm9yIHdpdGggb25lIG9mIHRoZSBmaWxlcy4KCSAqIEBtZXRob2QgX2hhbmRsZU1hbmlmZXN0RXJyb3IKCSAqIEBwYXJhbSB7RXJyb3JFdmVudH0gZXZlbnQKCSAqIEBwcml2YXRlCgkgKi8KCXAuX2hhbmRsZU1hbmlmZXN0RXJyb3IgPSBmdW5jdGlvbiAoZXZlbnQpIHsKCQl2YXIgbmV3RXZlbnQgPSBuZXcgY3JlYXRlanMuRXZlbnQoImZpbGVlcnJvciIpOwoJCW5ld0V2ZW50Lml0ZW0gPSBldmVudC5kYXRhOwoJCXRoaXMuZGlzcGF0Y2hFdmVudChuZXdFdmVudCk7Cgl9OwoKCWNyZWF0ZWpzLk1hbmlmZXN0TG9hZGVyID0gY3JlYXRlanMucHJvbW90ZShNYW5pZmVzdExvYWRlciwgIkFic3RyYWN0TG9hZGVyIik7Cgp9KCkpOwoKLy8jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLy8gU291bmRMb2FkZXIuanMKLy8jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCnRoaXMuY3JlYXRlanMgPSB0aGlzLmNyZWF0ZWpzIHx8IHt9OwoKKGZ1bmN0aW9uICgpIHsKCSJ1c2Ugc3RyaWN0IjsKCgkvLyBjb25zdHJ1Y3RvcgoJLyoqCgkgKiBBIGxvYWRlciBmb3IgSFRNTCBhdWRpbyBmaWxlcy4gUHJlbG9hZEpTIGNhbiBub3QgbG9hZCBXZWJBdWRpbyBmaWxlcywgYXMgYSBXZWJBdWRpbyBjb250ZXh0IGlzIHJlcXVpcmVkLCB3aGljaAoJICogc2hvdWxkIGJlIGNyZWF0ZWQgYnkgZWl0aGVyIGEgbGlicmFyeSBwbGF5aW5nIHRoZSBzb3VuZCAoc3VjaCBhcyA8YSBocmVmPSJodHRwOi8vc291bmRqcy5jb20iPlNvdW5kSlM8L2E+LCBvciBhbgoJICogZXh0ZXJuYWwgZnJhbWV3b3JrIHRoYXQgaGFuZGxlcyBhdWRpbyBwbGF5YmFjay4gVG8gbG9hZCBjb250ZW50IHRoYXQgY2FuIGJlIHBsYXllZCBieSBXZWJBdWRpbywgdXNlIHRoZQoJICoge3sjY3Jvc3NMaW5rICJCaW5hcnlMb2FkZXIifX17ey9jcm9zc0xpbmt9fSwgYW5kIGhhbmRsZSB0aGUgYXVkaW8gY29udGV4dCBkZWNvZGluZyBtYW51YWxseS4KCSAqIEBjbGFzcyBTb3VuZExvYWRlcgoJICogQHBhcmFtIHtMb2FkSXRlbXxPYmplY3R9IGxvYWRJdGVtCgkgKiBAcGFyYW0ge0Jvb2xlYW59IHByZWZlclhIUgoJICogQGNvbnN0cnVjdG9yCgkgKi8KCWZ1bmN0aW9uIFNvdW5kTG9hZGVyKGxvYWRJdGVtLCBwcmVmZXJYSFIpIHsKCQl0aGlzLkFic3RyYWN0TWVkaWFMb2FkZXJfY29uc3RydWN0b3IobG9hZEl0ZW0sIHByZWZlclhIUiwgY3JlYXRlanMuQWJzdHJhY3RMb2FkZXIuU09VTkQpOwoKCQkvLyBwcm90ZWN0ZWQgcHJvcGVydGllcwoJCWlmIChjcmVhdGVqcy5SZXF1ZXN0VXRpbHMuaXNBdWRpb1RhZyhsb2FkSXRlbSkpIHsKCQkJdGhpcy5fdGFnID0gbG9hZEl0ZW07CgkJfSBlbHNlIGlmIChjcmVhdGVqcy5SZXF1ZXN0VXRpbHMuaXNBdWRpb1RhZyhsb2FkSXRlbS5zcmMpKSB7CgkJCXRoaXMuX3RhZyA9IGxvYWRJdGVtOwoJCX0gZWxzZSBpZiAoY3JlYXRlanMuUmVxdWVzdFV0aWxzLmlzQXVkaW9UYWcobG9hZEl0ZW0udGFnKSkgewoJCQl0aGlzLl90YWcgPSBjcmVhdGVqcy5SZXF1ZXN0VXRpbHMuaXNBdWRpb1RhZyhsb2FkSXRlbSkgPyBsb2FkSXRlbSA6IGxvYWRJdGVtLnNyYzsKCQl9CgoJCWlmICh0aGlzLl90YWcgIT0gbnVsbCkgewoJCQl0aGlzLl9wcmVmZXJYSFIgPSBmYWxzZTsKCQl9Cgl9OwoKCXZhciBwID0gY3JlYXRlanMuZXh0ZW5kKFNvdW5kTG9hZGVyLCBjcmVhdGVqcy5BYnN0cmFjdE1lZGlhTG9hZGVyKTsKCXZhciBzID0gU291bmRMb2FkZXI7CgoJLy8gc3RhdGljIG1ldGhvZHMKCS8qKgoJICogRGV0ZXJtaW5lcyBpZiB0aGUgbG9hZGVyIGNhbiBsb2FkIGEgc3BlY2lmaWMgaXRlbS4gVGhpcyBsb2FkZXIgY2FuIG9ubHkgbG9hZCBpdGVtcyB0aGF0IGFyZSBvZiB0eXBlCgkgKiB7eyNjcm9zc0xpbmsgIkFic3RyYWN0TG9hZGVyL1NPVU5EOnByb3BlcnR5In19e3svY3Jvc3NMaW5rfX0uCgkgKiBAbWV0aG9kIGNhbkxvYWRJdGVtCgkgKiBAcGFyYW0ge0xvYWRJdGVtfE9iamVjdH0gaXRlbSBUaGUgTG9hZEl0ZW0gdGhhdCBhIExvYWRRdWV1ZSBpcyB0cnlpbmcgdG8gbG9hZC4KCSAqIEByZXR1cm5zIHtCb29sZWFufSBXaGV0aGVyIHRoZSBsb2FkZXIgY2FuIGxvYWQgdGhlIGl0ZW0uCgkgKiBAc3RhdGljCgkgKi8KCXMuY2FuTG9hZEl0ZW0gPSBmdW5jdGlvbiAoaXRlbSkgewoJCXJldHVybiBpdGVtLnR5cGUgPT0gY3JlYXRlanMuQWJzdHJhY3RMb2FkZXIuU09VTkQ7Cgl9OwoKCS8vIHByb3RlY3RlZCBtZXRob2RzCglwLl9jcmVhdGVUYWcgPSBmdW5jdGlvbiAoc3JjKSB7CgkJdmFyIHRhZyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImF1ZGlvIik7CgkJdGFnLmF1dG9wbGF5ID0gZmFsc2U7CgkJdGFnLnByZWxvYWQgPSAibm9uZSI7CgoJCS8vTE06IEZpcmVmb3ggZmFpbHMgd2hlbiB0aGlzIHRoZSBwcmVsb2FkPSJub25lIiBmb3Igb3RoZXIgdGFncywgYnV0IGl0IG5lZWRzIHRvIGJlICJub25lIiB0byBlbnN1cmUgUHJlbG9hZEpTIHdvcmtzLgoJCXRhZy5zcmMgPSBzcmM7CgkJcmV0dXJuIHRhZzsKCX07CgoJY3JlYXRlanMuU291bmRMb2FkZXIgPSBjcmVhdGVqcy5wcm9tb3RlKFNvdW5kTG9hZGVyLCAiQWJzdHJhY3RNZWRpYUxvYWRlciIpOwoKfSgpKTsKCi8vIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi8vIFZpZGVvTG9hZGVyLmpzCi8vIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgp0aGlzLmNyZWF0ZWpzID0gdGhpcy5jcmVhdGVqcyB8fCB7fTsKCihmdW5jdGlvbiAoKSB7CgkidXNlIHN0cmljdCI7CgoJLy8gY29uc3RydWN0b3IKCS8qKgoJICogQSBsb2FkZXIgZm9yIHZpZGVvIGZpbGVzLgoJICogQGNsYXNzIFZpZGVvTG9hZGVyCgkgKiBAcGFyYW0ge0xvYWRJdGVtfE9iamVjdH0gbG9hZEl0ZW0KCSAqIEBwYXJhbSB7Qm9vbGVhbn0gcHJlZmVyWEhSCgkgKiBAY29uc3RydWN0b3IKCSAqLwoJZnVuY3Rpb24gVmlkZW9Mb2FkZXIobG9hZEl0ZW0sIHByZWZlclhIUikgewoJCXRoaXMuQWJzdHJhY3RNZWRpYUxvYWRlcl9jb25zdHJ1Y3Rvcihsb2FkSXRlbSwgcHJlZmVyWEhSLCBjcmVhdGVqcy5BYnN0cmFjdExvYWRlci5WSURFTyk7CgoJCWlmIChjcmVhdGVqcy5SZXF1ZXN0VXRpbHMuaXNWaWRlb1RhZyhsb2FkSXRlbSkgfHwgY3JlYXRlanMuUmVxdWVzdFV0aWxzLmlzVmlkZW9UYWcobG9hZEl0ZW0uc3JjKSkgewoJCQl0aGlzLnNldFRhZyhjcmVhdGVqcy5SZXF1ZXN0VXRpbHMuaXNWaWRlb1RhZyhsb2FkSXRlbSk/bG9hZEl0ZW06bG9hZEl0ZW0uc3JjKTsKCgkJCS8vIFdlIGNhbid0IHVzZSBYSFIgZm9yIGEgdGFnIHRoYXQncyBwYXNzZWQgaW4uCgkJCXRoaXMuX3ByZWZlclhIUiA9IGZhbHNlOwoJCX0gZWxzZSB7CgkJCXRoaXMuc2V0VGFnKHRoaXMuX2NyZWF0ZVRhZygpKTsKCQl9Cgl9OwoKCXZhciBwID0gY3JlYXRlanMuZXh0ZW5kKFZpZGVvTG9hZGVyLCBjcmVhdGVqcy5BYnN0cmFjdE1lZGlhTG9hZGVyKTsKCXZhciBzID0gVmlkZW9Mb2FkZXI7CgoJLyoqCgkgKiBDcmVhdGUgYSBuZXcgdmlkZW8gdGFnCgkgKgoJICogQHJldHVybnMge0hUTUxFbGVtZW50fQoJICogQHByaXZhdGUKCSAqLwoJcC5fY3JlYXRlVGFnID0gZnVuY3Rpb24gKCkgewoJCXJldHVybiBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpOwoJfTsKCgkvLyBzdGF0aWMgbWV0aG9kcwoJLyoqCgkgKiBEZXRlcm1pbmVzIGlmIHRoZSBsb2FkZXIgY2FuIGxvYWQgYSBzcGVjaWZpYyBpdGVtLiBUaGlzIGxvYWRlciBjYW4gb25seSBsb2FkIGl0ZW1zIHRoYXQgYXJlIG9mIHR5cGUKCSAqIHt7I2Nyb3NzTGluayAiQWJzdHJhY3RMb2FkZXIvVklERU86cHJvcGVydHkifX17ey9jcm9zc0xpbmt9fS4KCSAqIEBtZXRob2QgY2FuTG9hZEl0ZW0KCSAqIEBwYXJhbSB7TG9hZEl0ZW18T2JqZWN0fSBpdGVtIFRoZSBMb2FkSXRlbSB0aGF0IGEgTG9hZFF1ZXVlIGlzIHRyeWluZyB0byBsb2FkLgoJICogQHJldHVybnMge0Jvb2xlYW59IFdoZXRoZXIgdGhlIGxvYWRlciBjYW4gbG9hZCB0aGUgaXRlbS4KCSAqIEBzdGF0aWMKCSAqLwoJcy5jYW5Mb2FkSXRlbSA9IGZ1bmN0aW9uIChpdGVtKSB7CgkJcmV0dXJuIGl0ZW0udHlwZSA9PSBjcmVhdGVqcy5BYnN0cmFjdExvYWRlci5WSURFTzsKCX07CgoJY3JlYXRlanMuVmlkZW9Mb2FkZXIgPSBjcmVhdGVqcy5wcm9tb3RlKFZpZGVvTG9hZGVyLCAiQWJzdHJhY3RNZWRpYUxvYWRlciIpOwoKfSgpKTsKCi8vIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi8vIFNwcml0ZVNoZWV0TG9hZGVyLmpzCi8vIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgp0aGlzLmNyZWF0ZWpzID0gdGhpcy5jcmVhdGVqcyB8fCB7fTsKCihmdW5jdGlvbiAoKSB7CgkidXNlIHN0cmljdCI7CgoJLy8gY29uc3RydWN0b3IKCS8qKgoJICogQSBsb2FkZXIgZm9yIEVhc2VsSlMgU3ByaXRlU2hlZXRzLiBJbWFnZXMgaW5zaWRlIHRoZSBzcHJpdGVzaGVldCBkZWZpbml0aW9uIGFyZSBsb2FkZWQgYmVmb3JlIHRoZSBsb2FkZXIKCSAqIGNvbXBsZXRlcy4gVG8gbG9hZCBTcHJpdGVTaGVldHMgdXNpbmcgSlNPTlAsIHNwZWNpZnkgYSB7eyNjcm9zc0xpbmsgIkxvYWRJdGVtL2NhbGxiYWNrOnByb3BlcnR5In19e3svY3Jvc3NMaW5rfX0KCSAqIGFzIHBhcnQgb2YgdGhlIHt7I2Nyb3NzTGluayAiTG9hZEl0ZW0ifX17ey9jcm9zc0xpbmt9fS4gTm90ZSB0aGF0IHRoZSB7eyNjcm9zc0xpbmsgIkpTT05Mb2FkZXIifX17ey9jcm9zc0xpbmt9fQoJICogYW5kIHt7I2Nyb3NzTGluayAiSlNPTlBMb2FkZXIifX17ey9jcm9zc0xpbmt9fSBhcmUgaGlnaGVyIHByaW9yaXR5IGxvYWRlcnMsIHNvIFNwcml0ZVNoZWV0cyA8c3Ryb25nPm11c3Q8L3N0cm9uZz4KCSAqIHNldCB0aGUge3sjY3Jvc3NMaW5rICJMb2FkSXRlbSJ9fXt7L2Nyb3NzTGlua319IHt7I2Nyb3NzTGluayAiTG9hZEl0ZW0vdHlwZTpwcm9wZXJ0eSJ9fXt7L2Nyb3NzTGlua319IHByb3BlcnR5CgkgKiB0byB7eyNjcm9zc0xpbmsgIkFic3RyYWN0TG9hZGVyL1NQUklURVNIRUVUOnByb3BlcnR5In19e3svY3Jvc3NMaW5rfX0uCgkgKiBAY2xhc3MgU3ByaXRlU2hlZXRMb2FkZXIKCSAqIEBwYXJhbSB7TG9hZEl0ZW18T2JqZWN0fSBsb2FkSXRlbQoJICogQGNvbnN0cnVjdG9yCgkgKi8KCWZ1bmN0aW9uIFNwcml0ZVNoZWV0TG9hZGVyKGxvYWRJdGVtKSB7CgkJdGhpcy5BYnN0cmFjdExvYWRlcl9jb25zdHJ1Y3Rvcihsb2FkSXRlbSwgbnVsbCwgY3JlYXRlanMuQWJzdHJhY3RMb2FkZXIuU1BSSVRFU0hFRVQpOwoKCQkvLyBwcm90ZWN0ZWQgcHJvcGVydGllcwoJCS8qKgoJCSAqIEFuIGludGVybmFsIHF1ZXVlIHdoaWNoIGxvYWRzIHRoZSBTcHJpdGVTaGVldCdzIGltYWdlcy4KCQkgKiBAbWV0aG9kIF9tYW5pZmVzdFF1ZXVlCgkJICogQHR5cGUge0xvYWRRdWV1ZX0KCQkgKiBAcHJpdmF0ZQoJCSAqLwoJCXRoaXMuX21hbmlmZXN0UXVldWUgPSBudWxsOwoJfQoKCXZhciBwID0gY3JlYXRlanMuZXh0ZW5kKFNwcml0ZVNoZWV0TG9hZGVyLCBjcmVhdGVqcy5BYnN0cmFjdExvYWRlcik7Cgl2YXIgcyA9IFNwcml0ZVNoZWV0TG9hZGVyOwoKCS8vIHN0YXRpYyBwcm9wZXJ0aWVzCgkvKioKCSAqIFRoZSBhbW91bnQgb2YgcHJvZ3Jlc3MgdGhhdCB0aGUgbWFuaWZlc3QgaXRzZWxmIHRha2VzIHVwLgoJICogQHByb3BlcnR5IFNQUklURVNIRUVUX1BST0dSRVNTCgkgKiBAdHlwZSB7bnVtYmVyfQoJICogQGRlZmF1bHQgMC4yNSAoMjUlKQoJICogQHByaXZhdGUKCSAqIEBzdGF0aWMKCSAqLwoJcy5TUFJJVEVTSEVFVF9QUk9HUkVTUyA9IDAuMjU7CgoJLy8gc3RhdGljIG1ldGhvZHMKCS8qKgoJICogRGV0ZXJtaW5lcyBpZiB0aGUgbG9hZGVyIGNhbiBsb2FkIGEgc3BlY2lmaWMgaXRlbS4gVGhpcyBsb2FkZXIgY2FuIG9ubHkgbG9hZCBpdGVtcyB0aGF0IGFyZSBvZiB0eXBlCgkgKiB7eyNjcm9zc0xpbmsgIkFic3RyYWN0TG9hZGVyL1NQUklURVNIRUVUOnByb3BlcnR5In19e3svY3Jvc3NMaW5rfX0KCSAqIEBtZXRob2QgY2FuTG9hZEl0ZW0KCSAqIEBwYXJhbSB7TG9hZEl0ZW18T2JqZWN0fSBpdGVtIFRoZSBMb2FkSXRlbSB0aGF0IGEgTG9hZFF1ZXVlIGlzIHRyeWluZyB0byBsb2FkLgoJICogQHJldHVybnMge0Jvb2xlYW59IFdoZXRoZXIgdGhlIGxvYWRlciBjYW4gbG9hZCB0aGUgaXRlbS4KCSAqIEBzdGF0aWMKCSAqLwoJcy5jYW5Mb2FkSXRlbSA9IGZ1bmN0aW9uIChpdGVtKSB7CgkJcmV0dXJuIGl0ZW0udHlwZSA9PSBjcmVhdGVqcy5BYnN0cmFjdExvYWRlci5TUFJJVEVTSEVFVDsKCX07CgoJLy8gcHVibGljIG1ldGhvZHMKCXAuZGVzdHJveSA9IGZ1bmN0aW9uKCkgewoJCXRoaXMuQWJzdHJhY3RMb2FkZXJfZGVzdHJveTsKCQl0aGlzLl9tYW5pZmVzdFF1ZXVlLmNsb3NlKCk7Cgl9OwoKCS8vIHByb3RlY3RlZCBtZXRob2RzCglwLl9jcmVhdGVSZXF1ZXN0ID0gZnVuY3Rpb24oKSB7CgkJdmFyIGNhbGxiYWNrID0gdGhpcy5faXRlbS5jYWxsYmFjawoJCWlmIChjYWxsYmFjayAhPSBudWxsICYmIGNhbGxiYWNrIGluc3RhbmNlb2YgRnVuY3Rpb24pIHsKCQkJdGhpcy5fcmVxdWVzdCA9IG5ldyBjcmVhdGVqcy5KU09OUExvYWRlcih0aGlzLl9pdGVtKTsKCQl9IGVsc2UgewoJCQl0aGlzLl9yZXF1ZXN0ID0gbmV3IGNyZWF0ZWpzLkpTT05Mb2FkZXIodGhpcy5faXRlbSk7CgkJfQoJfTsKCglwLmhhbmRsZUV2ZW50ID0gZnVuY3Rpb24gKGV2ZW50KSB7CgkJc3dpdGNoIChldmVudC50eXBlKSB7CgkJCWNhc2UgImNvbXBsZXRlIjoKCQkJCXRoaXMuX3Jhd1Jlc3VsdCA9IGV2ZW50LnRhcmdldC5nZXRSZXN1bHQodHJ1ZSk7CgkJCQl0aGlzLl9yZXN1bHQgPSBldmVudC50YXJnZXQuZ2V0UmVzdWx0KCk7CgkJCQl0aGlzLl9zZW5kUHJvZ3Jlc3Mocy5TUFJJVEVTSEVFVF9QUk9HUkVTUyk7CgkJCQl0aGlzLl9sb2FkTWFuaWZlc3QodGhpcy5fcmVzdWx0KTsKCQkJCXJldHVybjsKCQkJY2FzZSAicHJvZ3Jlc3MiOgoJCQkJZXZlbnQubG9hZGVkICo9IHMuU1BSSVRFU0hFRVRfUFJPR1JFU1M7CgkJCQl0aGlzLnByb2dyZXNzID0gZXZlbnQubG9hZGVkIC8gZXZlbnQudG90YWw7CgkJCQlpZiAoaXNOYU4odGhpcy5wcm9ncmVzcykgfHwgdGhpcy5wcm9ncmVzcyA9PSBJbmZpbml0eSkgeyB0aGlzLnByb2dyZXNzID0gMDsgfQoJCQkJdGhpcy5fc2VuZFByb2dyZXNzKGV2ZW50KTsKCQkJCXJldHVybjsKCQl9CgkJdGhpcy5BYnN0cmFjdExvYWRlcl9oYW5kbGVFdmVudChldmVudCk7Cgl9OwoKCS8qKgoJICogQ3JlYXRlIGFuZCBsb2FkIHRoZSBpbWFnZXMgb25jZSB0aGUgU3ByaXRlU2hlZXQgSlNPTiBoYXMgYmVlbiBsb2FkZWQuCgkgKiBAbWV0aG9kIF9sb2FkTWFuaWZlc3QKCSAqIEBwYXJhbSB7T2JqZWN0fSBqc29uCgkgKiBAcHJpdmF0ZQoJICovCglwLl9sb2FkTWFuaWZlc3QgPSBmdW5jdGlvbiAoanNvbikgewoJCWlmIChqc29uICYmIGpzb24uaW1hZ2VzKSB7CgkJCXZhciBxdWV1ZSA9IHRoaXMuX21hbmlmZXN0UXVldWUgPSBuZXcgY3JlYXRlanMuTG9hZFF1ZXVlKCk7CgkJCXF1ZXVlLm9uKCJjb21wbGV0ZSIsIHRoaXMuX2hhbmRsZU1hbmlmZXN0Q29tcGxldGUsIHRoaXMsIHRydWUpOwoJCQlxdWV1ZS5vbigiZmlsZWxvYWQiLCB0aGlzLl9oYW5kbGVNYW5pZmVzdEZpbGVMb2FkLCB0aGlzKTsKCQkJcXVldWUub24oInByb2dyZXNzIiwgdGhpcy5faGFuZGxlTWFuaWZlc3RQcm9ncmVzcywgdGhpcyk7CgkJCXF1ZXVlLm9uKCJlcnJvciIsIHRoaXMuX2hhbmRsZU1hbmlmZXN0RXJyb3IsIHRoaXMsIHRydWUpOwoJCQlxdWV1ZS5sb2FkTWFuaWZlc3QoanNvbi5pbWFnZXMpOwoJCX0KCX07CgoJLyoqCgkgKiBBbiBpdGVtIGZyb20gdGhlIHt7I2Nyb3NzTGluayAiX21hbmlmZXN0UXVldWU6cHJvcGVydHkifX17ey9jcm9zc0xpbmt9fSBoYXMgY29tcGxldGVkLgoJICogQG1ldGhvZCBfaGFuZGxlTWFuaWZlc3RGaWxlTG9hZAoJICogQHBhcmFtIHtFdmVudH0gZXZlbnQKCSAqIEBwcml2YXRlCgkgKi8KCXAuX2hhbmRsZU1hbmlmZXN0RmlsZUxvYWQgPSBmdW5jdGlvbiAoZXZlbnQpIHsKCQl2YXIgaW1hZ2UgPSBldmVudC5yZXN1bHQ7CgkJaWYgKGltYWdlICE9IG51bGwpIHsKCQkJdmFyIGltYWdlcyA9IHRoaXMuZ2V0UmVzdWx0KCkuaW1hZ2VzOwoJCQl2YXIgcG9zID0gaW1hZ2VzLmluZGV4T2YoZXZlbnQuaXRlbS5zcmMpOwoJCQlpbWFnZXNbcG9zXSA9IGltYWdlOwoJCX0KCX07CgoJLyoqCgkgKiBUaGUgaW1hZ2VzIGhhdmUgY29tcGxldGVkIGxvYWRpbmcuIFRoaXMgdHJpZ2dlcnMgdGhlIHt7I2Nyb3NzTGluayAiQWJzdHJhY3RMb2FkZXIvY29tcGxldGU6ZXZlbnQifX17ey9jcm9zc0xpbmt9fQoJICoge3sjY3Jvc3NMaW5rICJFdmVudCJ9fXt7L2Nyb3NzTGlua319IGZyb20gdGhlIFNwcml0ZVNoZWV0TG9hZGVyLgoJICogQG1ldGhvZCBfaGFuZGxlTWFuaWZlc3RDb21wbGV0ZQoJICogQHBhcmFtIHtFdmVudH0gZXZlbnQKCSAqIEBwcml2YXRlCgkgKi8KCXAuX2hhbmRsZU1hbmlmZXN0Q29tcGxldGUgPSBmdW5jdGlvbiAoZXZlbnQpIHsKCQl0aGlzLl9yZXN1bHQgPSBuZXcgY3JlYXRlanMuU3ByaXRlU2hlZXQodGhpcy5fcmVzdWx0KTsKCQl0aGlzLl9sb2FkZWRJdGVtcyA9IHRoaXMuX21hbmlmZXN0UXVldWUuZ2V0SXRlbXModHJ1ZSk7CgkJdGhpcy5fc2VuZENvbXBsZXRlKCk7Cgl9OwoKCS8qKgoJICogVGhlIGltYWdlcyB7eyNjcm9zc0xpbmsgIkxvYWRRdWV1ZSJ9fXt7L2Nyb3NzTGlua319IGhhcyByZXBvcnRlZCBwcm9ncmVzcy4KCSAqIEBtZXRob2QgX2hhbmRsZU1hbmlmZXN0UHJvZ3Jlc3MKCSAqIEBwYXJhbSB7UHJvZ3Jlc3NFdmVudH0gZXZlbnQKCSAqIEBwcml2YXRlCgkgKi8KCXAuX2hhbmRsZU1hbmlmZXN0UHJvZ3Jlc3MgPSBmdW5jdGlvbiAoZXZlbnQpIHsKCQl0aGlzLnByb2dyZXNzID0gZXZlbnQucHJvZ3Jlc3MgKiAoMSAtIHMuU1BSSVRFU0hFRVRfUFJPR1JFU1MpICsgcy5TUFJJVEVTSEVFVF9QUk9HUkVTUzsKCQl0aGlzLl9zZW5kUHJvZ3Jlc3ModGhpcy5wcm9ncmVzcyk7Cgl9OwoKCS8qKgoJICogQW4gaW1hZ2UgaGFzIHJlcG9ydGVkIGFuIGVycm9yLgoJICogQG1ldGhvZCBfaGFuZGxlTWFuaWZlc3RFcnJvcgoJICogQHBhcmFtIHtFcnJvckV2ZW50fSBldmVudAoJICogQHByaXZhdGUKCSAqLwoJcC5faGFuZGxlTWFuaWZlc3RFcnJvciA9IGZ1bmN0aW9uIChldmVudCkgewoJCXZhciBuZXdFdmVudCA9IG5ldyBjcmVhdGVqcy5FdmVudCgiZmlsZWVycm9yIik7CgkJbmV3RXZlbnQuaXRlbSA9IGV2ZW50LmRhdGE7CgkJdGhpcy5kaXNwYXRjaEV2ZW50KG5ld0V2ZW50KTsKCX07CgoJY3JlYXRlanMuU3ByaXRlU2hlZXRMb2FkZXIgPSBjcmVhdGVqcy5wcm9tb3RlKFNwcml0ZVNoZWV0TG9hZGVyLCAiQWJzdHJhY3RMb2FkZXIiKTsKCn0oKSk7CgovLyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwovLyBTVkdMb2FkZXIuanMKLy8jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCnRoaXMuY3JlYXRlanMgPSB0aGlzLmNyZWF0ZWpzIHx8IHt9OwoKKGZ1bmN0aW9uICgpIHsKCSJ1c2Ugc3RyaWN0IjsKCgkvLyBjb25zdHJ1Y3RvcgoJLyoqCgkgKiBBIGxvYWRlciBmb3IgU1ZHIGZpbGVzLgoJICogQGNsYXNzIFNWR0xvYWRlcgoJICogQHBhcmFtIHtMb2FkSXRlbXxPYmplY3R9IGxvYWRJdGVtCgkgKiBAcGFyYW0ge0Jvb2xlYW59IHByZWZlclhIUgoJICogQGNvbnN0cnVjdG9yCgkgKi8KCWZ1bmN0aW9uIFNWR0xvYWRlcihsb2FkSXRlbSwgcHJlZmVyWEhSKSB7CgkJdGhpcy5BYnN0cmFjdExvYWRlcl9jb25zdHJ1Y3Rvcihsb2FkSXRlbSwgcHJlZmVyWEhSLCBjcmVhdGVqcy5BYnN0cmFjdExvYWRlci5TVkcpOwoKCQkvLyBwdWJsaWMgcHJvcGVydGllcwoJCXRoaXMucmVzdWx0Rm9ybWF0dGVyID0gdGhpcy5fZm9ybWF0UmVzdWx0OwoKCQkvLyBwcm90ZWN0ZWQgcHJvcGVydGllcwoJCXRoaXMuX3RhZ1NyY0F0dHJpYnV0ZSA9ICJkYXRhIjsKCgkJaWYgKHByZWZlclhIUikgewoJCQl0aGlzLnNldFRhZyhkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzdmciKSk7CgkJfSBlbHNlIHsKCQkJdGhpcy5zZXRUYWcoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgib2JqZWN0IikpOwoJCQl0aGlzLmdldFRhZygpLnR5cGUgPSAiaW1hZ2Uvc3ZnK3htbCI7CgkJfQoKCQl0aGlzLmdldFRhZygpLnN0eWxlLnZpc2liaWxpdHkgPSAiaGlkZGVuIjsKCX07CgoJdmFyIHAgPSBjcmVhdGVqcy5leHRlbmQoU1ZHTG9hZGVyLCBjcmVhdGVqcy5BYnN0cmFjdExvYWRlcik7Cgl2YXIgcyA9IFNWR0xvYWRlcjsKCgkvLyBzdGF0aWMgbWV0aG9kcwoJLyoqCgkgKiBEZXRlcm1pbmVzIGlmIHRoZSBsb2FkZXIgY2FuIGxvYWQgYSBzcGVjaWZpYyBpdGVtLiBUaGlzIGxvYWRlciBjYW4gb25seSBsb2FkIGl0ZW1zIHRoYXQgYXJlIG9mIHR5cGUKCSAqIHt7I2Nyb3NzTGluayAiQWJzdHJhY3RMb2FkZXIvU1ZHOnByb3BlcnR5In19e3svY3Jvc3NMaW5rfX0KCSAqIEBtZXRob2QgY2FuTG9hZEl0ZW0KCSAqIEBwYXJhbSB7TG9hZEl0ZW18T2JqZWN0fSBpdGVtIFRoZSBMb2FkSXRlbSB0aGF0IGEgTG9hZFF1ZXVlIGlzIHRyeWluZyB0byBsb2FkLgoJICogQHJldHVybnMge0Jvb2xlYW59IFdoZXRoZXIgdGhlIGxvYWRlciBjYW4gbG9hZCB0aGUgaXRlbS4KCSAqIEBzdGF0aWMKCSAqLwoJcy5jYW5Mb2FkSXRlbSA9IGZ1bmN0aW9uIChpdGVtKSB7CgkJcmV0dXJuIGl0ZW0udHlwZSA9PSBjcmVhdGVqcy5BYnN0cmFjdExvYWRlci5TVkc7Cgl9OwoKCS8vIHByb3RlY3RlZCBtZXRob2RzCgkvKioKCSAqIFRoZSByZXN1bHQgZm9ybWF0dGVyIGZvciBTVkcgZmlsZXMuCgkgKiBAbWV0aG9kIF9mb3JtYXRSZXN1bHQKCSAqIEBwYXJhbSB7QWJzdHJhY3RMb2FkZXJ9IGxvYWRlcgoJICogQHJldHVybnMge09iamVjdH0KCSAqIEBwcml2YXRlCgkgKi8KCXAuX2Zvcm1hdFJlc3VsdCA9IGZ1bmN0aW9uIChsb2FkZXIpIHsKCQkvLyBtaW1lIHNob3VsZCBiZSBpbWFnZS9zdmcreG1sLCBidXQgT3BlcmEgcmVxdWlyZXMgdGV4dC94bWwKCQl2YXIgeG1sID0gY3JlYXRlanMuRGF0YVV0aWxzLnBhcnNlWE1MKGxvYWRlci5nZXRSZXN1bHQodHJ1ZSksICJ0ZXh0L3htbCIpOwoJCXZhciB0YWcgPSBsb2FkZXIuZ2V0VGFnKCk7CgoJCWlmICghdGhpcy5fcHJlZmVyWEhSICYmIGRvY3VtZW50LmJvZHkuY29udGFpbnModGFnKSkgewoJCQlkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKHRhZyk7CgkJfQoKCQlpZiAoeG1sLmRvY3VtZW50RWxlbWVudCAhPSBudWxsKSB7CgkJCXRhZy5hcHBlbmRDaGlsZCh4bWwuZG9jdW1lbnRFbGVtZW50KTsKCQkJdGFnLnN0eWxlLnZpc2liaWxpdHkgPSAidmlzaWJsZSI7CgkJCXJldHVybiB0YWc7CgkJfSBlbHNlIHsgLy8gRm9yIGJyb3dzZXJzIHRoYXQgZG9uJ3Qgc3VwcG9ydCBTVkcsIGp1c3QgZ2l2ZSB0aGVtIHRoZSBYTUwuIChJRSA5LTgpCgkJCXJldHVybiB4bWw7CgkJfQoJfQoKCWNyZWF0ZWpzLlNWR0xvYWRlciA9IGNyZWF0ZWpzLnByb21vdGUoU1ZHTG9hZGVyLCAiQWJzdHJhY3RMb2FkZXIiKTsKCn0oKSk7CgovLyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwovLyBYTUxMb2FkZXIuanMKLy8jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCnRoaXMuY3JlYXRlanMgPSB0aGlzLmNyZWF0ZWpzIHx8IHt9OwoKKGZ1bmN0aW9uICgpIHsKCSJ1c2Ugc3RyaWN0IjsKCgkvLyBjb25zdHJ1Y3RvcgoJLyoqCgkgKiBBIGxvYWRlciBmb3IgQ1NTIGZpbGVzLgoJICogQGNsYXNzIFhNTExvYWRlcgoJICogQHBhcmFtIHtMb2FkSXRlbXxPYmplY3R9IGxvYWRJdGVtCgkgKiBAY29uc3RydWN0b3IKCSAqLwoJZnVuY3Rpb24gWE1MTG9hZGVyKGxvYWRJdGVtKSB7CgkJdGhpcy5BYnN0cmFjdExvYWRlcl9jb25zdHJ1Y3Rvcihsb2FkSXRlbSwgdHJ1ZSwgY3JlYXRlanMuQWJzdHJhY3RMb2FkZXIuWE1MKTsKCgkJLy8gcHVibGljIHByb3BlcnRpZXMKCQl0aGlzLnJlc3VsdEZvcm1hdHRlciA9IHRoaXMuX2Zvcm1hdFJlc3VsdDsKCX07CgoJdmFyIHAgPSBjcmVhdGVqcy5leHRlbmQoWE1MTG9hZGVyLCBjcmVhdGVqcy5BYnN0cmFjdExvYWRlcik7Cgl2YXIgcyA9IFhNTExvYWRlcjsKCgkvLyBzdGF0aWMgbWV0aG9kcwoJLyoqCgkgKiBEZXRlcm1pbmVzIGlmIHRoZSBsb2FkZXIgY2FuIGxvYWQgYSBzcGVjaWZpYyBpdGVtLiBUaGlzIGxvYWRlciBjYW4gb25seSBsb2FkIGl0ZW1zIHRoYXQgYXJlIG9mIHR5cGUKCSAqIHt7I2Nyb3NzTGluayAiQWJzdHJhY3RMb2FkZXIvWE1MOnByb3BlcnR5In19e3svY3Jvc3NMaW5rfX0uCgkgKiBAbWV0aG9kIGNhbkxvYWRJdGVtCgkgKiBAcGFyYW0ge0xvYWRJdGVtfE9iamVjdH0gaXRlbSBUaGUgTG9hZEl0ZW0gdGhhdCBhIExvYWRRdWV1ZSBpcyB0cnlpbmcgdG8gbG9hZC4KCSAqIEByZXR1cm5zIHtCb29sZWFufSBXaGV0aGVyIHRoZSBsb2FkZXIgY2FuIGxvYWQgdGhlIGl0ZW0uCgkgKiBAc3RhdGljCgkgKi8KCXMuY2FuTG9hZEl0ZW0gPSBmdW5jdGlvbiAoaXRlbSkgewoJCXJldHVybiBpdGVtLnR5cGUgPT0gY3JlYXRlanMuQWJzdHJhY3RMb2FkZXIuWE1MOwoJfTsKCgkvLyBwcm90ZWN0ZWQgbWV0aG9kcwoJLyoqCgkgKiBUaGUgcmVzdWx0IGZvcm1hdHRlciBmb3IgWE1MIGZpbGVzLgoJICogQG1ldGhvZCBfZm9ybWF0UmVzdWx0CgkgKiBAcGFyYW0ge0Fic3RyYWN0TG9hZGVyfSBsb2FkZXIKCSAqIEByZXR1cm5zIHtYTUxEb2N1bWVudH0KCSAqIEBwcml2YXRlCgkgKi8KCXAuX2Zvcm1hdFJlc3VsdCA9IGZ1bmN0aW9uIChsb2FkZXIpIHsKCQlyZXR1cm4gY3JlYXRlanMuRGF0YVV0aWxzLnBhcnNlWE1MKGxvYWRlci5nZXRSZXN1bHQodHJ1ZSksICJ0ZXh0L3htbCIpOwoJfTsKCgljcmVhdGVqcy5YTUxMb2FkZXIgPSBjcmVhdGVqcy5wcm9tb3RlKFhNTExvYWRlciwgIkFic3RyYWN0TG9hZGVyIik7Cgp9KCkpOw==" ></script>




<!--
	<script type="text/javascript" src="/jkwii/js/jsdoit/preload/src/preloadjs/loaders/ManifestLoader.js"></script>
	-->
	<script id="script_preloadjs_next_combined_js" src="data:/text/plain;base64,LyoKICogTWFuaWZlc3RMb2FkZXIKICogVmlzaXQgaHR0cDovL2NyZWF0ZWpzLmNvbS8gZm9yIGRvY3VtZW50YXRpb24sIHVwZGF0ZXMgYW5kIGV4YW1wbGVzLgogKgogKgogKiBDb3B5cmlnaHQgKGMpIDIwMTIgZ3NraW5uZXIuY29tLCBpbmMuCiAqCiAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uCiAqIG9idGFpbmluZyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uCiAqIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQKICogcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsCiAqIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsCiAqIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQogKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZwogKiBjb25kaXRpb25zOgogKgogKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZQogKiBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KICoKICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCiAqIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUwogKiBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAogKiBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVAogKiBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwKICogV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCiAqIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKICogT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgogKi8KCi8qKgogKiBAbW9kdWxlIFByZWxvYWRKUwogKi8KCi8vIG5hbWVzcGFjZToKdGhpcy5jcmVhdGVqcyA9IHRoaXMuY3JlYXRlanMgfHwge307CgooZnVuY3Rpb24gKCkgewoJInVzZSBzdHJpY3QiOwoKCS8vIGNvbnN0cnVjdG9yCgkvKioKCSAqIEEgbG9hZGVyIGZvciBKU09OIG1hbmlmZXN0cy4gSXRlbXMgaW5zaWRlIHRoZSBtYW5pZmVzdCBhcmUgbG9hZGVkIGJlZm9yZSB0aGUgbG9hZGVyIGNvbXBsZXRlcy4gVG8gbG9hZCBtYW5pZmVzdHMKCSAqIHVzaW5nIEpTT05QLCBzcGVjaWZ5IGEge3sjY3Jvc3NMaW5rICJMb2FkSXRlbS9jYWxsYmFjazpwcm9wZXJ0eSJ9fXt7L2Nyb3NzTGlua319IGFzIHBhcnQgb2YgdGhlCgkgKiB7eyNjcm9zc0xpbmsgIkxvYWRJdGVtIn19e3svY3Jvc3NMaW5rfX0uCgkgKgoJICogVGhlIGxpc3Qgb2YgZmlsZXMgaW4gdGhlIG1hbmlmZXN0IG11c3QgYmUgZGVmaW5lZCBvbiB0aGUgdG9wLWxldmVsIEpTT04gb2JqZWN0IGluIGEgYG1hbmlmZXN0YCBwcm9wZXJ0eS4gVGhpcwoJICogZXhhbXBsZSBzaG93cyBhIHNhbXBsZSBtYW5pZmVzdCBkZWZpbml0aW9uLCBhcyB3ZWxsIGFzIGhvdyB0byB0byBpbmNsdWRlIGEgc3ViLW1hbmlmZXN0LgoJICoKCSAqIAkJewoJICogCQkJInBhdGgiOiAiYXNzZXRzLyIsCgkgKgkgCSAgICAibWFuaWZlc3QiOiBbCgkgKgkJCQkiaW1hZ2UucG5nIiwKCSAqCQkJCXsic3JjIjogImltYWdlMi5wbmciLCAiaWQiOiJpbWFnZTIifSwKCSAqCQkJCXsic3JjIjogInN1Yi1tYW5pZmVzdC5qc29uIiwgInR5cGUiOiJtYW5pZmVzdCIsICJjYWxsYmFjayI6Impzb25DYWxsYmFjayJ9CgkgKgkgCSAgICBdCgkgKgkgCX0KCSAqCgkgKiBXaGVuIGEgTWFuaWZlc3RMb2FkZXIgaGFzIGNvbXBsZXRlZCBsb2FkaW5nLCB0aGUgcGFyZW50IGxvYWRlciAodXN1YWxseSBhIHt7I2Nyb3NzTGluayAiTG9hZFF1ZXVlIn19e3svY3Jvc3NMaW5rfX0sCgkgKiBidXQgY291bGQgYWxzbyBiZSBhbm90aGVyIE1hbmlmZXN0TG9hZGVyKSB3aWxsIGluaGVyaXQgYWxsIHRoZSBsb2FkZWQgaXRlbXMsIHNvIHlvdSBjYW4gYWNjZXNzIHRoZW0gZGlyZWN0bHkuCgkgKgoJICogTm90ZSB0aGF0IHRoZSB7eyNjcm9zc0xpbmsgIkpTT05Mb2FkZXIifX17ey9jcm9zc0xpbmt9fSBhbmQge3sjY3Jvc3NMaW5rICJKU09OUExvYWRlciJ9fXt7L2Nyb3NzTGlua319IGFyZQoJICogaGlnaGVyIHByaW9yaXR5IGxvYWRlcnMsIHNvIG1hbmlmZXN0cyA8c3Ryb25nPm11c3Q8L3N0cm9uZz4gc2V0IHRoZSB7eyNjcm9zc0xpbmsgIkxvYWRJdGVtIn19e3svY3Jvc3NMaW5rfX0KCSAqIHt7I2Nyb3NzTGluayAiTG9hZEl0ZW0vdHlwZTpwcm9wZXJ0eSJ9fXt7L2Nyb3NzTGlua319IHByb3BlcnR5IHRvIHt7I2Nyb3NzTGluayAiQWJzdHJhY3RMb2FkZXIvTUFOSUZFU1Q6cHJvcGVydHkifX17ey9jcm9zc0xpbmt9fS4KCSAqIEBjbGFzcyBNYW5pZmVzdExvYWRlcgoJICogQHBhcmFtIHtMb2FkSXRlbXxPYmplY3R9IGxvYWRJdGVtCgkgKiBAZXh0ZW5kcyBBYnN0cmFjdExvYWRlcgoJICogQGNvbnN0cnVjdG9yCgkgKi8KCWZ1bmN0aW9uIE1hbmlmZXN0TG9hZGVyKGxvYWRJdGVtKSB7CgkJdGhpcy5BYnN0cmFjdExvYWRlcl9jb25zdHJ1Y3Rvcihsb2FkSXRlbSwgbnVsbCwgY3JlYXRlanMuQWJzdHJhY3RMb2FkZXIuTUFOSUZFU1QpOwoKCQkvLyBwcm90ZWN0ZWQgcHJvcGVydGllcwoJCS8qKgoJCSAqIEFuIGludGVybmFsIHt7I2Nyb3NzTGluayAiTG9hZFF1ZXVlIn19e3svY3Jvc3NMaW5rfX0gdGhhdCBsb2FkcyB0aGUgY29udGVudHMgb2YgdGhlIG1hbmlmZXN0LgoJCSAqIEBwcm9wZXJ0eSBfbWFuaWZlc3RRdWV1ZQoJCSAqIEB0eXBlIHtMb2FkUXVldWV9CgkJICogQHByaXZhdGUKCQkgKi8KCQl0aGlzLl9tYW5pZmVzdFF1ZXVlID0gbnVsbDsKCX07CgoJdmFyIHAgPSBjcmVhdGVqcy5leHRlbmQoTWFuaWZlc3RMb2FkZXIsIGNyZWF0ZWpzLkFic3RyYWN0TG9hZGVyKTsKCXZhciBzID0gTWFuaWZlc3RMb2FkZXI7CgoJLy8gc3RhdGljIHByb3BlcnRpZXMKCS8qKgoJICogVGhlIGFtb3VudCBvZiBwcm9ncmVzcyB0aGF0IHRoZSBtYW5pZmVzdCBpdHNlbGYgdGFrZXMgdXAuCgkgKiBAcHJvcGVydHkgTUFOSUZFU1RfUFJPR1JFU1MKCSAqIEB0eXBlIHtudW1iZXJ9CgkgKiBAZGVmYXVsdCAwLjI1ICgyNSUpCgkgKiBAcHJpdmF0ZQoJICogQHN0YXRpYwoJICovCglzLk1BTklGRVNUX1BST0dSRVNTID0gMC4yNTsKCgkvLyBzdGF0aWMgbWV0aG9kcwoJLyoqCgkgKiBEZXRlcm1pbmVzIGlmIHRoZSBsb2FkZXIgY2FuIGxvYWQgYSBzcGVjaWZpYyBpdGVtLiBUaGlzIGxvYWRlciBjYW4gb25seSBsb2FkIGl0ZW1zIHRoYXQgYXJlIG9mIHR5cGUKCSAqIHt7I2Nyb3NzTGluayAiQWJzdHJhY3RMb2FkZXIvTUFOSUZFU1Q6cHJvcGVydHkifX17ey9jcm9zc0xpbmt9fQoJICogQG1ldGhvZCBjYW5Mb2FkSXRlbQoJICogQHBhcmFtIHtMb2FkSXRlbXxPYmplY3R9IGl0ZW0gVGhlIExvYWRJdGVtIHRoYXQgYSBMb2FkUXVldWUgaXMgdHJ5aW5nIHRvIGxvYWQuCgkgKiBAcmV0dXJucyB7Qm9vbGVhbn0gV2hldGhlciB0aGUgbG9hZGVyIGNhbiBsb2FkIHRoZSBpdGVtLgoJICogQHN0YXRpYwoJICovCglzLmNhbkxvYWRJdGVtID0gZnVuY3Rpb24gKGl0ZW0pIHsKCQlyZXR1cm4gaXRlbS50eXBlID09IGNyZWF0ZWpzLkFic3RyYWN0TG9hZGVyLk1BTklGRVNUOwoJfTsKCgkvLyBwdWJsaWMgbWV0aG9kcwoJcC5sb2FkID0gZnVuY3Rpb24gKCkgewoJCXRoaXMuQWJzdHJhY3RMb2FkZXJfbG9hZCgpOwoJfTsKCgkvLyBwcm90ZWN0ZWQgbWV0aG9kcwoJcC5fY3JlYXRlUmVxdWVzdCA9IGZ1bmN0aW9uKCkgewoJCXZhciBjYWxsYmFjayA9IHRoaXMuX2l0ZW0uY2FsbGJhY2s7CgkJaWYgKGNhbGxiYWNrICE9IG51bGwpIHsKCQkJdGhpcy5fcmVxdWVzdCA9IG5ldyBjcmVhdGVqcy5KU09OUExvYWRlcih0aGlzLl9pdGVtKTsKCQl9IGVsc2UgewoJCQl0aGlzLl9yZXF1ZXN0ID0gbmV3IGNyZWF0ZWpzLkpTT05Mb2FkZXIodGhpcy5faXRlbSk7CgkJfQoJfTsKCglwLmhhbmRsZUV2ZW50ID0gZnVuY3Rpb24gKGV2ZW50KSB7CgkJc3dpdGNoIChldmVudC50eXBlKSB7CgkJCWNhc2UgImNvbXBsZXRlIjoKCQkJCXRoaXMuX3Jhd1Jlc3VsdCA9IGV2ZW50LnRhcmdldC5nZXRSZXN1bHQodHJ1ZSk7CgkJCQl0aGlzLl9yZXN1bHQgPSBldmVudC50YXJnZXQuZ2V0UmVzdWx0KCk7CgkJCQl0aGlzLl9zZW5kUHJvZ3Jlc3Mocy5NQU5JRkVTVF9QUk9HUkVTUyk7CgkJCQl0aGlzLl9sb2FkTWFuaWZlc3QodGhpcy5fcmVzdWx0KTsKCQkJCXJldHVybjsKCQkJY2FzZSAicHJvZ3Jlc3MiOgoJCQkJZXZlbnQubG9hZGVkICo9IHMuTUFOSUZFU1RfUFJPR1JFU1M7CgkJCQl0aGlzLnByb2dyZXNzID0gZXZlbnQubG9hZGVkIC8gZXZlbnQudG90YWw7CgkJCQlpZiAoaXNOYU4odGhpcy5wcm9ncmVzcykgfHwgdGhpcy5wcm9ncmVzcyA9PSBJbmZpbml0eSkgeyB0aGlzLnByb2dyZXNzID0gMDsgfQoJCQkJdGhpcy5fc2VuZFByb2dyZXNzKGV2ZW50KTsKCQkJCXJldHVybjsKCQl9CgkJdGhpcy5BYnN0cmFjdExvYWRlcl9oYW5kbGVFdmVudChldmVudCk7Cgl9OwoKCXAuZGVzdHJveSA9IGZ1bmN0aW9uKCkgewoJCXRoaXMuQWJzdHJhY3RMb2FkZXJfZGVzdHJveSgpOwoJCXRoaXMuX21hbmlmZXN0UXVldWUuY2xvc2UoKTsKCX07CgoJLyoqCgkgKiBDcmVhdGUgYW5kIGxvYWQgdGhlIG1hbmlmZXN0IGl0ZW1zIG9uY2UgdGhlIGFjdHVhbCBtYW5pZmVzdCBoYXMgYmVlbiBsb2FkZWQuCgkgKiBAbWV0aG9kIF9sb2FkTWFuaWZlc3QKCSAqIEBwYXJhbSB7T2JqZWN0fSBqc29uCgkgKiBAcHJpdmF0ZQoJICovCglwLl9sb2FkTWFuaWZlc3QgPSBmdW5jdGlvbiAoanNvbikgewoJCWlmIChqc29uICYmIGpzb24ubWFuaWZlc3QpIHsKCQkJdmFyIHF1ZXVlID0gdGhpcy5fbWFuaWZlc3RRdWV1ZSA9IG5ldyBjcmVhdGVqcy5Mb2FkUXVldWUoKTsKCQkJcXVldWUub24oImZpbGVsb2FkIiwgdGhpcy5faGFuZGxlTWFuaWZlc3RGaWxlTG9hZCwgdGhpcyk7CgkJCXF1ZXVlLm9uKCJwcm9ncmVzcyIsIHRoaXMuX2hhbmRsZU1hbmlmZXN0UHJvZ3Jlc3MsIHRoaXMpOwoJCQlxdWV1ZS5vbigiY29tcGxldGUiLCB0aGlzLl9oYW5kbGVNYW5pZmVzdENvbXBsZXRlLCB0aGlzLCB0cnVlKTsKCQkJcXVldWUub24oImVycm9yIiwgdGhpcy5faGFuZGxlTWFuaWZlc3RFcnJvciwgdGhpcywgdHJ1ZSk7CgkJCXF1ZXVlLmxvYWRNYW5pZmVzdChqc29uKTsKCQl9IGVsc2UgewoJCQl0aGlzLl9zZW5kQ29tcGxldGUoKTsKCQl9Cgl9OwoKCS8qKgoJICogQW4gaXRlbSBmcm9tIHRoZSB7eyNjcm9zc0xpbmsgIl9tYW5pZmVzdFF1ZXVlOnByb3BlcnR5In19e3svY3Jvc3NMaW5rfX0gaGFzIGNvbXBsZXRlZC4KCSAqIEBtZXRob2QgX2hhbmRsZU1hbmlmZXN0RmlsZUxvYWQKCSAqIEBwYXJhbSB7RXZlbnR9IGV2ZW50CgkgKiBAcHJpdmF0ZQoJICovCglwLl9oYW5kbGVNYW5pZmVzdEZpbGVMb2FkID0gZnVuY3Rpb24gKGV2ZW50KSB7CgkJZXZlbnQudGFyZ2V0ID0gbnVsbDsKCQl0aGlzLmRpc3BhdGNoRXZlbnQoZXZlbnQpOwoJfTsKCgkvKioKCSAqIFRoZSBtYW5pZmVzdCBoYXMgY29tcGxldGVkIGxvYWRpbmcuIFRoaXMgdHJpZ2dlcnMgdGhlIHt7I2Nyb3NzTGluayAiQWJzdHJhY3RMb2FkZXIvY29tcGxldGU6ZXZlbnQifX17ey9jcm9zc0xpbmt9fQoJICoge3sjY3Jvc3NMaW5rICJFdmVudCJ9fXt7L2Nyb3NzTGlua319IGZyb20gdGhlIE1hbmlmZXN0TG9hZGVyLgoJICogQG1ldGhvZCBfaGFuZGxlTWFuaWZlc3RDb21wbGV0ZQoJICogQHBhcmFtIHtFdmVudH0gZXZlbnQKCSAqIEBwcml2YXRlCgkgKi8KCXAuX2hhbmRsZU1hbmlmZXN0Q29tcGxldGUgPSBmdW5jdGlvbiAoZXZlbnQpIHsKCQl0aGlzLl9sb2FkZWRJdGVtcyA9IHRoaXMuX21hbmlmZXN0UXVldWUuZ2V0SXRlbXModHJ1ZSk7CgkJdGhpcy5fc2VuZENvbXBsZXRlKCk7Cgl9OwoKCS8qKgoJICogVGhlIG1hbmlmZXN0IGhhcyByZXBvcnRlZCBwcm9ncmVzcy4KCSAqIEBtZXRob2QgX2hhbmRsZU1hbmlmZXN0UHJvZ3Jlc3MKCSAqIEBwYXJhbSB7UHJvZ3Jlc3NFdmVudH0gZXZlbnQKCSAqIEBwcml2YXRlCgkgKi8KCXAuX2hhbmRsZU1hbmlmZXN0UHJvZ3Jlc3MgPSBmdW5jdGlvbiAoZXZlbnQpIHsKCQl0aGlzLnByb2dyZXNzID0gZXZlbnQucHJvZ3Jlc3MgKiAoMSAtIHMuTUFOSUZFU1RfUFJPR1JFU1MpICsgcy5NQU5JRkVTVF9QUk9HUkVTUzsKCQl0aGlzLl9zZW5kUHJvZ3Jlc3ModGhpcy5wcm9ncmVzcyk7Cgl9OwoKCS8qKgoJICogVGhlIG1hbmlmZXN0IGhhcyByZXBvcnRlZCBhbiBlcnJvciB3aXRoIG9uZSBvZiB0aGUgZmlsZXMuCgkgKiBAbWV0aG9kIF9oYW5kbGVNYW5pZmVzdEVycm9yCgkgKiBAcGFyYW0ge0Vycm9yRXZlbnR9IGV2ZW50CgkgKiBAcHJpdmF0ZQoJICovCglwLl9oYW5kbGVNYW5pZmVzdEVycm9yID0gZnVuY3Rpb24gKGV2ZW50KSB7CgkJdmFyIG5ld0V2ZW50ID0gbmV3IGNyZWF0ZWpzLkV2ZW50KCJmaWxlZXJyb3IiKTsKCQluZXdFdmVudC5pdGVtID0gZXZlbnQuZGF0YTsKCQl0aGlzLmRpc3BhdGNoRXZlbnQobmV3RXZlbnQpOwoJfTsKCgljcmVhdGVqcy5NYW5pZmVzdExvYWRlciA9IGNyZWF0ZWpzLnByb21vdGUoTWFuaWZlc3RMb2FkZXIsICJBYnN0cmFjdExvYWRlciIpOwoKfSgpKTsK" ></script>



<!-- We also provide hosted minified versions of all CreateJS libraries.
	http://code.createjs.com -->

	<script id="editable">
		var preload;

// Create a new queue.
//preload = new createjs.LoadQueue(true, "assets/");
// Use this instead to favor tag loading

		function init_jaxgrid() {
			preload = new createjs.LoadQueue(true);

			createjs.Sound.registerPlugins([createjs.HTMLAudioPlugin]);  // need this so it doesn't default to Web Audio
			preload.installPlugin(createjs.Sound);

			preload.on("fileload", handleFileLoaded);
			preload.on("error", handleError);
			}

		function loadManifest() {
			preload.loadManifest({src: "/txt/MediaGridManifest.json", callback: "loadMediaGrid", type: "manifest"}, true, "/txt/");
			}

	function stop() {
		if (preload != null) {
			preload.close();
		}
	}

	// Load a single asset.
	function loadAsset(target) {
		var div = document.getElementById(target.id);
		div.innerHTML = "<label>Loading...</label>";

		var type = target.attributes.getNamedItem("type");

		var item = {
			src: target.id,
			id: target.id
			};
		
		if (!type) {
			preload.loadManifest({path: "/txt/", manifest: [item]});
			} 
		else {
			item.type = type.value;
			item.callback = "maps";
			preload.loadFile(item, true);
			}
		}

// Once each file is loaded, show it. Each ID corresponds to the related DIV.
		function handleFileLoaded(event) {
		var item = event.item;
		var id = item.id;
		var result = event.result;

		var div = document.getElementById(id);
		if (div == null) {
			console.log("Could not find DIV:", id, event);
			return;
			}
		switch (item.type) {
			case createjs.AbstractLoader.CSS:
				(document.head || document.getElementsByTagName("head")[0]).appendChild(result);
				div.innerHTML = "<label>CSS is complete :)</label>";
				break;

			case createjs.AbstractLoader.IMAGE:
				div.innerText = "";
				result.width = div.clientWidth;
				result.height = div.clientHeight;
				div.appendChild(result);
				break;

			case createjs.AbstractLoader.JAVASCRIPT:
				document.body.appendChild(result);
				div.innerHTML = "<label>Javascript is complete :)</label>";
				break;

			case createjs.AbstractLoader.JSON:
			case createjs.AbstractLoader.XML:
				div.innerHTML = "<label>" +
						item.type +
						" loaded: <br /><xmp>" +
						(event.rawResult ? event.rawResult : '') +
						"</xmp></label>";
				break;
			case createjs.AbstractLoader.JSONP:
				div.innerHTML = "<label>JSONP is complete :)</label>";
				break;
			case createjs.AbstractLoader.SOUND:
				document.body.appendChild(result);
				result.play();
				div.innerHTML = "<label>Sound is complete :)</label>";
				break;

			case createjs.AbstractLoader.SVG:
				div.innerHTML = "";
				div.appendChild(result);
				break
		}
		div.style.backgroundColor = "#222222";
	}

	// A file failed to load.
	function handleError(event) {
		var item = event.data;
		var div = document.getElementById(item.id);
		if (div != null) {
			div.innerHTML = "<label>Error " + (item.id == "NoFileHere.png"?":)":":(")+"</label>";
			div.className = "gridBox error";
			}
		}
	</script>

<!--
</body> </html>
<html> <head>
	<title>index.html 20200503_2300   jsdoit.html  </title>
	-->

<!--
	<title>index.html 20200503_2200   jtfdcr_stalkarounds_20200503.txt </title>
	<title>index.html 20200502_1800   blobid ?id=iperms id=konet</title>
	<title>index.html 20200502_1200  random_jukebox kolists_imgs_jukebox </title>
	<title>index.html 20200502_1200  jtfdc_stalkarounds_fedex_gigglegirls </title>
	<title>index.html 20200502_1200  imgs/imgs_jukebos/radio_02.jpg </title>
	<title>index.html 20200502_0200  jtfdc_stalkarounds() disable filecheck </title>
	<title>index.html 20200502_0200  jtfdc_stalkarounds() </title>
	<title>index.html 20200501_2300  bloglists </title>
	<title>index.html 20200501_1111  slotlever skwiibugs </title>
	<title>index.html 20200501_1111  slotlever skwiibugs </title>
	<title>index.html 20200501_0444  color_selected=blue/red </title>
	<title>index.html 20200501_0200  blob_sound reorg </title>
	<title>index.html 20200501_0200  giphy_us replace giphy_us_news_focus/ </title>
	<title>index.html 20200430_1216  blob_ani,arrows kob/kow </title>
	<title>index.html 20200430_1200  shock-n-awe</title>
	<title>index.html 20200429_1933  jax(jtfdc_mp4) </title>
	<title>index.html 20200429_1933  jax(ko.php?ls=/fb/stlc/pages </title>
	<title>index.html 20200429_1933  blob_arrowkeys="" </title>
	<title>index.html 20200427_2030  imgs/sound/ringworm_1.gif width=60 </title>
	<title>index.html 20200427_2000  imgs/sound/ringworm_1.gif .png </title>
	<title>index.html 20200427_1400  giphy_wave03 </title>
	<title>index.html 20200427_0840  gravity_gif height=200</title>
	<title>index.html 20200426_2200  kb/mp3 </title>
	<title>index.html 20200426_1900  kb/mp3 </title>
	<title>index.html 20200426_0100  script_jaxs </title>
	<title>index.html 20200424_1600  kolists_mp3 </title>
	<title>index.html 20200424_1600  imgs/btn/blob_gravity_onoff.gif </title>
	<title>index.html 20200424_0830  imgs/btn/blob_gravity_onoff.gif </title>
	<title>index.html 20200424_0830  imgs_blob5 blob_info </title>
	<title>index.html 20200424_0830  imgs/sound/soundwave.png </title>
	<title>index.html 20200423_0316  div_buttons us </title>
	<title>index.html 20200423_1413  gravityon blobColl.split </title>
	<title>index.html 20200423_1413 blob init split</title>
	<title>index.html 20200423_1413 jtfdc_20200423_1423_stalkaroundup_speeding_amazon_stalk.mp4</title>
	<title>index.html 20200423_1413 jaxphp button beutify</title>
	<title>index.html 20200423_1300 fb links </title>
	<title>index.html 20200423_1230 jax() kolists[id] kolists['jax'] </title>
	<title>index.html 20200423_0530 startup kolists</title>
	<title>index.html 20200422_1130 iperms konet links </title>
	<title>index.html 20200422_1130 ko_center links </title>
	<title>index.html 20200422_0630 postturtle_monkeytrap/floop </title>
	<title>index.html 20200422_0630 postturtle_monkeytrap </title>
	<title>index.html 20200420_2112 img_blob_buttons.png gravity </title>
	<title>index.html 20200420_2112 img_blob_togglestart gravity </title>
	<title>index.html 20200420_1233 blob+index.html mousebug fix </title>
	<title>blob.html 20200418_2130 up down left right new Vector</title>
	<title>blob.html 20200418_0900 keypress shift ctrl</title>
	<title>blob.html 20200418_0900 blobsallad</title>
	<title>blob.html 20200418_0400</title>
	-->

	<script id="script_blob_log"  type="text/javascript">
		function log(msg) {
			var textArea;
			textArea = document.getElementById("logArea");
			textArea.value = msg + "\n" + textArea.value;
			}

		function clearLog() {
			var textArea;
			textArea = document.getElementById("logArea");
			textArea.value = "";
			}
		</script>

<!--	<script type="text/javascript" src="blobsallad.js"> </script> -->
<!--	<script type="text/javascript" src="blob.js"> </script> -->
	<script id="script_blob">
		function Vector(x, y) {
			this.x = x; 
			this.y = y; 
			this.equal = function(v) {
				return this.x == v.getX() && this.y == v.getY(); 
				}
			this.getX = function() {
				return this.x; 
				}
			this.getY = function() {
				return this.y; 
				}
			this.setX = function(x) {
				this.x = x; 
				}
			this.setY = function(y) {
				this.y = y; 
				}
			this.addX = function(x) {
				this.x += x; 
				}
			this.addY = function(y) { this.y += y; }
			this.set = function(v) {
				this.x = v.getX(); 
				this.y = v.getY(); 
				}
			this.add = function(v) {
				this.x += v.getX(); 
				this.y += v.getY(); 
				}
			this.sub = function(v) {
				this.x -= v.getX(); 
				this.y -= v.getY(); 
				}
			this.dotProd = function(v) {
				return this.x * v.getX() + this.y * v.getY(); 
				}
			this.length = function() {
				return Math.sqrt(this.x * this.x + this.y * this.y); 
				}
			this.scale = function(scaleFactor) {
				this.x *= scaleFactor; 
				this.y *= scaleFactor; 
				}
			this.toString = function() {
				return " X: " + this.x + " Y: " + this.y; 
				}
			}
  
		function Environment(x, y, w, h) {
			this.left = x;   
			this.right = x + w;   
			this.top = y;   
			this.buttom = y + h;
			this.r = new Vector(0.0, 0.0); 

		this.collision = function(curPos, prevPos) {
			var collide = false; 
			var i; 

		if(curPos.getX() < this.left) {
			curPos.setX(this.left); 
			collide = true; 
			}
		else if(curPos.getX() > this.right) {
			curPos.setX(this.right); 
			collide = true; 
			}
		if(curPos.getY() < this.top) {
			curPos.setY(this.top); 
			collide = true; 
			}
      else if(curPos.getY() > this.buttom)
      {
        curPos.setY(this.buttom); 
        collide = true; 
      }
      return collide; 
    }  


	this.draw = function(ctx, scaleFactor) {}
	}
  
	function PointMass(cx, cy, mass) {
		this.cur = new Vector(cx, cy); 
		this.prev = new Vector(cx, cy); 
		this.mass = mass; 
		this.force = new Vector(0.0, 0.0); 
		this.result = new Vector(0.0, 0.0); 
		this.friction = 0.01; 
    
	this.getXPos = function() {
		return this.cur.getX(); 
		}
	this.getYPos = function() {
		return this.cur.getY(); 
		}
	this.getPos = function() {
		return this.cur; 
		}
	this.getXPrevPos = function() {
		return this.prev.getX(); 
		}
	this.getYPrevPos = function() {return this.prev.getY(); }
	this.getPrevPos = function() {return this.prev; }
	this.addXPos = function(dx) {this.cur.addX(dx); }
	this.addYPos = function(dy) {this.cur.addY(dy); }
	this.setForce = function(force) {this.force.set(force); }    
	this.addForce = function(force) {this.force.add(force); }
	this.getMass = function() {return this.mass; }
	this.setMass = function(mass) {this.mass = mass; }

		this.move = function(dt) {
			var t, a, c, dtdt; 
			dtdt = dt * dt; 
      
			a = this.force.getX() / this.mass;
			c = this.cur.getX(); 
			t = (2.0 - this.friction) * c - (1.0 - this.friction) * this.prev.getX() + a * dtdt;
			this.prev.setX(c); 
			this.cur.setX(t);
            
			a = this.force.getY() / this.mass;
			c = this.cur.getY(); 
			t = (2.0 - this.friction) * c - (1.0 - this.friction) * this.prev.getY() + a * dtdt;
			this.prev.setY(c); 
			this.cur.setY(t);
			}
		this.setFriction = function(friction) {this.friction = friction; }
		this.getVelocity = function() {
			var cXpX, cYpY; 
      
			cXpX = this.cur.getX() - this.prev.getX(); 
			cYpY = this.cur.getY() - this.prev.getY();
      
			return cXpX * cXpX + cYpY * cYpY;  
			}

		this.draw = function(ctx, scaleFactor) {
			ctx.lineWidth = 2; 
//			ctx.fillStyle = '#000000'; 
//			ctx.strokeStyle = '#000000'; 
			ctx.fillStyle = 'white'; 
			ctx.strokeStyle = 'black'; 
			ctx.beginPath(); 
			ctx.arc(this.cur.getX() * scaleFactor, 
			nthis.cur.getY() * scaleFactor, 
			4.0, 0.0, Math.PI * 2.0, true); 
			ctx.fill(); 
			}
		}
 
	function ConstraintY(pointMass, y, shortConst, longConst) {
		this.pointMass = pointMass; 
		this.y = y; 
		this.delta = new Vector(0.0, 0.0);
		this.shortConst = shortConst; 
		this.longConst = longConst;  
    
		this.sc = function() {      
      var dist; 
      
      dist = Math.abs(this.pointMass.getYPos() - this.y);
      this.delta.setY(-dist); 
       
      if(this.shortConst != 0.0 && dist < this.shortConst) {
        var scaleFactor; 
        
        scaleFactor = this.shortConst / dist; 
        this.delta.scale(scaleFactor); 
        pointMass.getPos().sub(this.delta); 
      } 
      else if(this.longConst != 0.0 && dist > this.longConst)
      {
        var scaleFactor; 
        
        scaleFactor = this.longConst / dist; 
        this.delta.scale(scaleFactor); 
        pointMass.getPos().sub(this.delta); 
      }
    } 
  }

  
  function Joint(pointMassA, pointMassB, shortConst, longConst)
  {
    this.pointMassA = pointMassA; 
    this.pointMassB = pointMassB; 
    this.delta = new Vector(0.0, 0.0);     
    this.pointMassAPos = pointMassA.getPos(); 
    this.pointMassBPos = pointMassB.getPos(); 
    
    this.delta.set(this.pointMassBPos); 
    this.delta.sub(this.pointMassAPos); 
    
    this.shortConst = this.delta.length() * shortConst; 
    this.longConst = this.delta.length() * longConst; 
    this.scSquared = this.shortConst * this.shortConst; 
    this.lcSquared = this.longConst * this.longConst; 

    this.setDist = function(shortConst, longConst)
    {
      this.shortConst = shortConst; 
      this.longConst = longConst; 
      this.scSquared = this.shortConst * this.shortConst; 
      this.lcSquared = this.longConst * this.longConst;     
    }
    this.scale = function(scaleFactor)
    {
      this.shortConst = this.shortConst * scaleFactor; 
      this.longConst = this.longConst * scaleFactor; 
      this.scSquared = this.shortConst * this.shortConst; 
      this.lcSquared = this.longConst * this.longConst;     
    }
    this.sc = function()
    {      
      this.delta.set(this.pointMassBPos); 
      this.delta.sub(this.pointMassAPos); 

      var dp = this.delta.dotProd(this.delta);
      
      if(this.shortConst != 0.0 && dp < this.scSquared)
      {
        var scaleFactor; 
        
        scaleFactor = this.scSquared / (dp + this.scSquared) - 0.5; 
        
        this.delta.scale(scaleFactor);
       
        this.pointMassAPos.sub(this.delta); 
        this.pointMassBPos.add(this.delta); 
      } 
      else if(this.longConst != 0.0 && dp > this.lcSquared)
      {
        var scaleFactor;
        
        scaleFactor = this.lcSquared / (dp + this.lcSquared) - 0.5; 
        
        this.delta.scale(scaleFactor);
       
        this.pointMassAPos.sub(this.delta); 
        this.pointMassBPos.add(this.delta);       
      }
    } 
  }
    
  function Stick(pointMassA, pointMassB)
  {
    function pointMassDist(pointMassA, pointMassB)
    {
      var aXbX, aYbY; 
    
      aXbX = pointMassA.getXPos() - pointMassB.getXPos(); 
      aYbY = pointMassA.getYPos() - pointMassB.getYPos(); 
    
      return Math.sqrt(aXbX * aXbX + aYbY * aYbY);  
    }
  
    this.length = pointMassDist(pointMassA, pointMassB); 
    this.lengthSquared = this.length * this.length; 
    this.pointMassA = pointMassA; 
    this.pointMassB = pointMassB; 
    this.delta = new Vector(0.0, 0.0); 
    
    this.getPointMassA = function()
    {
      return this.pointMassA; 
    }
    this.getPointMassB = function()
    {
      return this.pointMassB; 
    }
    this.scale = function(scaleFactor)
    {
      this.length *= scaleFactor; 
      this.lengthSquared = this.length * this.length; 
    }
    this.sc = function(env)
    {
      var dotProd, scaleFactor; 
      var pointMassAPos, pointMassBPos; 
    
      pointMassAPos = this.pointMassA.getPos(); 
      pointMassBPos = this.pointMassB.getPos(); 
    
      this.delta.set(pointMassBPos); 
      this.delta.sub(pointMassAPos); 

      dotProd = this.delta.dotProd(this.delta); 

      scaleFactor = this.lengthSquared / (dotProd + this.lengthSquared) - 0.5; 
      this.delta.scale(scaleFactor);
       
      pointMassAPos.sub(this.delta); 
      pointMassBPos.add(this.delta); 
    }
    this.setForce = function(force)
    {
      this.pointMassA.setForce(force); 
      this.pointMassB.setForce(force); 
    }
    this.addForce = function(force)
    {
      this.pointMassA.addForce(force); 
      this.pointMassB.addForce(force); 
    }
    this.move = function(dt)
    {
      this.pointMassA.move(dt); 
      this.pointMassB.move(dt); 
    }
		this.draw = function(ctx, scaleFactor) {
			this.pointMassA.draw(ctx, scaleFactor); 
			this.pointMassB.draw(ctx, scaleFactor); 
            
			ctx.lineWidth = 3; 
//			ctx.fillStyle = '#000000'; 
//			ctx.strokeStyle = '#000000'; 
			ctx.fillStyle = 'darkslategrey'; 
			ctx.strokeStyle = 'linen'; 
			ctx.beginPath(); 
			ctx.moveTo(this.pointMassA.getXPos() * scaleFactor, 
			this.pointMassA.getYPos() * scaleFactor); 
			ctx.lineTo(this.pointMassB.getXPos() * scaleFactor, 
			this.pointMassB.getYPos() * scaleFactor); 
			ctx.stroke(); 
			}
		}
  
  function Spring(restLength, stiffness, damper, pointMassA, pointMassB)
  {
    this.restLength = restLength; 
    this.stiffness = stiffness; 
    this.damper = damper; 
    this.pointMassA = pointMassA; 
    this.pointMassB = pointMassB; 
    this.tmp = Vector(0.0, 0.0); 
    
    this.sc = function(env)
    {
      env.collistion(this.pointMassA.getPos(), this.pointMassA.getPrevPos()); 
      env.collistion(this.pointMassB.getPos(), this.pointMassB.getPrevPos()); 
    }
    
    this.move = function(dt)
    {
      var aXbX;
      var aYbY;
      var springForce; 
      var length; 
      
      aXbX = this.pointMassA.getXPos() - this.pointMassB.getXPos(); 
      aYbY = this.pointMassA.getYPos() - this.pointMassB.getYPos(); 
      
      length = Math.sqrt(aXbX * aXbX + aYbY * aYbY);
      springForce = this.stiffness * (length / this.restLength - 1.0);   
      
      var avXbvX; 
      var avYbvY; 
      var damperForce; 
      
      avXbvX = this.pointMassA.getXVel() - this.pointMassB.getXVel(); 
      avYbvY = this.pointMassA.getYVel() - this.pointMassB.getYVel(); 
      
      damperForce = avXbvX * aXbX + avYbvY * aYbY;
      damperForce *= this.damper; 
      
      var fx; 
      var fy; 
      
      fx = (springForce + damperForce) * aXbX; 
      fy = (springForce + damperForce) * aYbY; 
      
      this.tmp.setX(-fx); 
      this.tmp.setY(-ft); 
      this.pointMassA.addForce(this.tmp); 

      this.tmp.setX(fx); 
      this.tmp.setY(ft); 
      this.pointMassB.addForce(this.tmp); 
      
      this.pointMassA.move(dt); 
      this.pointMassB.move(dt); 
    }
    this.addForce = function(force)
    {
      this.pointMassA.addForce(force); 
      this.pointMassB.addForce(force); 
    }


			this.draw = function(ctx, scaleFactor) {
				this.pointMassA.draw(ctx, scaleFactor); 
				this.pointMassB.draw(ctx, scaleFactor); 
      
//				ctx.fillStyle = '#000000'; 
//				ctx.strokeStyle = '#000000'; 
				ctx.fillStyle = 'red'; 
				ctx.strokeStyle = 'blue'; 
				ctx.beginPath(); 
				ctx.moveTo(this.pointMassA.getXPos() * scaleFactor, 
					this.pointMassA.getYPos() * scaleFactor); 
				ctx.lineTo(this.pointMassB.getXPos() * scaleFactor, 
					this.pointMassB.getXPos() * scaleFactor); 
				ctx.stroke(); 
				}
			}

		function Blob(x, y, radius, numPointMasses) {
			this.x = x; 
			this.y = y; 

//			alert( "BUGS_480 x="+x+" y="+radius+" numpointmasses="+numPointMasses );
			this.sticks = new Array(); 
			this.pointMasses = new Array(); 
			this.joints = new Array(); 
			this.middlePointMass; 
			this.radius = radius; 
			this.drawFaceStyle = 1; 
			this.drawEyeStyle = 1; 
			this.selected = false; 
    
			numPointMasses = 8; 
    
			var f = 0.1; 
			var low = 0.95, high = 1.05;
			var t, i, p;
  
		function clampIndex(index, maxIndex) {
			index += maxIndex; 
			return index % maxIndex; 
			}

		for(i = 0, t = 0.0; i < numPointMasses; i++) {
			this.pointMasses[i] = new PointMass(Math.cos(t) * radius + x, Math.sin(t) * radius + y, 1.0); 
			t += 2.0 * Math.PI / numPointMasses; 
			}
    
		this.middlePointMass = new PointMass(x, y, 1.0); 
     
    this.pointMasses[0].setMass(4.0); 
    this.pointMasses[1].setMass(4.0); 
     
    for(i = 0; i < numPointMasses; i++)
    {
      this.sticks[i] = new Stick(this.pointMasses[i], this.pointMasses[clampIndex(i + 1, numPointMasses)]); 
    }

    for(i = 0, p = 0; i < numPointMasses; i++)
    {
      this.joints[p++] = new Joint(this.pointMasses[i], this.pointMasses[clampIndex(i + numPointMasses / 2 + 1, numPointMasses)], low, high);  
      this.joints[p++] = new Joint(this.pointMasses[i], this.middlePointMass, high * 0.9, low * 1.1); // 0.8, 1.2 works  
    }
    
    this.addBlob = function(blob)
    {
      var index = this.joints.length;
      var dist; 
       
      this.joints[index] = new Joint(this.middlePointMass, blob.getMiddlePointMass(), 0.0, 0.0); 
      dist = this.radius + blob.getRadius(); 
      this.joints[index].setDist(dist * 0.95, 0.0); 
    }
    this.getMiddlePointMass = function()
    {
      return this.middlePointMass; 
    }
    this.getRadius = function()
    {
      return this.radius; 
    }
    this.getXPos = function()
    {
      return this.middlePointMass.getXPos(); 
    }
    this.getYPos = function()
    {
      return this.middlePointMass.getYPos(); 
    }
    this.scale = function(scaleFactor)
    {
      var i; 
      
      for(i = 0; i < this.joints.length; i++)
      {
        this.joints[i].scale(scaleFactor); 
      }
      for(i = 0; i < this.sticks.length; i++)
      {
        this.sticks[i].scale(scaleFactor); 
      }
      this.radius *= scaleFactor; 
    }
    
    this.move = function(dt)
    {
      var i; 
      
      for(i = 0; i < this.pointMasses.length; i++)
      {
        this.pointMasses[i].move(dt); 
      }
      this.middlePointMass.move(dt); 
    }
    this.sc = function(env)
    {
      var i, j; 
      
      for(j = 0; j < 4; j++)
      {
        for(i = 0; i < this.pointMasses.length; i++)
        {
          if(env.collision(this.pointMasses[i].getPos(), this.pointMasses[i].getPrevPos()) == true)
          {
            this.pointMasses[i].setFriction(0.75); 
          } 
          else 
          {
            this.pointMasses[i].setFriction(0.01); 
          }
        }
        for(i = 0; i < this.sticks.length; i++)
        {
          this.sticks[i].sc(env); 
        }
        for(i = 0; i < this.joints.length; i++)
        {
          this.joints[i].sc(); 
        }
      }
    }
    this.setForce = function(force)
    {
      var i; 
      
      for(i = 0; i < this.pointMasses.length; i++)
      {
        this.pointMasses[i].setForce(force); 
      }
      this.middlePointMass.setForce(force); 
    }
    this.addForce = function(force)
    {
      var i; 
      
      for(i = 0; i < this.pointMasses.length; i++)
      {
        this.pointMasses[i].addForce(force); 
      }
      this.middlePointMass.addForce(force); 
      this.pointMasses[0].addForce(force); 
      this.pointMasses[0].addForce(force); 
      this.pointMasses[0].addForce(force); 
      this.pointMasses[0].addForce(force); 
    }
    this.moveTo = function(x, y)
    {
      var i, blobPos; 
      
      blobPos = this.middlePointMass.getPos(); 
      x -= blobPos.getX(x); 
      y -= blobPos.getY(y); 

      for(i = 0; i < this.pointMasses.length; i++)
      {
        blobPos = this.pointMasses[i].getPos(); 
        blobPos.addX(x); 
        blobPos.addY(y); 
      }
      blobPos = this.middlePointMass.getPos(); 
      blobPos.addX(x); 
      blobPos.addY(y); 
    }
    this.setSelected = function(selected)
    {
      this.selected = selected; 
    }
    
		this.drawEars = function(ctx, scaleFactor) {
			ctx.strokeStyle = "#000000"; 
			ctx.fillStyle = "#FFFFFF"; 
//			ctx.strokeStyle = "#FFFFFF"; 
//			ctx.fillStyle = "#000000"; 
			ctx.lineWidth = 2; 

			ctx.beginPath(); 
			ctx.moveTo((-0.55 * this.radius) * scaleFactor, (-0.35 * this.radius) * scaleFactor);
			ctx.lineTo((-0.52 * this.radius) * scaleFactor, (-0.55 * this.radius) * scaleFactor);
			ctx.lineTo((-0.45 * this.radius) * scaleFactor, (-0.40 * this.radius) * scaleFactor);
			ctx.fill(); 
			ctx.stroke(); 
      
			ctx.beginPath(); 
			ctx.moveTo((0.55 * this.radius) * scaleFactor, (-0.35 * this.radius) * scaleFactor);
			ctx.lineTo((0.52 * this.radius) * scaleFactor, (-0.55 * this.radius) * scaleFactor);
			ctx.lineTo((0.45 * this.radius) * scaleFactor, (-0.40 * this.radius) * scaleFactor);
			ctx.fill(); 
			ctx.stroke(); 
			}
    
		this.drawHappyEyes1 = function(ctx, scaleFactor) {      
			ctx.lineWidth = 1; 
			ctx.fillStyle = "#FFFFFF";
			ctx.beginPath(); 
			ctx.arc((-0.15 * this.radius) * scaleFactor, 
				(-0.20 * this.radius) * scaleFactor, 
				this.radius * 0.12 * scaleFactor, 0, 2.0 * Math.PI, false);
			ctx.fill(); 
			ctx.stroke();  

			ctx.beginPath(); 
			ctx.arc(( 0.15 * this.radius) * scaleFactor, 
			(-0.20 * this.radius) * scaleFactor, 
				this.radius * 0.12 * scaleFactor, 0, 2.0 * Math.PI, false);
			ctx.fill(); 
			ctx.stroke();          

			ctx.fillStyle = "#000000";
			ctx.beginPath(); 
			ctx.arc((-0.15 * this.radius) * scaleFactor, 
				(-0.17 * this.radius) * scaleFactor, 
				this.radius * 0.06 * scaleFactor, 0, 2.0 * Math.PI, false);
			ctx.fill();  

			ctx.beginPath(); 
			ctx.arc(( 0.15 * this.radius) * scaleFactor, 
				(-0.17 * this.radius) * scaleFactor, 
				this.radius * 0.06 * scaleFactor, 0, 2.0 * Math.PI, false);
			ctx.fill();  
			}
		this.drawHappyEyes2 = function(ctx, scaleFactor) {      
      ctx.lineWidth = 1; 
      ctx.fillStyle = "#FFFFFF";
      ctx.beginPath(); 
      ctx.arc((-0.15 * this.radius) * scaleFactor, 
              (-0.20 * this.radius) * scaleFactor, 
              this.radius * 0.12 * scaleFactor, 0, 2.0 * Math.PI, false);
      ctx.stroke();  

      ctx.beginPath(); 
      ctx.arc(( 0.15 * this.radius) * scaleFactor, 
              (-0.20 * this.radius) * scaleFactor, 
              this.radius * 0.12 * scaleFactor, 0, 2.0 * Math.PI, false);
      ctx.stroke();          

      ctx.lineWidth = 1;       
      ctx.beginPath(); 
      ctx.moveTo((-0.25   * this.radius) * scaleFactor, 
                 (-0.20 * this.radius) * scaleFactor); 
      ctx.lineTo((-0.05 * this.radius) * scaleFactor, 
                 (-0.20 * this.radius) * scaleFactor); 
      ctx.stroke();  

      ctx.beginPath(); 
      ctx.moveTo(( 0.25   * this.radius) * scaleFactor, 
                 (-0.20 * this.radius) * scaleFactor); 
      ctx.lineTo(( 0.05 * this.radius) * scaleFactor, 
                 (-0.20 * this.radius) * scaleFactor); 
      ctx.stroke();  
			}


		this.drawHappyFace1 = function(ctx, scaleFactor) {      
			ctx.lineWidth = 2; 
//			ctx.strokeStyle = "#000000";
//			ctx.fillStyle = "#000000";
			ctx.strokeStyle = "black";
			ctx.fillStyle = "black";
			ctx.beginPath(); 
			ctx.arc(0.0, 0.0, 
				this.radius * 0.25 * scaleFactor, 0, Math.PI, false);
			ctx.stroke();
			}

		this.drawHappyFace2 = function(ctx, scaleFactor) {      
			ctx.lineWidth = 2; 
			ctx.strokeStyle = "#000000";
			ctx.fillStyle = "#000000";
			ctx.beginPath(); 
			ctx.arc(0.0, 0.0, 
        			this.radius * 0.25 * scaleFactor, 0, Math.PI, false);
			ctx.fill();  
			}
		this.drawOohFace = function(ctx, scaleFactor) {
			ctx.lineWidth = 2; 
			ctx.strokeStyle = "#000000";
			ctx.fillStyle = "#000000";
			ctx.beginPath(); 
			ctx.arc(0.0, (0.1 * this.radius) * scaleFactor, 
				this.radius * 0.25 * scaleFactor, 0, Math.PI, false);
			ctx.fill();  

			ctx.beginPath();

			ctx.moveTo((-0.25 * this.radius) * scaleFactor, (-0.3 * this.radius) * scaleFactor);
			ctx.lineTo((-0.05 * this.radius) * scaleFactor, (-0.2 * this.radius) * scaleFactor);
			ctx.lineTo((-0.25 * this.radius) * scaleFactor, (-0.1 * this.radius) * scaleFactor);

			ctx.moveTo((0.25 * this.radius) * scaleFactor, (-0.3 * this.radius) * scaleFactor);
			ctx.lineTo((0.05 * this.radius) * scaleFactor, (-0.2 * this.radius) * scaleFactor);
			ctx.lineTo((0.25 * this.radius) * scaleFactor, (-0.1 * this.radius) * scaleFactor);

			ctx.stroke();           
			} 

		this.drawFace = function(ctx, scaleFactor) {
			if(this.drawFaceStyle == 1 && Math.random() < 0.05) {
				this.drawFaceStyle = 2; 
				}
			else if(this.drawFaceStyle == 2 && Math.random() < 0.1) {
				this.drawFaceStyle = 1; 
				}

			if(this.drawEyeStyle == 1 && Math.random() < 0.025) {
				this.drawEyeStyle = 2; 
				}
			else if(this.drawEyeStyle == 2 && Math.random() < 0.3) {
				this.drawEyeStyle = 1; 
				}
                  
      if(this.middlePointMass.getVelocity() > 0.004)
      {    
        this.drawOohFace(ctx, scaleFactor);     
      }
      else 
      {
        if(this.drawFaceStyle == 1)
        {
          this.drawHappyFace1(ctx, scaleFactor, 0.0, -0.3);     
        }
        else 
        {
          this.drawHappyFace2(ctx, scaleFactor, 0.0, -0.3);     
        }
        
        if(this.drawEyeStyle == 1)
        {
          this.drawHappyEyes1(ctx, scaleFactor, 0.0, -0.3);     
        }
        else 
        {
          this.drawHappyEyes2(ctx, scaleFactor, 0.0, -0.3);     
        }
      }
    }
    this.getPointMass = function(index)
    {
      index += this.pointMasses.length; 
      index = index % this.pointMasses.length; 
      return this.pointMasses[index]; 
    }


		this.drawBody = function(ctx, scaleFactor) {
			var i; 

var colors = 
`blue
red
blue
white
white
wheat
burlywood
linen
darkslategray
yellow
pink
orange
red
blue
red
blue
green
brown`.split("\n");
			href=window.location.href;
			color=""; color_selected="";
//			alert( "BUGS_850 kolists_blobs="+kolists['blobs'] );
//			alert( "BUGS_800 ka1 href="+href+" color="+color+" selected="+color_selected );

			blobs=kolists['blobs'].split("\n");
			blobs_len=blobs.length;
//			alert( "BUGS_855 blobs_len="+blobs_len );

			for( j=0; j< blobs_len; j++ ) {
				if( blobs[j] == "" ) { continue; }
				if( /^#/.test(blobs[j] )) { continue; }
				if( /\n/.test(blobs[j] )) { continue; }
//				alert( "BUGS_860 blobs j="+j+" blobs="+blobs[j] );
				blob=blobs[j].split("|");
				id=blob[0];
				color=blob[1];
				color_selected=blob[2];
				color_stroke=blob[3];
				linewidth=blob[4];
				src_img=blob[5];
//				url=blob[6];
//				alert( "BUGS_870 j="+j+" id="+id+" color="+color+" color_selected="+color_selected+" linewidth="+linewidth );

//				if(filecheck(src)) {
//					img=new Image();
//					img.onload = function() {ctx.drawImage(img, 0,0); }
//					alert(  "BUGS_810 id="+id+" color="+color );
//					}

//				if( testid == id ) { 
//				if( /ka1/.test(href)) {
//				re=/id/;
//				href=window.location.href;
//				alert( "BUGS_881 blob FIND id -="+id+"=- match -="+match+"=- color="+color+" color_stroke="+color_stroke );
//				if( /id/.test(match)) { 
				match="ka21";
//				var str = "Hello world!";
//				var patt = /Hello/g;
				var str = id;
				var patt = /id/g;
				var result = patt.test(str);
//				if( patt.test(str)) { }
//				if( result == true ) { }
//				var id = geturlparam('id','3');
//				alert( "BUGS_881 BLOBID blobid="+blobid+" id="+id );
//				if( j==5 ) {
//					alert( "BUGS_882 __MATCH str="+str+" patt="+patt+" result="+result );


				blobid="ka12";
				blobid="ka21";
				blobid="konet";
				blobid=geturlparameter('id');
//				blobid=geturlparameter(blobid);
				if( blobid == id ) {
//					alert( "BUGS_882 __MATCH j="+j+" id="+id+" color="+color+" color_selected="+color_selected+" linewidth="+linewidth );
					break;
					}
				else {
//					alert( "BUGS_883 NOMATCH str="+str+" patt="+patt+" result="+result );
					}

//				if( id == match ) { 
//					alert( "BUGS_882 blob __MATCH id="+id+" href="+href+" color="+color+" color_stroke="+color_stroke );
//					break;
//					}
//				else {
//					alert( "BUGS_883 blob NOMATCH id="+id+" href="+href+" color="+color+" color_stroke="+color_stroke );
//					}
//				if( /id/.test(testid)) { 
//					color=blob[i].split("|")[1];
//					color_selected=blob[i].split("|")[2];
//					color_stroke=blob[i].split("|")[3];
//					linewidth=blob[i].split("|")[4];
//					alert( "BUGS_871 blob FOUND id="+id+" href="+href+" color="+color+" color_stroke="+color_stroke );
//					break;
//					}

//				alert( "BUGS_880 id="+id+" color="+color+" img="+img );
				}


//			if( color=="" ) {
//				alert( "BUGS_859 href="+window.location.href+" color="+color+" selected="+color_selected );
//				color=colors[0];
//				color_selected=colors[1];
//				color="blue";
//				}
//			alert( "BUGS_860 href="+href+" color="+color+" selected="+color_selected );

//			var color = colors[random_int(0,colors.length-1)]

      
//			ctx.strokeStyle = "white"; 
//			ctx.strokeStyle = "black`"; 
//			ctx.strokeStyle = "#000000"; 
			ctx.strokeStyle = color_stroke;
			if(this.selected == true) {
//				ctx.fillStyle = "#FFCCCC"; 
//				ctx.fillStyle = color; 
//				ctx.fillStyle = "red"; 
				ctx.fillStyle = color_selected; 
				}
			else {
//				ctx.fillStyle = "#FFFFFF"; 
//				ctx.fillStyle = "red"; 
//				ctx.fillText('blob',10,10);
//				ctx.fillStyle = "blue"; 
				ctx.fillStyle = color; 
				}
//			ctx.lineWidth = 5; 
//			ctx.lineWidth = 5; 
			ctx.lineWidth = linewidth;
			ctx.beginPath(); 
			ctx.moveTo(this.pointMasses[0].getXPos() * scaleFactor, 
			this.pointMasses[0].getYPos() * scaleFactor); 

			for(i = 0; i < this.pointMasses.length; i++) {
				var px, py, nx, ny, tx, ty, cx, cy; 
				var prevPointMass, currentPointMass, nextPointMass, nextNextPointMass;
        
				prevPointMass = this.getPointMass(i - 1); 
				currentPointMass = this.pointMasses[i]; 
				nextPointMass = this.getPointMass(i + 1);   
				nextNextPointMass = this.getPointMass(i + 2);   
        
				tx = nextPointMass.getXPos(); 
				ty = nextPointMass.getYPos(); 
        
				cx = currentPointMass.getXPos(); 
				cy = currentPointMass.getYPos(); 

				px = cx * 0.5 + tx * 0.5; 
				py = cy * 0.5 + ty * 0.5; 
        
				nx = cx - prevPointMass.getXPos() + tx - nextNextPointMass.getXPos();         
				ny = cy - prevPointMass.getYPos() + ty - nextNextPointMass.getYPos(); 
        
				px += nx * 0.16; 
				py += ny * 0.16; 
        
				px = px * scaleFactor; 
				py = py * scaleFactor; 
        
				tx = tx * scaleFactor; 
				ty = ty * scaleFactor; 
        
				ctx.bezierCurveTo(px, py, tx, ty, tx, ty);        
				}    

		ctx.closePath(); 
		ctx.stroke(); 
		ctx.fill(); 
		}
	this.drawSimpleBody = function(ctx, scaleFactor) {
		for(i = 0; i < this.sticks.length; i++) {
			this.sticks[i].draw(ctx, scaleFactor); 
			}
		}

	this.draw = function(ctx, scaleFactor) {
		var i; 
		var up, ori, ang; 
            
		this.drawBody(ctx, scaleFactor); 

		ctx.strokeStyle = "#000000"; 
		ctx.fillStyle = "#000000"

		ctx.save(); 
		ctx.translate(this.middlePointMass.getXPos() * scaleFactor, 
			(this.middlePointMass.getYPos() - 0.35 * this.radius) * scaleFactor); 
      
		up = new Vector(0.0, -1.0); 
		ori = new Vector(0.0, 0.0); 
		ori.set(this.pointMasses[0].getPos()); 
		ori.sub(this.middlePointMass.getPos()); 
		ang = Math.acos(ori.dotProd(up) / ori.length());
		if(ori.getX() < 0.0) {
			ctx.rotate(-ang);  
			}
		else {
			ctx.rotate(ang);  
			}
      
// this.drawEars(ctx, scaleFactor); 
			this.drawFace(ctx, scaleFactor); 
			ctx.restore(); 
			}    
		}
  
	function BlobCollective(x, y, startNum, maxNum) {
		this.maxNum = maxNum;
		this.numActive = 1; 
		this.blobs = new Array(); 
		this.tmpForce = new Vector(0.0, 0.0); 
		this.selectedBlob = null; 
    
		this.blobs[0] = new Blob(x, y, 0.4, 8); 
    

		this.split = function() {
			var i, maxIndex = 0, maxRadius = 0.0;
			var emptySlot; 
			var motherBlob, newBlob;  
    
			if(this.numActive == this.maxNum) {
				return; 
				}
      
		emptySlot = this.blobs.length;
		for(i = 0; i < this.blobs.length; i++) {
			if(this.blobs[i] != null && this.blobs[i].getRadius() > maxRadius) {
				maxRadius = this.blobs[i].getRadius(); 
				motherBlob = this.blobs[i]; 
				}
		else if(this.blobs[i] == null) {
			emptySlot = i; 
			}
		}
      
		motherBlob.scale(0.75); 
		newBlob = new Blob(motherBlob.getXPos(), 
	        motherBlob.getYPos(), motherBlob.getRadius(), 8); 
        
		for(i = 0; i < this.blobs.length; i++) {
			if(this.blobs[i] == null) {
				continue; 
				}
			this.blobs[i].addBlob(newBlob); 
			newBlob.addBlob(this.blobs[i]); 
			}
		this.blobs[emptySlot] = newBlob; 
        
		this.numActive++; 
		}
    
	this.findSmallest = function(exclude) {
		var minRadius = 1000.0, minIndex; 
		var i; 
      
		for(i = 0; i < this.blobs.length; i++) {
			if(i == exclude || this.blobs[i] == null) {
				continue; 
				}
			if(this.blobs[i].getRadius() < minRadius) {
				minIndex = i; 
				minRadius = this.blobs[i].getRadius();  
				}
			}
		return minIndex; 
		}
	this.findClosest = function(exclude) {
      var minDist = 1000.0, foundIndex, dist, aXbX, aYbY;
      var i;
      var myPointMass, otherPointMass;    

      myPointMass = this.blobs[exclude].getMiddlePointMass(); 
      for(i = 0; i < this.blobs.length; i++)
      {
        if(i == exclude || this.blobs[i] == null) {
          continue; 
        }
        
        otherPointMass = this.blobs[i].getMiddlePointMass(); 
        aXbX = myPointMass.getXPos() - otherPointMass.getXPos(); 
        aYbY = myPointMass.getYPos() - otherPointMass.getYPos(); 
        dist = aXbX * aXbX + aYbY * aYbY; 
        if(dist < minDist)
        {
          minDist = dist; 
          foundIndex = i; 
        }
      }
      return foundIndex; 
    }
    this.join = function()
    {
      var blob1Index, blob2Index, blob1, blob2; 
      var r1, r2, r3; 
      
      if(this.numActive == 1)
      {
        return; 
      }
      
      blob1Index = this.findSmallest(-1); 
      blob2Index = this.findClosest(blob1Index);
      
      r1 = this.blobs[blob1Index].getRadius(); 
      r2 = this.blobs[blob2Index].getRadius(); 
      r3 = Math.sqrt(r1 * r1 + r2 * r2); 
      
      this.blobs[blob1Index] = null; 
      this.blobs[blob2Index].scale(0.945 * r3 / r2); 
      
      this.numActive--; 
    }
    
		this.selectBlob = function(x, y) {
			var i, minDist = 10000.0; 
			var otherPointMass; 
			var selectedBlob; 
			var selectOffset = null; 
      
			if(this.selectedBlob != null) { return; }
      
		for(i = 0; i < this.blobs.length; i++) {
			if(this.blobs[i] == null) { continue; }
        
			otherPointMass = this.blobs[i].getMiddlePointMass(); 
			aXbX = x - otherPointMass.getXPos(); 
			aYbY = y - otherPointMass.getYPos(); 
			dist = aXbX * aXbX + aYbY * aYbY; 
			if(dist < minDist) {
				minDist = dist; 
				if(dist < this.blobs[i].getRadius() * 0.5) {
					this.selectedBlob = this.blobs[i]; 
					selectOffset = { x : aXbX, y : aYbY };  
					}
				}
			}
      
		if(this.selectedBlob != null) {
			this.selectedBlob.setSelected(true); 
			}
		return selectOffset; 
		}

	this.unselectBlob = function() {
		if(this.selectedBlob == null) {
			return; 
			}
		this.selectedBlob.setSelected(false); 
		this.selectedBlob = null; 
		}
	this.selectedBlobMoveTo = function(x, y) {
		if(this.selectedBlob == null) {return; }
		this.selectedBlob.moveTo(x, y); 
		}
    
	this.move = function(dt) {
		var i; 
      
		for(i = 0; i < this.blobs.length; i++) {
			if(this.blobs[i] == null) {continue; }
			this.blobs[i].move(dt); 
//			if( i== 0 ) {
//				alert( "BUGS_1110 color="+this.blobs[i].color+"  i="+i+" this.blobs.length="+this.blobs.length );
//				}
			}
		}
		this.sc = function(env) {
			var i; 
			for(i = 0; i < this.blobs.length; i++) {
				if(this.blobs[i] == null) {continue; }
				this.blobs[i].sc(env); 
				}    
		if(this.blobAnchor != null) {
			this.blobAnchor.sc(); 
			}
		}


		this.setForce = function(force) {
			var i; 
			for(i = 0; i < this.blobs.length; i++) {
			if(this.blobs[i] == null) {continue; }
			if(this.blobs[i] == this.selectedBlob) {
				this.blobs[i].setForce(new Vector(0.0, 0.0)); 
				continue; 
				}
			this.blobs[i].setForce(force); 
			}
		}
	this.addForce = function(force) {
		var i; 
		for(i = 0; i < this.blobs.length; i++) {
			if(this.blobs[i] == null) {continue; }
			if(this.blobs[i] == this.selectedBlob) {continue; }
			this.tmpForce.setX(force.getX() * (Math.random() * 0.75 + 0.25)); 
			this.tmpForce.setY(force.getY() * (Math.random() * 0.75 + 0.25)); 
			this.blobs[i].addForce(this.tmpForce); 
			}
		}

	this.draw = function(ctx, scaleFactor) {
		var i; 
		for(i = 0; i < this.blobs.length; i++) {
			if(this.blobs[i] == null) {continue; }
			this.blobs[i].draw(ctx, scaleFactor); 
			}    
		}

//	this.info = function(ctx, scaleFactor) {  }
//		alert( "BUGS_1140 this.info ctx="+ctx );
//		var i; 
// var colors =
// `red
// white
// blue
// wheat
// darkslategray
// linen
//  black`;
//		for(i = 0; i < this.blobs.length; i++) {
//			if(this.blobs[i] == null) {continue; }
//			this.blobs[i].draw(ctx, scaleFactor); 
//			ctx.fillStyle=colors[i];
//			ctx.stroke(); 
//			}    
//		}

	}


		function random_int(max,min) {
			min = Math.ceil(min);
			max = Math.floor(max);
			return Math.floor(Math.random() * (max - min + 1)) + min;
			}

  function debug(msg, okFunc, cancelFunc)
  {
    if(confirm(msg) == true && okFunc != null)
    {
      okFunc(); 
    }
    else if(cancelFunc != null)
    {
      cancelFunc(); 
    }
  }

  var env; 
  var width = 600.0; 
  var height = 400.0; 
  var scaleFactor = 200.0; 
  var blobColl; 
  var gravity; 
  var stopped; 
  var savedMouseCoords = null; 
  var selectOffset = null; 

  function update()
  {
    var dt = 0.05; 
    
    if(savedMouseCoords != null && selectOffset != null)
    {
      blobColl.selectedBlobMoveTo(savedMouseCoords.x - selectOffset.x, 
        savedMouseCoords.y - selectOffset.y); 
    }
    
    blobColl.move(dt); 
    blobColl.sc(env); 
    blobColl.setForce(gravity); 
  }

		function draw() {
//			var canvas = document.getElementById('blob');
//			var canvas = document.getElementById('canvas_blob_w');
			var canvas = document.getElementById('canvas_blob');
			if(canvas.getContext == null) {return; }
     
			var ctx = canvas.getContext('2d');
			ctx.clearRect(0, 0, width, height); 
    
			env.draw(ctx, scaleFactor); 
			blobColl.draw(ctx, scaleFactor); 
			}
  
		function timeout() {
			draw(); 
			update(); 
        
			if(stopped == false) {
				setTimeout('timeout()', 30); 
				}
			}
  
		function init() {  
//			var canvas = document.getElementById('blob');
			var canvas = document.getElementById('canvas_blob');
			if(canvas.getContext == null) {
				alert("ALERT_100 unauthorized access logged"); 
				return; 
				}

			document.onkeydown = function(event) {
				var keyCode; 
      
//				alert( "BUGS_701 document.onkeydown event="+event );
				if(event == null) {
					keyCode = window.event.keyCode; 
					}
				else {
					keyCode = event.keyCode; 
					}

				if( keypress(event)){ return; }
//				alert( "BUGS_701 document.onkeydown keypress event="+event );

//				if( event.which === 89 && event.ctrlKey ) {
//				if( keyCode === 89 && event.ctrlKey ) {
//					alert('MSG_89-ctrl-y control + y'); 
//					}
//				else if( keyCode === 90 && event.ctrlKey ) {
//					alert('MSG_90-ctrl-z control + z'); 
//					}  

				switch(keyCode) {
// esc					
					case 27: alert( "MSG_027 esc keycode="+keyCode ); break;
// slash
					case 191: alert( "MSG_191 slash keycode="+keyCode ); break;
// colon
// hat
// dollar
// plus
// minus
					case 59: alert( "MSG_191 colon keycode="+keyCode ); break;
					case 54: alert( "MSG_54 hat keycode="+keyCode ); break;
					case 52: alert( "MSG_191 dollar keycode="+keyCode ); break;
					case 107: alert( "MSG_107 plus keycode="+keyCode ); break;
					case 109: alert( "MSG_109 minus keycode="+keyCode ); break;

// shift
// control
// winkey
// alt
// tab
// caps
// space
// enter
//					case 16: alert( "MSG_16 shift keycode="+keyCode ); break;
//					case 17: alert( "MSG_17 control keycode="+keyCode ); break;
//					case 224: alert( "MSG_224 meta keycode="+keyCode ); break;
//					case 18: alert( "MSG_18 alt keycode="+keyCode ); break;
//					case 9: alert( "MSG_9 tab keycode="+keyCode ); break;
//					case 20: alert( "MSG_191 caps keycode="+keyCode ); break;
//					case 32: alert( "MSG_32 space keycode="+keyCode ); break;
					case 13: alert( "MSG_13 enter keycode="+keyCode ); break;

					case 224: break;
					case 18: break;
					case 9: break;
					case 20: break;
					case 32: break;
					case 13: break;


// 0
// 9
					case 48: alert( "MSG_48 0 keycode="+keyCode ); break;
					case 49: alert( "MSG_49 1 keycode="+keyCode ); break;
					case 50: alert( "MSG_50 2 keycode="+keyCode ); break;
					case 51: alert( "MSG_51 3 keycode="+keyCode ); break;
					case 52: alert( "MSG_52 4 keycode="+keyCode ); break;
					case 53: alert( "MSG_53 5 keycode="+keyCode ); break;
					case 54: alert( "MSG_54 6 keycode="+keyCode ); break;
					case 55: alert( "MSG_55 7 keycode="+keyCode ); break;
					case 56: alert( "MSG_56 8 keycode="+keyCode ); break;
					case 57: alert( "MSG_57 9 keycode="+keyCode ); break;

// backtick
// backslash
// tick
// qoute
//					case 57: alert( "MSG_57 quote keycode="+keyCode ); break;
// question
					case 192: alert( "MSG_192 backtick keycode="+keyCode ); break;
					case 220: alert( "MSG_220 backslash keycode="+keyCode ); break;
					case 222: alert( "MSG_222 tick keycode="+keyCode ); break;
					case 191: alert( "MSG_57 question keycode="+keyCode ); break;

	
// left 
					case 37: 
						if( blob_arrowkeys != "" ) {
							blobColl.addForce(new Vector(-50.0, 0.0)); 
							}
						break; 
         
// up 
					case 38: 
						if( blob_arrowkeys != "" ) {
							blobColl.addForce(new Vector(0.0, -50.0)); 
							}
						break; 
          
// right 
					case 39: 
						if( blob_arrowkeys != "" ) {
							blobColl.addForce(new Vector(50.0, 0.0)); 
							}
						break; 
        
// down
					case 40: 
						if( blob_arrowkeys != "" ) {
							blobColl.addForce(new Vector(0.0, 50.0)); 
							}
						break; 
          
// join 'j' 
					case 74:
						blobColl.join(); 
						break;  
        
// split 'h'
					case 72: 
						blobColl.split(); 
						break; 
          
// toggle gravity 'g'
					case 71: 
						toggleGravity(); 
						break; 

					default: 
						break; 
					} 
				}
    
		function getMouseCoords(event) {
			if(event == null) {event = window.event; }
			if(event == null) {return null; }
			if(event.pageX || event.pageY){
				return {x:event.pageX / scaleFactor, y:event.pageY / scaleFactor};
				}
			return null;
			}

		document.onmousedown = function(event) {
			var mouseCoords; 
			if(stopped == true) {return; }
			mouseCoords = getMouseCoords(event); 
			if(mouseCoords == null) {return; }
			selectOffset = blobColl.selectBlob(mouseCoords.x, mouseCoords.y);         
			}
		document.onmouseup = function(event) {
			blobColl.unselectBlob(); 
			savedMouseCoords = null; 
			selectOffset = null; 
			}
		document.onmousemove = function(event) {
			var mouseCoords; 
			if(stopped == true) {return; }
			if(selectOffset == null) {return; }
			mouseCoords = getMouseCoords(event); 
			if(mouseCoords == null) {return; }
			blobColl.selectedBlobMoveTo(mouseCoords.x - selectOffset.x, mouseCoords.y - selectOffset.y); 
			savedMouseCoords = mouseCoords; 
			}
    
			env = new Environment(0.2, 0.2, 2.6, 1.6); 
			blobColl = new BlobCollective(1.0, 1.0, 1, 200); 
			gravity = new Vector(0.0, 10.0); 
			stopped = false; 
			timeout(); 
			}

			function stop() {
				stopped = true; 
				}
			function start() {
				stopped = false; 
				timeout(); 
				}

			function togglestart() {
				if( stopped == true ) {
					stopped = false; 
					timeout(); 
					if( document.getElementById('img_blob_togglestart')) {
						document.getElementById('img_blob_togglestart').src="/imgs/btn/kow.png";
						}
					}
				else {
					stopped = true;
					if( document.getElementById('img_blob_togglestart')) {
						document.getElementById('img_blob_togglestart').src="/imgs/btn/kob.png";
						}
					}
				}


		function toggleGravity() {
			if(gravity.getY() > 0.0) {
				gravity.setY(0.0); 
//				alert( "BUGS_121 img_blob_togglegravity" );
				if( document.getElementById('img_blob_togglegravity')) {
//					alert( "BUGS_122 img_blob_togglegravity" );
					document.getElementById('img_blob_togglegravity').src="/imgs/btn/blob_gravity_off.gif";
					}
				}
			else {
				gravity.setY(10.0); 
				if( document.getElementById('img_blob_togglegravity')) {
//					alert( "BUGS_132 img_blob_togglegravity" );
					document.getElementById('img_blob_togglegravity').src="/imgs/btn/blob_gravity_on.gif";
					}
				blobColl.split();
				}
			}
		</script>

	<script id="script_geturlvars" >
//		var number = geturlvars()["x"];
//		var mytext = geturlvars()["text"];
//		var mytext = geturlparam('text','Empty');
		function geturlvars() {
			var vars = {};
			var parts = window.location.href.replace(/[?&]+([^=&]+)=([^&]*)/gi, function(m,key,value) {
				vars[key] = value;
				});
			return vars;
			}

		<script id="script_geturlparam" >
			function geturlparam(parameter, defaultvalue){
				var urlparameter = defaultvalue;
				if(window.location.href.indexOf(parameter) > -1) {
					urlparameter = getUrlVars()[parameter];
					}
				return urlparameter;
				}
//			var mytext = getUrlParam('text','Empty');
			</script>


	<script id="script_keypress" >
		function keypress(e) {
// Ensure event is not null
			e = e || window.event;
			if ((e.which == 90 || e.keyCode == 90) && e.ctrlKey) {alert( "MSG_090 keypress  ctrl-z" );
				return('ctrl-z');
				}
			if ((e.which == 89 || e.keyCode == 89) && e.ctrlKey) {alert( "MSG_089 keypress  ctrl-y" );
				return('ctrl-y');
				}
			if ((e.which == 54 || e.keyCode == 54) && e.ctrlKey) {
				alert( "MSG_054 keypress  ctrl-hat" );
				return('ctrl-hat');
				}
			if ((e.which == 54 || e.keyCode == 54) && e.shiftKey) {
				alert( "MSG_054 keypress  shift-hat" );
				return('shift-hat');
				}
			if ((e.which == 60 || e.keyCode == 60) && e.shiftKey) {
				alert( "MSG_090 keypress dollar shift-4" );
				}

// case 59: alert( "MSG_191 colon keycode="+keyCode ); break;
// case 54: alert( "MSG_54 hat keycode="+keyCode ); break;
// case 52: alert( "MSG_191 dollar keycode="+keyCode ); break;
// case 107: alert( "MSG_107 plus keycode="+keyCode ); break;
// case 109: alert( "MSG_109 minus keycode="+keyCode ); break;
			}
		</script>


	<script id="script_trigger" >
// A handler called preventDefault.
// None of the handlers called preventDefault.
	
		function trigger_mouse(args) {
			alert( "BUGS_901 trigger _mouse args="+args );
			var event = new MouseEvent('click', {
				view: window,
				bubbles: true,
				cancelable: true
				});

			if(document.getElementById('checkbox')) {
				var cb = document.getElementById('checkbox'); 
				var cancelled = !cb.dispatchEvent(event);
				if (cancelled) {alert("cancelled");} 
				else {alert("not cancelled");}
				}
			}
		</script>

	<style type="text/css">
		canvas { }
		</style>

	<script id="script_startup_blob">
		function startup_blob(args) {
			init();
			blobColl.split();
			blobColl.split();
			return('');
			}
		</script>


	<script id="script_trigger" >
		function trigger(key) {
//			alert( "BUGS_801 trigger key="+key );
			var trigger_char = "Q";
			var trigger_key = "q";
			var trigger_keycode = "81";
			if( key == 'h') { blobColl.split(); return(''); }
			if( key == 'g') { toggleGravity(); return(''); }
			if( key == 'j') { blobColl.join(); return(''); }
			if( key == '<') { blobColl.move(); return(''); }
			if( key == '>') { blobColl.move(); return(''); }

			if( key == 'q') { trigger_char="Q"; trigger_key="q"; trigger_keycode="81"; }
			if( key == 'h') { trigger_char="H"; trigger_key="h"; trigger_keycode="72"; }
			if( key == 'j') { trigger_char="J"; trigger_key="j"; trigger_keycode="74"; }
			if( key == 'g') { trigger_char="G"; trigger_key="g"; trigger_keycode="71"; }

//			alert( "BUGS_802 triger key="+key+" trigger_char="+trigger_char+" keycode="+trigger_keycode );
//			char : "Q",
//			key : "q",
//			keyCode : 81
////			var e = new KeyboardEvent("keydown", {
			var e = new KeyboardEvent("keyPress", {
				bubbles : true,
				cancelable : true,
				key : trigger_key,
				char : trigger_char,
				shiftKey : true,
				keyCode : trigger_keycode
				});
			alert( "BUGS_803 trigger key="+key );
			}
		function simulateKeyEvent(character) {
			var evt = document.createEvent("KeyboardEvent");
			(evt.initKeyEvent || evt.initKeyboardEvent)("keypress", true, true, window,
				0, 0, 0, 0,
				0, character.charCodeAt(0)) 
			var canceled = !body.dispatchEvent(evt);
// A handler called preventDefault
    // None of the handlers called preventDefault
			if(canceled) {
				alert("canceled");
				} 
			else {
				alert("not canceled");
				}
			}

		function simulateKeyPress(character) {
			jQuery.event.trigger({ type : 'keypress', which : character.charCodeAt(0) });
			}

		</script>

	<script id="script_replace_key" type="text/javascript">
		function replace(e) {
			if (e.keyCode==13) e.keyCode=9
			}
		</script>

	<script id="script_" >
		function geturlparameter(name) {
			return decodeURIComponent((new RegExp('[?|&]' + name + '=' + '([^&;]+?)(&|#|;|$)').exec(location.search) || [null, ''])[1].replace(/\+/g, '%20')) || null;
			}
		</script>

<!--	</head> -->
<!-- <body bgcolor=wheat onload="init();"> -->
<!-- <body bgcolor=wheat onload="startup_blob();return false;"> -->


	<div id="div_blob">
		<h3>blobsallad</h3>
		<hr color=white>
		<canvas id="canvas_blob" width="600" height="400"></canvas><br>
<!--		<canvas id="canvas_blobs" width="600" height="400"></canvas><br> -->
<!--		<canvas id="canvas_blob" width="800" height="400" onclick="window.open('/blob.html');return false;"></canvas><br> -->
		<hr color=white>


<!--		<img src="/imgs/btn/koeyeb.png" onclick="stop();return false;" height=30> -->
<!--		<img src="/imgs/btn/koeyew.png" onclick="start();return false;" height=30> -->
<!-- -= start =- -= stop =- -->
		<br>
		<hr color=whtie>
		<img id="img_blob_togglestart" src="/imgs/btn/kow.png" onclick="togglestart();return false;" height=30>
		&nbsp &nbsp &nbsp &nbsp
		<img id="img_blob_arrowkeys_toggle" src="/imgs/btn/kob.png" onclick="blob_arrowkeys_toggle('');return false;" height=25>
		&nbsp &nbsp &nbsp &nbsp
		<img id="img_blob_split" src="/imgs/btn/koeye_split.png" onclick="blobColl.split();return false;" height=30>
		&nbsp &nbsp
<!--
		<img id="img_blob_togglegravity" src="/imgs/btn/koeyew_gravity.png" onclick="toggleGravity();return false;" 
			height=30>
			-->
		<img id="img_blob_togglegravity" src="/imgs/btn/blob_gravity_on.gif" 
			onclick="toggleGravity();return false;" 
			height=100>
<!--
		<img id="img_blob_togglegravity" src="/imgs/btn/blob_gravity_off.gif" 
			onclick="toggleGravity();return false;" 
			height=30>
	-->

		&nbsp &nbsp
		<img id="img_blob_join" src="/imgs/btn/koeye_join.png" onclick="blobColl.join();return false;" height=30>
		&nbsp &nbsp
<!--
		<button onclick="document.getElementById('audio_sound').play();">
			giggle
			</button>	
	-->
		&nbsp &nbsp
<!-- -= + =- -= = =- -= - =- -->
		<hr color=white>
		<br>
		<img id="img_blob1" src="/imgs/btn/koeye_space.png" 
			onclick="blobColl.addForce( new Vector(0.0,-50.0));return false;" 
			onmouseover="blob_mouseover('1');return false"
			height=30>
		<img id="img_blob2 "src="/imgs/btn/koeye_up.png" 
			onclick="blobColl.addForce( new Vector(0.0,-50.0));return false;" 
			onmouseover="blob_mouseover('2');return false"
			height=30>
		<img id="img_blob3" src="/imgs/btn/koeye_space.png" 
			onclick="blobColl.addForce( new Vector(0.0,-50.0));return false;" 
			onmouseover="blob_mouseover('3');return false"
			height=30>
		<br>
		<img id="img_blob4" src="/imgs/btn/koeye_left.png" 
			onclick="blobColl.addForce( new Vector(-50.0,0.0));return false;" 
			onmouseover="blob_mouseover('4');return false"
			height=30>
		<img id="img_blob5" src="/imgs/btn/koeye_space.png" 
			onclick="blob_info('');return false;" 
			onmouseover="blob_mouseover('5');return false"
			height=30>
		<img id="img_blob6" src="/imgs/btn/koeye_right.png" 
			onclick="blobColl.addForce( new Vector(50.0,0.0));return false;" 
			onmouseover="blob_mouseover('6');return false"
			height=30>
		<br>
		<img id="img_blob7" src="/imgs/btn/koeye_space.png" 
			onclick="blobColl.addForce( new Vector(0.0,50.0));return false;" 
			onmouseover="blob_mouseover('7');return false"
			height=30>
		<img id="img_blob8" src="/imgs/btn/koeye_down.png" 
			onclick="blobColl.addForce( new Vector(0.0,50.0));return false;" 
			onmouseover="blob_mouseover('8');return false"
			height=30>
		<img id="img_blob9" src="/imgs/btn/koeye_space.png" 
			onclick="blobColl.addForce( new Vector(0.0,50.0));return false;" 
			onmouseover="blob_mouseover('9');return false"
			height=30>
<!-- -= l =- -= u =- -= d =- -= r =- -->
		<hr color=white>
<br>

		<img id="img_blob0" src="/imgs/btn/kob.png" onclick="blob_mouseover('0');return false;" height=25>

		<script id="script_blob_arrowkeys_toggle">
			var blob_arrowkeys="";
			function blob_arrowkeys_toggle(args) {
//				alert( "BUGS_1830 args="+args );
//				alert( "BUGS_1834 blob_arrowkeys="+blob_arrowkeys );
				if( document.getElementById('img_blob_arrowkeys_toggle')) {
					if( blob_arrowkeys == "on" ) {
						blob_arrowkeys = "";
						document.getElementById('img_blob_arrowkeys_toggle').src='/imgs/btn/kob.png';
//						alert( "BUGS_1841 blob_arrowkeys="+blob_arrowkeys );
						}
					else {
						blob_arrowkeys = "on";
						document.getElementById('img_blob_arrowkeys_toggle').src='/imgs/btn/kow.png';
//						alert( "BUGS_1842 blob_arrowkeys="+blob_arrowkeys );
						}
					}
				}
			</script>




		<script id="script_blob_audiocontrols_toggle">
			var blob_audiocontrols="";
			function blob_audiocontrols_toggle(args) {
//				alert( "BUGS_1830 args="+args );
//				alert( "BUGS_1834 blob_audiocontrols="+blob_audiocontrols );
				if( document.getElementById('img_blob_audiocontrols_toggle')) {
					if( blob_audiocontrols == "on" ) {
						blob_audiocontrols = "";
						document.getElementById('img_blob_audiocontrols_toggle').src='/imgs/btn/kob.png';
						document.getElementById('blob_audio').controls='false';

//						alert( "BUGS_1841 blob_audiocontrols="+blob_audiocontrols);
						}
					else {
						blob_audiocontrols = "on";
						document.getElementById('img_blob_audiocontrols_toggle').src='/imgs/btn/kow.png';
						document.getElementById('blob_audio').controls='true';
//						alert( "BUGS_1842 blob_audiocontrols="+blob_audiocontrols );
						}
					}
				}
			</script>







		<script id="script_blob_mouseover">
			function blob_mouseover1(args) {
				alert( "BUGS_499 blob_mouseover" );
				}
			function blob_mouseover(args) {
				var id=args;
				var img_id="img_blob"+id;
				if( id==0 ) {alert( "BUGS_500 blob_mouseover_0 img_id="+img_id ); }
//				alert( "BUGS_500 blob_info img_id="+img_id );
//				var src = document.getElemntById('img_blob0').src;
//				alert( "BUGS_501 blob_info src="+src );
////				if( document.getElementById(img_id)) {
//					alert( "BUGS_500 blob_info img_id="+img_id );
//					alert( "BUGS_501 blob_info divcheck img_id="+img_id );
//					document.getElementById(img_id).src="/imgs/btn/koeye_handhither.gif"";
//					}
				return(args);
				}
			</script>

		<script id="script_blob_info">
			function blob_info(args) {
				alert( "BUGS_500 blob_info args="+args );
//    				blobColl = new BlobCollective(1.0, 1.0, 1, 200); 
//				blobColl.split();
//				var blob_len = blobColl.length;
//				alert( "BUGS_501 blob_info blob_len="+blob_len );
//				alert( "BUGS_501 blobcoll0="+blobcoll[0] );
				}
			</script>
		</div>

		<br><br><br><br>
		<hr color=black>
		<hr color=white>
		<img id="img_blob_mute" src="/imgs/sound/ringworm_1.gif" 
			onclick="blob_mute('btn_soundwave_00');return false;" 
			onmouseover="blob_mute('btn_soundwave_00');return false;" 
			height=30 width=60>
		<hr color=white>
		<img id="img_blob_audiocontrols_toggle" src="/imgs/btn/kob.png" onclick="blob_audiocontrols_toggle('');return false;" height=25>
		&nbsp &nbsp &nbsp &nbsp
		<hr color=black>
		<img id="img_blob_sound" hidden src="/imgs/imgs_jukebox/record_04.gif"  
			onclick="blob_sound('img_record_04');return false;" 
			height=200>
		<br>
<!--
		<img id="img_blob_sound_ringworm" hidden src="/imgs/sound/ringworm_1.gif"  
			onclick="blob_sound('img_sound_ringworm_1');return false;" 
			height=200>
		-->
		<br>
		<hr color=black>
		<hr color=white>
		<hr color=black>
		<div id="div_blob_playlist" hidden>
			<h1>div_blob_playlist</h1>
			</div>
<!--		
		<img id="img_blob_sound" hidden src="/imgs/gif/spacers/giphy_spacer_22.gif"  
		<img id="img_blob_sound" hidden src="/imgs/gif/kali/kalid1.gif"  
		<img id="img_blob_sound" hidden src="/imgs/gif/orbs/godotss.gif"  
		<img id="img_blob_sound" hidden src="/imgs/gif/orbs/kali20.gif"  
		<img id="img_blob_sound" hidden src="/imgs/gif/orbs/orbcryst_alpulse.gif"  
		<img id="img_blob_sound" hidden src="/imgs/gif/orbs/ringcube.gif"  
	-->
<!--		
		<img id="img_blob_sound" hidden src="/imgs/sound/btn_sound.png"  
			onclick="blob_sound('koeyeb_sound');return false;" 
			height=30>
	-->

		<audio id="audio_sound" src="/gm/sounds/bubbles.mp3" preload="auto" muted="true">
			</audio>
		<input id="input_volume" hidden type="range" min="0" max="100" step="1" 
				oninput="SetVolume(this.value);return false;" 
				onchange="SetVolume(this.value); return false;">
				</input>


		<script id="script_blob_volume">
			var audio = document.getElementById('audio');
			var volume = document.getElementById('input_volume');
			window.setInterval(changevolume(), 1);
			function SetVolume(val) {
//				alert( "BUGS_1680 SetVolume val="+val );
//				var player = document.getElementById('video');
				var player = document.getElementById('audio_sound');
//				console.log('Before: ' + player.volume);
				player.volume = val / 100;
//				console.log('After: ' + player.volume);
				}
			function changevolume() {
	 			var x = volume.value;
				var y = x / 100;
	 			audio.volume = y;
				}
			</script>






<!--
	<form id="form_replace" >
		<input onkeydown="replace(event)" /><br /> <input />
		</form>

	<script id="script_dispatch">
		function dispatch(args) {
			document.addEventListener ('keydown', function (event) {
				console.log (event.which);
				}); 
     
			var evt = new KeyboardEvent('keydown', {'keyCode':65, 'which':65};
			document.dispatchEvent (evt);	
			}
		</script>


<!--
<html>
<head>
	-->
	<title>-= index.html 20200419_1117 avril startup_blobs =-</title>
<!--
	<title>-= index.html 20200418_1913 avril fb/stlc =-</title>
	<title>-= index.html 20200416_0900 avril blob.html =-</title>
	<title>-= index.html 20200416_0900 avril /fb/law/tc /kk /k2 =-</title>
	<title>-= index.html 20200415_2400 avril /fb/law/tc/kk/ =-</title>
	<title>-= index.html 20200415_1130 avril /fb/jtfdcr/pages/jtfdc_keepout_covid_eagles.jpg  f =-</title>
	<title>-= index.html 20200414_1030 easter_passover_past todays.html jtfdcr/jtfdcr_202004  f =-</title>
	<title>-= index.html 20200412_0200 easter_passover newlink holidays.html find_jtfdcr_mp4.txt  =-</title>
	<title>-= index.html 20200412_0200 easter_passover newlink fb/birthday jak1 cw am jcm  =-</title>
	<title>-= index.html 20200411_0800 easter_passover newlink jtfdc_20200411_1538_ks.mp4  =-</title>
	<title>-= index.html 20200411_0800 easter_passover newlink alberici  =-</title>
	<title>-= index.html 20200411_0800 easter_passover newlink sk_contractor  =-</title>
	<title>-= index.html 20200411_0800 easter_passover newlink ks_contractor  =-</title>
	<title>-= index.html 20200410_0830 goodfriday_passover kogrids random_toggle bug  =-</title>
	<title>-= index.html 20200410_0830 goodfriday_passover divids bug  =-</title>
	<title>-= index.html 20200410_0000 happyeaster kogrid ??.txt =-</title>
	<title>-= index.html 20200409_1230 happyeaster kogrid toggle bgcolor wheat2#FFFDDA =-</title>
	<title>-= index.html 20200409_1230 happyeaster newlink bgcolor wheat2#FFFDDA =-</title>
	<title>-= index.html 20200409_1030 happyeaster newlink div_divs index_divid.html  =-</title>
	<title>-= index.html 20200409_1025 happyeaster newlink /fb/gov  =-</title>
	<title>-= index.html 20200408_2230 happyeaster kolist[divs]  =-</title>
	<title>-= index.html 20200408_1730 happyeaster rehab terminal/csv  =-</title>
	<title>-= index.html 20200408_0600 happyeaster rehab terminal/csv  =-</title>
	<title>-= index.html 20200404_2000 happyeaster terminal  =-</title>
	<title>-= index.html 20200404_2000 happyeaster terminal repo  =-</title>
	<title>-= index.html 20200404_2000 happyeaster canvas_anim =-</title>
	<title>-= index.html 20200404_2000 happyeaster fb2top =-</title>
	<title>-= index.html 20200404_1800 happyeaster canvas_main2top zhlink =-</title>
	<title>-= index.html 20200404_1800 happyeaster src_notfound notfound.gif =-</title>
	<title>-= index.html 20200404_1800 happyeaster pagelist_gifs =-</title>
	<title>-= index.html 20200404_1100 happyeaster yt_cycletoon =-</title>
	<title>-= index.html 20200404_0630 happyeaster jit.si/ko2us =-</title>
	<title>-= index.html 20200404_0630 happyeaster dd files csv =-</title>
	<title>-= index.html 20200403_1230 happyeaster html5rocks_files =-</title>
	<title>-= index.html 20200403_1230 happyeaster filecheck jaxurl fb.txt =-</title>
	<title>-= index.html 20200403_1200 happyeaster add fb =-</title>
	<title>-= index.html 20200402_2330 happyeaster add yokkmokk startup_canvas =-</title>
	<title>-= index.html 20200402_1323 happyeaster add kotoggle() =-</title>
	<title>-= index.html 20200402_1312 happyeaster add fblinks fb/ fb/neuz fb/gofunwii ko1.us =-</title>
	<title>-= index.html 20200402_0700 happyeaster yt spring first_of_string =-</title>
	<title>-= index.html 20200330_2140 happyeaster div_dd =-</title>
	<title>-= index.html 20200330_1900 happyeaster div_dd =-</title>
	<title>-= index.html 20200330_0700 happyeaster div_dd =-</title>
	<title>-= index.html 20200330_0700 happyeaster av/show_videobox,slow,avril,chillicothe  =-</title>
	<title>-= index.html 20200330_0700 happyeaster link cohen_slow.mp4  =-</title>
	<title>-= index.html 20200330_0700 happyeaster details medmask cycleguy crosswalkers  =-</title>
	<title>-= index.html 20200330_0700 happyeaster detail summary todo notes  =-</title>
	<title>-= index.html 20200330_0540 happyeaster detail summary =-</title>
	<title>-= index.html 20200330_0540 happyeaster style/script_mobile=-</title>
	<title>-= index.html 20200329_0200 happyeaster link chillecothe_1938.mp4 =-</title>
	<title>-= index.html 20200329_0100 happyeaster link cdc.gov =-</title>
	<title>-= index.html 20200328_2200 happyeaster giphy_eggs_03.gif chapelcrosswalkers.mp4 ko =-</title>
	<title>-= index.html 20200328_1600 happyeaster =-</title>
	<title>-= index.html 20200328_1000 /gm =-</title>
	<title>-= index.html 20200328_1000 /gm =-</title>
	<title>-= index.html 20200327_2130 /gm =-</title>
	<title>-= min.html 20200327_1800  =-</title>
	<title>-= min.html 20200326_1900  whatsup =-</title>
	<title>-= min.html 20200322_1100 =-</title>
	-->
<!--	<link rel="shortcut icon" type="image/png" href="/koeye.png"/> -->
	<link rel="shortcut icon" type="image/png" href="ko.png"/>


	<style id="style_mobile">
		
/* Style the navigation menu */
/* Hide the links inside the navigation menu (except for logo/home) */
/* Style navigation menu links */
/* Style the hamburger menu */
/* Add a grey background color on mouse-over */
/* Style the active link (or home/logo) */

		.topnav {
			overflow: hidden;
//			background-color: #333;
//			background-color: yellow;
			background-color: burlywood;
			position: relative;
			}
		.topnav #myLinks {display: none;}
		.topnav a {
//			color: white; 
//			color: linen; 
			color: black;
//			width: 250;
			background: burlywood;
			padding: 14px 16px;
			text-decoration: none;
			font-size: 17px;
			display: block;
			}
		.topnav a.icon {
//			background: black;
//			background: darkslategrey;
			background: burlybrown;
			height: 100;
			width: 200:
			display: block;
			position: absolute;
			right: 0;
			top: 0;
//			url_bgimg: "/imgs/bg/background.jpg";
//			background: url(url_bgimg);
			}
		.topnav a:hover {
//			background-color: #ddd;
//			background-color: red;
			background-color: beige;
			background-color: blanchedalmond;
			background-color: antiquewhite
			background-color: burlywood;
			color: black;
			width: 200;
			width: 400;
			}
		.active {
//			background-color: #4CAF50;
//			background-color: linen;
//			background-color: yellow;
			background-color: burlywood;
			color: black;
			} 
		</style>

	<script id="script_mobile">
/* Toggle between showing and hiding the navigation menu links when the user clicks on the hamburger menu / bar icon */
		function myFunction() {
			var x = document.getElementById("myLinks");
			if (x.style.display === "block") {
				x.style.display = "none";
				} 
			else {
				x.style.display = "block";
				}
			} 
		</script>


	<style id="style_yokkmokk" >
		@font-face {
			font-family: yokkmokkOT;
			src: url("data:font/ttf;base64,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AEMARABFAEYARwBIAEkASgBLAEwATQBOAE8AUABRAFIAUwBUAFUAVgCjAFcAWABZAJYAWgChAFsAXABdAF4AXwBgAGEAYgBjAGQAZQBmAGcAaABpAGoAawBsAG0AbgBvAHAAcQByAHMAdAB1AHYAdwB4AHkAegB7AHwAfQB+AH8AgACBAIIAgwCEAIUAhgCHAIgAiQCKAIsAjACNAI4AjwCQAJEAkgCTAJQAlQCWAJcAmACZAJoAmwANAJwAnQCeAJ8AoAChAAAAAAAQAAAAqAkIBQABAQMCAwQFAwMEAgQCBQQCAwMDAwQDAgQCAgMEAwIGAwgFBAQEBAIEBAMGBQQEBQQCAwMEBgUEAwICAgQDBgQEAgQFAgQEAgYEAwQEBAICAwMGBQQDAwMFAgICBgYGBgYGCAgEBAQCAgIFBAQEBAQEAwMDAwMEBAQEBAQHBgQEBAICAgQDAwMDAwMDAwMDCAYCAgICAgIBAgIEAgICBgUBBQUAAAoJBQABAQMCBAUGAwMFAgQCBQUCBAMDBAUDAgQCAgMEAwMHAwkGBAQFBAIEBAMHBgUEBgQCBAQEBwUEAwICAwUDBwUEAgUGAgQEAgYFAwUFBQICAwMGBQQDAwMGAwIDBwcHBwcHCQkEBAQCAgIGBQUFBQUFBAQEBAMFBQUFBQUIBwQEBAICAgUDAwMDAwQDAwMDCAcDAwICAgIBAgIEAgICBwUBBQUAAAsKBgACAgQCBAUGAwMFAgQCBgUDBAQEBAUEAwUDAgMEAwMIAwoGBQUFBQIEBQMHBgUEBgUDBAQECAYFAwIDAwUDCAUFAwUGAgQEAgcFBAUFBQMDAwMHBgUDBAQGAwIDCAgICAgICQoFBQUCAgIGBQUFBQUFBAQEBAMFBQUFBQUJCAUFBQICAgUEBAQEBAQDAwMDCQgDAwICAwIBAgIEAgICBwYBBgYAAAwLBgACAgQDBAYHBAQGAgUDBgYDBQQEBAUEAwUDAwQFBAMIAwsHBQUFBQIFBQQIBwYFBwUDBQUFCAYFAwMDAwYDCQYFAwUHAgUFAggGBAYGBgMDBAQHBgUDBAQHAwMDCAgICAgICgsFBQUCAgIHBgYGBgYGBQUFBQMGBgYGBgYJCQUFBQICAgYEBAQEBAQEBAQECggDAwMDAwIBAwMFAwMDCAYBBgYAAA0MBwACAgQDBQYHBAQGAwUDBwYDBQQFBQYEAwYDAwQFBAMJBAwIBgYGBQMFBgQJBwYFCAUDBQUFCQcFBAMDAwYECQYGAwYIAwUFAggGBQYGBgMDBAQIBwYEBAQHAwMDCQkJCQkJCwwGBgYDAwMHBgYGBgYGBQUFBQQGBgYGBgYKCQYGBgMDAwYFBQUFBQUEBAQECwkDAwMDAwIBAwMFAwMDCQcCBwcAAA4NBwACAgUDBQcIBAQHAwUDBwcDBQUFBQYFAwYDAwQFBAQKBAwIBgYGBgMGBgQJCAcGCAYDBQUGCggGBAMDBAcECgcGAwYIAwYGAwkHBQcHBwMDBAQJBwYEBQUIBAMECgoKCgoKDA0GBgYDAwMIBwcHBwcHBQUFBQQHBwcHBwcLCgYGBgMDAwcFBQUFBQUEBAQEDAoEBAMDAwMBAwMGAwMDCQcCBwcAAA8OCAACAgUDBgcIBQUHAwYDCAcDBgUFBQcFBAcEAwUGBQQLBA0JBwcHBgMGBwUKCAcGCQYEBgYGCggGBAMEBAcECwcHBAcJAwYGAwkHBQcHBwQDBQUJCAYEBQUJBAMECwsLCwsLDQ4HBwcDAwMIBwcHBwcHBgYGBgQHBwcHBwcMCwcHBwMDAwcFBQUFBQUFBQUFDQoEBAMDBAMCAwMGAwMDCggCCAgAABAPCAACAgUEBggJBQUIAwYECAgEBgUGBgcFBAcEBAUGBQQLBQ4JBwcHBwMGBwULCQgGCQcEBgYGCwkHBAQEBAgFCwgHBAcJAwcGAwoHBggIBwQEBQUKCAcEBQUJBAMECwsLCwsLDg8HBwcDAwMJCAgICAgIBgYGBgUICAgICAgNCwcHBwMDAwcGBgYGBgYFBQUFDgsEBAQEBAMCAwMGBAQECwgCCAgAABEQCQACAgYEBggJBQUIAwcECQgEBwYGBggGBAcEBAUHBQUMBQ8KBwcIBwMHCAULCggHCgcEBgYHDAkHBQQEBAgFDAgHBAgKAwcHAwsIBggICAQEBQUKCQcFBgYKBAQFDAwMDAwMDxAHCAcDAwMKCAgICAgIBgYGBgUICAgICAgNDAcHBwMDAwgGBgYGBgYFBQUFDgwFBQQEBAMCBAQHBAQECwkCCQkAABIQCQADAwYEBwkKBgYJBAcECQkEBwYGBggGBAgEBAYHBgUNBRAKCAgICAQHCAUMCgkHCwcEBwcHDQoIBQQEBQkFDQkIBAgKBAcHAwsIBgkJCAQEBQYLCQgFBgYKBQQFDQ0NDQ0NDxAICAgEBAQKCQkJCQkJBwcHBwUJCQkJCQkODQgICAQEBAgGBgYGBgYFBQUFDwwFBQQEBAMCBAQHBAQEDAkCCQkAABMRCgADAwYEBwkLBgYJBAcECgkEBwYHBwkGBAgFBAYHBgUNBhELCAgJCAQICAYNCwkICwgEBwcIDQoIBQQFBQkFDQkIBAkLBAgIBAwJBwkJCQQEBgYMCggFBgYLBQQFDQ0NDQ0NEBEICAgEBAQLCQkJCQkJBwcHBwUJCQkJCQkPDQgICAQEBAkHBwcHBwcGBgYGEA0FBQQEBQQCBAQIBAQEDQoCCgoAABQSCgADAwcEBwoLBgYKBAgECgoFCAcHBwkHBQkFBAYIBgUOBhIMCQkJCAQICQYNCwoIDAgFCAgIDgsIBgUFBQoGDgoJBQkMBAgIBA0JBwoKCQUFBgYMCgkGBwcLBQQFDg4ODg4OERIJCQkEBAQLCgoKCgoKCAgICAYKCgoKCgoQDgkJCQQEBAkHBwcHBwcGBgYGEQ4FBQUFBQQCBAQIBQUEDgoCCgoAABUTCwADAwcFCAoMBgYKBAgFCwoFCAcHBwoHBQkFBQYIBgYPBhMMCQkJCQQJCQYODAoIDAkFCAgIDwsJBgUFBQoGDwoJBQoMBAkIBA0KBwoKCgUFBgcNCwkGBwcMBQQGDw8PDw8PEhMJCQkEBAQMCgoKCgoKCAgICAYKCgoKCgoRDwkJCQQEBAoHBwcHBwcGBgYGEg4GBgUFBQQCBAQIBQUFDgsDCwsAABYUCwADAwcFCAsMBwcLBAkFCwoFCAcICAoHBQoFBQcJBwYPBhQNCgoKCQQJCgcPDAoJDQkFCAgJDwwJBgUFBgsGEAsKBQoNBAkJBA4KCAsLCgUFBwcOCwkGBwcNBgUGDw8PDw8PExQKCgoEBAQMCgoKCgoLCAgICAYLCwsLCwsREAoKCgQEBAoICAgICAgHBwcHEw8GBgUFBQQCBQUJBQUFDwsDCwsAABcVDAADAwcFCQsNBwcLBQkFDAsFCQcICAsIBQoGBQcJBwYQBxQNCgoKCgUJCgcPDQsJDQoFCQkJEAwKBgUGBgsHEAsKBQoNBQkJBA4LCAsLCwUFBwcODAoGBwgNBgUGEBAQEBAQFBUKCgoFBQUNCwsLCwsLCQkJCQcLCwsLCwsSEAoKCgUFBQsICAgICAgHBwcHFBAGBgUFBgQCBQUJBQUFEAwDDAwAABgWDAADAwgFCQwNBwcMBQkFDAsGCQgICAsIBgoGBQcJBwYRBxUOCgoLCgUKCwcQDgsKDgoGCQkKEQ0KBwUGBgsHEQwKBgsOBQoKBA8LCAwMCwYGBwgPDAoHCAgOBgUGERERERERFRYKCwoFBQUOCwsLCwsMCQkJCQcLCwsLCwsTEQoKCgUFBQsICAgICAgHBwcHFBEGBgUFBgQCBQUKBQUFEAwDDAwAAAABAV0BkAAFAAICvAKKAAAAjwK8AooAAAHFADIBAwAAAAAEAAAAAAAAAAAAAAMAAAAAAAAAAAAAAABNQUNSAEAAICIZAyH/OQAAAyEAxwAAAAEAAAAAAAAAAQAAgAAAAACLAT8AAGAAAbQCdVlva2ttb2trICAgICAgICD/////N////llPS1IwMAAAAAAAAAABAAAAAQAAmJpL9V8PPPUAAAPoAAAAALfnFZIAAAAAt+cVkv+2/zkDawMhAAAAAwACAAEAAAAAAAEAAAMh/zkAAAOQ/7b/uANrAAEAAAAAAAAAAAAAAAAAAACkAAEAAACkAJgADQAAAAAAAgAIAEAACgAAAF0AvgABAAE=");
			}

		@font-face {
			font-family: 'yokkmokkOT_file';
			src: url('/fonts/yokkmokkOT.otf'); /* IE 5-8 */ 
			src: local('?'),             /* sneakily trick IE */
		        url('/fonts/yokkmokk.ttf') format('truetype'), /* Opera, Safari */
		        url('/fonts/yokkmokkOT.woff') format('woff'),    /* FF 3.6, Chrome 5, IE9 */
		        url('/fonts/yokkmokkOT.svg#font') format('svg'); /* iOS */
			}
	
		body { 
//			background: url("data:font/ttf;base64,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AEMARABFAEYARwBIAEkASgBLAEwATQBOAE8AUABRAFIAUwBUAFUAVgCjAFcAWABZAJYAWgChAFsAXABdAF4AXwBgAGEAYgBjAGQAZQBmAGcAaABpAGoAawBsAG0AbgBvAHAAcQByAHMAdAB1AHYAdwB4AHkAegB7AHwAfQB+AH8AgACBAIIAgwCEAIUAhgCHAIgAiQCKAIsAjACNAI4AjwCQAJEAkgCTAJQAlQCWAJcAmACZAJoAmwANAJwAnQCeAJ8AoAChAAAAAAAQAAAAqAkIBQABAQMCAwQFAwMEAgQCBQQCAwMDAwQDAgQCAgMEAwIGAwgFBAQEBAIEBAMGBQQEBQQCAwMEBgUEAwICAgQDBgQEAgQFAgQEAgYEAwQEBAICAwMGBQQDAwMFAgICBgYGBgYGCAgEBAQCAgIFBAQEBAQEAwMDAwMEBAQEBAQHBgQEBAICAgQDAwMDAwMDAwMDCAYCAgICAgIBAgIEAgICBgUBBQUAAAoJBQABAQMCBAUGAwMFAgQCBQUCBAMDBAUDAgQCAgMEAwMHAwkGBAQFBAIEBAMHBgUEBgQCBAQEBwUEAwICAwUDBwUEAgUGAgQEAgYFAwUFBQICAwMGBQQDAwMGAwIDBwcHBwcHCQkEBAQCAgIGBQUFBQUFBAQEBAMFBQUFBQUIBwQEBAICAgUDAwMDAwQDAwMDCAcDAwICAgIBAgIEAgICBwUBBQUAAAsKBgACAgQCBAUGAwMFAgQCBgUDBAQEBAUEAwUDAgMEAwMIAwoGBQUFBQIEBQMHBgUEBgUDBAQECAYFAwIDAwUDCAUFAwUGAgQEAgcFBAUFBQMDAwMHBgUDBAQGAwIDCAgICAgICQoFBQUCAgIGBQUFBQUFBAQEBAMFBQUFBQUJCAUFBQICAgUEBAQEBAQDAwMDCQgDAwICAwIBAgIEAgICBwYBBgYAAAwLBgACAgQDBAYHBAQGAgUDBgYDBQQEBAUEAwUDAwQFBAMIAwsHBQUFBQIFBQQIBwYFBwUDBQUFCAYFAwMDAwYDCQYFAwUHAgUFAggGBAYGBgMDBAQHBgUDBAQHAwMDCAgICAgICgsFBQUCAgIHBgYGBgYGBQUFBQMGBgYGBgYJCQUFBQICAgYEBAQEBAQEBAQECggDAwMDAwIBAwMFAwMDCAYBBgYAAA0MBwACAgQDBQYHBAQGAwUDBwYDBQQFBQYEAwYDAwQFBAMJBAwIBgYGBQMFBgQJBwYFCAUDBQUFCQcFBAMDAwYECQYGAwYIAwUFAggGBQYGBgMDBAQIBwYEBAQHAwMDCQkJCQkJCwwGBgYDAwMHBgYGBgYGBQUFBQQGBgYGBgYKCQYGBgMDAwYFBQUFBQUEBAQECwkDAwMDAwIBAwMFAwMDCQcCBwcAAA4NBwACAgUDBQcIBAQHAwUDBwcDBQUFBQYFAwYDAwQFBAQKBAwIBgYGBgMGBgQJCAcGCAYDBQUGCggGBAMDBAcECgcGAwYIAwYGAwkHBQcHBwMDBAQJBwYEBQUIBAMECgoKCgoKDA0GBgYDAwMIBwcHBwcHBQUFBQQHBwcHBwcLCgYGBgMDAwcFBQUFBQUEBAQEDAoEBAMDAwMBAwMGAwMDCQcCBwcAAA8OCAACAgUDBgcIBQUHAwYDCAcDBgUFBQcFBAcEAwUGBQQLBA0JBwcHBgMGBwUKCAcGCQYEBgYGCggGBAMEBAcECwcHBAcJAwYGAwkHBQcHBwQDBQUJCAYEBQUJBAMECwsLCwsLDQ4HBwcDAwMIBwcHBwcHBgYGBgQHBwcHBwcMCwcHBwMDAwcFBQUFBQUFBQUFDQoEBAMDBAMCAwMGAwMDCggCCAgAABAPCAACAgUEBggJBQUIAwYECAgEBgUGBgcFBAcEBAUGBQQLBQ4JBwcHBwMGBwULCQgGCQcEBgYGCwkHBAQEBAgFCwgHBAcJAwcGAwoHBggIBwQEBQUKCAcEBQUJBAMECwsLCwsLDg8HBwcDAwMJCAgICAgIBgYGBgUICAgICAgNCwcHBwMDAwcGBgYGBgYFBQUFDgsEBAQEBAMCAwMGBAQECwgCCAgAABEQCQACAgYEBggJBQUIAwcECQgEBwYGBggGBAcEBAUHBQUMBQ8KBwcIBwMHCAULCggHCgcEBgYHDAkHBQQEBAgFDAgHBAgKAwcHAwsIBggICAQEBQUKCQcFBgYKBAQFDAwMDAwMDxAHCAcDAwMKCAgICAgIBgYGBgUICAgICAgNDAcHBwMDAwgGBgYGBgYFBQUFDgwFBQQEBAMCBAQHBAQECwkCCQkAABIQCQADAwYEBwkKBgYJBAcECQkEBwYGBggGBAgEBAYHBgUNBRAKCAgICAQHCAUMCgkHCwcEBwcHDQoIBQQEBQkFDQkIBAgKBAcHAwsIBgkJCAQEBQYLCQgFBgYKBQQFDQ0NDQ0NDxAICAgEBAQKCQkJCQkJBwcHBwUJCQkJCQkODQgICAQEBAgGBgYGBgYFBQUFDwwFBQQEBAMCBAQHBAQEDAkCCQkAABMRCgADAwYEBwkLBgYJBAcECgkEBwYHBwkGBAgFBAYHBgUNBhELCAgJCAQICAYNCwkICwgEBwcIDQoIBQQFBQkFDQkIBAkLBAgIBAwJBwkJCQQEBgYMCggFBgYLBQQFDQ0NDQ0NEBEICAgEBAQLCQkJCQkJBwcHBwUJCQkJCQkPDQgICAQEBAkHBwcHBwcGBgYGEA0FBQQEBQQCBAQIBAQEDQoCCgoAABQSCgADAwcEBwoLBgYKBAgECgoFCAcHBwkHBQkFBAYIBgUOBhIMCQkJCAQICQYNCwoIDAgFCAgIDgsIBgUFBQoGDgoJBQkMBAgIBA0JBwoKCQUFBgYMCgkGBwcLBQQFDg4ODg4OERIJCQkEBAQLCgoKCgoKCAgICAYKCgoKCgoQDgkJCQQEBAkHBwcHBwcGBgYGEQ4FBQUFBQQCBAQIBQUEDgoCCgoAABUTCwADAwcFCAoMBgYKBAgFCwoFCAcHBwoHBQkFBQYIBgYPBhMMCQkJCQQJCQYODAoIDAkFCAgIDwsJBgUFBQoGDwoJBQoMBAkIBA0KBwoKCgUFBgcNCwkGBwcMBQQGDw8PDw8PEhMJCQkEBAQMCgoKCgoKCAgICAYKCgoKCgoRDwkJCQQEBAoHBwcHBwcGBgYGEg4GBgUFBQQCBAQIBQUFDgsDCwsAABYUCwADAwcFCAsMBwcLBAkFCwoFCAcICAoHBQoFBQcJBwYPBhQNCgoKCQQJCgcPDAoJDQkFCAgJDwwJBgUFBgsGEAsKBQoNBAkJBA4KCAsLCgUFBwcOCwkGBwcNBgUGDw8PDw8PExQKCgoEBAQMCgoKCgoLCAgICAYLCwsLCwsREAoKCgQEBAoICAgICAgHBwcHEw8GBgUFBQQCBQUJBQUFDwsDCwsAABcVDAADAwcFCQsNBwcLBQkFDAsFCQcICAsIBQoGBQcJBwYQBxQNCgoKCgUJCgcPDQsJDQoFCQkJEAwKBgUGBgsHEAsKBQoNBQkJBA4LCAsLCwUFBwcODAoGBwgNBgUGEBAQEBAQFBUKCgoFBQUNCwsLCwsLCQkJCQcLCwsLCwsSEAoKCgUFBQsICAgICAgHBwcHFBAGBgUFBgQCBQUJBQUFEAwDDAwAABgWDAADAwgFCQwNBwcMBQkFDAsGCQgICAsIBgoGBQcJBwYRBxUOCgoLCgUKCwcQDgsKDgoGCQkKEQ0KBwUGBgsHEQwKBgsOBQoKBA8LCAwMCwYGBwgPDAoHCAgOBgUGERERERERFRYKCwoFBQUOCwsLCwsMCQkJCQcLCwsLCwsTEQoKCgUFBQsICAgICAgHBwcHFBEGBgUFBgQCBQUKBQUFEAwDDAwAAAABAV0BkAAFAAICvAKKAAAAjwK8AooAAAHFADIBAwAAAAAEAAAAAAAAAAAAAAMAAAAAAAAAAAAAAABNQUNSAEAAICIZAyH/OQAAAyEAxwAAAAEAAAAAAAAAAQAAgAAAAACLAT8AAGAAAbQCdVlva2ttb2trICAgICAgICD/////N////llPS1IwMAAAAAAAAAABAAAAAQAAmJpL9V8PPPUAAAPoAAAAALfnFZIAAAAAt+cVkv+2/zkDawMhAAAAAwACAAEAAAAAAAEAAAMh/zkAAAOQ/7b/uANrAAEAAAAAAAAAAAAAAAAAAACkAAEAAACkAJgADQAAAAAAAgAIAEAACgAAAF0AvgABAAE=");
			background-color: lightblue;
			background-color: linen;
			background-color: burlywood;
			background-color: antiquewhite;
			background-color: yellow;
			background-color: lightyellow;
			background-color: blue;
			background-color: lightblue;
			background-color: black;
			background-color: white;
			background-color: wheat;
			background-color: #FFFDDA
//			background-color: darkslategrey;
//			background-color: darkgreyslate;
//			color: white;
			color: black;
			font-size:62.5%; 
			font-family: "New Times Roman";
			font-family: "serif";
			font-family: "sans-serif";
			font-family: "courier";
			font-family: "monospace";
			font-family: cursive;
			font-family: fantasy;
			font-family: yokkmokkOT;
			font-family: "arial";
			font-size: 38pt;
			}

//		h1 { font-size: 2.4em; } /* =24px */
		h1 { font-size: 14pt; } /* =24px */
		h2 { font-size: 12pt; } /* =24px */
		h3 { font-size: 10pt; } /* =24px */
		p  { font-size: 10pt; } /* =14px */
		li { font-size: 20pt; } /* =14px? */
		</style>

	<style id="style_buttons" >
//		body { text-align: center; background-color: "darkSlategrey"; color:"ivory"; }
                button {
//			visibility: hidden;
//			background: rgba(7, 99, 53, .1);
			background: transparent;
//	                border: 3px solid rgba(7, 99, 53, 1);
//	                border: 3px solid wheat;
//	                border: 3px solid #FFFDDA;
	                border: 3px solid darkSlategrey;
			border-radius: 5px;
//			color: rgba(7, 99, 53, 1);
//			color: ivory;
			color: darkSlategrey;
			color: black;
			cursor: pointer;
			line-height: 40px;
			font-size: 20px;
			outline: none;
			padding: 0 20px;
			transition: all .3s;
                	}
	        button:hover {
//	              background: rgba(7, 99, 53, 1);
			background: darkSlategrey;
			background: wheat;
			background: #FFFDDA;
//			background: yellow;
//			background: white;
//			color: rgba(255,255,255,1);
//			color: ivory				
			color: black;

  	              }
		p {font-size: 20px; font-weight: bold;
		</style>

	<style id="style_input" >
//		body { text-align: center; background-color: "darkSlategrey"; color:"ivory"; }
                input {
//			visibility: hidden;
//			background: rgba(7, 99, 53, .1);
			background: transparent;
//	                border: 3px solid rgba(7, 99, 53, 1);
	                border: 3px solid darkSlategrey;
			border-radius: 5px;
//			color: rgba(7, 99, 53, 1);
//			color: ivory;
//			color: darkSlategrey;
			color: black;
			cursor: pointer;
			line-height: 40px;
			font-size: 10px;
			outline: none;
			padding: 0 20px;
			transition: all .3s;
                	}
	        button:hover {
//	              background: rgba(7, 99, 53, 1);
  	              background: darkslategray;
//  	              background: yellow;
//  	              background: white;
//  	              color: rgba(255,255,255,1);
//  	              color: white;
//  	              color: ivory;
  	              color: darkslategray;
  	              }
		p {font-size: 10px; font-weight: bold;
		</style>




	<script id="script_allowdrop" >
		function allowDrop(ev) {ev.preventDefault();}
		function drag(ev) {ev.dataTransfer.setData("text", ev.target.id);}
		function drop(ev) {
			ev.preventDefault();
			var data = ev.dataTransfer.getData("text");
			ev.target.appendChild(document.getElementById(data));
			}
		</script>

	<style id="style_input_file">
		.fileContainer {
		    overflow: hidden;
		    position: relative;
			}
		
		.fileContainer [type=file] {
		    cursor: inherit;
		    display: block;
		    font-size: 999px;
		    filter: alpha(opacity=0);
		    min-height: 100%;
		    min-width: 100%;
		    opacity: 0;
		    position: absolute;
		    right: 0;
		    text-align: right;
		    top: 0;
			}
		</style>
<!--
	<style id="style_input_text">
		input[type=text] {
//			background-color: #BFBDBD;
//			background-color: darkSlategrey;
			background-color: wheat;
			background-color: #FFFDDA;
//			color: #979797;
			border:solid 1px darkSlategrey;
//			color: ivory;
			color: black;
			height: 28px;
			padding-left:10px;
			width: 191px;
			box-shadow: 2px 2px 0 #828181 inset;
			}
		input[type=button] {
//			background-color: #1E1E1E;
//			color: #979797;
			background-color: darkSlategrey;
			background-color: wheat;
			background-color: #FFFDDA;
//			color: ivory;
			color: darkslategray;
			height: 24px;
			width: 103px;
			text-transform:uppercase;
			box-shadow:-1px 2px #6E6B6A inset;
			}
//		input[type=button], input[type=text]
//			{border-radius: 5px; font-family: Sansation;}
//			{border-radius: 5px; font-family: yokkmokkOT;}
		</style>
	-->






	<style id="style_popover" >
		.popover  {
			position: relative;
			float: left;
			padding: 5px;
			/*z-ka1: 0;*/
			}
		.popover:hover {
//			background-color: #e9e9e2;
//			background-color: darkslategrey;
			background-color: wheat;
//			background-color: #FFFDDA;
			/*z-ka1: 50;*/
//			color: white;
//			color: ivory;
			color: black;
//			color: #335500;
			text-decoration: none;
			}
/*CSS for enlarged image*/
		.popover span { 
			position: absolute; 
//			background-color: #e5e5e5;
//			background-color: darkslategrey;
			background-color: wheat;
			background-color: #FFFDDA;
			padding: 5px;
			/*left: -1000px;*/
//			border: 1px solid #666;
//			border: 1px solid darkslategrey;
			border: 1px solid wheat;
			border: 1px solid #FFFDDA;
			visibility: hidden;
			color: black;
			text-decoration: none;
			}
/*CSS for enlarged image*/
		.popover span img { 
			border-width: 0px; 
			/*padding: 2px;*/
			}
		
/*CSS for enlarged image on hover*/
		.popover:hover span { 
			visibility: visible; 
//			width: 200px;
			top: 0px; /* use IF IE6 style to correct IE6 positions of larger image relative to thumb */
			left: 0px;/*position where enlarged image should offset horizontally */
			}
		</style>

	<style id="style_thumbnail" >
		.thumbnail  {
			position: relative;
			float: left;
			padding: 5px;
			/*z-ka1: 0;*/
			}
		.thumbnail:hover {
//			background-color: #e9e9e2;
			background-color: darkslategrey;
			/*z-ka1: 50;*/
//			color: #335500;
//			color: ivory;
			color: darkslategray;
			text-decoration: none;
			}
/*CSS for enlarged image*/
		.thumbnail span { 
			position: absolute; 
//			background-color: #e5e5e5;
			background-color: darkslategrey;
			padding: 5px;
			/*left: -1000px;*/
			border: 1px solid #666;
			visibility: hidden;
//			color: black;
			color: ivory;
			text-decoration: none;
			}
/*CSS for enlarged image*/
		.thumbnail span img { 
			border-width: 0px; 
			/*padding: 2px;*/
			}
		
/*CSS for enlarged image on hover*/
		.thumbnail:hover span { 
			visibility: visible; 
			width: 200px;
			top: 5px; /* use IF IE6 style to correct IE6 positions of larger image relative to thumb */
			left: 300px;/*position where enlarged image should offset horizontally */
			}
		</style>








	<script id="script_allowdrop">
		function allowDrop(ev) {
			ev.preventDefault();
			}

		function drag(ev) {
			ev.dataTransfer.setData("text", ev.target.id);
			}

		function drop(ev) {
			ev.preventDefault();
			var data = ev.dataTransfer.getData("text");
			ev.target.appendChild(document.getElementById(data));
		function drop1(ev) {
			ev.preventDefault();
			var data = ev.dataTransfer.getData("text");
			ev.target.appendChild(document.getElementById(data));
		function drop2(ev) {
			ev.preventDefault();
			var data = ev.dataTransfer.getData("text");
			ev.target.appendChild(document.getElementById(data));
			}
		</script>

	
	<script id="script_drop">
		function drop(e) {
			var e_id=e.getAttribute('id');
			var eid = e.attribute("id");
			alert( "BUGS_01 drop e_id="+e_id );
			alert( "BUGS_01 drop e.id="+e.id );
			var e_id=e.getAttribute("id");
			alert( "BUGS_00 drop e_id="+e_id );
			alert( "BUGS_00 drop e="+e );
			alert( "BUGS_01 drop e.attribute.id="+e.attribute.id );
			}
		</script>
	
	<script id="script_dropw1">
		function dropw1(e) {
			alert( "BUGS_110w dropw1 e="+e );
			alert( "BUGS_110w dropw1 e.id="+e.id );
			alert( "BUGS_111w dropw1 e.attribute.id="+e.attribute.id );
			}
		</script>
	<script id="script_dropb1">
		function dropb1(e) {
			alert( "BUGS_111b dropb1 e_id="+e_id );
			alert( "BUGS_111b dropb1 e.id="+e.id );
			alert( "BUGS_110b dropb1 e="+e );
			alert( "BUGS_21 dropb1 e.attribute.id="+e.attribute.id );
			}
		</script>

	<script id="script_allowdrop">
		function allowDrop(ev) { ev.preventDefault(); }
		function drag(ev) {ev.dataTransfer.setData("text", ev.target.id);}
		</script>

	<script id="script_drop">
		function drop(ev) {
			ev.preventDefault();
			var data = ev.dataTransfer.getData("text");
			ev.target.appendChild(document.getElementById(data));
			}
		function drop0(ev) {
			ev.preventDefault();
			var data = ev.dataTransfer.getData("text");
			ev.target.appendChild(document.getElementById(data));
			}
		function drop1(ev) {
			ev.preventDefault();
			var data = ev.dataTransfer.getData("text");
			ev.target.appendChild(document.getElementById(data));
			}
		function drop2(ev) {
			ev.preventDefault();
			var data = ev.dataTransfer.getData("text");
			ev.target.appendChild(document.getElementById(data));
			}

		function dropw(ev) {
			ev.preventDefault();
			var data = ev.dataTransfer.getData("text");
			ev.target.appendChild(document.getElementById(data));
			}
		function dropb(ev) {
			ev.preventDefault();
			var data = ev.dataTransfer.getData("text");
			ev.target.appendChild(document.getElementById(data));
			}
		function dropw1(ev) {
			ev.preventDefault();
			var data = ev.dataTransfer.getData("text");
			ev.target.appendChild(document.getElementById(data));
			}
		function dropb1(ev) {
			ev.preventDefault();
			var data = ev.dataTransfer.getData("text");
			ev.target.appendChild(document.getElementById(data));
			}
		function dropw2(ev) {
			ev.preventDefault();
			var data = ev.dataTransfer.getData("text");
			ev.target.appendChild(document.getElementById(data));
			}
		function dropb2(ev) {
			ev.preventDefault();
			var data = ev.dataTransfer.getData("text");
			ev.target.appendChild(document.getElementById(data));
			}
		</script>

	<style id="style_startup">
//		body { background-color: wheat; }	
		body { background-color: #FFFDDA; color: black }	
		</style>

	<script id="script_startup_canvas" >
		function startup_canvas(args) {
			var dt = dttm('');
			var dt = dttm("");
//			canvas_button(id,imgsrc,txt,x,y,fontsize,fontname,fillstyle);
			canvas_button('canvas_button_alloff_w','/imgs/btn/koeyeb.png','head',80,40,'18px','Verdana','white' );
			canvas_button('canvas_button_toggle_w','/imgs/btn/koeyew.png','head',80,40,'18px','Verdana','black' );
			canvas_button('canvas_button_allon_w','/imgs/btn/koeyew.png','head',80,40,'18px','Verdana','black' );
			canvas_button('canvas_button_head_w','/imgs/btn/koeyeb.png','head',80,40,'18px','Verdana','white' );
			canvas_button('canvas_button_setup_w','/imgs/btn/koeyeb.png','setup',80,40,'18px','Verdana','black' );
			canvas_button('canvas_button_tail_w','/imgs/btn/koeyeb.png','setup',80,40,'18px','Verdana','black' );


//			canvas_button('canvas_button_hunt_w','/imgs/btn/koeyew.png','hunt',80,40,'18px','Verdana','black' );
//			canvas_button('canvas_button_tag_w','/imgs/btn/koeyeb.png','tag',80,40,'18px','Verdana','black' );
//			canvas_button('canvas_button_swarm_w','/imgs/btn/koeyeb.png','swarm',80,40,'18px','Verdana','black' );


			if( document.getElementById('canvas')) {
				var ctx= document.getElementById('canvas').getContext('2d');
				}


			var ctx_w = ctx;
			var ctx_b = ctx;
			var ctx_m = ctx;
			var ctx_bbwii = ctx;
			var ctx_blobs = ctx;
			if( document.getElementById('canvas_w')) {
				ctx_w = document.getElementById('canvas_w').getContext('2d');
				}
			if( document.getElementById('canvas_b')) {
				ctx_b = document.getElementById('canvas_b').getContext('2d');
				}
			if( document.getElementById('canvas_m')) {
				ctx_m = document.getElementById('canvas_m').getContext('2d');
				}
			if( document.getElementById('canvas_bbwii')) {
				ctx_bbwii = document.getElementById('canvas_bbwii').getContext('2d');
				}
			if( document.getElementById('canvas_bbwii')) {
				ctx_blobs = document.getElementById('canvas_blobs').getContext('2d');
				}
			var ctx_w = canvas_w.getContext('2d');
			var canvas_b = document.getElementById('canvas_b');
			var ctx_b = canvas_b.getContext('2d');
			var canvas_m = document.getElementById('canvas_m');
			var ctx_m = canvas_m.getContext('2d');

			drawimage(ctx,120,100,'/imgs/btn/koeyew.png');
			drawimage(ctx,200,200,'/imgs/btn/koeye.png');
			drawimage(ctx,500,400,'/imgs/btn/koeyeb.png');

//			drawimage(ctx_w,100,100,'/imgs/btn/kop12.png');
//			drawimage(ctx_b,100,100,'/imgs/btn/kop34.png');
//			drawimage(ctx_m,100,100,'/imgs/btn/kop1234.png');



			var my_gradient = ctx.createLinearGradient(0, 0, 0, 170);
			var my_gradient_w = ctx_w.createLinearGradient(0, 0, 0, 170);
			var my_gradient_b = ctx_b.createLinearGradient(0, 0, 0, 170);
			var my_gradient_m = ctx_m.createLinearGradient(0, 0, 0, 170);
			my_gradient.addColorStop(0, "black");
			my_gradient.addColorStop(1, "white");

			my_gradient_w.addColorStop(0, "white");
			my_gradient_w.addColorStop(1, "black");
			ctx_w.fillStyle = my_gradient_w;
//			ctx_w.fillRect(10,10,1300,650);

			my_gradient_b.addColorStop(0, "black");
			my_gradient_b.addColorStop(1, "white");
			ctx_b.fillStyle = my_gradient_b;
//			ctx_b.fillRect(0,0,500,500);

			my_gradient_m.addColorStop(0, "burlywood");
//			my_gradient_m.addColorStop(1, "wheat");
			my_gradient_m.addColorStop(1, "#FFFDDA");
			ctx_m.fillStyle = my_gradient_m;
			ctx_m.fillRect(0,0,500,500);

			ctx.fillStyle = my_gradient;
			ctx.fillRect(10,10,2000,800);
			ctx.font = "40pt Calibri";
			ctx.font = "50pt yokkmokkOT";
			ctx.fillStyle = 'white';
			ctx.fillText("jkwii timejak:      its about time",200, 80 );
			ctx.fillStyle = 'black';
			ctx.font = "160pt yokkmokkOT";
//			ctx.fillText("-= 2 0 2 0 =-",450, 160 );
			ctx.fillStyle = "blue";
			ctx.fillText("M A Y  wii ",600, 200 );
			ctx.font = "40pt yokkmokkOT";
			ctx.fillStyle = "red";
			ctx.fillText("M A Y  wii ?",100, 240 );
			ctx.fillStyle = "blue";
			ctx.fillText("M A Y  wii !",400, 240 );
			ctx.fillStyle = "red";
			ctx.fillText("M A Y  wii .",700, 240 );
			ctx.fillStyle = "black";

			ctx.font = "20pt yokkmokkOT";
			ctx.fillStyle = "wheat";
			ctx.fillText("-= shock =- n -= awe =-",500, 300 );
			ctx.fillStyle = "black";



//			ctx.fillText("avril 14 2020",650, 180 );

//			ctx.font = "110pt yokkmokkOT";
//			ctx.fillText("-=  happy passover easter  =-",100, 300 );
//			ctx.fillText("-=  happy easter passover  =-",100, 400 );
//			ctx.fillText("-=  happy birthday jessie  =-",100, 500 );

			ctx.strokeStyle = "blue";
			ctx.font = "100pt yokkmokkOT";
			ctx.fillText("-=   DEFFORD  COURT  =-",80, 350 );
			ctx.font = "160pt yokkmokkOT";
			ctx.fillText("-=     KEEP  OUT     =-",50, 600 );

			ctx.font = "60pt yokkmokkOT";
			ctx.fillText("-=  COVID-19 LOCKDOWN  =-",200, 460 );

			ctx.font = "70pt yokkmokkOT";
			ctx.fillText("est. 1979",1100, 400 );

			ctx.font = "40pt yokkmokkOT";
			ctx.fillText("offroad",150, 390 );
			ctx.fillText("private drive",500, 390 );
			ctx.fillText("no outlet",900, 390 );

			ctx.font = "20pt yokkmokkOT";
			ctx.fillText("please . . .",300, 500 );
			ctx.fillText("jkwii\@hi_risk",900, 500 );

			ctx.fillStyle="blue";
			ctx.strokeStyle="red";
			ctx.beginPath();
			ctx.lineWidth=6;
			ctx.rect(20, 250, 1300, 20);
			ctx.stroke();

//			ctx.font = "80pt yokkmokkOT";
//			ctx.fillText("offroad  private drive '100, 350 );
//			ctx.font = "110pt yokkmokkOT";
//			ctx.fillText("-=  C O V D 1 9  L O C K D O W N  =-",100, 400 );
////			ctx.fillText("-=  K E E P   O U T  =-",100, 400 );
//			ctx.font = "80pt yokkmokkOT";
//			ctx.fillText("please ...  ",100, 600 );
//			ctx.fillText("jkwii@hirisk ",600, 600 );
//
			ctx.font = "50pt yokkmokkOT";
			ctx.fillText( dt, 25,150 );
//			ctx.fillText("-= one =- -= eins =- -= un =- -= uno =- ",100, 400 );
//			ctx.fillText(dt,100, 100 );
//			ctx.font = "100pt yokkmokkOT";
//			ctx.fillText("eins",1000, 600 );

//			alert( "BUGS_690 startup_canvas" );

			drawimage(ctx,100,200,'/imgs/btn/ko.png');
			drawimage(ctx,200,100,'/imgs/btn/ok.png');


//			let mouse = { x: undefined, y: undefined };
//			window.addEventListener('mousemove', function(e) {
//				mouse.x = event.x;
//				mouse.y = event.y;
//				});
//
//			document.getElementById('div_msg').innerHTML = 'MOUSE '+mouse.x+","+mouse.y;


//			alert( "BUGS_701 startup_canvas ctx_w="+ctx_w );
			ctx_w.font = "12pt Calibri";
			ctx_w.fillStyle = 'red';
//			ctx_w.fillText("jkwii timejak_w",20, 10 );

//			alert( "BUGS_702 startup_canvas ctx_b="+ctx_b );
			ctx_b.font = "12pt Calibri";
			ctx_b.fillStyle = 'black';
//			ctx_b.fillText("jkwii timejak_b",20, 10 );

//			alert( "BUGS_703 startup_canvas ctx_m="+ctx_m );
			ctx_m.font = "12pt Calibri";
			ctx_m.fillStyle = 'black';
			ctx_m.fillText("jkwii timejak_m",20, 10 );
//			alert( "BUGS_704 startup_canvas ctx_m="+ctx_m );

//			ctx.fillStyle = "url('/gm/imgs/bg/bg_steel_linear.png')";
//			ctx.fillStyle = "url('/gm/imgs/bg/background1.jpg')";
//			ctx.fillstyle = "/gm/imgs/bg/background1.jpg";
//			var line1={x:10,y:10, l:40, h:1};
//			var down=false;
//			var mouse={x:0,y:0};
//			var line="line";
//			var mouse="mouse";
//			var down="false";
//			ctx.onmousemove=function(e){ 
//				mouse={x:e.pageX-this.offsetLeft,y:e.pageY-this.offsetTop};
//				this.onmousedown=function(){down=true};
//				this.onmouseup=function(){down=false} ; 
//				}
//			setInterval(function(){
//				ctx.clearRect(0,0,canvas.width,canvas.height)
//				ctx.beginPath()
//				ctx.moveTo(line1.x,line1.y)
//				ctx.lineTo(line1.x +line1.l,line1.y)
//				ctx.lineTo(line1.x +line1.l,line1.y+line1.h)
//				ctx.lineTo(line1.x,line1.y+line1.h)
//
//				ctx.isPointInPath(mouse.x,mouse.y)? (ctx.fillStyle ="red",line1.x=down?mouse.x:line1.x,line1.y=down?mouse.y:line1.y):(ctx.fillStyle ="blue")
//				ctx.fill()
//				},100)

//		var isInside=(
//			mouseX>=RectX && 
//			mouseX<=RectX+RectWidth &&
//			mouseY>=RectY &&
//			mouseY<=RectY+RectHeight
//			);

//		ctx.addEventListener('mousemove', e => {
//			let bound = ctx.getBoundingClientRect();
//			let x = e.pageX - bound.left;
//			let y = e.pageY - bound.top;
//			paths.forEach((path, index) => {
//				if ($.isPointInPath(path, x, y)) {
//					console.log(index);
//					}
//				});
//			});
//			document.body.appendChild(ctx);
//			alert( "BUGS_600 startup_canvas args="+args );

//			var canvas = document.getElementById('canvas');
//			var canvas_b = document.getElementById('canvas_b');
//			var canvas_m = document.getElementById('canvas_m');
//			var ctxx = canvas.getContext('2d');
//			var ctx_b = canvas_b.getContext('2d');
//			var ctx_m = canvas_m.getContext('2d');
//			ctxx.fillStyle = "yellow";
//			ctxx.fillText("jkwii timejak",20, 50 );
//			ctx_b.fillStyle = "black";
//			ctx_b.fillText("jkwii timejak_b" );
//			ctx_w.fillStyle = "white";
//			ctx_w.fillText("jkwii timejak_w" );
//			ctx_m.fillStyle = "red";
//			ctx_m.fill();
//			ctx_m.fillText("jkwii timejak_m" );
//
//			alert( "BUGS_651 ctx args="+args );
//			eval(req.responseText);args
//			req.open("GET", "/notes.txt", false);
//			req.send();
//			ctx.width = window.innerWidth;
//			ctx.height = window.innerHeight;
//			alertmsg( "BUGS_780 startup_canvas end" );
			}
		</script>


	<script id="script_shape">
		class Shape {
			constructor(x, y) {
				this.x = x;
				this.y = y;
				this.initialX = x;
				this.initialY = y;
				};  
// this is where we control the shape's appearance
// this is where we control movement and interactivity
			draw = () => {};  
			update = () => {this.draw();};
			};

		function animate() {
			requestAnimationFrame(animate);
// bugs			ctx.clearRect(0,0, window.innerWidth, window.innerHeight);
// bugs			Shape.draw();
			};
		animate();
		</script>

	<script id="script_drawimage" >
//		window.onload = function () {
		function drawimage(ctx,x,y,imgsrc) {
//			alert( "BUGS_680 drawimage" );
//			var canvas  = document.getElementById("canvas");
//			var ctx = canvas.getContext('2d');
//			var canvas_b  = document.getElementById("canvas_b");
//			var ctx_b = canvas_b.getContext('2d');
//			var canvas_w  = document.getElementById("canvas_w");
//			var ctx_w = canvas_w.getContext('2d');
//			var canvas_m  = document.getElementById("canvas_m");
//			var ctx_m = canvas_m.getContext('2d');

			var img = new Image();
//			img.src = '/imgs/btn/koeye.png';
			img.src = imgsrc;
			img.onload = function (e) {
//				ctx.drawImage(img, 10, 10);
				ctx.drawImage(img, 0, 0);
				}
			}
		</script>

	<script id="script_canvas_button" >
//	canvas_button(id,imgsrc,txt,x,y,font,fillstyle);
//	canvas_button('canvas_button_head_w','/imgs/btn/koeyew.png','head',80,40,'18px',' Verdana','black' );
//		function canvas_button(id,imgsrc,txt) {
		function canvas_button(id,imgsrc,txt,x,y,fontsize,fontname,fillstyle) {
//			alertmsg( "BUGS_1025 canvas_button id="+id+","+imgsrc+ ","+txt ","+x ","+y ","+fontsize ","+fontname ","+fillstyle );

			var img = new Image();
			img.src = '/imgs/btn/koeye.png';
			if( imgsrc != "" ) { img.src = imgsrc; }


//			alertmsg( "BUGS_1040 canvas_button id="+id+","+imgsrc+","+txt+","+x+","+y+","+fontsize+","+fontname+","+fillstyle );
			if(! document.getElementById(id)) { 
//				alertmsg( "BUGS_1042 canvas_button NOTFOUND id="+id+","+imgsrc+","+txt );
				return(""); 
				}

			var canvas  = document.getElementById(id);
			var ctx= canvas.getContext('2d');
			img.onload = function(e) {
				ctx.drawImage(img, 0, 0);
				}

//			alertmsg( "BUGS_1007 txt="+txt+","+x+","+y+" font="+font+" fillstyle="+fillstyle );
//			ctx.font = '18px yokkmokkOT';
//			ctx.font = '18px'+' '+'Verdana';
//			ctx.fillStyle = 'white';
//			ctx.fillStyle = 'black';

			ctx.fillStyle = fillstyle;
			var font = fontsize+" "+fontname;
			ctx.font = font;

//			alertmsg( "BUGS_1061 canvas_button FILLTEXT id="+id+","+imgsrc+","+txt+","+x+","+y+","+font+","+fillstyle );
			ctx.fillText(txt,x,y);			
//			alertmsg( "BUGS_1062 canvas_button FILLTEXT id="+id+","+imgsrc+",TXT="+txt+" x="+x+"y="+y+"fontname="+fontname );

//			ctx.font = '18px yokkmokkOT';
//			var gradient = ctx.createLinearGradient(0, 0, c.width, 0);
//			gradient.addColorStop("0"," magenta");
//			gradient.addColorStop("0.5", "blue");
//			gradient.addColorStop("1.0", "red");
//			ctx.fillStyle = gradient;
//			alertmsg( htmout );
//			alertmsg( "BUGS_1060 canvas_button FILLTEXT id="+id+","+imgsrc+",TXT="+txt );
			}
		</script>	

	<script id="script_play_audio" >
		function play_audio(args) {
			alertmsg("BUGS_1601 play_audio args="+args );
			return("");
			}
		</script>

	<script id="script_play_video" >
		function play_video(args) {
			alertmsg("BUGS_1602 play_video args="+args );
			return("");
			}
		</script>


	<script id="script_mute" >
// Mute a singular HTML5 element
// Try to mute all video and audio elements on the page
		function mute(elem) {
			alertmsg('BUGS_1071 mute elem='+elem );
			elem.muted = true; elem.pause();
			alertmsg('BUGS_1072 mute elem='+elem );
			}

		function allmute(args) {
//  			var x, i;
//			x = document.querySelectorAll(".img");
//			for (i = 0; i < x.length; i++) {
//				x[i].style.backgroundColor = "red";
//				}
//
			alertmsg('BUGS_1081 mute args='+args );
			var elems = document.querySelectorAll("video, audio");
//			var elems = document.querySelectorAll("<audio");
			alertmsg('BUGS_1081 mute elem='+elem );
			[].forEach.call(elems, function(elem) { 
				alertmsg('BUGS_1082 mute elem='+elem );
				mute(elem); 
				});
			alertmsg('BUGS_1083 mute elem='+elem );
			}	


// HTML Audio/Video Methods
// Method 	Description
// addTextTrack() 	Adds a new text track to the audio/video
// canPlayType() 	Checks if the browser can play the specified audio/video type
// load() 	Re-loads the audio/video element
// play() 	Starts playing the audio/video
// pause() 	Pauses the currently playing audio/video

// HTML Audio/Video Events
// Event 	Description
// abort 	Fires when the loading of an audio/video is aborted
// canplay 	Fires when the browser can start playing the audio/video
// canplaythrough 	Fires when the browser can play through the audio/video without stopping for buffering
// durationchange 	Fires when the duration of the audio/video is changed
// emptied 	Fires when the current playlist is empty
// ended 	Fires when the current playlist is ended
// error 	Fires when an error occurred during the loading of an audio/video
// loadeddata 	Fires when the browser has loaded the current frame of the audio/video
// loadedmetadata 	Fires when the browser has loaded meta data for the audio/video
// loadstart 	Fires when the browser starts looking for the audio/video
// pause 	Fires when the audio/video has been paused
// play 	Fires when the audio/video has been started or is no longer paused
// playing 	Fires when the audio/video is playing after having been paused or stopped for buffering
// progress 	Fires when the browser is downloading the audio/video
// ratechange 	Fires when the playing speed of the audio/video is changed
// seeked 	Fires when the user is finished moving/skipping to a new position in the audio/video
// seeking 	Fires when the user starts moving/skipping to a new position in the audio/video
// stalled 	Fires when the browser is trying to get media data, but data is not available
// suspend 	Fires when the browser is intentionally not getting media data
// timeupdate 	Fires when the current playback position has changed
// volumechange 	Fires when the volume has been changed
// waiting 	Fires when the video stops because it needs to buffer the next frame


 
// HTML Audio/Video Properties
// Property 	Description
// audioTracks 	Returns an AudioTrackList object representing available audio tracks
// autoplay 	Sets or returns whether the audio/video should start playing as soon as it is loaded
// buffered 	Returns a TimeRanges object representing the buffered parts of the audio/video
// controller 	Returns the MediaController object representing the current media controller of the audio/video
// controls 	Sets or returns whether the audio/video should display controls (like play/pause etc.)
// crossOrigin 	Sets or returns the CORS settings of the audio/video
// currentSrc 	Returns the URL of the current audio/video
// currentTime 	Sets or returns the current playback position in the audio/video (in seconds)
// defaultMuted 	Sets or returns whether the audio/video should be muted by default
// defaultPlaybackRate 	Sets or returns the default speed of the audio/video playback
// duration 	Returns the length of the current audio/video (in seconds)
// ended 	Returns whether the playback of the audio/video has ended or not
// error 	Returns a MediaError object representing the error state of the audio/video
// loop 	Sets or returns whether the audio/video should start over again when finished
// mediaGroup 	Sets or returns the group the audio/video belongs to (used to link multiple audio/video elements)
// muted 	Sets or returns whether the audio/video is muted or not
// networkState 	Returns the current network state of the audio/video
// paused 	Returns whether the audio/video is paused or not
// playbackRate 	Sets or returns the speed of the audio/video playback
// played 	Returns a TimeRanges object representing the played parts of the audio/video
// preload 	Sets or returns whether the audio/video should be loaded when the page loads
// readyState 	Returns the current ready state of the audio/video
// seekable 	Returns a TimeRanges object representing the seekable parts of the audio/video
// seeking 	Returns whether the user is currently seeking in the audio/video
// src 	Sets or returns the current source of the audio/video element
// startDate 	Returns a Date object representing the current time offset
// textTracks 	Returns a TextTrackList object representing the available text tracks
// videoTracks 	Returns a VideoTrackList object representing the available video tracks
// volume 	Sets or returns the volume of the audio/video
		</script>


	<script id="script_progressbar">
		var reader;
		var progress = document.querySelector('.percent');
		function abortRead() {reader.abort(); }

		function errorHandler(evt) {
			switch(evt.target.error.code) {
				case evt.target.error.NOT_FOUND_ERR:
					alert('File Not Found!');
        				break;
				case evt.target.error.NOT_READABLE_ERR:
					alert('File is not readable');
					break;
				case evt.target.error.ABORT_ERR:
					break; // noop
					default:
				alertmsg('ERR_7750 reading file');
				};
			}

// evt is an ProgressEvent.
// Increase the progress bar length.
		function updateProgress(evt) {
			if (evt.lengthComputable) {
				var percentLoaded = Math.round((evt.loaded / evt.total) * 100);
				if (percentLoaded < 100) {
					progress.style.width = percentLoaded + '%';
					progress.textContent = percentLoaded + '%';
					}
				}
			}

// Reset progress indicator on new file selection.
		function handleFileSelect(evt) {
			progress.style.width = '0%';
			progress.textContent = '0%';
			reader = new FileReader();
			reader.onerror = errorHandler;
			reader.onprogress = updateProgress;
			reader.onabort = function(e) {
				alertmsg('MSG_7790 cancelled');
				};
			reader.onloadstart = function(e) {
				document.getElementById('progress_bar').className = 'loading';
				};

// Ensure that the progress bar displays 100% at the end.
			reader.onload = function(e) {
				progress.style.width = '100%';
				progress.textContent = '100%';
				setTimeout("document.getElementById('progress_bar').className='';", 2000);
				}

// Read in the image file as a binary string.
			reader.readAsBinaryString(evt.target.files[0]);
			}

		document.getElementById('files').addEventListener('change', handleFileSelect, false);
		</script>


	<script id="script_jaximg">
		function jaximg(args) {
			var url_default="ko.png";
			var url	
			if( args != "" ) { url = args; }
			if(! filecheck(img)) { return(""); }
			var xhr = new XMLHttpRequest();
//			xhr.open('GET', '/path/to/image.png', true);
			xhr.open('GET', url, true);
			xhr.responseType = 'blob';
	
// Note: .response instead of .responseText
			xhr.onload = function(e) {
				if (this.status == 200) {
					var blob = new Blob([this.response], {type: 'image/png'});
					alertmsg( "MSG_7760 jax_blob" ):
					}
				};
			xhr.send();
			}

// var byte3 = uInt8Array[4]; 
// byte at offset 4
//  ...
		function jaximg2(args) {
			var url_default = "ko.png";
			if( args != "" ) { url = args; }
			if(! filecheck(imgurl)) { return(""); }
			var xhr = new XMLHttpRequest();
			xhr.open('GET', url, true);
			xhr.responseType = 'arraybuffer';
			xhr.onload = function(e) {
				var uInt8Array = new Uint8Array(this.response); // this.response == uInt8Array.buffer
				};
			xhr.send();
			}
		</script>

		<script id="script_jaxsend" >
			function sendText(txt) {
				var xhr = new XMLHttpRequest();
				xhr.open('POST', '/q=sendtextr', true);
				xhr.onload = function(e) {
					if (this.status == 200) {
						alertmsg(this.responseText);
						}
					};
				xhr.send(txt);
				}

// disable		sendText('test string');
			function sendTextNew(txt) {
				var xhr = new XMLHttpRequest();
				xhr.open('POST', '/?q=sendtextnew', true);
				xhr.responseType = 'text';
				xhr.onload = function(e) {
					if (this.status == 200) {
						alert(this.response);
						}
					};
				xhr.send(txt);
				}

// disable		sendTextNew('test string');
			function sendForm() {
				var formData = new FormData();
				formData.append('username', 'jkwii');
				formData.append('id', 1213);
				var xhr = new XMLHttpRequest();
				xhr.open('POST', '/?q=sendform', true);
				xhr.onload = function(e) { alert( "MSG_7000 sendform " ); };
				xhr.send(formData);
				}

// Append extra data before send.
// Prevent page from submitting.
			function sendForm(form) {
				var formData = new FormData(form);
				formData.append('secret_token', '1234567890'); 
				var xhr = new XMLHttpRequest();
				xhr.open('POST', form.action, true);
				xhr.onload = function(e) { alert("MSG_7000 sendForm form="+form); };
				xhr.send(formData);
				return false; 
				}

			function uploadFiles(url, files) {
				var formData = new FormData();
				for (var i = 0, file; file = files[i]; ++i) {
					formData.append(file.name, file);
					}
				var xhr = new XMLHttpRequest();
				xhr.open('POST', url, true);
				xhr.onload = function(e) { alert("BUGS_uploadFiles url="+url+" files="+files); };
// multipart/form-data
				xhr.send(formData);  
				}

//			document.querySelector('input[type="file"]').addEventListener('change', function(e) {
//				uploadFiles('/?q=input_file', this.files);
//				}, false);

			function upload_blob(blobOrFile) {
				var xhr = new XMLHttpRequest();
				xhr.open('POST', '/q=blobfile', true);
				xhr.onload = function(e) { alert("MSG_7000 blobfile");};

// Listen to the upload progress.
				var progressBar = document.querySelector('progress');
				xhr.upload.onprogress = function(e) {
					if (e.lengthComputable) {
						progressBar.value = (e.loaded / e.total) * 100;
						progressBar.textContent = progressBar.value; // Fallback for unsupported browsers.
						}
					};
				xhr.send(blobOrFile);
				}
//			upload_blob(new Blob(['jkwii timejak'], {type: 'text/plain'}));



// Access-Control-Allow-Origin: http://example.com
// Access-Control-Allow-Origin: *
			function jaxs_cors(args) {
				var urljson_default = "/?q=jaxs_cors_json";
				var urljson = urljson_default;
				if( args != "" ) { urljson = args; }
				var xhr = new XMLHttpRequest();
//				xhr.open('GET', 'httlP::/example.com/hello.json');
//				xhr.open('GET', 'index.json');
				xhr.open('GET', urljson);
				xhr.onload = function(e) {
					var data = JSON.parse(this.response);
					alertmsg( "MSG_7100 jaxs_cors urljson="+urljson );
					}
				xhr.send();
				}
			</script>










	<script id="script_alertmsg" >
		alertmsg(msg) {
			alert( "alert_101 msg="+msg );
			document.getElementById('div_msg').innerHTML=msg;
			document.getElementById('div_log').insertAdjacetHTML('afterend,msg);
//			document.getElementById('div_log').insertAdjacetHTML('beforeend,msg);
//			document.getElementById('div_log').insertAdjacetHTML('afterbegin,msg);
//			document.getElementById('div_log').insertAdjacetHTML('beforebegin,msg);
			}
		</script>

	<style id="style_details">
		details { border: 1px solid #aaa; border-radius: 4px; padding: .5em .5em 0; }
		summary { font-weight: bold; margin: -.5em -.5em 0; padding: .5em; }
		details[open] { padding: .5em; }
		details[open] summary { border-bottom: 1px solid #aaa; margin-bottom: .5em; }
		</style>

	<script id="script_ytload" >
		function ytload(args) {

var ytlist_default = `
yt_20190404_spring_blender_open_movie|https://www.youtube.com/watch?v=WhWc3b3KhnY
yt_20180531_first_of_spring_dgital_animation_showcase|https://www.youtube.com/watch?v=IAaLzP1U4nc
`;
			alertmsg( "MSG_300 ytload args="+args );
			return( ytlist.split("\n"));
			}
		</script>

	<script id="script_ytlist" >
		var childNumber_yt = 3;
		var ytlist = new Array();
		function script_ytlist(src) {
			ytlist=script_ytlist_load(src);
			alert( "BUGS_3000 script_ytlist_load src="+src );
			alert( "BUGS_3001 script_ytlist_load ytlist="+ytlist );
			script_ytlist_show(ytlist);
			alert( "BUGS_3002 script_ytlist_load ytlist="+ytlist );
			}
		function script_ytlist_ajax(src) {
			if( filecheck(src)) {
				var ytlist='';
				alert( "BUGS_2941 src="+src+" ytlist="+ytlist );
				ytlist=script_ytlist_load(src);
				script_ytlist_show(ytlist);
				alert( "BUGS_2942 src="+src+" ytlist="+ytlist );
				}
			}
		</script>

		<script id="script_avlist" >
			var childNumber_av = 3;
			function script_avlist() {
				script_avlist_load();
				script_avlist_show();
//				var parent = document.getElementById('div_tllist');
//				var newChild_tl = '<p>tl ' + childNumber_tl + '</p>';
//				newChild_tl += "<hr color=white><h1>tllist one</h1><hr color=white>";
//				parent.insertAdjacentHTML('beforeend', newChild_tl);
//				childNumber++;
				}
			</script>


		<script id="script_avlist_load" >
			var avlist = new Array();
			function script_avlist_load() {

//				alert( "BUGS_1455 script__avlist_load" );
				var z=0;

			avlist[z++] = "/kb/jtfdc/vid/jtfdc_20190122_2200_stalkaround_jtf28in_drivewaytraffic.mp4";
avlist =
`/index.mp4
/index1_avril.mp4
/index1.mp4
/index1.mp4`.split("\n");
			var z = avlist.length - 1;
//			alert( "BUGS_1875 script_load_avlist("+z+")="+avlist[z] + " len="+avlist.length );
//			document.write( "avlist_lost avlist_length="+avlist.length+" z="+z );
				return(avlist);
				}

		function script_avlist_show() {
			var z = 0; var avout=""; var len=avlist.length;
			var avid = ""; var avurl = "";
			var avid_default = "index.mp4";
			var avid_img_default = "/imgs/links/av.png";
//			var avid_tn_default = "/imgs/links/koeye_av.png";
			var avid_tn_default = "/imgs/links/tn/tn_av.png";
			var avid_img = avid_img_default;
			var avid_tn = avid_tn_default;
//			alert( "bugs_900 script_avlist_show IN" );
			for( z=0; z< avlist.length; z++ ) {
				avid = avlist[z];
				avid_filename = avid.substring(avid.lastIndexOf('/')+1);
				avid_ext = avid_filename.split(".")[1];
				avid_pathname = avid.replace( avid_filename, "" );
//				avid_code = avid_filename.replace(".mp4", "" );
				avid_code = avid_filename.replace(avid_ext, "" ).replace(".","");


				avid_img = avid_pathname + "/imgs/" + avid_code + ".png";
				avid_tn = avid_pathname + "tn/tn_" + avid_code + ".gif";
				if( avid_pathname == "" ) {
					avid_img = avid_pathname + avid_code + ".png";
							if(( element == "alloff" )) {
//				alert( "BUGS_1740 hideshow element="+element );
 				for( j=0; j<divids.length; j++ ) {
 					divid=divids[j];
					div_divid="div_"+divid;
					div_divid_w = div_divid+"_w";
					div_divid_m = div_divid+"_m";
					div_divid_b = div_divid+"_b";
					if( divid == "<br>" ) { continue; }

					alert( "BUGS_1750 hideshow j="+j+" element="+element );

					if( document.getElementById(div_divid)) {
						document.getElementById(div_divid).style.display="none";
						}
					if( document.getElementById(div_divid_w)) {
						document.getElementById(div_divid_w).style.display="none";
						}
					if( document.getElementById(div_divid_m)) {
						document.getElementById(div_divid_m).style.display="none";
						}
					if( document.getElementById(div_divid_b)) {
						document.getElementById(div_divid_b).style.display="none";
						}

//					var disp = document.getElementById(div_divid).style.display;
					alert( "BUGS_1770_allof j="+j+" disp="+disp+" htmout="+htmout+ "element="+element );
					}
				}	avid_tn = avid_pathname +  avid_code + ".gif";
					}
				if( avid_pathname == "/" ) {
					avid_img = avid_pathname + "" + avid_code + ".png";
					avid_tn = avid_pathname + "" + avid_code + ".gif";
					}

/////////////////////
// This Immediately Invoked Function Expression is invoked via call.
// call() takes 1 or more arguments: the first being the scope you want the 
// invoked function be in; the other arguments become arguments of the function
// itself.
// In this case, the scope of our function is an empty object ({}).
// This object allows us to attach functions using the this.* syntax and call the 
// functions with this["string"]() without ever polluting the global namespace. 
// It is also forward compatible with ECMAScript 5's scrict-mode as it does not
// use arguments.callee.
//		(function(document, window){
//		    var functionName = "myFunction";
// you'll need to define the function _before_ you call it.
//			    this.myFunction = function(){
//	Do some stuff
//			        alert('me');
//				    };
//			    this[functionName]();
//////////////////
//				alert( "BUGS_1360 avid="+avid+" ext="+avid_ext+" avid_pathname="+avid_pathname+" avid_filename="+avid_filename );
//				alert( "BUGS_1361 avid="+avid+" avid_ext="+avid_ext+ " avid_code="+avid_code+" avid_tn="+avid_tn );
//				alert( "BUGS_1350 avid="+avid+" avid_code="+avid_code+" avid_tn="+avid_tn );
//				tlout += "<h1><b>tllist_"+z+"</b><h1>";
//				tlout += "<a href='/index_vu.html?tlid="+tlid+"' target=_blank>";
//				tlout += "	<img name='img_" + tlid + "' src='"+tn_tlid+"' border=0 height=100 >\n";
//				tlout += "	</a>";
//				tlout += "<a href='"+tlid+".html' class="thumbnail"  target=_blank>";

// bugs				tlout += "<a href='"+tlid+".html' class='thumbnail'  target=_blank>";
//				avout += "<a href='/index_av.html?avid="+avid+"' class='thumbnail' target=_blank>";

				avout += "<a href='?avid="+avid+"' class='thumbnail' target=_blank>";

//				if( gif ) {				
//					avout += "	<img name='" + avid_img + "' height=25 src='"+avid_tn+"' border=0 height=100 >\n";
//					avout += "	<span><img name='img_" + avid + "' src='"+avid_img+"' border=0 height=100 ></span>\n";
//					avout += "	</a>";
//					}

				avout += "	<img name='" + avid_code + "' height=25 src='"+avid_tn_default+"' border=0 height=100 >\n";
				avout += "	<span><img name='" + avid_code + "' src='"+avid_tn+"' border=0 height=100 ></span>\n";
				avout += "	</a>";



//				alert( "bugs430 avid=" + avid + " tn_avid=" + tn_avid );
				}
//			document.write( "bugs435 avout=" + avout );

//			alert( "BUGS432_show avlist("+len+")="+avlist[z] + " len="+avlist.length );
// 			document.getElementById('div_avlist').innerHTML += avout;
			var parent = document.getElementById('div_avlist');
			parent.insertAdjacentHTML('beforeend', avout);
			}
			</script>


		<script id="script_ytlist_load" >
			var ytlist = new Array();


			function script_ytlist_load(src) {
//				alert( "BUGS_5670 script_ytlist_load src="+src );

				if( src != "" ) {
					var url = src.replace("jax=","");
//					alert( "BUGS_5602 url="+url+" kolists_jax="+kolists['jax'] );
					jax(url);
					var ytlist = kolists['jax'].split("\n");

//					alert( "BUGS_5689 ytlist_len="+ytlist.length+" ytlist="+ytlist );
//					alert( "BUGS_5681 kolists_jax="+kolists['jax'].length );
//					alert( "BUGS_5680 ytlist="+ytlist);
					return(ytlist);
					}





				if( src == "" ) {
var ytlist_text_ajax =
`https://youtube.com
yt_outerlight_20200130_kobe_bryant_crash_predicated_simpsons|yt_outerlight_20200130_kobe_bryant_crash_predicted_simpsons|https://www.youtube.com/watch?v=Bp2zJ5U31Ow
`;

//					alert( "BUGS_1171 script_ytlist_load src="+src+" ytlist_text_ajax="+ytlist_text_ajax );
					ytlist_text_ajax = load_ajax(src);
//					alert( "BUGS_1172 script_ytlist_load src="+src+" ytlist_text_ajax="+ytlist_text_ajax );
					return( ytlist_text_ajax.split("\n"));
				var ytlist = "";
				ytlist += ytlist_text;
				return( ytlist.split("\n"));
				}
			</script>
		<script id="script_ytlist_show">
		function script_ytlist_show(ytlist) {
//			var ytlist = new Array();
//			ytlist=script_ytlist_load(src);
//			alert( "BUGS_7660 script_ytlist_show len="+ytlist.length+" ytlist="+ytlist );
			var ytout='';
			src="/yt/txt/ytlist_202004.txt";
			ytout += '<h1>'+src+'</h1>';
			ytout += '<hr color=white>';
			ytout += '<hr color=black>';
			ytout += '<hr color=red>';
			ytout += '<hr color=white>';
			ytout += '<hr color=blue>';

			var z = 0; var ytout=""; var len=ytlist.length;
			var ytid = ""; var yturl = "";
			var ytid_default = "https://youtube.com";
			var ytid_img_default = "/imgs/links/yt.png";
			var ytid_tn_default = "/imgs/links/tn/tn_yt.png";
			var ytid_img = ytid_img_default;
			var ytid_tn = ytid_tn_default;
			var ytline = new Array(); var f=0;
			var ytid_filename = "";
//			alert( "bugs_1010 script_avlist_show ytlist.length="+ytlist.length );
			var ytid_text="";
			var yt_group = "";
			var yt_title = ""
			var yt_dttm = "";
			var re = "";
			var re_pound = '/^#/';
			for( z=0; z< ytlist.length; z++ ) {
				if( ytlist[z] == '' ) { continue; }
				if( ytlist[z] == '\n' ) { continue; }
				
//				if( ytlist[z].test(re_pound)) { 
				if( ytlist[z].match(/^#/)) {
//					alert( "BUGS_1011 matchpound z="+z+" re_pound="+re_pound+" ytlist="+ytlist[z] );
					continue; 
					}
				if( ytlist[z].match(/^\/\//)) {
//					alert( "BUGS_1012 matchpound z="+z+" re_pound="+re_pound+" ytlist="+ytlist[z] );
					continue; 
					}

				if( ytlist[z].match(/^</)) {
//					alert( "BUGS_1012 matchpound z="+z+" re_pound="+re_pound+" ytlist="+ytlist[z] );
					ytout += "<br>";
//					ytout += ytlist[z];
					continue; 
					}

//				alert( "BUGS_7700 z="+z+" ytlist="+ytlist[z] );


//				if( ytlist[z].test('/^\/\//gi')) { 
//					alert( "BUGS_1011 matchslash z="+z+" ytlist="+ytlist[z] );
//					continue; 
//					}
//				if( ytlist[z].test('/^</gi')) { 
//					alert( "BUGS_1011 matchhtml z="+z+" ytlist="+ytlist[z] );
//					ytout += ytlist[z];
//					continue; 
//					}


				ytline = ytlist[z].split("|");
//				alert( "BUGS_1425 ytline="+ytline+" len="+ytline.length );
				if( ytline.length == 1 ) { ytid = ytline[0]; }
				if( ytline.length == 2 ) { ytid = ytline[1]; yt_title=ytline[0]; }
				if( ytline.length == 3 ) { ytid = ytline[2]; yt_title=ytline[1]; yt_group=ytline[0]}
				if( ytid.length < 5 ) { continue; }


//				for( f=0; f< ytline.length; f++ ) {
//					ytid_text = ytline[0];
//					ytid = ytline[ytline.length-1];
//					alert( "BUGS_1429 ytid="+ytid+"  f="+f+" ytline="+ytline[f] );
//					}

//				ytid = ytline;
//				ytid = ytline[1];
//				ytid = ytlist[z];

//				alert( "BUGS_1430 ytid="+ytid );
//				ytid_filename = ytid.substring(ytid.lastIndexOf('/')+1);
//				alert( "BUGS_1431 ytid_filename="+ytid_filename );

//				ytid_ext = ytid_filename.split(".")[1];
//				ytid_pathname = ytid.replace( ytid_filename, "" );
//				alert( "BUGS_1440 ytid_pathname="+ytid_pathname );

//				ytid_code = ytid_filename.replace(".mp4", "" );
//				ytid_code = ytid_filename.replace(ytid_ext, "" ).replace(".","");


				ytid_tn = "/imgs/links/tn/tn_yt.png";

				ytid_tn = str2btn(ytline);
//				alert("BUGS_7000 str2btn ytid_tn="+ytid_tn+" ytline="+ytline );

				var ytid_id = ytid.split("=")[1];
				ytid_img = "http://i.ytimg.com/vi/" + ytid_id + "/default.jpg";
//				ytid_img = "http://i.ytimg.com/vi/" + ytid_id + "/maxresdefault.jpg";


//				ytid_img = ytid_pathname + "/imgs/" + ytid_code + ".png";
//				ytid_tn = ytid_pathname + "tn/tn_" + ytid_code + ".gif";
//				if( ytid_pathname == "" ) {
//					ytid_img = ytid_pathname + ytid_code + ".png";
//					ytid_tn = ytid_pathname +  ytid_code + ".gif";
//					}
//				if( ytid_pathname == "/" ) {
//					ytid_img = ytid_pathname + "" + ytid_code + ".png";
//					ytid_tn = ytid_pathname + "" + ytid_code + ".gif";
//					}

////				ytout += "<a href='?ytid="+ytid+"' class='thumbnail' target=_blank>";
				ytout += '<a href="'+ytid+'" target=_blank class="thumbnail">';

//				alert( "bugs_1060 script_ytlist_show ytout="+ytout );
////				if( gif ) {				
////					avout += "	<img name='" + avid_img + "' height=25 src='"+avid_tn+"' border=0 height=100 >\n";
////					avout += "	<span><img name='img_" + avid + "' src='"+avid_img+"' border=0 height=100 ></span>\n";
////					avout += "	</a>";
////					}
//
//				ytout += "	<img name='" + ytid_tn + "' src='"+ytid_tn_default+"' border=0 height=25 >\n";
				ytout += "	<img name='" + ytid_tn + "' src='"+ytid_tn+"' border=0 height=25 >\n";
//				ytout += "	<span><img name='" + ytid_tn + "' src='"+ytid_tn+"' border=0 height=50 ></span>\n";
				ytout += "	<span><img name='" + ytid_img + "' src='"+ytid_img+"' border=0 height=300 alt='"+ytid_text+"' ></span>\n";
				ytout += "	</a>";
				}

var ytout_spacer =
`<br><br><br><br><br><br><br><br>
<br><br><br><br><br><br><br><br>
<br><br><br><br><br><br><br><br>
<br><br><br><br><br><br><br><br>`;
			ytout += ytout_spacer;

//			alert( "BUGS_1035 script_ytlist_show ytout="+ytout );
			var parent = document.getElementById('div_ytlist');
			parent.insertAdjacentHTML('beforeend', ytout);
			}
			</script>



		<script id="script_ytlist_show1">
		function script_ytlist_show1(ytlist) {
//			var ytlist = new Array();
//			ytlist=script_ytlist_load(src);
//			alert( "BUGS_1410 script_ytlist_show ytlist="+ytlist );
			var ytout='';
			var z = 0; var ytout=""; var len=ytlist.length;
			var ytid = ""; var yturl = "";
			var ytid_default = "https://youtube.com";
			var ytid_img_default = "/imgs/links/yt.png";
			var ytid_tn_default = "/imgs/links/tn/tn_yt.png";
			var ytid_img = ytid_img_default;
			var ytid_tn = ytid_tn_default;
			var ytline = new Array(); var f=0;
			var ytid_filename = "";
//			alert( "bugs_1010 script_avlist_show ytlist.length="+ytlist.length );
			var ytid_text="";
			var yt_group = "";
			var yt_title = ""
			var yt_dttm = "";
			var re = "";
			var re_pound = '/^#/';
			for( z=0; z< ytlist.length; z++ ) {
				if( ytlist[z] == '' ) { continue; }
				if( ytlist[z] == '\n' ) { continue; }
				
//				if( ytlist[z].test(re_pound)) { 
				if( ytlist[z].match(/^#/)) {
//					alert( "BUGS_1011 matchpound z="+z+" re_pound="+re_pound+" ytlist="+ytlist[z] );
					continue; 
					}
				if( ytlist[z].match(/^\/\//)) {
//					alert( "BUGS_1012 matchpound z="+z+" re_pound="+re_pound+" ytlist="+ytlist[z] );
					continue; 
					}

				if( ytlist[z].match(/^</)) {
//					alert( "BUGS_1012 matchpound z="+z+" re_pound="+re_pound+" ytlist="+ytlist[z] );
					ytout += "<br>";
//					ytout += ytlist[z];
					continue; 
					}


//				if( ytlist[z].test('/^\/\//gi')) { 
//					alert( "BUGS_1011 matchslash z="+z+" ytlist="+ytlist[z] );
//					continue; 
//					}
//				if( ytlist[z].test('/^</gi')) { 
//					alert( "BUGS_1011 matchhtml z="+z+" ytlist="+ytlist[z] );
//					ytout += ytlist[z];
//					continue; 
//					}


				ytline = ytlist[z].split("|");
//				alert( "BUGS_1425 ytline="+ytline+" len="+ytline.length );
				if( ytline.length == 1 ) { ytid = ytline[0]; }
				if( ytline.length == 2 ) { ytid = ytline[1]; yt_title=ytline[0]; }
				if( ytline.length == 3 ) { ytid = ytline[2]; yt_title=ytline[1]; yt_group=ytline[0]}
				if( ytid.length < 5 ) { continue; }


//				for( f=0; f< ytline.length; f++ ) {
//					ytid_text = ytline[0];
//					ytid = ytline[ytline.length-1];
//					alert( "BUGS_1429 ytid="+ytid+"  f="+f+" ytline="+ytline[f] );
//					}

//				ytid = ytline;
//				ytid = ytline[1];
//				ytid = ytlist[z];

//				alert( "BUGS_1430 ytid="+ytid );
//				ytid_filename = ytid.substring(ytid.lastIndexOf('/')+1);
//				alert( "BUGS_1431 ytid_filename="+ytid_filename );

//				ytid_ext = ytid_filename.split(".")[1];
//				ytid_pathname = ytid.replace( ytid_filename, "" );
//				alert( "BUGS_1440 ytid_pathname="+ytid_pathname );

//				ytid_code = ytid_filename.replace(".mp4", "" );
//				ytid_code = ytid_filename.replace(ytid_ext, "" ).replace(".","");


				ytid_tn = "/imgs/links/tn/tn_yt.png";

				ytid_tn = str2btn(ytline);
//				alert("BUGS_7000 str2btn ytid_tn="+ytid_tn+" ytline="+ytline );

				var ytid_id = ytid.split("=")[1];
				ytid_img = "http://i.ytimg.com/vi/" + ytid_id + "/default.jpg";
//				ytid_img = "http://i.ytimg.com/vi/" + ytid_id + "/maxresdefault.jpg";


//				ytid_img = ytid_pathname + "/imgs/" + ytid_code + ".png";
//				ytid_tn = ytid_pathname + "tn/tn_" + ytid_code + ".gif";
//				if( ytid_pathname == "" ) {
//					ytid_img = ytid_pathname + ytid_code + ".png";
//					ytid_tn = ytid_pathname +  ytid_code + ".gif";
//					}
//				if( ytid_pathname == "/" ) {
//					ytid_img = ytid_pathname + "" + ytid_code + ".png";
//					ytid_tn = ytid_pathname + "" + ytid_code + ".gif";
//					}

////				ytout += "<a href='?ytid="+ytid+"' class='thumbnail' target=_blank>";
				ytout += '<a href="'+ytid+'" target=_blank class="thumbnail">';

//				alert( "bugs_1060 script_ytlist_show ytout="+ytout );
////				if( gif ) {				
////					avout += "	<img name='" + avid_img + "' height=25 src='"+avid_tn+"' border=0 height=100 >\n";
////					avout += "	<span><img name='img_" + avid + "' src='"+avid_img+"' border=0 height=100 ></span>\n";
////					avout += "	</a>";
////					}
//
//				ytout += "	<img name='" + ytid_tn + "' src='"+ytid_tn_default+"' border=0 height=25 >\n";
				ytout += "	<img name='" + ytid_tn + "' src='"+ytid_tn+"' border=0 height=25 >\n";
//				ytout += "	<span><img name='" + ytid_tn + "' src='"+ytid_tn+"' border=0 height=50 ></span>\n";
				ytout += "	<span><img name='" + ytid_img + "' src='"+ytid_img+"' border=0 height=300 alt='"+ytid_text+"' ></span>\n";
				ytout += "	</a>";
				}

var ytout_spacer =
`<br><br><br><br><br><br><br><br>
<br><br><br><br><br><br><br><br>
<br><br><br><br><br><br><br><br>
<br><br><br><br><br><br><br><br>`;
			ytout += ytout_spacer;

//			alert( "BUGS_1035 script_ytlist_show ytout="+ytout );
			var parent = document.getElementById('div_ytlist');
			parent.insertAdjacentHTML('beforeend', ytout);
			}
			</script>



	<script id="script_str2btn" >
		function str2btn(str) {
// var btn_default = "/imgs/btn/koeye_handhither.gif";
var btn_default = "/imgs/links/tn/tn_yt.png";
var btn = btn_default;
var re = "";
var htmout = "";
var regex_btn = "";

// # /youtube/gi|yt/imgs/koeye_yt.png
// # /youtube/gi|yt/imgs/koeye_av.png

var regex_btns = `

//
// /youtube/gi|yt/imgs/koeye_yt.png
// /youtube/gi|yt/imgs/koeye_av.png

polly|/yt/imgs/yt_polly.png
mcduff|/yt/imgs/yt_mcduff.png
munder|/yt/imgs/yt_munder.png
^munder|/yt/imgs/yt_munder.png
webb|/yt/imgs/yt_webb.png
vlad|/yt/imgs/yt_vlad9t.png
borealis|/yt/imgs/yt_borealis.png
med/imgs/operation.png
dah|/yt/imgs/yt_dahboo.png
fulford|/yt/imgs/yt_fulford.png
newearth|/yt/imgs/yt_newearth.png
quinn|/yt/imgs/yt_quinn.png
kt|/yt/imgs/koeye_kt.png
`.split("\n");
var line = "";
var regex = "";
var fldlen = 0;
var flds = "";

//			alert( "BUGS_104 regex_btns="+regex_btns );
			for( j=0; j<regex_btns.length; j++ ) {
				flds = regex_btns[j];
				fldlen=flds.split("|").length;			

//				alert( "BUGS_105 j="+j+" flds="+flds);
				if( flds == "" ){ continue; }
				if( /\#/.test(flds)){ continue; }
				if( /\/\//.test(flds)){ continue; }

				regex_btn="/imgs/btn/koeye_handhi.gif";	

				regex = flds.split("|")[0];
				re = flds.split("|")[0];
				regex_btn = flds.split("|")[fldlen-1];
				if( regex == "" ) { contihue; }

//				alert( "BUGS_120 str2btn j="+j+" regex="+regex+" regex_btn="+regex_btn );
//				regex_btn = regex_btns[j].split("|")[1];
//				if( regex.test(str)) {
//				var re = new RegExp( '/^yt_2020/' );
//				var re = /\w+\s/gi;
//				var re = /^yt_202003/gi;
//				var re = /kt/gi;

//				alert( "BUGS_111 str2btn ______ j="+j+" re="+re+" str="+str );
				re = new RegExp(regex,"gi");
//				alert( "BUGS_110 str2btn ______ j="+j+" re="+re+" str="+str );
				if( re.test(str)) {
//					alert( "BUGS_112 str2btn __MATCH j="+j+" re="+re+" str="+str );
					return(regex_btn);
					}
				else {
//					alert( "BUGS_113 str2btn nomatch j="+j+" re="+re+" str="+str );
					}
				}
			return(btn_default);
			}
		</script>

	<script id="script_hideshow1">
		function script_hideshow1(id) {
			alert( "BUGS_1500 script_hideshow1 id="+id );
			}
		</script>
	<script id="script_hideshow">
		function script_hideshow(element) {
//			alert( "BUGS_1720 hideshow element="+element );
//			alert( "BUGS_1722 hideshow kolists_divids="+kolists['divids'] );
			var divids = kolists['divids'].split(" ");;
//			alert( "BUGS_1731 hideshow divids="+divids );
			var htmbugs = ""; 
			htmbugs += '<div id="div_htmbugs">';
			htmbugs += '	<h1>div_htmbugs</h1>';
			htmbugs += '	<pre>';

			var style_d = "_style_d";
			var style_v = "_style_v";
//			alert( "BUGS_1570 element="+element );
			var htmout = ""; var j=0; var k=0;
			var divid = "";
			var div_divid = "";
			var div_divid_w = "";
			var div_divid_m = "";
			var div_divid_b = "";
//			var divids = "head jtfdc jtfinc jtfdcr av db dd fb pn sl tl tm yt zm".split(" ");
//			var divids = "head jtfdc jtfinc jtfdcr av db dd fb pn sl tl tm yt zm".split(" ");
//			var divids_hl = "hl hllinks hltext hlmouse";

////			var divids = "alloff toggle allon <br> hl av bb dd fb fs pn sl tl tm yt zm <br> jtfdcr jtfdc jtfinc <br> head body memes kov tail".split(" ");
//			var divids = kolists['divids'];
//			var divids = "alloff toggle allon <br> jtfdc jtfinc jtfdcr <br> head body memes kov tail".split(" ");
//			var divids = "games av_jtfdc av_jtfinc av_jtfdcr <br> av db dd fb fs pn sl tl tm yt zm <br> jtfdc jtfinc jtfdcr <br> head slots body memes kov tail".split(" ");
//			var divids = "av_jtfdc av_jtfinc av_jtfdcr <br> av db dd fb fs pn sl tl tm yt zm <br> jtfdc jtfinc jtfdcr <br> head slots body memes kov tail".split(" ");

//			alert( "BUGS_1730 hideshow element="+element );

//			htmout += '<div id="div_buttons_hideshow">';
////			htmout += '<img src="/imgs/btn/koeyeb_alloff.png" onclick="script_hideshow(\'alloff\'); return false;">';
////			htmout += '<img src="/imgs/btn/koeyew_allon.png" onclick="script_hideshow(\'allon\'); return false;">';
////			htmout += '<br>';
//			alert( "BUGS_2500 element="+element );
			if(( element == "alloff" )) {
 				for( j=0; j<divids.length; j++ ) {
 					divid=divids[j];
					div_divid="div_"+divid;
					div_divid_w = div_divid+"_w";
					div_divid_m = div_divid+"_m";
					div_divid_b = div_divid+"_b";
					if( divid == "<br>" ) { continue; }

					if( document.getElementById(div_divid)) {
						document.getElementById(div_divid).style.display="none";
						}
					if( document.getElementById(div_divid_w)) {
						document.getElementById(div_divid_w).style.display="none";
						}
					if( document.getElementById(div_divid_m)) {
						document.getElementById(div_divid_m).style.display="none";
						}
					if( document.getElementById(div_divid_b)) {
						document.getElementById(div_divid_b).style.display="none";
						}
					}
				}
			if(( element == "toggle" )) {
//				alert( "BUGS_1740 hideshow element="+element );
 				for( j=0; j<divids.length; j++ ) {
 					divid=divids[j];
					div_divid="div_"+divid;
					div_divid_w = div_divid+"_w";
					div_divid_m = div_divid+"_m";
					div_divid_b = div_divid+"_b";
					if( divid == "<br>" ) { continue; }

//					alert( "BUGS_1770 hideshow toggle j="+j+" element="+element );

					if( document.getElementById(div_divid)) {
						if( document.getElementById(div_divid).style.display == "none" ) {
							document.getElementById(div_divid).style.display="inline";
							}
						else {
							document.getElementById(div_divid).style.display="none";
							}
						}
					if( document.getElementById(div_divid_w)) {
						if( document.getElementById(div_divid_w).style.display == "none" ) {
							document.getElementById(div_divid_w).style.display="inline";
							}
						else {
							document.getElementById(div_divid_w).style.display="none";
							}
						}
					if( document.getElementById(div_divid_m)) {
						if( document.getElementById(div_divid_m).style.display == "none" ) {
							document.getElementById(div_divid_m).style.display="inline";
							}
						else {
							document.getElementById(div_divid_m).style.display="none";				
							}
						}
					if( document.getElementById(div_divid_b)) {
						if( document.getElementById(div_divid_b).style.display =="none" ) {
							document.getElementById(div_divid_b).style.display="inline";
							}
						else {
							document.getElementById(div_divid_b).style.display="none";
							}
						}
//					var disp = document.getElementById(div_divid).style.display;
//					alert( "BUGS_1810 toggle j="+j+" htmout="+htmout+ "element="+element );
					}
				}






			if( element == "allon" )  {
//				alert( "BUGS_2510 allon" );
 				for( j=0; j<divids.length; j++ ) {
 					divid=divids[j];
					div_divid="div_"+divid;
					div_divid_w = div_divid+"_w";
					div_divid_m = div_divid+"_m";
					div_divid_b = div_divid+"_b";
					if( divid == "<br>" ) { continue; }

					if( document.getElementById(div_divid)) {
						document.getElementById(div_divid).style.display="inline";
						}
					if( document.getElementById(div_divid_w)) {
						document.getElementById(div_divid_w).style.display="inline";
						}
					if( document.getElementById(div_divid_m)) {
						document.getElementById(div_divid_m).style.display="inline";
						}
					if( document.getElementById(div_divid_b)) {
						document.getElementById(div_divid_b).style.display="inline";
						}

//					alert( "BUGS_1840_allon j="+j+" htmout="+htmout+ "element="+element );
					}
				}

//			alert( "BUGS_1800 hideshow element="+element );
			htmout += '<hr color=white>';
			htmout += '<img src="/imgs/btn/koeye_'+"alloff"+'.png" height=50 onclick="script_hideshow(\''+"alloff"+'\');return false;" alt="btn_'+"alloff"+'">';
			htmout += '<img src="/imgs/btn/koeye_'+"toggle"+'.png" height=50 onclick="script_hideshow(\''+"toggle"+'\');return false;" alt="btn_'+"toggle"+'">';
			htmout += '<img src="/imgs/btn/koeye_'+"allon"+'.png" height=50 onclick="script_hideshow(\''+"allon"+'\');return false;" alt="btn_'+"allon"+'">';
//			htmout += '<img src="/imgs/btn/koeye_'+"games"+'.png" height=50 onclick="script_hideshow(\''+"div_games"+'\');return false;" alt="btn_'+"allon"+'">';
			htmout += '<br>';


 			for( j=0; j<divids.length; j++ ) {
 				divid=divids[j];
				div_divid="div_"+divid;
				div_divid_w = div_divid+"_w";
				div_divid_m = div_divid+"_m";
				div_divid_b = div_divid+"_b";
				if( divid == "<br>" ) {
					htmout += "<br>";
					continue;
					}

//				document.getElementById("test").style.visibility = "hidden";
//				document.getElementById("test").style.display = "none";

				style_v="";
				style_d="";
				if( document.getElementById(div_divid)) {
					style_v = document.getElementById(div_divid).style.visibility;
					style_d = document.getElementById(div_divid).style.display;
					}

				htmbugs += "htmbugs j="+j+" divid="+divid;
				htmbugs += " -== div_divid="+div_divid;
				htmbugs += " element="+element;
				htmbugs += " =- -=";
				htmbugs += " style_d="+style_d+"";
				htmbugs += " style_v="+style_v+"";
				htmbugs += "====================\n";
//				alert( "BUGS_1830 j="+j+" htmbugs="+htmbugs );

//				if( div_divid.match(/element/) != '') {
//				if( div_divid.match(element)) {
//				if( div_divid == element ) {
//					alert( "BUGS_141 _MATCH_ div_divid="+div_divid+" element="+element+" style_d="+style_d+" style_v="+style_v );
//					htmbugs += "BUGS_141 _MATCH_ div_divid="+div_divid+" element="+element+" style_d="+style_d+" style_v="+style_v;
//					}
//				else {
//					alert( "BUGS_142 nomatch div_divid="+div_divid+" element="+element+" style_d="+style_d+" style_v="+style_v );
//					htmbugs += "BUGS_142 _match_ div_divid="+div_divid+" element="+element+" style_d="+style_d+" style_v="+style_v;
//					}


				if( div_divid == element ) {
					if( document.getElementById(div_divid)) {
						style_d = document.getElementById(div_divid).style.display;
						}

//					alert( "BUGS_1850 MATCH div_divid="+div_divid+" element="+element+" style_d="+style_d );
					if( document.getElementById(div_divid)) {
					if( document.getElementById(div_divid).style.display == "none" ) {
						htmout += '<img src="/imgs/btn/koeyew_'+divid+'.png" height=50 onclick="script_hideshow(\''+div_divid+'\');return false;" alt="btn_'+divid+'_hide">';
//						alert( "BUGS_161 _DIV_DIVID-NONE div_divid="+div_divid+" element="+element+" style_d="+style_d+" style_v="+style_v );
						htmbugs += "BUGS_1850 _DIV_DIVID-NONE div_divid="+div_divid+" element="+element+" style_d="+style_d+" style_v="+style_v;
						if( document.getElementById(div_divid)) {
							document.getElementById(div_divid).style.display="inline";
							}
						if( document.getElementById(div_divid_w)) {
							document.getElementById(div_divid_w).style.display="inline";
							}
						if( document.getElementById(div_divid_m)) {
							document.getElementById(div_divid_m).style.display="inline";
							}
						if( document.getElementById(div_divid_b)) {
							document.getElementById(div_divid_b).style.display="inline";
							}
						}
					else {
						htmout += '<img src="/imgs/btn/koeyeb_'+divid+'.png" height=50 onclick="script_hideshow(\''+div_divid+'\');return false;" alt="btn_'+divid+'_hide">';
//						alert( "BUGS_1870 DIV_DIVID-INLINE div_divid="+div_divid+" element="+element+" style_d="+style_d+" style_v="+style_v );
						htmbugs += "BUGS_162 DIV_DIVID-INLINE div_divid="+div_divid+" element="+element+" style_d="+style_d+" style_v="+style_v;
						if( document.getElementById(div_divid)) {
							document.getElementById(div_divid).style.display="none";
							}
						if( document.getElementById(div_divid_w)) {
							document.getElementById(div_divid_w).style.display="none";
							}
						if( document.getElementById(div_divid_m)) {
							document.getElementById(div_divid_m).style.display="none";
							}
						if( document.getElementById(div_divid_b)) {
							document.getElementById(div_divid_b).style.display="none";
							}
						}}
					}

//				alert( "BUGS_1942 element="+element );

				if( div_divid != element ) {
//					alert( "BUGS_1885 rest div_divid="+div_divid+" element="+element );
					if( document.getElementById(div_divid)) {
					if( document.getElementById(div_divid).style.display == "none" ) {
						htmout += '<img src="/imgs/btn/koeyeb_'+divid+'.png" height=50 onclick="script_hideshow(\''+div_divid+'\');return false;" alt="btn_'+divid+'">';
//						alert( "BUGS_1890 div_divid_none div_divid="+div_divid+" element="+element+" style_d="+style_d+" style_v="+style_v );
						htmbugs += "BUGS_171 div_divid_none div_divid="+div_divid+" element="+element+" style_d="+style_d+" style_v="+style_v;
						}
					else {
						htmout += '<img src="/imgs/btn/koeyew_'+divid+'.png" height=50 onclick="script_hideshow(\''+div_divid+'\');return false;" alt="btn_'+divid+'_hide">';
//						alert( "BUGS_1900 div_divid_inline div_divid="+div_divid+" element="+element+" style_d="+style_d+" style_v="+style_v );
						htmbugs += "BUGS_172 div_divid_inline div_divid="+div_divid+" element="+element+" style_d="+style_d+" style_v="+style_v;
						}
					}

					}
				}  
//			htmout += '	</div>';

			htmbugs += "	</pre>";
			htmbugs += "	</div>";			

//			alert( "BUGS_181 script_hideshow divid="+divid+" htmout="+htmout );
//			alert( "BUGS_1911 htmout="+htmout );	
//			alert( "BUGS_1912 htmbugs="+htmbugs );	
//			document.getElementById("div_htmbugs").innerHTML = htmbugs;

			if( document.getElementById("div_buttons_hideshow")) {
				document.getElementById("div_buttons_hideshow").innerHTML = htmout;
				}
			if( document.getElementById("div_buttons_hideshow_w")) {
				document.getElementById("div_buttons_hideshow_w").innerHTML = htmout;
				}
			if( document.getElementById("div_buttons_hideshow_m")) {
				document.getElementById("div_buttons_hideshow_m").innerHTML = htmout;
				}
			if( document.getElementById("div_buttons_hideshow_b")) {
				document.getElementById("div_buttons_hideshow_b").innerHTML = htmout;
				}
			if( document.getElementById("div_htmbugs")) {
				document.getElementById("div_htmbugs").innerHTML = htmbugs;
				}
			}
 		</script>








	<script id="script_kogrids">
		function kogrids(args) {
//			alert( "BUGS_1850 kogrids args="+args );
			postturtle_monkeytrap(args);
//			alert( "BUGS_1852 kogrids len="+len+" kolist="+kolist );
//			alert( "BUGS_1852 kogrids len="+kolist.length+" kolist="+kolist );
//			var j=0; var len = divids.split(" ").length;
//			script_hideshow('alloff');
//			var id="zm";
//			script_hideshow(id);
//			script_hideshow1('allon');
		
//			alert( "BUGS_1850 kogrids args="+args );
//			var kolist = kolists['divids'];
//			alert( "BUGS_1851 kogrids kolist="+kolist );
//			alert( "BUGS_1851 kogrids divids="+divids );
//			alert( "BUGS_1852 kogrids kolist_divids="+kolists['divids'] );
//			alert( "BUGS_1860 kogrids len="+len+" kolist="+kolist );
			var kolist = kolists['divids'].split(" ");
			var len=kolist.length;
			for ( j=0; j<len; j++ ) {
				var rand = random_int(len,1);
				var id=kolist[rand-1];
				if( /alloff/.test(id)) {continue;}
				if( /allon/.test(id)) {continue;}
				if( /toggle/.test(id)) {continue;}
				if( /</.test(id)) {continue;}
				script_hideshow('alloff');
				var divid="div_"+id;
//				alert( "BUGS_1881 j="+j+" hideshow id="+id+" rand="+rand );
//				script_hideshow('fb');
//				script_hideshow('yt');
				script_hideshow(divid);
//				alert( "BUGS_1882 j="+j+" hideshow id="+id+" rand="+rand );
////				script_hideshow1('allon');
				break;
				}

			var myko = new Array();
			var mykob = new Array();
			var mykow = new Array();
			var mykoeyeb = new Array();
			var mykoeyew = new Array();

mykob =
`/imgs/kogrids/tn/tn_kob_grid1.png
/imgs/kogrids/tn/tn_kob_grid2.png
/imgs/kogrids/tn/tn_kob_grid3.png
/imgs/kogrids/tn/tn_kob_grid4.png
/imgs/kogrids/tn/tn_kob_grid5.png
/imgs/kogrids/tn/tn_kob_grid6.png
/imgs/kogrids/tn/tn_kob_grid7.png
/imgs/kogrids/tn/tn_kob_grid8.png
/imgs/kogrids/tn/tn_kob_grid9.png
/imgs/kogrids/tn/tn_kob_grid.gif`.split("\n");
mykow = 
`/imgs/kogrids/tn/tn_kow_grid1.png
/imgs/kogrids/tn/tn_kow_grid2.png
/imgs/kogrids/tn/tn_kow_grid3.png
/imgs/kogrids/tn/tn_kow_grid4.png
/imgs/kogrids/tn/tn_kow_grid5.png
/imgs/kogrids/tn/tn_kow_grid6.png
/imgs/kogrids/tn/tn_kow_grid7.png
/imgs/kogrids/tn/tn_kow_grid8.png
/imgs/kogrids/tn/tn_kow_grid9.png
/imgs/kogrids/tn/tn_kow_grip.gif`.split("\n");

mykoeyeb =
`/imgs/kogrids/tn/tn_koeyeb_grid1.png
/imgs/kogrids/tn/tn_koeyeb_grid2.png
/imgs/kogrids/tn/tn_koeyeb_grid3.png
/imgs/kogrids/tn/tn_koeyeb_grid4.png
/imgs/kogrids/tn/tn_koeyeb_grid5.png
/imgs/kogrids/tn/tn_koeyeb_grid6.png
/imgs/kogrids/tn/tn_koeyeb_grid7.png
/imgs/kogrids/tn/tn_koeyeb_grid8.png
/imgs/kogrids/tn/tn_koeyeb_grid9.png
/imgs/kogrids/tn/tn_koeyeb_grid_delay5.gif`.split("\n");
mykoeyew =
`/imgs/kogrids/tn/tn_koeyew_grid1.png
/imgs/kogrids/tn/tn_koeyew_grid2.png
/imgs/kogrids/tn/tn_koeyew_grid3.png
/imgs/kogrids/tn/tn_koeyew_grid4.png
/imgs/kogrids/tn/tn_koeyew_grid5.png
/imgs/kogrids/tn/tn_koeyew_grid6.png
/imgs/kogrids/tn/tn_koeyew_grid7.png
/imgs/kogrids/tn/tn_koeyew_grid8.png
/imgs/kogrids/tn/tn_koeyew_grid9.png
/imgs/kogrids/tn/tn_koeyew_grip_delay5.gif`.split("\n");

				var ko=Math.floor(Math.random()*myko.length);
				var kob=Math.floor(Math.random()*mykob.length);
				var kow=Math.floor(Math.random()*mykow.length);
				var koeyeb=Math.floor(Math.random()*mykoeyeb.length);
				var koeyew=Math.floor(Math.random()*mykoeyew.length);
				var koeyeb1=Math.floor(Math.random()*mykoeyeb.length);
				var koeyew1=Math.floor(Math.random()*mykoeyew.length);
				var koeyeb2=Math.floor(Math.random()*mykoeyeb.length);
				var koeyew2=Math.floor(Math.random()*mykoeyew.length);

				var max=4; var min=1;
				var delay1=random_int(max,min);
				var delay2=random_int(max,min);
				var delay3=random_int(max,min);
				var delay4=random_int(max,min);

//				var random_toggle = random_int(kolists['divids'].split(" ").length,1);
//				script_hideshow('alloff');
//				script_hideshow(kolists['divids'].split(" ")[random_toggle-1] );

				if( delay1 = 1 ) mykoeyeb[10]="/imgs/kogrids/tn/tn_koeyew_grid_delay100.gif";
				if( delay1 = 2 ) mykoeyeb[10]="/imgs/kogrids/tn/tn_koeyew_grid_delay25.gif";
				if( delay1 = 3 ) mykoeyeb[10]="/imgs/kogrids/tn/tn_koeyew_grid_delay50.gif";
				if( delay1 = 4 ) mykoeyeb[10]="/imgs/kogrids/tn/tn_koeyew_grid_delay5.gif";
				if( delay2 = 1 ) mykoeyew[10]="/imgs/kogrids/tn/tn_koeyew_grip_delay100.gif";
				if( delay2 = 2 ) mykoeyew[10]="/imgs/kogrids/tn/tn_koeyew_grip_delay25.gif";
				if( delay2 = 3 ) mykoeyew[10]="/imgs/kogrids/tn/tn_koeyew_grip_delay50.gif";
				if( delay2 = 4 ) mykoeyew[10]="/imgs/kogrids/tn/tn_koeyew_grip_delay5.gif";

				if (ko==0) ko=10;
				if (kob==0) kob=10;
				if (kow==0) kow=10;
				if (koeyeb==0) koeyeb=10;
				if (koeyew==0) koeyew=10;
				if (koeyeb1==0) koeyeb1=10;
				if (koeyew1==0) koeyew1=10;
				if (koeyeb2==0) koeyeb2=10;
				if (koeyew2==0) koeyew2=10;

var htmout_spacer = 
`<br><br><br><br><br><br><br><br>
<hr color=red>
<hr color=white>
<hr color=blue>
<br><br><br><br>`;
				htmout  = '\n';
				htmout += '<a href="/index.html" class="thumbnail"  target=_blank>';
				htmout += '<img src="'+mykoeyeb[koeyeb1]+'" height=75 alt=kob border=0>';
//				htmout += '<span><img src="/imgs/kogrids/tn/tn_links_ko2us.png" height=400 alt="ko2.us" border=0></span>';
				htmout += '<span><img src="/imgs/kogrids/links_ko2us.png" height=400 alt="ko2.us" border=0></span>';
				htmout += '</a>';
				htmout += '&nbsp  &nbsp';
				htmout += '<a href="/ko_center/ko_center.php?q=login" class="thumbnail" target=_blank>';
				htmout += '<img src="'+mykoeyew[koeyew1]+'" height=75 alt=koeyeb border=0>';
//				htmout += '<span><img src="/imgs/kogrids/tn/tn_links_kologin.png" height=400 alt="kolgin" border=0></span>';
				htmout += '<span><img src="/imgs/kogrids/links_kologin.png" height=400 alt="kolgin" border=0></span>';
				htmout += '</a>';
				htmout += '&nbsp  &nbsp';
				htmout += '<a href="/cfaa.html" class="thumbnail" target=_blank>';
				htmout += '<img src="'+mykoeyeb[koeyeb2]+'"  height=75 alt=koeyew border=0>';
//				htmout += '<span><img src="/imgs/kogrids/tn/tn_links_cfaa.png" height=400 alt="ko2.us" border=0></span>';
				htmout += '<span><img src="/imgs/kogrids/links_cfaa.png" height=400 alt="ko2.us" border=0></span>';
				htmout += '</a>';
				htmout += '&nbsp &nbsp &nbsp';
				htmout += '<a href="https://www.bluehost.com/?utm_source=%28direct%29&utm_medium=affiliate&utm_campaign=affiliate-link_konet_notype" class="thumbnail" target=_blank>';
				htmout += '<img src="'+mykoeyew[koeyew2]+'" height=75 alt=kow border=0>';
//				htmout += '<span><img src="/imgs/kogrids/tn/tn_links_bluehost.png" height=400 alt="bluehost.com" border=0></span>';
				htmout += '<span><img src="/imgs/kogrids/links_bluehost.png" height=400 alt="bluehost.com" border=0></span>';
				htmout += '</a>';
				htmout += '\n';

				htmout_kogrids=htmout;

				var htmout_lever_mw = "";
				htmout_lever_mw += '<a href=#div_kogrids class="popover" >\n';	
				htmout_lever_mw += '	<img  src=/imgs/btn/kop12.png onclick="kogrids(\'\'); return false;" border=0>\n';
				htmout_lever_mw += '	<span><img src=/imgs/btn/kop34.png onclick="kogrids(\'\');return false;" border=0></span>\n';
				htmout_lever_mw += '	</a>\n';

				var htmout_lever_mb = "";
				htmout_lever_mb += '<a href=#div_kogrids class="popover" >\n';	
				htmout_lever_mb += '	<img  src=/imgs/btn/kop34.png onclick="kogrids(\'\'); return false;" border=0>\n';
				htmout_lever_mb += '	<span><img src=/imgs/btn/kop12.png onclick="kogrids(\'\');return false;" border=0></span>\n';
				htmout_lever_mb += '	</a>\n';


				var htmout_m = "";
				htmout_m += htmout_lever_mw;
				htmout_m += htmout_kogrids;
				htmout_m += htmout_lever_mb;
				htmout_m += htmout_spacer;


				htmout_lever_w = "";
				htmout_lever_w += '<a href=# class="popover" >\n';	
				htmout_lever_w += '	<img src=/imgs/btn/kop1.png onclick="kogrids(\'w\'); return false;" border=0>\n';
				htmout_lever_w += '	<span><img src=/imgs/btn/kop2.png onclick="kogrids(\'w\'); return false;" border=0></span>\n';
				htmout_lever_w += '	</a>\n';

				htmout_w = "";
				htmout_w += htmout_lever_w;
				htmout_w += htmout_kogrids;
				htmout_w += htmout_spacer;

				htmout_lever_b = "";
				htmout_lever_b += '<a href=# class="popover" >\n';	
				htmout_lever_b += '	<img src=/imgs/btn/kop3.png onclick="kogrids(\'b\');return false;" border=0>\n';
				htmout_lever_b += '	<span><img src=/imgs/btn/kop4.png onclick="kogrids(\'b\'); return false;" border=0></span>\n';
				htmout_lever_b += '	</a>\n';

				htmout_b = "";
				htmout_b += htmout_kogrids;
				htmout_b += htmout_lever_b;
				htmout_b += htmout_spacer;

//				alert( "BUGS_2140 kogrids_w htmout_w="+htmout_w );
//				alert( "BUGS_2141 kogrids htmout="+htmout );
//				var div_kogrids = document.getElementById('div_kogrids_m');
//				div_kogrids.innerHTML = htmout_m;
//				var div_kogrids_b = document.getElementById('div_kogrids_b');
//				div_kogrids_b.innerHTML = htmout_b;

				if(document.getElementById('div_kogrids_xx')){
					document.getElementById('div_kogrids_xx').innerHTML=htmout_m;
					}
//				document.getElementById('div_kogrids').innerHTML=htmout;
				document.getElementById('div_kogrids_w').innerHTML=htmout_w;
				document.getElementById('div_kogrids_m').innerHTML=htmout_m;
				document.getElementById('div_kogrids_b').innerHTML=htmout_b;
				}

			function random_int(max,min) {
				min = Math.ceil(min);
				max = Math.floor(max);
				return Math.floor(Math.random() * (max - min + 1)) + min;	
				}

		</script>


	<script id="script_toggle">
		function script_toggle(element) {
//			alert( "BUGS_2400 hideshow element="+element );
			var htmbugs = ""; 
			htmbugs += '<div id="div_htmbugs">';
			htmbugs += '	<h1>div_htmbugs</h1>';
			htmbugs += '	<pre>';

			var style_d = "_style_d";
			var style_v = "_style_v";
//			alert( "BUGS_2401 element="+element );
			var htmout = ""; var j=0; var k=0;
			var divid = "";
			var div_divid = "";
			var div_divid_w = "";
			var div_divid_m = "";
			var div_divid_b = "";
//			var divids = "head jtfdc jtfinc jtfdcr av db dd fb pn sl tl tm yt zm".split(" ");
//			var divids = "head jtfdc jtfinc jtfdcr av db dd fb pn sl tl tm yt zm".split(" ");
//			var divids = "allon toggle alloff head setup hunt tag swarm bd status all_places all_items all_sounds all_us all_eggs all_grass places items sounds us eggs grass yt av links ".split(" ");
			var divids = "allon toggle alloff <br> hl jtfinc jtfdc bb fb  head setup hunt tag swarm bd status all_places all_items all_sounds all_us all_eggs all_grass places items sounds us eggs grass yt av links ".split(" ");

			if(( element == "alloff" )) {
//				alertmsg( "BUGS_2450 hideshow divids_length="+divids.length );
 				for( j=0; j<divids.length; j++ ) {
 					divid=divids[j];
					div_divid="div_"+divid;
//					div_divid_w = div_divid+"_w";
//					div_divid_m = div_divid+"_m";
//					div_divid_b = div_divid+"_b";
					if( divid == "<br>" ) { continue; }


					if( document.getElementById(div_divid)) {
						document.getElementById(div_divid).style.display="none";
						}
//					if( document.getElementById(div_divid_w)) {
//						document.getElementById(div_divid_w).style.display="none";
//						}
//					if( document.getElementById(div_divid_m)) {
//						document.getElementById(div_divid_m).style.display="none";
//						}
//					if( document.getElementById(div_divid_b)) {
//						document.getElementById(div_divid_b).style.display="none";
//						}
					}
				}
			if( element == "allon" )  {
//				alertmsg( "BUGS_2460 hideshow divids_length="+divids.length );
 				for( j=0; j<divids.length; j++ ) {
 					divid=divids[j];
					div_divid="div_"+divid;
					div_divid_w = div_divid+"_w";
					div_divid_m = div_divid+"_m";
					div_divid_b = div_divid+"_b";
					if( divid == "<br>" ) { continue; }

					if( document.getElementById(div_divid)) {
						document.getElementById(div_divid).style.display="inline";
						}
//					if( document.getElementById(div_divid_w)) {
//						document.getElementById(div_divid_w).style.display="inline";
//						}
//					if( document.getElementById(div_divid_m)) {
//						document.getElementById(div_divid_m).style.display="inline";
//						}
//					if( document.getElementById(div_divid_b)) {
//						document.getElementById(div_divid_b).style.display="inline";
//						}
					}
				}

			htmout += '<hr color=white>';
			htmout += '<img src="/imgs/btn/koeye_'+"alloff"+'.png" height=50 onclick="script_hideshow(\''+"alloff"+'\');return false;" alt="btn_'+"alloff"+'">';
			htmout += '<img src="/imgs/btn/koeye_'+"allon"+'.png" height=50 onclick="script_hideshow(\''+"allon"+'\');return false;" alt="btn_'+"allon"+'">';
			htmout += "<hr color=pink>";
			htmout += '<br>';


//			alertmsg( "BUGS_2500 hideshow divids_length="+divids.length );
 			for( j=0; j<divids.length; j++ ) {
 				divid=divids[j];
				div_divid="div_"+divid;
				div_divid_w = div_divid+"_w";
				div_divid_m = div_divid+"_m";
				div_divid_b = div_divid+"_b";
				if( divid == "<br>" ) {
					htmout += "<br>";
					continue;
					}

				style_v="";
				style_d="";
				if( document.getElementById(div_divid)) {
//					style_v = document.getElementById(div_divid).style.visibility;
					style_d = document.getElementById(div_divid).style.display;
//					alert( "BUGS_880 div_divid="+div_divid+"  style_d="+style_d );
					}

				htmbugs += "htmbugs j="+j+" divid="+divid;
				htmbugs += " -== div_divid="+div_divid;
				htmbugs += " element="+element;
				htmbugs += " =- -=";
				htmbugs += " style_d="+style_d+"";
				htmbugs += " style_v="+style_v+"";
				htmbugs += "====================\n";



//				alertmsg("BUGS_2520 divid="+divid+" element="+element );
//				if( div_divid == element ) {
				if( divid == element ) {
//					alertmsg("BUGS_2540 div_divid="+div_divid+" element="+element );
					if( document.getElementById(div_divid)) {
						style_d = document.getElementById(div_divid).style.display;
						}

					if( document.getElementById(div_divid)) {
//						alert( "BUGS_900 div_div="+div_div+" style_d="+style_d );
						if( document.getElementById(div_divid).style.display == "none" ) {
							alert( "BUGS_901 div_div="+div_div+" style_d="+style_d );
							htmout += '<img src="/imgs/btn/koeyew_'+divid+'.png" height=50 onclick="script_hideshow(\''+div_divid+'\');return false;" alt="btn_'+divid+'_hide">';
							htmbugs += "BUGS_161 _DIV_DIVID-NONE div_divid="+div_divid+" element="+element+" style_d="+style_d+" style_v="+style_v;
							document.getElementById(div_divid).style.display="inline";
//							document.getElementById(div_divid_w).style.display="inline";
//							document.getElementById(div_divid_m).style.display="inline";
//							document.getElementById(div_divid_b).style.display="inline";
							}
						else {
							htmout += '<img src="/imgs/btn/koeyeb_'+divid+'.png" height=50 onclick="script_hideshow(\''+div_divid+'\');return false;" alt="btn_'+divid+'_hide">';
							htmbugs += "BUGS_162 DIV_DIVID-INLINE div_divid="+div_divid+" element="+element+" style_d="+style_d+" style_v="+style_v;
							document.getElementById(div_divid).style.display="none";
//							document.getElementById(div_divid_w).style.display="none";
//							document.getElementById(div_divid_m).style.display="none";
//							document.getElementById(div_divid_b).style.display="none";
							}
						}
					}


				if( div_divid != element ) {
					if( document.getElementById(div_divid).style.display == "none" ) {
						htmout += '<img src="/imgs/btn/koeyeb_'+divid+'.png" height=50 onclick="script_hideshow(\''+div_divid+'\');return false;" alt="btn_'+divid+'">';
//						htmbugs += "BUGS_921 div_divid_none div_divid="+div_divid+" element="+element+" style_d="+style_d+" style_v="+style_v;
						}
					else {
						htmout += '<img src="/imgs/btn/koeyew_'+divid+'.png" height=50 onclick="script_hideshow(\''+div_divid+'\');return false;" alt="btn_'+divid+'_hide">';
						htmbugs += "BUGS_922 div_divid_inline div_divid="+div_divid+" element="+element+" style_d="+style_d+" style_v="+style_v;
						}
					}
				}  
			htmbugs += "	</pre>";
			htmbugs += "	</div>";			

			alertmsg( "BUGS_2590 htmout="+htmbugs );
			document.getElementById("div_buttons_hideshow").innerHTML = htmout;
			document.getElementById("div_htmbugs").innerHTML = htmbugs;
//			document.getElementById("div_buttons_hideshow_w").innerHTML = htmout;
//			document.getElementById("div_buttons_hideshow_m").innerHTML = htmout;
//			document.getElementById("div_buttons_hideshow_b").innerHTML = htmout;
			document.getElementById("div_htmbugs").innerHTML = htmbugs;
			}
 		</script>
	<script id="script_alertmsg1">
		function alertmsg1(msg) {
//			alert( "BUGS_2321 alertmsg1 msg="+msg );
			}
		</script>
	<script id="script_alertmsg" >
		function alertmsg(msg) {
//			alert( "BUGS_2320 alertmsg="+msg );
			if( document.getElementById('div_msg')) {
				document.getElementById('div_msg').innerHTML = msg+"<hr color=white>";
				}

//			document.getElementById('div_log').innerHTML = msg;
//			document.getElemetById('div_log').insertAdjacentHTML('afterbegin', msg);
//			document.getElemetById('div_log').insertAdjacentHTML('beforebegin', msg);
//			document.getElemetById('div_log').insertAdjacentHTML('beforeend', msg);
//			if( document.getElementById('div_log_m')) {
//				document.getElementById('div_log_m').insertAdjacentHTML("beforeend", msg+"<br>" );
//				}
			if( document.getElementById('div_log')) {
				document.getElementById('div_log').insertAdjacentHTML("beforeend", msg+"<br>" );
				}
//			alert( "BUGS_2340 alertmsg="+msg );
			return("");
			}
		</script>



	<script id="script_dttm_bugs" >
		function dttm_bugs(args) {
			alert( "BUGS_1500 args="+args );
//			var formatTime = function(time, format) {
//				alert( "BUG1_1500 args="+args );
//				time = typeof time == 'number' ? new Date(time) : time;
//				format = format || 'yyyy-mm-dd hh:MM:ss';
//				var year = time.getFullYear();
//				var month = time.getMonth() + 1;
//				var date = time.getDate();
//				var hours = time.getHours();
//				var minutes = time.getMinutes();
//				var seconds = time.getSeconds();
//				var add0 = function(t){ return t < 10 ? '0' + t : t }
//				alert( "BUGS_1499" );
//				var replaceMent = {
//					'yyyy': year,
//					'mm': add0(month),
//					'm': month,
//					'dd': add0(date),
//					'd': date,
//					'hh': add0(hours),
//					'h': hours,
//					'MM': add0(minutes),
//					'M': minutes,
//					'ss': add0(seconds),
//					's': seconds
//					}
//				alert( "BUGS_1510 format="+format );
//				for( var k in replaceMent ){
//					format = format.replace(k, replaceMent[k]);
//					}
//				}
//			var dt = format;
//			alert( "BUGS_1515 dt="+dt );
//			return(dt);
			}
		</script>		



	<script id="script_dttm" >
		function dttm(args) {
//			alert( "BUGS dttm args="+args );
//			alert( "BUGS dttm now="+now );
//			var today = new Date().toISOString().slice(0, 10);

			var now = new Date();
			var yyyy_mm_dd = new Date().toISOString().slice(0, 10);
			var hh_mm_dd = new Date().toISOString().slice(11, 19);
			var dt=yyyy_mm_dd+"_"+hh_mm_dd;

//			const d = new Date('2010-08-05')
//			const d = new Date();
//			const ye = new Intl.DateTimeFormat('en', { year: 'numeric' }).format(d)
//			const mo = new Intl.DateTimeFormat('en', { month: 'short' }).format(d)
//			const da = new Intl.DateTimeFormat('en', { day: '2-digit' }).format(d)
//			var dt = `${da}-${mo}-${ye}`;
//			var d = date.getDate();
//			var m = date.getMonth() + 1; //Month from 0 to 11
//			var y = date.getFullYear();
//			var dt = '' + y + '-' + (m<=9 ? '0' + m : m) + '-' + (d <= 9 ? '0' + d : d);
//			var strArray=['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];
//			var mth = strArray[date.getMonth()];
//			alert( "BUGS_1543 dt="+dt );
//			console.log("1) "+  new Date().toDateString());
//			console.log("2) "+  new Date().toISOString());
//			console.log("3) "+  new Date().toJSON());
//			alert( "BUGS_1560 dttm dt="+dt );
			return( dt );
			}
		</script>

	<script id="script_postturtle_monkeytrap" >


		function postturtle_monkeytrap(args) {
//			alert( "BUGS_postturtle_monkeytrap args="+args );


var img_monkeytraps = `
/imgs/postturtle_moneytrap/monkeytrap1.png
/imgs/postturtle_moneytrap/monkeytrap2.jpg
/imgs/postturtle_moneytrap/monkeytrap3.jpg
/imgs/postturtle_moneytrap/monkeytrap10.jpg
/imgs/postturtle_moneytrap/monkeytrap11.jpg
/imgs/postturtle_moneytrap/monkeytrap12.jpg
/imgs/postturtle_moneytrap/monkeytrap13.jpg
/imgs/postturtle_moneytrap/monkeytrap14.jpg
/imgs/postturtle_moneytrap/monkeytrap17.jpg
/imgs/postturtle_moneytrap/monkeytrap18.jpg
/imgs/postturtle_moneytrap/monkeytrap20.jpg
/imgs/postturtle_moneytrap/monkeytrap21.png
/imgs/postturtle_moneytrap/monkeytrap22.png
/imgs/postturtle_moneytrap/monkeytrap24.jpg
/imgs/postturtle_moneytrap/monkeytrap28.jpg
/imgs/postturtle_moneytrap/monkeytrap29.jpg
/imgs/postturtle_moneytrap/monkeytrap30.jpg
/imgs/postturtle_moneytrap/monkeytrap31.jpg
/imgs/postturtle_moneytrap/monkeytrap34.png
/imgs/postturtle_moneytrap/monkeytrap36.jpg
/imgs/postturtle_moneytrap/monkeytrap37.jpg
/imgs/postturtle_moneytrap/monkeytrap37.png
/imgs/postturtle_moneytrap/monkeytrap4.png
/imgs/postturtle_moneytrap/monkeytrap5.jpg
/imgs/postturtle_moneytrap/monkeytrap54.jpg
/imgs/postturtle_moneytrap/monkeytrap6.jpg
/imgs/postturtle_moneytrap/monkeytrap7.png
/imgs/postturtle_moneytrap/monkeytrap8.jpg
/imgs/postturtle_moneytrap/monkeytrap9.jpg
`;

var img_postturtles = `
/imgs/postturtle_moneytrap/postturtl10.jpg
/imgs/postturtle_moneytrap/postturtl11.jpg
/imgs/postturtle_moneytrap/postturtl12.jpg
/imgs/postturtle_moneytrap/postturtl13.jpg
/imgs/postturtle_moneytrap/postturtl14.jpg
/imgs/postturtle_moneytrap/postturtl15.png
/imgs/postturtle_moneytrap/postturtl16.jpg
/imgs/postturtle_moneytrap/postturtl17.gif
/imgs/postturtle_moneytrap/postturtl18.jpg
/imgs/postturtle_moneytrap/postturtl2.jpg
/imgs/postturtle_moneytrap/postturtl20.jpg
/imgs/postturtle_moneytrap/postturtl21.jpg
/imgs/postturtle_moneytrap/postturtl22.jpg
/imgs/postturtle_moneytrap/postturtl23.jpg
/imgs/postturtle_moneytrap/postturtl24.jpg
/imgs/postturtle_moneytrap/postturtl25.png
/imgs/postturtle_moneytrap/postturtl26.gif
/imgs/postturtle_moneytrap/postturtl27.jpg
/imgs/postturtle_moneytrap/postturtl3.jpg
/imgs/postturtle_moneytrap/postturtl31.png
/imgs/postturtle_moneytrap/postturtl4.jpg
/imgs/postturtle_moneytrap/postturtl5.jpg
/imgs/postturtle_moneytrap/postturtl6.jpg
/imgs/postturtle_moneytrap/postturtl7.jpg
/imgs/postturtle_moneytrap/postturtl8.jpg
/imgs/postturtle_moneytrap/postturtl9.jpg
/imgs/postturtle_moneytrap/postturtle_caption.jpg
/imgs/postturtle_moneytrap/rose.jpg
# /imgs/postturtle_moneytrap/postturtl33.jpg
`;

var img_floods = `
/imgs/postturtle_moneytrap//floop_rooftop.jpg
/imgs/postturtle_moneytrap//floop_rooftop1.jpg
/imgs/postturtle_moneytrap//floop_rooftop11.jpg
/imgs/postturtle_moneytrap//floop_rooftop12.jpg
/imgs/postturtle_moneytrap//floop_rooftop13.jpg
/imgs/postturtle_moneytrap//floop_rooftop14.jpg
/imgs/postturtle_moneytrap//floop_rooftop15.jpg
/imgs/postturtle_moneytrap//floop_rooftop2.jpg
/imgs/postturtle_moneytrap//floop_rooftop20.jpg
/imgs/postturtle_moneytrap//floop_rooftop21.jpg
/imgs/postturtle_moneytrap//floop_rooftop3.jpg
/imgs/postturtle_moneytrap//floop_rooftop5.jpg
/imgs/postturtle_moneytrap//floop_rooftop6.jpg
/imgs/postturtle_moneytrap//floop_rooftop7.jpg
/imgs/postturtle_moneytrap//floop_rooftop8.jpg
/imgs/postturtle_moneytrap//floop_rooftop9.jpg
`;



//			alert( "BUGS_4181 img_postturtles="+img_postturtles );
//			alert( "BUGS_4182 img_monkeytraps="+img_monkeytraps );

//	<img id="img_postturtle" src="/imgs/postturtle_moneytrap/postturtle_caption.jpg" onclick="window.open('/?postturtle');return false;" height=200 border=0 draggable="true">
//	<img id="img_monkeytrap" src="/imgs/postturtle_moneytrap/monkeytrap10.jpg" onclick="window.open('/?monkeytrap');return false;" height=200 border=0 draggable="true">
//	<img id="img_flood" src="/imgs/postturtle_moneytrap/floop1.jpg" onclick="window.open('/?flood');return false;" height=200 border=0 draggable="true">

			var turtle=0; var turtle_max=0;
			var monkey=0; var monkey_max=0;
			var flood=0; var flood_max=0;
			
			var turtle_max = img_postturtles.split("\n").length;
			var monkey_max = img_monkeytraps.split("\n").length;
			var flood_max = img_floods.split("\n").length;
			turtle = random_int(turtle_max,0);
			monkey = random_int(monkey_max,0);
			flood = random_int(flood_max,0);
			var img_postturtle = img_postturtles.split("\n")[turtle];
			var img_monkeytrap = img_monkeytraps.split("\n")[monkey];
			var img_flood = img_floods.split("\n")[flood];

			if( filecheck(img_postturtle)) {
				if( document.getElementById("img_postturtle")) {
					document.getElementById("img_postturtle").src=img_postturtle;
					}
				}
			if( filecheck(img_monkeytrap)) {
				if( document.getElementById("img_monkeytrap")) {
					document.getElementById("img_monkeytrap").src=img_monkeytrap;
					}
				}
			if( filecheck(img_flood)) {
				if( document.getElementById("img_flood")) {
					document.getElementById("img_flood").src=img_flood;
					}
				}
			}
		</script>




	</head>


<!-- <body bgcolor=darkslategrey> -->
<!-- <body bgcolor=wheat> -->
<!-- <body bgcolor=#FFFDDA> -->
<!-- <body onload="startup(''); return false;" > -->

<!--
<body onload="startup('');init_jaxgrid(); return false;">
	-->
<body onload="startup('');init_jaxgrid(); return false;">

<!-- Load an icon library to show a hamburger menu (bars) on small screens -->
<!-- <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css"> -->
<!-- Top Navigation Menu -->
		<div class="topnav">
			<a href="#home" class="active">
				<img id="img_topnav_logo" src="/imgs/btn/ok.png" height=50>
				</a>
	
<!-- Navigation links (hidden by default) -->
		<div id="myLinks">
			<div id="div_kogrids_m"></div>
			<canvas id="canvas_m" onclick="window.open('/?canvas_m'); return false;" height=400 witdh=400 draggable="true"></canvas>
			<a href="#news">News</a>
			<a href="#contact">Contact</a>
			<a href="#about">About</a>
			<img src="/fb/jkwii/pages/1.jpg" onclick="window.open('/fb/jkwii');return false;" border=0 height=100>
			<hr color=white>
			<hr color=black>
			<a href="/notes.txt">notes</a>
			<a href="#about">About</a>
			<div id="div_log_m"><h1>div_log_m</h1></div>
			</div>

<!-- "Hamburger menu" / "Bar icon" to toggle the navigation links -->
		<a href="javascript:void(0);" class="icon" onclick="myFunction()">
			<i class="fa fa-bars"></i>
			</a>
		</div>

	<div id="div_kogrids_w" >
<!--		<img src="/imgs/btn/koeye_handhither.gif" onclick="startup(''); return false" height=50 border=0 > -->
		</div>
	<div id="div_buttons_hideshow_w">
		<img src="/imgs/btn/koeye_alloff.png" height=50 onclick="script_hideshow('alloff');return false;" alt="btn_alloff">
		<img src="/imgs/btn/koeye_toggle.png" height=50 onclick="script_hideshow('toggle');return false;" alt="btn_alloff">
		<img src="/imgs/btn/koeye_allon.png" height=50 onclick="script_hideshow('allon');return false;" alt="btn_allon">
		<br>
		<hr color=white>
		<hr color=black>
<!--		<img src="/imgs/btn/koeyew_slots.png" height=50 onclick="script_hideshow('div_slots');return false;" alt="btn_slots"> -->
<!--		<img src="/imgs/btn/koeyew_hl.png" height=50 onclick="script_hideshow('div_hl');return false;" alt="btn_hl"> -->
<!--		<img src="/imgs/btn/koeyew_hllinks.png" height=50 onclick="script_hideshow('div_hllinks');return false;" alt="btn_hllinks"> -->
<!--		<img src="/imgs/btn/koeyew_hltext.png" height=50 onclick="script_hideshow('div_hltext');return false;" alt="btn_hltext"> -->
<!--		<img src="/imgs/btn/koeyew_hlmedia.png" height=50 onclick="script_hideshow('div_hltext');return false;" alt="btn_hlmedia"> -->
<!--		<img src="/imgs/btn/koeyew_games.png" height=50 onclick="script_hideshow('div_games');return false;" alt="btn_games"> -->
<!--		<img src="/imgs/btn/koeyew_av_jtfdc.png" height=50 onclick="script_hideshow('div_av_jtfdc');return false;" alt="btn_av_jtfdc"> -->
<!--		<img src="/imgs/btn/koeyew_av_jtfinc.png" height=50 onclick="script_hideshow('div_av_jtfinc');return false;" alt="btn_av_jtfinc"> -->
<!--		<img src="/imgs/btn/koeyew_av_jtfdcr.png" height=50 onclick="script_hideshow('div_av_jtfdcr');return false;" alt="btn_av_jtfdcr"> -->

		<img src="/imgs/btn/koeyew_av.png" height=50 onclick="script_hideshow('div_av');return false;" alt="btn_av">
		<img src="/imgs/btn/koeyew_bb.png" height=50 onclick="script_hideshow('div_db');return false;" alt="btn_db">
		<img src="/imgs/btn/koeyew_dd.png" height=50 onclick="script_hideshow('div_dd');return false;" alt="btn_dd">
		<img src="/imgs/btn/koeyew_fb.png" height=50 onclick="script_hideshow('div_fb');return false;" alt="btn_fb">
		<img src="/imgs/btn/koeyew_fs.png" height=50 onclick="script_hideshow('div_fs');return false;" alt="btn_fs">
		<img src="/imgs/btn/koeyew_pn.png" height=50 onclick="script_hideshow('div_pn');return false;" alt="btn_pn">
		<img src="/imgs/btn/koeyew_sl.png" height=50 onclick="script_hideshow('div_sl');return false;" alt="btn_sl">
		<img src="/imgs/btn/koeyew_tl.png" height=50 onclick="script_hideshow('div_tl');return false;" alt="btn_tl">
		<img src="/imgs/btn/koeyew_tm.png" height=50 onclick="script_hideshow('div_tm');return false;" alt="btn_tm">
		<img src="/imgs/btn/koeyew_yt.png" height=50 onclick="script_hideshow('div_yt');return false;" alt="btn_yt">
		<img src="/imgs/btn/koeyew_zm.png" height=50 onclick="script_hideshow('div_zm');return false;" alt="btn_zm">
		<br>
		<img src="/imgs/btn/koeyew_jtfdc.png" height=50 onclick="script_hideshow('div_jtfdc');return false;" alt="btn_jtfdc">
		<img src="/imgs/btn/koeyew_jtfinc.png" height=50 onclick="script_hideshow('div_jtfinc');return false;" alt="btn_jtfinc">
		<img src="/imgs/btn/koeyew_jtfdcr.png" height=50 onclick="script_hideshow('div_jtfdcr');return false;" alt="btn_jtfdcr">
		<br>
		<img src="/imgs/btn/koeyew_head.png" height=50 onclick="script_hideshow('div_head');return false;" alt="btn_head">
		<img src="/imgs/btn/koeyew_body.png" height=50 onclick="script_hideshow('div_body');return false;" alt="btn_body">
		<img src="/imgs/btn/koeyew_memes.png" height=50 onclick="script_hideshow('div_memes');return false;" alt="btn_memes">
		<img src="/imgs/btn/koeyew_kov.png" height=50 onclick="script_hideshow('div_kov');return false;" alt="btn_kov">
		<img src="/imgs/btn/koeyew_tail.png" height=50 onclick="script_hideshow('div_tail');return false;" alt="btn_tail">
		</div>



	<div id="div_blob_w" hidden >
		<h3>blobsallad_w</h3>
		<hr color=white>
		<canvas id="canvas_blob_w" width="600" height="400"></canvas><br>
		<hr color=white>

		<img id="img_startstop" src="/imgs/btn/koeye.png" onclick="startstop();return false;" height=30>
<!-- -= start =- -= stop =- -->
		<br>
		<hr color=whtie>
		<img src="/imgs/btn/koeyeb.png" onclick="blobColl.split();return false;" height=30>
		<img src="/imgs/btn/koeyeb.png" onclick="toggleGravity();return false;" height=30>
		<img src="/imgs/btn/koeyeb.png" onclick="blobColl.join();return false;" height=30>
<!-- -= + =- -= = =- -= - =- -->
		<hr color=whtie>
		<br>
		<img src="/imgs/btn/koeyeb.png" onclick="blobColl.addForce( new Vector(-50.0,0.0));return false;" height=30>
		<img src="/imgs/btn/koeyeb.png" onclick="blobColl.addForce( new Vector(0.0,-50.0));return false;" height=30>
		<img src="/imgs/btn/koeyeb.png" onclick="blobColl.addForce( new Vector(0.0,50.0));return false;" height=30>
		<img src="/imgs/btn/koeyeb.png" onclick="blobColl.addForce( new Vector(50.0,0.0));return false;" height=30>
<!-- -= l =- -= u =- -= d =- -= r =- -->
		<hr color=whtie>
<br>
		</div>



	<hr color=white>
	<hr color=linen>
	<hr color=black>
	<div id="div_postturtle_monkeytrap">
		<img id="img_postturtle" src="/imgs/postturtle_moneytrap/postturtl2.jpg" onclick="window.open('/?postturtle');return false;" height=200 border=0 draggable="true">
		<img id="img_monkeytrap" src="/imgs/postturtle_moneytrap/monkeytrap2.jpg" onclick="window.open('/?postturtle');return false;" height=200 border=0 draggable="true">
		<img id="img_flood" src="/imgs/postturtle_moneytrap/floop_rooftop2.jpg" onclick="window.open('/?postturtle');return false;" height=200 border=0 draggable="true">
		</div>
	<br>
	<hr color=black>
	<hr color=red>
	<hr color=white>
	<hr color=blue>
	<hr color=white>
	<div id="div_tclaw" >
		<img src="/fb/iperms/pages/1.jpg" alt="fb/law/tc"
			onclick="window.open('iperms.com');return false;"
			height=200 border=0>
		&nbsp &nbsp &nbsp &nbsp
		<img src="/imgs/btn/ko_center2.png" alt="ko_center"
			onclick="window.open('/ko_center/ko_center.php');return false;"
			height=100 border=0>
		<img src="/imgs/btn/ko_center_tools.png" alt="ko_center_tools"
			onclick="window.open('/ko_center/ko_center.php?q=tools');return false;"
			height=100 border=0>
		<img src="/imgs/btn/ko_center_zm.png" alt="ko_center_zm"
			onclick="window.open('/ko_center/zm5/hrc_d.htm');return false;"
			height=100 border=0>
		<img src="/imgs/btn/ko_saic.png" alt="ko_saic"
			onclick="window.open('/ko_saic/ko_saic.php');return false;"
			height=100 border=0>
		&nbsp &nbsp &nbsp &nbsp
		<img src="/fb/focus/pages/1.jpg" alt="fb/focus"
			onclick="window.open('/fb/focus');return false;"
			height=200 border=0>
		&nbsp &nbsp &nbsp &nbsp
		<img src="/fb/konet/pages/1.jpg" alt="fb/law/tc"
			onclick="window.open('konet.org');return false;"
			height=200 border=0>
		<hr color=white>


<!--
		<img src="/fb/law/tc/kk/pages/1.jpg" alt="fb/law/tc/kk"
			onclick="window.open('/fb/law/tc/kk');return false;"
			height=200 border=0>
		&nbsp &nbsp &nbsp &nbsp




		<img src="/fb/jtfdc/pages/1.jpg" alt="fb/jtfdc"
			onclick="window.open('/fb/jtfdc/');return false;"
			height=200 border=0>
		&nbsp &nbsp &nbsp &nbsp
		<img src="/fb/jtfdcr/pages/1.jpg" alt="fb/jtfdcr"
			onclick="window.open('/fb/jtfdcr');return false;"
			height=200 border=0>
		&nbsp &nbsp &nbsp &nbsp
		<img src="/fb/law/tc/pages/1.jpg" alt="fb/law/tc"
			onclick="window.open('/fb/law/tc/');return false;"
			height=200 border=0>
		<hr color=white>
		&nbsp &nbsp &nbsp &nbsp
		<img src="/fb/stlc/pages/1.jpg" alt="fb/stlc"
			onclick="window.open('/fb/stlc/');return false;"
			height=200 border=0>
		<hr color=white>
		<br><br><br><br>
		<img src="/fb/neuz/pages/1.jpg" alt="fb/neuz"
			onclick="window.open('/fb/neuz/');return false;"
			height=200 border=0>
		&nbsp &nbsp &nbsp &nbsp
		<img src="/fb/law/pages/1.jpg" alt="fb/law"
			onclick="window.open('/fb/law/');return false;"
			height=200 border=0>
		&nbsp &nbsp &nbsp &nbsp
		<img src="/fb/med/pages/1.jpg" alt="fb/med"
			onclick="window.open('/fb/med/');return false;"
			height=200 border=0>
		&nbsp &nbsp &nbsp &nbsp
		<img src="/fb/gov/pages/1.jpg" alt="fb/gov"
			onclick="window.open('/fb/gov/');return false;"
			height=200 border=0>
		&nbsp &nbsp &nbsp &nbsp
		<img src="/fb/heart/pages/1.jpg" alt="fb/gov"
			onclick="window.open('/fb/heart/');return false;"
			height=200 border=0>
		&nbsp &nbsp &nbsp &nbsp
		<img src="/fb/soul/pages/1.jpg" alt="fb/gov"
			onclick="window.open('/fb/soul/');return false;"
			height=200 border=0>
		&nbsp &nbsp &nbsp &nbsp
		&nbsp &nbsp &nbsp &nbsp
		<img src="/fb/gofunwii/pages/1.jpg" alt="fb/gov"
			onclick="window.open('/fb/gofunwii/');return false;"
			height=200 border=0>
		<br><br><br><br>
		<img src="/fb/kitiworks/pages/1.jpg" alt="fb/gov"
			onclick="window.open('/fb/kitiworks/');return false;"
			height=100 border=0>
		&nbsp &nbsp &nbsp &nbsp
		<img src="/fb/pastryroad/pages/1.jpg" alt="fb/gov"
			onclick="window.open('/fb/pastryroad/');return false;"
			height=100 border=0>
		&nbsp &nbsp &nbsp &nbsp
		<img src="/fb/nwm/pages/1.jpg" alt="fb/gov"
			onclick="window.open('/fb/nwm/');return false;"
			height=100 border=0>
		&nbsp &nbsp &nbsp &nbsp
		<img src="/fb/konabus/pages/1.jpg" alt="fb/gov"
			onclick="window.open('/fb/konabus/');return false;"
			height=100 border=0>
		&nbsp &nbsp &nbsp &nbsp
		<img src="/fb/kt/pages/1.jpg" alt="fb/gov"
			onclick="window.open('/fb/kt/');return false;"
			height=100 border=0>
		&nbsp &nbsp &nbsp &nbsp
		<img src="/fb/go/pages/1.jpg" alt="fb/gov"
			onclick="window.open('/fb/go/');return false;"
			height=100 border=0>
		&nbsp &nbsp &nbsp &nbsp
		<img src="/fb/kou/pages/1.jpg" alt="fb/gov"
			onclick="window.open('/fb/kou/');return false;"
			height=100 border=0>
		&nbsp &nbsp &nbsp &nbsp
		<img src="/imgs/btn/jsdoit.png" alt="jsdoit"
			onclick="window.open('/jsdoit.html');return false;"
			height=100 border=0>
		<img src="/imgs/btn/jaxgrid.png" alt="jsdoit"
			onclick="window.open('/jaxgrid.html');return false;"
			height=100 border=0>
		</div>
	<hr color=linen>
	<hr color=white>
	<br>


		<img src="/fb/law/tc/k2/pages/1.jpg" alt="fb/law/tc/k2"
			onclick="window.open('/fb/law/tc/k2');return false;"
			height=200 border=0>
		&nbsp &nbsp &nbsp &nbsp
	-->
		<hr color=white>
		<hr color=white>
		<br>

<!--
	<header class="PreloadJS">
		<h1>Example: Media Grid</h1>
		<p>PreloadJS can load a variety of media. In this example, click each
			example to load its related item.
			Once the item is loaded, it will display (image, svg), play (sound),
			apply to the document (css), or display
			an alert (script). Note that when loading images, sounds, css, scripts,
			or svg locally, you need to ensure
			that PreloadJS uses tag loading to avoid cross-origin errors. Other
			media types will not load locally.</p>
		</header>
	-->
<!--
	-->
	<div id="controls">
		Click an item to load it. 
		<input type="button" value="Load the entire manifest"
			onclick="loadManifest()">
		</div>

	<div id="imageGrid">
			<div id="/txt/Texas.jpg" onclick="loadAsset(this)" class="gridBox"
				style="width: 300px; height: 375px;">
			<label>Image</label>
			</div>

	<div id="/txt/bg.css" onclick="loadAsset(this)" class="gridBox">
		<label>CSS - Background</label>
	</div>

	<div id="/txt/alert1.js" onclick="loadAsset(this)" class="gridBox">
		<label>JavaScript</label>
	</div>

	<div id="/txt/grant.xml" onclick="loadAsset(this)" class="gridBox">
		<label>XML</label>
	</div>

	<div id="/txt/gbot.svg" onclick="loadAsset(this)" class="gridBox"
		 style="width:200px; height:226px; float: right; overflow:hidden">
		<label>SVG</label>
	</div>

	<div id="/txt/grant.json" onclick="loadAsset(this)" class="gridBox">
		<label>JSON</label>
	</div>

	<div id="/txt/font.css" onclick="loadAsset(this)" class="gridBox">
		<label>CSS - Font Color</label>
	</div>

	<div id="/txt/Thunder.mp3" onclick="loadAsset(this)"
		 class="gridBox">
		<label>Audio</label>
	</div>

	<div id="http://ko1.us/tl/tl.json" type="jsonp"
		 onclick="loadAsset(this)" class="gridBox"
		 style="width:200px; height:73px; float: right; overflow:hidden">
		<label>JSONP<br/>-= ko1us/tl/tl.json =-</label>
		</div>
<!--
	<div id="//gskinner.com/assets/createjs/mapsJSONP.json" type="jsonp"
		 onclick="loadAsset(this)" class="gridBox"
		 style="width:200px; height:73px; float: right; overflow:hidden">
		<label>JSONP<br/>(loaded from gskinner.com)</label>
		</div>
	-->

	<div id="/txt/Autumn.png" onclick="loadAsset(this)" class="gridBox"
		 style="width:454px; height:147px">
		<label>Image</label>
	</div>

		<div id="NoFileHere.png" onclick="loadAsset(this)" class="gridBox"
			 style="width:200px; height:72px;">
			<label>unavailable<br/>access attempt logged</label>
			</div>
		</div>


<!--	<center> -->
	<br><br><br><br>
	<br><br><br><br>
	<br><br><br><br>
	<br><br><br><br>
	<br><br><br><br>
	<br><br><br><br>
	<div id="div_kov_w" ><h1>div_kov_w</h1></div>
	<br><br><br><br>
	<div id="div_divs" ><h1>div_divs</h1>
		<img src="/imgs/btn/koeye_handhither.gif" onclick="koshow('divs'); return false;"
			draggable="true" height=50 >
		<img src="/imgs/btn/koeyeb_divs.png" onclick="koshow('divs'); return false;"
			draggable="true" height=50 >
		</div id="div_divs_tail">
	<br><br><br><br>
	<div id="div_kovs" ><h1>div_kovs</h1>
		<img src="/imgs/btn/koeye_handhither.gif" onclick="koshow('kovs'); return false;"
			draggable="true" height=50 >
		<img src="/imgs/btn/koeyeb_kovs.png" onclick="koshow('kovs'); return false;"
			draggable="true" height=50 >
		</div id="div_kovs_tail">
	<br><br><br><br>
	<div id="div_yt" ><h1>div_yt</h1>
		bug hunting
		<br>
<!--
		<img src="/imgs/btn/koeye_handhither.gif" onclick="koshow('yt'); return false;"
			draggable="true" height=50 >
		-->
		<img src="/imgs/btn/koeyeb_yt.png" onclick="koshow('yt'); return false;"
			draggable="true" height=25 >
		</div id="div_yt_tail">



	<div id="div_bb_w"><h1>div_bb_w</h1>
	<hr color=white>
	<hr color=black>
<!--	<canvas id="canvas_anim" color="darkslategray" onclick="window.open('/?canvas'); return false;"  -->
	<canvas id="canvas_anim" onclick="window.open('/todays.html?id=jtfdc_202004'); return false;" height=400 witdh=400 draggable="true"></canvas>
		height=600 width=2000 draggable="true"></canvas>
	<hr color=black>
	<hr color=white>
	<hr color=white>
	<hr color=black>
<!--	<canvas id="canvas_wiibb" color="darkslategray" onclick="window.open('/?canvas'); return false;"  
		height=600 width=2000 draggable="true"></canvas>
	-->
<!--

	<canvas id="canvas_bbwii" onclick="window.open('/todays.html?id=jtfdc_202004'); return false;" height=650 witdh=2000 draggable="true"></canvas>
	<hr color=black>
	<hr color=white>
	<hr color=yellow>
	<canvas id="canvas_blobs" onclick="window.open('/blobs.html?id=jtfdc_202004'); return false;" height=650 witdh=2000 draggable="true"></canvas>
	<hr color=white>
	<hr color=black>
	-->
<!--
	<canvas id="canvas" color="darkslategray" onclick="window.open('/?canvas'); return false;" 
		height=600 width=2000 draggable="true"></canvas>
	-->
	<canvas id="canvas" color="darkslategray" onclick="window.open('/todays.html?id=jtfdcr_202004'); return false;" 
		height=600 width=2000 draggable="true"></canvas>
	<hr color=black>
	<hr color=white>
	</div id="div_bb_w_tail">

	<div id="div_hl_w">
		<hr color=red>
		<hr color=white>
		<hr color=blue>
		<img src="/fb/jtfdc/pages/jtfdc_keepout_covd_eagles.jpg" height=900
			alt = "jtfdcr_keepout_covid_lockdown_eagles"
			onclick="window.open('/todays.html?id=20200413');return false;"
			width=1200 border=0>
		<br>
		<hr color=black>
		<hr color=red>
		<hr color=black>
		<img src="/fb/med/imgs/cdc_coronavirus_disease_2019.png" 
			onclick="window.open('http://cdc.gov');return false;"
			width=1200 border=0>
		<hr color=blue>
		<hr color=white>
		<hr color=red>


	<details id="details_w">
		<summary>details_w</summary>
		<h1> something small enough to escape casual notice</h1>
		<pre>
		global pandemic lockdown
		shelter in place

		<h1>our home - our private court - our business</h1>
		<pre>
		private court markers need to be 
		restored/returned/replaced

		- sawhorse with stop and private property signs
		- pair of our stolen/siezed 500 lb cement eagles
		- pair of our stolen/siezed survallence cameras

		who delegated authority to 
		prohibit and obstruct
		our attempts to comply with
		national "shelter in place/lockdown" orders

			
		gang of insane neigbors declare 
		- our private court est 1978 
		- our private driveway 300 feet offroad since 2001
		- our easement to our back yard and shared barn 

		thier public turnaround and commons
		thier private dog pony club
		all thier friends support thier taking

		people should live your own lives
		please just leave us alone

		</pre>

		
		defford court has its own 
		internal issues disputes to resolve with 

		the haslekassldorfers

		our donutvanloaw showhorned 
		sisterhouse neigbors 

		ignore the severe and impending damage 
		thier unapproved mini-shed installation has caused.
			- the 300 foot sinkhole under our driveway
			- collapsing barn wall from erosion mud 
			- denial of service to our own back yard

		needs to end
			dogs / easement blockage / 
			setups and  fake police calls


		still working 
		making wonderful things happen

		does a falling tree make a sound
		if your not thier to hear it?
		yes

		"build it and they will come"
		working on my party dress - nowhere to go

		jkwii @hi_risk 
		</pre>
		<img src="/fb/jtfdc/pages/1.jpg" onclick="window.open('/fb/jtfdc/'); return false;" border=0 height=100>
		</details>

	<img src="/imgs/btn/ko.png" onclick="window.open('http://ko2.us');return false;" >
	<img src="/imgs/btn/koeye_jitsi.png" onclick="window.open('https://meet.jit.si/ko2us'); return false;" border=0 >
	<img src="/imgs/btn/koeye_duckduckgo.png" onclick="window.open('http://duckduckgo.com');return false;" >
	<img src="/imgs/btn/koeye_dailymail.png" onclick="window.open('http://dailymail.co.uk');return false;" >
	<img src="/imgs/btn/koeye_zerohedge.png" onclick="window.open('http://zerohedge.com');return false;" >
	<img src="/imgs/btn/koeye_youtube.png" onclick="window.open('http://youtube.com');return false;" >
	<img src="/imgs/btn/koeye_mars.png" onclick="window.open('https://mars.nasa.gov/msl/multimedia/raw-images/?order=sol+desc%2Cinstrument_sort+asc%2Csample_type_sort+asc%2C+date_taken+desc&per_page=50&page=0&mission=msl');return false;" >
	<img src="/imgs/btn/ok.png" onclick="window.open('http://ko1.us');return false;" >
	<hr color=red>
	<hr color=white>
	<hr color=blue>


<!--	<img src="/imgs/btn/koeye_handhither.gif" onclick="startup_canvas(''); return false" height=50 border=0 > -->
<!--	<img src="/imgs/btn/koeye_handhither.gif" onclick="dttm(''); return false" height=50 border=0 > -->

<!--
	<div id="div_buttons_hideshow_w" >
		<h1>div_buttons_hideshow_w</h1>
		<img src="/imgs/btn/kop23.png" width=200 height=80 onclick="script_hideshow('alloff');return false;" >
		<canvas id="canvas_button_alloff_w" width=200 height=80 onclick="script_hideshow('alloff');return false;" ></canvas>
		<img src="/imgs/btn/kop23.png" width=200 height=80 onclick="script_hideshow('allon');return false;" >
		<canvas id="canvas_button_allon_w" width=200 height=80 onclick="script_hideshow('allon');return false;" ></canvas>
		<br>
		<img src="/imgs/btn/kop23.png" width=200 height=80 onclick="script_hideshow('head');return false;" >
		<canvas id="canvas_button_head_w" width=200 height=80 onclick="script_hideshow('head');return false;" ></canvas>
		<img src="/imgs/btn/kop23.png" width=200 height=80 onclick="script_hideshow('head');return false;" >
		<canvas id="canvas_button_setup_w" width=200 height=80  onclick="script_hideshow('setup');return false;"></canvas>
		<img src="/imgs/btn/kop23.png" width=200 height=80 onclick="script_hideshow('head');return false;" >
		<canvas id="canvas_button_hunt_w" width=200 height=80  onclick="script_hideshow('hunt');return false;"></canvas>
		<img src="/imgs/btn/kop23.png" width=200 height=80 onclick="script_hideshow('tag');return false;" >
		<canvas id="canvas_button_tag_w" width=200 height=80  onclick="script_hideshow('tag');return false;"></canvas>
		<img src="/imgs/btn/kop23.png" width=200 height=80 onclick="script_hideshow('swarm');return false;" >
		<canvas id="canvas_button_swarm_w" width=200 height=80  onclick="script_hideshow('swarm');return false;"></canvas>
		<img src="/imgs/btn/kop23.png" width=200 height=80 onclick="script_hideshow('tail');return false;" >
		<canvas id="canvas_button_tail_w" width=200 height=80  onclick="script_hideshow('tail');return false;"></canvas>
	-->
		</div>
	<hr color=yellow>
	<hr color=red>

<!--
	<div id="div_buttons_hideshow_b" ><h1>div_buttons_hideshow_b</h1></div>
	<div id="div_buttons_hideshow_w" ><h1>div_buttons_hideshow_w</h1></div>
	<div id="div_buttons_hideshow_m" ><h1>div_buttons_hideshow_m</h1></div>
	-->

	<canvas id="canvas_button_alloff_w"></canvas>
	<canvas id="canvas_button_alltoggle_w"></canvas>
	<canvas id="canvas_button_head_w"></canvas>
<!--
	<canvas id="canvas_button_setup_w"></canvas>
	<canvas id="canvas_button_av_w"></canvas>
	<canvas id="canvas_button_fb_w"></canvas>
	<canvas id="canvas_button_sl_w"></canvas>
	<canvas id="canvas_button_tl_w"></canvas>
	<canvas id="canvas_button_yt_w"></canvas>
	<canvas id="canvas_button_zm_w"></canvas>
	-->

<!--
	<hr color=white>
	<hr color=black>
	<canvas id="canvas" color="darkslategray" onclick="window.open('/?canvas'); return false;" 
		height=600 width=2000 draggable="true"></canvas>
	<hr color=black>
	<hr color=white>
	-->

	<canvas id="canvas_w" onclick="window.open('/?canvas_w'); return false;" height=200 witdh=400 draggable="true"></canvas>
	<canvas id="canvas_b" onclick="window.open('/?canvas_b'); return false;" height=400 witdh=200 draggable="true"></canvas>
	<hr color=white>
	<hr color=black>

	<div id="div_msg_w" >
		<h1>div_msg_w<h2>
		</div>
	<hr color=black>
	<hr color=white>

<!--	<img src="/imgs/btn/koeye_handhither.gif" onclick="startup(''); return false" > -->
<!--	<img src="/imgs/btn/koeye_handhither.gif" onclick="script_hideshow('alloff'); return false" > -->

	<hr color=white>
	<hr color=black>
	<div id="div_log_w" ><h1>div_log_w</h1></div>
	<br><br><br><br>
	<hr color=blue>
	<hr color=white>
	<hr color=red>
	<br><br><br><br>


	<div id="div_fblink" >
		<h1>div_fblink</h1>
		<hr color=red>
		<img src="/imgs/btn/koeye_handhither.gif" onclick="show_kolists('');return false;"
			height=200 >
		<hr color=red>
		</div>
	<div id="div_fb_w" ><h1>div_fb_w</h1>
		<div id="canvas_fb">
		<div class="zoom-icon zoom-icon-in"></div>
			<div class="magazine-viewport">
				<div class="container">
					<div class="magazine">
				<!-- Next button -->
				<div ignore="1" class="next-button"></div>
				<!-- Previous button -->
				<div ignore="1" class="previous-button"></div>
				</div>
			</div>
		</div>

<!-- Thumbnails -->
	<div id="div_tn"></div>
<!--	<div class="thumbnails" hidden> -->
	<div class="thumbnails" >
		<div>
			<ul>
			<li class="i">
				<img src="pages/tn/tn_1.png" width="76" height="100" class="page-1">
				<span>1</span>
				</li>
			<li class="d">
				<img src="pages/tn/tn_2.png" width="76" height="100" class="page-2">
				<img src="pages/tn/tn_3.png" width="76" height="100" class="page-3">
				<span>2-3</span>
				</li>
			<li class="d">
				<img src="pages/tn/tn_4.png" width="76" height="100" class="page-4">
				<img src="pages/tn/tn_5.png" width="76" height="100" class="page-5">
				<span>4-5</span>
				</li>
			<li class="d">
				<img src="pages/tn/tn_6.png" width="76" height="100" class="page-6">
				<img src="pages/tn/tn_7.png" width="76" height="100" class="page-7">
				<span>6-7</span>
				</li>
			<li class="d">
				<img src="pages/tn/tn_8.png" width="76" height="100" class="page-8">
				<img src="pages/tn/tn_9.png" width="76" height="100" class="page-9">
				<span>8-9</span>
				</li>
			<li class="d">
				<img src="pages/tn/tn_10.png" width="76" height="100" class="page-10">
				<img src="pages/tn/tn_11.png" width="76" height="100" class="page-11">
				<span>10-11</span>
				</li>
			<li class="d">
				<img src="pages/tn/tn_12.png" width="76" height="100" class="page-12">
				<img src="pages/tn/tn_13.png" width="76" height="100" class="page-13">
				<span>12-13</span>
				</li>
			<li class="d">
				<img src="pages/tn/tn_14.png" width="76" height="100" class="page-14">
				<img src="pages/tn/tn_15.png" width="76" height="100" class="page-15">
				<span>14-15</span>
				</li>
			<li class="d">
				<img src="pages/tn/tn_16.png" width="76" height="100" class="page-14">
				<img src="pages/tn/tn_17.png" width="76" height="100" class="page-15">
				<span>16-17</span>
				</li>
			<li class="i">
				<img src="pages/tn/tn_18.png" width="76" height="100" class="page-16">
				<span>18</span>
				</li>
			<ul>
			<div>	</div>
		</div>
	</div>
	</div id="div_fb_w_tail" >

	<br><br><br><br>
	<br><br><br><br>
	<br><br><br><br>



<hr color="white">
<hr color="pink">
<div id="div_happyeaster" >
<h1>div_happyeaster</h1>
<hr color="white">
<hr color="pink">

	<hr color=white>
	<hr color=pink>
	<hr color=red>
	<hr color=pink>
	<hr color=white>
<!--
	<script id="script_youtubeapi">
		function youtube_api(args) {
			var ytid = "WhWc3b3KhnY";
			$data = file_get_contents("https://www.googleapis.com/youtube/v3/videos?key=YOUR_API_KEY&part=snippet&id="+ytid);
			$json = json_decode($data);
			var_dump($json->items[0]->snippet->thumbnails);
			}
		</script>
	-->

	<div id="div_yt_w" draggable="true" ><h1>div_yt_w</h1>
	<img src="https://img.youtube.com/vi/2Q3y3Cre1-k/default.jpg"
		alt="yt_kitt_avril"
		onclick="window.open('https://www.youtube.com/watch?v=2Q3y3Cre1-k');return false;"
			); return false;"
		height=200 border=0 >  


	<img src="https://img.youtube.com/vi/WhWc3b3KhnY/default.jpg"
		alt="yt_spring"
		onclick="window.open('https://www.youtube.com/watch?v=WhWc3b3KhnY');return false;"
			); return false;"
		height=200 border=0 >  


	&nbsp &nbsp &nbsp &nbsp
	<img src="https://img.youtube.com/vi/7fjTY_ABMj0/default.jpg"
		alt="yt_morrison_2008"
			onclick="window.open('https://www.youtube.com/watch?v=7fjTY_ABMj0&list=PL7919B9B0B051C6A8&index=1'); return false;"
			); return false;"
		height=200 border=0 >  
	&nbsp &nbsp &nbsp &nbsp

	<img src="https://img.youtube.com/vi/IAaLzP1U4nc/default.jpg"
		alt="yt_first_of_spring"
		onclick="window.open('https://www.youtube.com/watch?v=IAaLzP1U4nc');return false;"
			); return false;"
		height=200 border=0 >  

	<img src="https://img.youtube.com/vi/T2fLsCPd1-I/default.jpg"
		alt="yt_chillicothe_1938"
		onclick="window.open('https://www.youtube.com/watch?v=T2fLsCPd1-I');return false;"
			); return false;"
		height=200 border=0 >  
	<br><br>

<!--
	<img src="https://img.youtube.com/vi/QEcTjhUN_7U/default.jpg"
		alt="yt_harold_loyd_safty"
		onclick="window.open('https://www.youtube.com/watch?v=QEcTjhUN_7U');return false;"
			); return false;"
		height=100 border=0 >  
	&nbsp &nbsp &nbsp &nbsp	
-->

<!--
	<img src="/imgs/btn/kobubbleb_avril.png"
		alt="test2_mp4 /index1_avril.mp4"
		onclick="window.open('/index1_avril.mp4');return false;"
			); return false;"
		height=200 border=0 >  
	-->


	&nbsp &nbsp &nbsp &nbsp
	<br><br>
	<hr color=green>
	<img src="/imgs/btn/kobubbleb.png"
		alt="videobox_avril /index1_avril.mp4"
		onclick="window.open('/av/show_videobox.html?avid=/index1_avril.mp4');return false;"
			); return false;"
		height=100 border=0 >  
	&nbsp &nbsp &nbsp &nbsp


<!-- twins	<img src="/imgs/gif/eggs/giphy_eggs_03.gif" height=100> -->
<!--	<img src="/imgs/gif/eggs/giphy_eggs_03.gif" height=200 -->

	<div id="div_jtfdc_stalkarounds">
		<h1>jtfdc_stalkarounds</h1>
		</div>


	<script id="script_jtfdc_stalkarounds">

		function jtfdc_stalkarounds(args) {
kolists['jtfdc_stalkarounds'] = `
/kb/jtfdcr/vid/jtfdc_stalkarounds/jtfdc_20200503_0810_stalkaroundacross_dogs2.mp4|/imgs/mp4gifs/jtfdc_20200503_0810_stalkaroundacross_dogs2.jpg
/kb/jtfdcr/vid/jtfdc_stalkarounds/jtfdc_20200503_1656_stalkaoundacross_shiygrey_cpl.mp4|/imgs/mp4gifs/jtfdc_20200503_1656_stalkaoundacross_shiygrey_cpl.jpg
/kb/jtfdcr/vid/jtfdc_stalkarounds/jtfdc_20200503_1815_jtf30_doogys_allin.mp4|/imgs/mp4gifs/jtfdc_20200503_1815_jtf30_doogys_allin.jpg
/kb/jtfdcr/vid/jtfdc_stalkarounds/jtfdc_20200503_1816_stalkaround_drksqrbak.mp4|/imgs/mp4gifs/jtfdc_20200503_1816_stalkaround_drksqrbak.jpg
/kb/jtfdcr/vid/jtfdc_stalkarounds/jtfdc_20200503_1825_stalkaroudup_shyredcpl.mp4|/imgs/mp4gifs/jtfdc_20200503_1825_stalkaroudup_shyredcpl.jpg
/kb/jtfdcr/vid/jtfdc_stalkarounds/jtfdc_20200503_1825_stalkaroundup_shinysilverguy.mp4|/imgs/mp4gifs/jtfdc_20200503_1825_stalkaroundup_shinysilverguy.jpg
/kb/jtfdcr/vid/jtfdc_stalkarounds/jtfdc_20200503_1905_stalkaroudacross_ltlsilvrguy.mp4|/imgs/mp4gifs/jtfdc_20200503_1905_stalkaroudacross_ltlsilvrguy.jpg
/kb/jtfdcr/vid/jtfdc_stalkarounds/jtfdc_20200503_2011_stalaround_acrosss_ltlwhtcarguy.mp4|/imgs/mp4gifs/jtfdc_20200503_2011_stalaround_acrosss_ltlwhtcarguy.jpg
/kb/jtfdcr/vid/jtfdc_stalkarounds/jtfdc_20200502_1124_stalkaroundsup_fedex_gigglegirls.mp4|/imgs/mp4gifs/jtfdc_20200502_1124_stalkaroundsup_fedex_gigglegirls.jpg
/kb/jtfdcr/vid/jtfdc_stalkarounds/jtfdc_20200501_2012_stalkaround_jtf31_bigups_crunch.mp4|/imgs/mp4gif/jtfdc_20200501_2012_stalkaround_jtf31_bigups_crunch.jpg
/kb/jtfdcr/vid/jtfdc_stalkarounds/jtfdc_20200501_0051_stalkaroundup_owl_n_rumblepickup.mp4|/imgs/mp4gifs/jtfdc_20200501_0051_stalkaroundup_owl_rumblepickup.jpg
/kb/jtfdcr/vid/jtfdc_stalkarounds/jtfdc_20200328_0920_jkwii_chapelwakers_tomazy_got2hell_lures.mp4|/imgs/mp4gifs/chapelcrosswalkers.gif|/imgs/mp4gifs/chapelcrosswakers.gif
/kb/jtfdcr/vid/jtfdc_stalkarounds/jtfdc_20200423_1423_stalkaroundup_speeding_amazon_stalk.mp4|/imgs/mp4gifs/jtfdc_20200423_1423_stalkaroundup_speeding_amazon_stalk.jpg
/kb/jtfdcr/vid/jtfdc_stalkarounds/jtfdc_20200424_1833_stalkaroundup_longflatbed_truck.mp4|/imgs/mp4gifs/jtfdc_20200424_1833_stalkaroundup_longflatbed_truck.jpg
/kb/jtfdcr/vid/jtfdc_stalkarounds/jtfdc_20200424_1850_stalkaroundup_speedy_bigtruckvan.mp4|/imgs/mp4gifs/jtfdc_20200424_1850_stalkaroundup_speedy_bigtruckvan.jpg
/kb/jtfdcr/vid/jtfdc_kids/jtfdc_20200411_1538_ks.mp4|/imgs/mp4gifs/jtfdc_20200411_1538_ks.jpg
# /kb/jtfdcr/vid/jtfdc_stalkarounds/jtfdc_20200327_1532_stalkaround_jtf30_yellowcycler_fu_fu_fu.mp4|/imgs/mp4gifs/jtfdc_20200327_1532_stalkaround_jtf30_yellowcycler_fu_fu_fu.jpg
`;
//			alert( "BUGS_5301 jtfdc_stalkarounds args="+args );
			htmout = '';
			list=kolists['jtfdc_stalkarounds'].split("\n");
			htmout += '<div id="div_jtfdc_stalkarounds" >';
			htmout += '	<h1>div_jtfdc_stalkarounds_update</h1>';
			for( j=0; j<list.length; j++ ) {
				line=list[j];
				if( line=="" ) { continue; }
				if( /^#/.test(line)) { continue; }			
				src_mp4=line;
				src_tn=src_mp4.replace(".mp4",".jpg");
//				pipelen=line.split("|");
				src_mp4=line.split("|")[0];
				src_tn=line.split("|")[1];
				title=j+" "+src_mp4;
				title=title.replace(".mp4","");
				title=title.replace("/kb/","");

//				alert( "BUGS_5370 src_mp4="+src_mp4 );
//				alert( "BUGS_5370 src_tn="+src_tn );
//				if(! filecheck(src_mp4)) {
//					alert( "BUGS_5370 NOTFOUND src_mp4="+src_mp4 );
//					src_mp4="/kb/vid/notfound.mp4";
//					}
//				if(! filecheck(src_tn)) {
//					src_tn="/imgs/notfound.gif";
//					}

				htmout += '	<h2>'+title+'</h2>';
				htmout += '	<img src="'+src_tn+'" ';
				htmout += '	onclick="window.open(\''+src_mp4+'\'); return false;" ';
				htmout += '	height=100 border=0 draggable="true" >';
				htmout += '	<br>';
//				alert( "BUGS_5371 jtfdc_stalkarounds htmout="+htmout );
//				alert( "BUGS_5372 jtfdc_stalkarounds htmout="+htmout );
				}
			htmout += '	</div>';
			htmout += '<hr color=black>';
			htmout += '<hr color=white>';
			htmout += '<br><br><br><br>';

			divid="div_jtfdc_stalkarounds";
			if( document.getElementById(divid)) {
//				alert( "BUGS_5380 DIV_FOUND jtfdc_stalkarounds htmout="+htmout );
				document.getElementById(divid).innerHTML=htmout;
				}
//			alert( "BUGS_5390 jtfdc_stalkarounds htmout="+htmout );
			}

		</script>








	<img src="/imgs/btn/kobubblew.png"
		alt="videobox_chillicothe"
		onclick="window.open('/av/show_videobox_chillicothe.html?avid=/kb/vid/jkwii/jtfdcchillicothe_ohio_the_good_old_days_1938_looking_back.mp4');return false;"
			); return false;"
		height=100 border=0 >  
	&nbsp &nbsp &nbsp &nbsp


<!--
	<img src="/imgs/btn/kobubblew_avril.png"
		alt="chillicothe_ohio_good_old_days_1938_looking_back"
		onclick="window.open(
'/kb/vid/jkwii/jtfdcchillicothe_ohio_the_good_old_days_1938_looking_back.mp4'
			); return false;"
		height=200 border=0 >  
	-->

		</div id="div_yt_w_tail"  >


	<hr color=white>
	<hr color=pink>
	<hr color=red>
	<hr color=pink>
<!--	</div id="div_unknown_tail"> -->
	<hr color=white>
	<hr color=pink>

	<div id="div_body_w" draggable="true" ><h1>div_body_w</h1>
<img src="/fb/heart/pages/1.jpg" alt="heart" onclick="window.open('/fb/heart/');return false;" 
height=100 border=0 >  
&nbsp &nbsp &nbsp

<img src="/gm/imgs/btn/btn_chapelofthecross.png" alt="chapelofthecross" onclick="window.open('https://www.chapelofthecross.org/');return false;" 
height=100 border=0 >
&nbsp &nbsp &nbsp

<!-- <img src="/imgs/gif/eggs/giphy_eggs_01.gif" alt="gm" onclick="window.open('/gm/gm_eggs.html');return false;"  -->
<img src="/fb/birthday/pages/1.jpg" alt="fb/birthday" onclick="window.open('/fb/birthday/');return false;" 
height=200 border=0 >
&nbsp &nbsp &nbsp
<img src="/imgs/btn/jsdoit.png" alt="jsdoit" onclick="window.open('/jsdoit.html');return false;" 
height=200 border=0 >
&nbsp &nbsp &nbsp
<img src="/fb/birthday/pages/1.jpg" alt="fb/birthday" onclick="window.open('/fb/birthday/');return false;" 
height=200 border=0 >
&nbsp &nbsp &nbsp
		<img src="/imgs/btn/koeye_blobs.png" alt="koeye_blobs"
			onclick="window.open('/blob.html');return false;"
			height=200 border=0>
&nbsp &nbsp &nbsp

<img src="/imgs/gif/eggs/giphy_eggs_03.gif" alt="gm" onclick="window.open('/gm/gm_eggs.html');return false;" 
height=200 border=0 >
&nbsp &nbsp &nbsp

<img src="/gm/imgs/btn/btn_latterdaysaints_stl.png" alt="latterdaysaints" onclick="window.open('https://www.facebook.com/pages/LDS-Temple-St-Louis-MO/161979377153524');return false;" 
height=100 border=0 >
&nbsp &nbsp &nbsp

<img src="/fb/soul/pages/1.jpg" alt="heart" onclick="window.open('/fb/soul/');return false;" 
height=100 border=0 >  
&nbsp &nbsp &nbsp
<hr color="pink">
<hr color="white">
	</div id="div_body_w_tail" >







<hr color="pink">
<hr color="white">

	<div id="div_jtfdcr_w" draggable="true" >
		<div id="div_jtfdcr_dot_dot_dot" >
			<br>
			<hr color="black">
			<hr color="black">
			<hr color="black">
			<br>
			<h1>jtfdcr_dot_dot_dot ... </h1>
			<h2> 20200408 ... 20200328</h2>
			<hr color=black>
			<hr color=yellow>
			<hr color=black>



	<img src="/fb/med/imgs/cdc_banner.png" height=100  onclick="window.open('http://cdc.gov');return false;" >
	<hr color=black>
	<hr color=yellow>
	<hr color=black>
	<br>

	<h1>defford court report 20200326-20200330_0900</h1>
	<h3>20200326_1830 offroad shiny white suv medmask</h3>

<!--	<img src="/kb/jtfdcr/vid/jtfdc_stalkarounds_tiny/tn_jtfdc_20200327_1532_stalkaround_jtf30_yellowcycler_fu_fu_fu.png" -->
<!--	<img src="/gm/imgs/btn/btn_cycle.png" -->
	<img src="/imgs/btn/kobubble.png"
		alt="jtfdc_20200327_1532_stalkaround_jtf30_yellowcycler_fu_fu_fu"
		onclick="window.open(
'/kb/jtfdcr/vid/jtfdc_stalkarounds/jtfdc_20200327_1532_stalkaround_jtf30_yellowcycler_fu_fu_fu.mp4'
				); return false;"
		height=100 border=0 >  

	<img src="/fb/donutvanlaw/pages/1.jpg"
		alt="jtf32_donutvanlaw" onclick="window.open(
'/fb/donutvanlaw/'
		);return false;"
		height=100 border=0 >  
	&nbsp &nbsp &nbsp
	
	<img src="https://img.youtube.com/vi/Oo4KXZVApsQ/default.jpg"
		alt="yt_spring"
		onclick="window.open('https://www.youtube.com/watch?v=Oo4KXZVApsQ');return false;"
			); return false;"
		height=200 border=0 >  




<img src="/fb/soul/pages/koeye_faithchurch.png"
		alt="faithchurch" onclick="window.open( 'http://faithchurch.com'
		);return false;"
		height=100 border=0 >  
	&nbsp &nbsp &nbsp

<img src="/imgs/btn/koeye_todays"
		alt="todays" onclick="window.open( '/todays.html?id=20200413'
		);return false;"
		height=100 border=0 >  
	&nbsp &nbsp &nbsp

<img src="/kb/jtfdcr/vid/jtfdc_20170529_memorialday_tiny/jtfdc_20170529_0703_00028_memorialday_jkwii_jtf30_doogy.png"
		alt="tourdedonut_stl" onclick="window.open( '/holidays.html?id=jtfdc_20170529_memorialday'
		);return false;"
		height=100 border=0 >  
	&nbsp &nbsp &nbsp
	
	<img src="/gm/imgs/btn/btn_tourdedonut_stl.png"
		alt="tourdedonut_stl" onclick="window.open( 'http://www.tourdedonut.org/'
		);return false;"
		height=100 border=0 >  
	&nbsp &nbsp &nbsp
	

	<img src="/gm/imgs/btn/btn_bebikeclub.png"
		alt="bebikeclub" onclick="window.open(
'https://www.bebikeclub.org/'
		);return false;"
		height=100 border=0 >  
	&nbsp &nbsp &nbsp
	
<!--
btn_tourdedonut.org
http://www.tourdedonut.org/
	-->


	<h3>20200328_0928 chapel_of_the_crosswalkers jtf4- "hi mr_T says jkwii"
"go to hell" says mr_T back to wii"
		</h3>

	<details id="detail_crosswalkers">
		<h2>detail_crosswalkers</h2>
		<pre>
			satruday 9:28	
			two mature woman strangers appear
			wander into our private 3 house court
			explore our obstructed barn/backyard easement

			curious

			what are you two here to see
			apparently your not here for me 

			looking familiar they searched back through time
			we all discover together thier old friend of mine
			
			old friends from our old church
			all three kids attended there	
			well before this corona scare

			invited the ladies for a quick tour
			appear they were here as mr_T lures

			from over the hill 
			mr_T speeds into our court

			"hi mr_T" but no reply

			"is this man bothering you ladies"
			failed new police incident schedules to report
			"go to hell" mr_T only retort
			

			curious

			old time neighbors from our youth
			are just the one who have forgotten the truth

			jkwii@hi_risk
			</pre>
		</details>

<!--		<img src="/kb/jtfdcr/vid/jtfdc_stalkarounds_tiny/tn_jtfdc_20200328_0920_jkwii_chapelwakers_tomazy_got2hell_lures.png" -->
<!--		'/kb/jtfdcr/vid/jtfdc_stalkarounds_tiny/tn_jtfdc_20200328_0920_jkwii_chapelwakers_tomazy_got2hell_lures.mp4' -->
<!--		<img src="/gm/imgs/btn/btn_chapelcrosswalkers.png" -->
		<img src="/imgs/btn/kobubble.png"
			alt="/kb/jtfdcr/vid/jtfdc_stalkarounds_tiny/tn_jtfdc_20200328_0920_jkwii_chapelwakers_tomazy_got2hell_lures.mp4"
			onclick="window.open(
'/kb/jtfdcr/vid/jtfdc_stalkarounds/jtfdc_20200328_0920_jkwii_chapelwakers_tomazy_got2hell_lures.mp4'
				); return false;"
			height=100 border=0 >  
			&nbsp &nbsp &nbsp
	
		<img src="/fb/byrdpucker/pages/1.jpg"
			alt="jtf39_byrdpucker" onclick="window.open(
'/fb/byrdpucker'
			);return false;"
			height=100 border=0 >  
		&nbsp &nbsp &nbsp

		<img src="/gm/imgs/btn/btn_ks_contractors.png"
			alt="fb_ks_contractors_stl" onclick="window.open('https://ksgcstl.com');return false;"
			height=80 border=0 >  
		&nbsp &nbsp &nbsp

		<img src="/gm/imgs/btn/btn_fb_ks_contractors.png"
			alt="fb_ks_contractors" onclick="window.open( 'https://www.facebook.com/K.T.Contracting85/photos/a.647903691927784/1407436845974461/?type=1&theater');return false;"
			height=80 border=0 >  
		&nbsp &nbsp &nbsp

		<img src="/gm/imgs/btn/btn_fb_sk_contractors.png"
			alt="fb_ks_contractors" onclick="window.open(
'https://www.facebook.com/skcontractors4344/'
			);return false;"
			height=80 border=0 >  
		&nbsp &nbsp &nbsp

		<img src="/gm/imgs/btn/btn_cardinalcontractors_stl.png"
			alt="cardinalcontractors_stl" onclick="window.open(
'https://cardinalcontractorsllc.com/'
			);return false;"
			height=80 border=0 >  
		&nbsp &nbsp &nbsp

		<img src="/gm/imgs/btn/btn_fb_cardinalcontractors_stl.png"
			alt="fb_cardinalcontractors_stl" onclick="window.open(
'https://www.facebook.com/cardinalroof/'
			);return false;"
			height=80 border=0 >  
		&nbsp &nbsp &nbsp

		<img src="/gm/imgs/btn/btn_alberici.png"
			alt="alberici" onclick="window.open( 'https://alberici.com/');return false;"
			height=80 border=0 >  
		&nbsp &nbsp &nbsp

		<img src="/gm/imgs/btn/btn_fb_alberici.png"
			alt="fb_alberici" onclick="window.open( 'https://www.facebook.com/AlbericiConstructors');return false;"
			height=80 border=0 >  
		&nbsp &nbsp &nbsp

		<img src="/imgs/btn/kobubble.png"
			alt="jtfdc_20200328_2235_stalkarounup_xmaslite_rumble_truck" onclick="window.open(
'/kb/jtfdcr/vid/jtfdc_stalkarounds/jtfdc_20200328_2235_stalkarounup_xmaslite_rumble_truck.mp4'
			);return false;"
			height=80 border=0 >  
		</div>

		</div id="div_jtfdcr_w_tail" >

	<hr color=red>
	<hr color=white>
	<hr color=blue>


	
	<hr color=black>





	<h1>- = +</h1>
	<img src="/imgs/btn/koeye_alloff.png" onclick="window.open('/mobmin.html');return false;" >
	<img src="/imgs/btn/koeye.png" onclick="window.open('/');return false;" > 
	<img src="/imgs/btn/btn_gm.png" onclick="window.open('/gm/');return false;" height=100 > 
	<img src="/imgs/gif/view/giphy_view19.gif" onclick="window.open('/mob_vu.html');return false;" height=100 > 
	<img src="/imgs/btn/koeye.png" onclick="window.open('/');return false;" > 
	<img src="/imgs/btn/koeye_allon.png" onclick="window.open('/mobmax.html');return false;" >
	<hr color=black>
	<hr color=blue>
	<hr color=white>
	<hr color=red>
	<h1>- = +</h1>
	<img src="/ko1/pages/1.jpg" onclick="window.open('http://ko1.us');return false;" border=0 height=100 >
	<img src="/fb/konet/pages/1.jpg" onclick="window.open('http://konet.org');return false;" border=0 height=100 >
	<img src="/fb/iperms/pages/1.jpg" onclick="window.open('http://iperms.com');return false;"  border=0 height=100 >
	<hr color=blue>
	<hr color=white>
	<hr color=red>
	<br><br>	
	<hr color=pink>	
	<hr color=pink>	
	<hr color=pink>	
	<h2>- + =</h2>
	<img src="/gm/pages/1.jpg" onclick="window.open('/gm/');return false;" height=100 border=0 >
	<img src="/fb/operation/pages/1.jpg" onclick="window.open('/fb/operation/');return false;" height=100 border=0 >
	<img src="/fb/kitiworks/pages/1.jpg" onclick="window.open('/fb/kitiworks/');return false;" height=100 border=0 >
	<img src="/fb/pastryroad/pages/1.jpg" onclick="window.open('/fb/pastryroad/');return false;" height=100 border=0 >
	<img src="/fb/jkwii/pages/1.jpg" onclick="window.open('/fb/jkwii/');return false;" height=100 border=0 >
	<img src="/fb/jtfdc/pages/1.jpg" onclick="window.open('/fb/jtfdc/');return false;" height=100 border=0 >
	<img src="/fb/kt/pages/1.jpg" onclick="window.open('/fb/kt/');return false;" target=_blank border=0 height=100>
	<hr color=pink>	
	<hr color=pink>	
	<hr color=pink>	
	
	<hr color=white>
	<hr color=black>
	<h2>- = +</h2>
	<img src="/fb/birthday/pages/1.jpg" onclick="window.open('/fb/birthday/');return false;" height=100 border=0  >
	<img src="/fb/neuz/pages/1.jpg" onclick="window.open('/fb/neuz/');return false;" height=100 border=0  >
	<img src="/fb/law/pages/1.jpg" onclick="window.open('/fb/law/');return false;" height=100 border=0 >
	<img src="/fb/med/pages/1.jpg" onclick="window.open('/fb/med/');return false;" height=100 border=0  >
	<img src="/fb/gov/pages/1.jpg" onclick="window.open('/fb/gov/');return false;" height=100 border=0  >
	<img src="/fb/iperms/pages/1.jpg" onclick="window.open('/fb/iperms/');return false;" height=100 border=0  >
	<img src="/fb/pages/1.jpg" onclick="window.open('/fb/');return false;" height=100 border=0  >
	<img src="/fb/jtfdc/pages/1.jpg" onclick="window.open('/fb/jtfdc/');return false;" height=100 border=0 >
	<img src="/fb/konet/pages/1.jpg" onclick="window.open('/fb/konet/');return false;" height=100 border=0 >
	<img src="/fb/gofunwii/pages/1.jpg" onclick="window.open('/fb/gofunwii/');return false;" height=100 border=0  >
	<hr color=black>
	<hr color=white>
	<hr color=white>
	<hr color=black>
<!--
	<h3>h3</h3>
	<canvas id="canvas_b" onclick="window.open('/?q=b'); return false;" color=black ></canvas>
	<canvas id="canvas_w" onclick="window.open('/?q=w'); return false;" color=white ></canvas>
	<canvas id="canvas_m" onclick="window.open('/?q=m'); return false;" color=maize ></canvas>
	-->
	<hr color=white>
	<hr color=black>
	<hr color=white>
	<hr color=black>
	<hr color=black>
	<hr color=white>
	<hr color=red>
	<hr color=blue>
<!--
	<img src="/imgs/btn/koeye_handhither.gif" onclick="document.location.href='/?handhither'; return false;">	
	-->


<hr color=yellow>
<hr color=black>
<hr color=yellow>
<hr color=black>
<hr color=yellow>
<!--
	<style id="style_videobox">
//		div {
		div_video {
			position: absolute;
			top: 50%;
			transform: translate(-50%,-50%);
			width: 480px;
			height: 380px;
			border-radius: 10px;
			background-color: #eee;
			background-image: linear-gradient(to bottom, rgba(0,0,0,0), rgba(0,0,0,0.1));
			}

		.hidden {left: -50%;}
		.showing {left: 50%;}

//		div video {
		div_video video {
			display: block;
			width: 400px;
			margin: 40px auto;
			}

		</style>
	-->

	<hr color=red>
	<hr color=white>
	<hr color=blue>
<!--
	<button>Display video</button>
	<div_video id="div_videobox" class="hidden">
		<video id="video_videobox">
		        <source src="/index1_avril.mp4" type="video/mp4">
			<source src="/index1_avril.webm" type="video/webm">
			<p>access_logged <a href="/index1_avril.mp4"></a>.</p>
			</video>
		</div>
	-->
	<hr color=red>
	<hr color=white>
	<hr color=blue>


	<button id="button" ></button>
	<div id="div" ><h1>div</h1></div>
	<video id="video" ></video>
	<script id="script_videobox">
		function videobox(args) {
			const btn = document.querySelector('button');
			const videoBox = document.querySelector('div');
			const video = document.querySelector('video');

			btn.onclick = function() {
			videoBox.setAttribute('class','showing');
	
			videoBox.onclick = function() {
				videoBox.setAttribute('class','hidden');
				};

			video.onclick = function(e) {
				e.stopPropagation();
				video.play();
				};
			}
		</script>



	<div id="div_yt_b" draggable="true><h1>div_yt_b</h1>
	<hr color=black>
	<hr color=white>
	<img src="/imgs/btn/kobubble.png"
		alt="leonard_cohen_slow_mp4"
		onclick="window.open('/kb/vid/jkwii/jkwiileonard_cohen_slow_audio.mp4');return false;"
			); return false;"
		height=100 border=0 >  
	&nbsp &nbsp &nbsp &nbsp
	<img src="/imgs/btn/kobubble.png"
		alt="test3_htm /kb/vid/jkwii/jkwiileonard_cohen_slow_audio.mp4"
		onclick="window.open('/av/show_videobox_slow.html?avid=/kb/vid/jkwii/jkwiileonard_cohen_slow_audio.mp4');return false;"
			); return false;"
		height=50 border=0 >  
	<hr color=white>
	<hr color=black>
	</div id="div_yt_b" draggable="true>


		<div id="div_tail">
			<h2>div_tail</h2>

				<a href="/notes.txt" target=_blank><img src=/imgs/gif/notes/giphy_notes10.gif height=100 border=0 alt="notes.txt"></a>
				<a href="/mobmin.html" class="popover" target=_blank>
					<img src="/imgs/btn/giphy_phone01.gif" width=100 height=100>
					</a>
				<a href="/index2big4most.html" class="popover" target=_blank>
					<img src="/imgs/btn/giphy_mouse01.gif" width=100 height=100>
					</a>

				<a href="/mobmax.html" class="popover" target=_blank>
					<img src="/imgs/btn/giphy_phone01.gif" width=100 height=100>
					</a>
				<a href="/find_jtfdc_mp4.txt" target=_blank>
					<img src=/imgs/gif/notes/giphy_notes08.gif height=100 border=0 alt="find_jtfdc_mp4">
					</a>
				</div>
			</div>


	<hr color=red>
	<hr color=red>
	<hr color=white>
	<hr color=blue>
	<div id="div_dd_w" draggable="true" ><h1>div_dd_w</h1>
	<div id="div_drop" ondrop="dropw1(event)" ondragover="allowDrop(event)">
		<img src="/gm/imgs/bg/bg_steel_linear.png" height=100 width=600>
		</div>
	<div id="div_drop0" ondrop="dropw1(event)" ondragover="allowDrop(event)">
		<img src="/gm/imgs/bg/bg_frax4d01.png" height=100 width=600>
		</div>
	<div id="div_drop1" ondrop="dropw1(event)" ondragover="allowDrop(event)">
		<img src="/gm/imgs/bg/bg_newton04a.png" height=100 width=600>
		</div>
	<div id="div_drop2" ondrop="dropw1(event)" ondragover="allowDrop(event)">
		<img src="/gm/imgs/bg/bg_newton04b.png" height=100 width=600>
		</div>



	<div id="div_dropw" ondrop="dropw(event)" ondragover="allowDrop(event)">
		<img src="/gm/imgs/bg/bg_newton06.png" height=100 width=600>
		</div>
	<div id="div_dropb" ondrop="dropb(event)" ondragover="allowDrop(event)">
		<img src="/gm/imgs/bg/bg_newton06a.png" height=100 width=600>
		</div>
	<div id="div_dropw1" ondrop="dropw1(event)" ondragover="allowDrop(event)">
		<img src="/gm/imgs/bg/bg_newton06b.png" height=100 width=600>
		</div>
	<div id="div_dropb1" ondrop="dropb1(event)" ondragover="allowDrop(event)">
		<img src="/gm/imgs/bg/bg_newton07a.png" height=100 width=600>
		</div>
	<div id="div_dropw2" ondrop="dropw2(event)" ondragover="allowDrop(event)">
		<img src="/gm/imgs/bg/bg_newton07b.png" height=100 width=600>
		</div>
	<div id="div_dropb2" ondrop="dropb2(event)" ondragover="allowDrop(event)">
		<img src="/gm/imgs/bg/bg_background1.png" height=100 width=600>
		</div>
	<hr color=red>
	<hr color=red>
	<hr color=red>
	<hr color=red>
	<img id="img_drop" src="/gm/imgs/btn/ko.png" ondrop="dropb2(event)" ondragover="allowDrop(event)" height=50>
	<img id="img_drop0" src="/gm/imgs/btn/koeye.png" ondrop="dropb2(event)" ondragover="allowDrop(event)" height=50>
	<img id="img_drop1" src="/gm/imgs/btn/koeyew.png" ondrop="dropb2(event)" ondragover="allowDrop(event)" height=50>
	<img id="img_drop2" src="/gm/imgs/btn/koeyeb.png" ondrop="dropb2(event)" ondragover="allowDrop(event)" height=50>
	<img id="img_dropw" src="/gm/imgs/btn/kiw.png" ondrop="dropb2(event)" ondragover="allowDrop(event)" height=50>
	<img id="img_dropb" src="/gm/imgs/btn/kib.png" ondrop="dropb2(event)" ondragover="allowDrop(event)" height=50>
	<br>
	<br>
	<img id="drag12" src="/imgs/btn/kop12.png" draggable="true" ondragstart="drag(event)" height=50 >
	<img id="drag13" src="/imgs/btn/kop23.png" draggable="true" ondragstart="drag(event)" height=50 >
	<img id="drag14" src="/imgs/btn/kop34.png" draggable="true" ondragstart="drag(event)" height=50 >
<!--	<img id="drag15" src="/imgs/btn/kop14.png" draggable="true" ondragstart="drag(event)" height=50 >  -->
	<br>
	<img id="img_dropw1" src="/gm/imgs/btn/kop12.png" ondrop="dropb2(event)" ondragover="allowDrop(event)" height=50>
<!--	<img id="img_dropb1" src="/gm/imgs/btn/kop23.png" ondrop="dropb2(event)" ondragover="allowDrop(event)" height=50> -->
	<img id="img_dropb2" src="/gm/imgs/btn/kop14.png" ondrop="dropb2(event)" ondragover="allowDrop(event)" height=50>
	<img id="img_dropw2" src="/gm/imgs/btn/kop34.png" ondrop="dropb2(event)" ondragover="allowDrop(event)" height=50>

	<hr color=white>
	<img id="drag1" src="/imgs/btn/ko.png" draggable="true" ondragstart="drag(event)" height=50 >
	<img id="drag3" src="/imgs/btn/koeye.png" draggable="true" ondragstart="drag(event)" height=50 >
	<img id="drag4" src="/imgs/btn/koeyeb.png" draggable="true" ondragstart="drag(event)" height=50 >
	<img id="drag5" src="/imgs/btn/koeyew.png" draggable="true" ondragstart="drag(event)" height=50 >
	<img id="drag2" src="/imgs/btn/ok.png" draggable="true" ondragstart="drag(event)" height=50 >
	<br>
	<br>
	<img id="drag8" src="/imgs/btn/kop1.png" draggable="true" ondragstart="drag(event)" height=50 >
	<img id="drag9" src="/imgs/btn/kop2.png" draggable="true" ondragstart="drag(event)" height=50 >
	<img id="drag10" src="/imgs/btn/kop3.png" draggable="true" ondragstart="drag(event)" height=50 >
	<img id="drag11" src="/imgs/btn/kop4.png" draggable="true" ondragstart="drag(event)" height=50 >
	<br>
	<img id="drag16" src="/imgs/btn/kop1234.png" draggable="true" ondragstart="drag(event)" height=50 >
	</div id="div_dd_tail_w"  >
	
	<script id="script_drop">
		function drop(e) {
//			var e_id=e.getAttribute('id');
//			var eid = e.attribute("id");
//			var e_id=e.getAttribute("id");
			alert( "MSG_1000 drop e="+e);
			}
		function drop0(e) {
			alert( "MSG_1000 drop0 e="+e);
			}
		function drop1(e) {
			alert( "MSG_1000 drop1 e="+e);
			}
		function drop2(e) {
			alert( "MSG_1000 drop2 e="+e);
			}
		function dropb(e) {
			alert( "MSG_1000 dropb e="+e);
			}
		function dropw(e) {
			alert( "MSG_1000 dropw e="+e);
			}
		function dropb1(e) {
			alert( "MSG_1000 drob1 e="+e);
			}
		function dropw1(e) {
			alert( "MSG_1000 dropw1 e="+e);
			}
		function dropb2(e) {
			alert( "MSG_1000 dropb2 e="+e);
			}
		function dropw2(e) {
			alert( "MSG_1000 dropw2 e="+e);
			}
		</script>
	

	<div id="div_form" hidden>
		<h1>div_form</h1>
		<form id="form" >
			<div id="div_form_fname">
				<label for="fname">First name: </label>
				<input id="fname" type="text">
				</div>
			<div id="div_form_lname">
				<label for="lname">Last name: </label>
				<input id="lname" type="text">
				</div>
			<div id="div_form_submit">
				<input id="submit" type="submit">
				</div>
			</form>
		<p></p>
		</div>

	<script id="script_form">
		const form = document.querySelector('form');
		const fname = document.getElementById('fname');
		const lname = document.getElementById('lname');
		const para = document.querySelector('p');

		form.onsubmit = function(e) {
			if (fname.value === '' || lname.value === '') {
				e.preventDefault();
				para.textContent = 'both';
				}
			}
		</script>


	<hr color=white>
	<hr color=pink>
	<hr color=pink>
	<hr color=pink>
	<hr color=white>
	<div id="div_yt_b" draggable="true"><h1>div_yt_b</h1>
	<img src="https://img.youtube.com/vi/NGorjBVag0I/default.jpg"
		alt="yt_cohen_danceme"
		onclick="window.open('https://www.youtube.com/watch?v=NGorjBVag0I');return false;"
			); return false;"
		height=100 border=0 >  
	&nbsp &nbsp &nbsp &nbsp


	<img src="https://img.youtube.com/vi/WkJoP2PLe6g/default.jpg"
		alt="yt_swing_chanzie_stephen_gettogether"
		onclick="window.open('https://www.youtube.com/watch?v=WkJoP2PLe6g');return false;"
			); return false;"
		height=100 border=0 >  
	&nbsp &nbsp &nbsp &nbsp

	<img src="https://img.youtube.com/vi/alLi8i9BQK4/default.jpg"
		alt="yt_swing_nils_bianca"
		onclick="window.open('https://www.youtube.com/watch?v=alLi8i9BQK4');return false;"
			); return false;"
		height=100 border=0 > 
	&nbsp &nbsp &nbsp &nbsp

	<img src="https://img.youtube.com/vi/m01f4uAn1AA/default.jpg"
		alt="yt_swing_chanzie_stephen_nittygritty"
		onclick="window.open('https://www.youtube.com/watch?v=m01f4uAn1AA');return false;"
			); return false;"
		height=100 border=0 >  
	&nbsp &nbsp &nbsp &nbsp



	<img src="https://img.youtube.com/vi/BPRPK5qU3Y4/default.jpg"
		alt="yt_cohen_slow_dance"
		onclick="window.open('https://www.youtube.com/watch?v=BPRPK5qU3Y4');return false;"
			); return false;"
		height=100 border=0 > 
	&nbsp &nbsp &nbsp &nbsp

	<img src="https://img.youtube.com/vi/EjFN5iVKn6w/default.jpg"
		alt="yt_childers_housefire"
		onclick="window.open('https://www.youtube.com/watch?v=EjFN5iVKn6w');return false;"
			); return false;"
		height=100 border=0 > 
	&nbsp &nbsp &nbsp &nbsp


<!--
		&nbsp &nbsp &nbsp &nbsp
		<img src="https://img.youtube.com/vi/WkJoP2PLe6g/default.jpg"
			alt="yt_dylan_mostfoul"
			onclick="window.open('https://www.youtube.com/watch?v=Rkr6TVnGtAM');return false;"
				); return false;"
			height=200 border=0 >  
	-->
		</div id="div_yt_b" >


	<hr color=white>
	<hr color=pink>
	<hr color=pink>
	<hr color=pink>
	<hr color=white>

<!--	</center> -->
	<div id="div_btn_hideshow_b" ><h3>div_btn_hideshow_b</h3></div>
	<div id="div_buttons_hideshow_b"><h3>div_buttons_hideshow_b</h3></div>

	<div id="div_kogrids_b"></div>


<!--	<script src='/fb/extras/jquery.min.1.7.js'></script>	-->
<!--	<script src='/fb/extras/modnizr.2.5.3.min.js'></script>	-->
<!--	<script src='/fb/lib/hash.js'></script>	-->
<!--	<script src='/fb/lib/turn_html4.js'></script> -->
<!--	<script src='/fb/lib/zoom.js'></script>	-->
<!--	<script src='/fb/html/magazine/js/magazine.js'></script>	-->
<!--	<script src='data:/text/plain;base64,LyoKICogTWFnYXppbmUgc2FtcGxlCiovCgpmdW5jdGlvbiBhZGRQYWdlKHBhZ2UsIGJvb2spIHsKCgl2YXIgaWQsIHBhZ2VzID0gYm9vay50dXJuKCdwYWdlcycpOwoKCS8vIENyZWF0ZSBhIG5ldyBlbGVtZW50IGZvciB0aGlzIHBhZ2UKCXZhciBlbGVtZW50ID0gJCgnPGRpdiAvPicsIHt9KTsKCgkvLyBBZGQgdGhlIHBhZ2UgdG8gdGhlIGZsaXBib29rCglpZiAoYm9vay50dXJuKCdhZGRQYWdlJywgZWxlbWVudCwgcGFnZSkpIHsKCgkJLy8gQWRkIHRoZSBpbml0aWFsIEhUTUwKCQkvLyBJdCB3aWxsIGNvbnRhaW4gYSBsb2FkZXIgaW5kaWNhdG9yIGFuZCBhIGdyYWRpZW50CgkJZWxlbWVudC5odG1sKCc8ZGl2IGNsYXNzPSJncmFkaWVudCI+PC9kaXY+PGRpdiBjbGFzcz0ibG9hZGVyIj48L2Rpdj4nKTsKCgkJLy8gTG9hZCB0aGUgcGFnZQoJCWxvYWRQYWdlKHBhZ2UsIGVsZW1lbnQpOwoJfQoKfQoKZnVuY3Rpb24gbG9hZFBhZ2UocGFnZSwgcGFnZUVsZW1lbnQpIHsKCgkvLyBDcmVhdGUgYW4gaW1hZ2UgZWxlbWVudAoKCXZhciBpbWcgPSAkKCc8aW1nIC8+Jyk7CgoJaW1nLm1vdXNlZG93bihmdW5jdGlvbihlKSB7CgkJZS5wcmV2ZW50RGVmYXVsdCgpOwoJfSk7CgoJaW1nLmxvYWQoZnVuY3Rpb24oKSB7CgkJCgkJLy8gU2V0IHRoZSBzaXplCgkJJCh0aGlzKS5jc3Moe3dpZHRoOiAnMTAwJScsIGhlaWdodDogJzEwMCUnfSk7CgoJCS8vIEFkZCB0aGUgaW1hZ2UgdG8gdGhlIHBhZ2UgYWZ0ZXIgbG9hZGVkCgoJCSQodGhpcykuYXBwZW5kVG8ocGFnZUVsZW1lbnQpOwoKCQkvLyBSZW1vdmUgdGhlIGxvYWRlciBpbmRpY2F0b3IKCQkKCQlwYWdlRWxlbWVudC5maW5kKCcubG9hZGVyJykucmVtb3ZlKCk7Cgl9KTsKCgkvLyBMb2FkIHRoZSBwYWdlCgoJaW1nLmF0dHIoJ3NyYycsICdwYWdlcy8nICsgIHBhZ2UgKyAnLmpwZycpOwoKCWxvYWRSZWdpb25zKHBhZ2UsIHBhZ2VFbGVtZW50KTsKCn0KCi8vIFpvb20gaW4gLyBab29tIG91dAoKZnVuY3Rpb24gem9vbVRvKGV2ZW50KSB7CgoJCXNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CgkJCWlmICgkKCcubWFnYXppbmUtdmlld3BvcnQnKS5kYXRhKCkucmVnaW9uQ2xpY2tlZCkgewoJCQkJJCgnLm1hZ2F6aW5lLXZpZXdwb3J0JykuZGF0YSgpLnJlZ2lvbkNsaWNrZWQgPSBmYWxzZTsKCQkJfSBlbHNlIHsKCQkJCWlmICgkKCcubWFnYXppbmUtdmlld3BvcnQnKS56b29tKCd2YWx1ZScpPT0xKSB7CgkJCQkJJCgnLm1hZ2F6aW5lLXZpZXdwb3J0Jykuem9vbSgnem9vbUluJywgZXZlbnQpOwoJCQkJfSBlbHNlIHsKCQkJCQkkKCcubWFnYXppbmUtdmlld3BvcnQnKS56b29tKCd6b29tT3V0Jyk7CgkJCQl9CgkJCX0KCQl9LCAxKTsKCn0KCgoKLy8gTG9hZCByZWdpb25zCgpmdW5jdGlvbiBsb2FkUmVnaW9ucyhwYWdlLCBlbGVtZW50KSB7CgoJJC5nZXRKU09OKCdwYWdlcy8nK3BhZ2UrJy1yZWdpb25zLmpzb24nKS4KCQlkb25lKGZ1bmN0aW9uKGRhdGEpIHsKCgkJCSQuZWFjaChkYXRhLCBmdW5jdGlvbihrZXksIHJlZ2lvbikgewoJCQkJYWRkUmVnaW9uKHJlZ2lvbiwgZWxlbWVudCk7CgkJCX0pOwoJCX0pOwp9CgovLyBBZGQgcmVnaW9uCgpmdW5jdGlvbiBhZGRSZWdpb24ocmVnaW9uLCBwYWdlRWxlbWVudCkgewoJCgl2YXIgcmVnID0gJCgnPGRpdiAvPicsIHsnY2xhc3MnOiAncmVnaW9uICAnICsgcmVnaW9uWydjbGFzcyddfSksCgkJb3B0aW9ucyA9ICQoJy5tYWdhemluZScpLnR1cm4oJ29wdGlvbnMnKSwKCQlwYWdlV2lkdGggPSBvcHRpb25zLndpZHRoLzIsCgkJcGFnZUhlaWdodCA9IG9wdGlvbnMuaGVpZ2h0OwoKCXJlZy5jc3MoewoJCXRvcDogTWF0aC5yb3VuZChyZWdpb24ueS9wYWdlSGVpZ2h0KjEwMCkrJyUnLAoJCWxlZnQ6IE1hdGgucm91bmQocmVnaW9uLngvcGFnZVdpZHRoKjEwMCkrJyUnLAoJCXdpZHRoOiBNYXRoLnJvdW5kKHJlZ2lvbi53aWR0aC9wYWdlV2lkdGgqMTAwKSsnJScsCgkJaGVpZ2h0OiBNYXRoLnJvdW5kKHJlZ2lvbi5oZWlnaHQvcGFnZUhlaWdodCoxMDApKyclJwoJfSkuYXR0cigncmVnaW9uLWRhdGEnLCAkLnBhcmFtKHJlZ2lvbi5kYXRhfHwnJykpOwoKCglyZWcuYXBwZW5kVG8ocGFnZUVsZW1lbnQpOwp9CgovLyBQcm9jZXNzIGNsaWNrIG9uIGEgcmVnaW9uCgpmdW5jdGlvbiByZWdpb25DbGljayhldmVudCkgewoKCXZhciByZWdpb24gPSAkKGV2ZW50LnRhcmdldCk7CgoJaWYgKHJlZ2lvbi5oYXNDbGFzcygncmVnaW9uJykpIHsKCgkJJCgnLm1hZ2F6aW5lLXZpZXdwb3J0JykuZGF0YSgpLnJlZ2lvbkNsaWNrZWQgPSB0cnVlOwoJCQoJCXNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CgkJCSQoJy5tYWdhemluZS12aWV3cG9ydCcpLmRhdGEoKS5yZWdpb25DbGlja2VkID0gZmFsc2U7CgkJfSwgMTAwKTsKCQkKCQl2YXIgcmVnaW9uVHlwZSA9ICQudHJpbShyZWdpb24uYXR0cignY2xhc3MnKS5yZXBsYWNlKCdyZWdpb24nLCAnJykpOwoKCQlyZXR1cm4gcHJvY2Vzc1JlZ2lvbihyZWdpb24sIHJlZ2lvblR5cGUpOwoKCX0KCn0KCi8vIFByb2Nlc3MgdGhlIGRhdGEgb2YgZXZlcnkgcmVnaW9uCgpmdW5jdGlvbiBwcm9jZXNzUmVnaW9uKHJlZ2lvbiwgcmVnaW9uVHlwZSkgewoKCWRhdGEgPSBkZWNvZGVQYXJhbXMocmVnaW9uLmF0dHIoJ3JlZ2lvbi1kYXRhJykpOwoKCXN3aXRjaCAocmVnaW9uVHlwZSkgewoJCWNhc2UgJ2xpbmsnIDoKCgkJCXdpbmRvdy5vcGVuKGRhdGEudXJsKTsKCgkJYnJlYWs7CgkJY2FzZSAnem9vbScgOgoKCQkJdmFyIHJlZ2lvbk9mZnNldCA9IHJlZ2lvbi5vZmZzZXQoKSwKCQkJCXZpZXdwb3J0T2Zmc2V0ID0gJCgnLm1hZ2F6aW5lLXZpZXdwb3J0Jykub2Zmc2V0KCksCgkJCQlwb3MgPSB7CgkJCQkJeDogcmVnaW9uT2Zmc2V0LmxlZnQtdmlld3BvcnRPZmZzZXQubGVmdCwKCQkJCQl5OiByZWdpb25PZmZzZXQudG9wLXZpZXdwb3J0T2Zmc2V0LnRvcAoJCQkJfTsKCgkJCSQoJy5tYWdhemluZS12aWV3cG9ydCcpLnpvb20oJ3pvb21JbicsIHBvcyk7CgoJCWJyZWFrOwoJCWNhc2UgJ3RvLXBhZ2UnIDoKCgkJCSQoJy5tYWdhemluZScpLnR1cm4oJ3BhZ2UnLCBkYXRhLnBhZ2UpOwoKCQlicmVhazsKCX0KCn0KCi8vIExvYWQgbGFyZ2UgcGFnZQoKZnVuY3Rpb24gbG9hZExhcmdlUGFnZShwYWdlLCBwYWdlRWxlbWVudCkgewoJCgl2YXIgaW1nID0gJCgnPGltZyAvPicpOwoKCWltZy5sb2FkKGZ1bmN0aW9uKCkgewoKCQl2YXIgcHJldkltZyA9IHBhZ2VFbGVtZW50LmZpbmQoJ2ltZycpOwoJCSQodGhpcykuY3NzKHt3aWR0aDogJzEwMCUnLCBoZWlnaHQ6ICcxMDAlJ30pOwoJCSQodGhpcykuYXBwZW5kVG8ocGFnZUVsZW1lbnQpOwoJCXByZXZJbWcucmVtb3ZlKCk7CgkJCgl9KTsKCgkvLyBMb2FkbmV3IHBhZ2UKCQoJaW1nLmF0dHIoJ3NyYycsICdwYWdlcy8nICsgIHBhZ2UgKyAnLWxhcmdlLmpwZycpOwp9CgovLyBMb2FkIHNtYWxsIHBhZ2UKCmZ1bmN0aW9uIGxvYWRTbWFsbFBhZ2UocGFnZSwgcGFnZUVsZW1lbnQpIHsKCQoJdmFyIGltZyA9IHBhZ2VFbGVtZW50LmZpbmQoJ2ltZycpOwoKCWltZy5jc3Moe3dpZHRoOiAnMTAwJScsIGhlaWdodDogJzEwMCUnfSk7CgoJaW1nLnVuYmluZCgnbG9hZCcpOwoJLy8gTG9hZG5ldyBwYWdlCgoJaW1nLmF0dHIoJ3NyYycsICdwYWdlcy8nICsgIHBhZ2UgKyAnLmpwZycpOwp9CgovLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvY2hyb21pdW0vaXNzdWVzL2RldGFpbD9pZD0xMjg0ODgKCmZ1bmN0aW9uIGlzQ2hyb21lKCkgewoKCXJldHVybiBuYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoJ0Nocm9tZScpIT0tMTsKCn0KCmZ1bmN0aW9uIGRpc2FibGVDb250cm9scyhwYWdlKSB7CgkJaWYgKHBhZ2U9PTEpCgkJCSQoJy5wcmV2aW91cy1idXR0b24nKS5oaWRlKCk7CgkJZWxzZQoJCQkkKCcucHJldmlvdXMtYnV0dG9uJykuc2hvdygpOwoJCQkJCQoJCWlmIChwYWdlPT0kKCcubWFnYXppbmUnKS50dXJuKCdwYWdlcycpKQoJCQkkKCcubmV4dC1idXR0b24nKS5oaWRlKCk7CgkJZWxzZQoJCQkkKCcubmV4dC1idXR0b24nKS5zaG93KCk7Cn0KCi8vIFNldCB0aGUgd2lkdGggYW5kIGhlaWdodCBmb3IgdGhlIHZpZXdwb3J0CgpmdW5jdGlvbiByZXNpemVWaWV3cG9ydCgpIHsKCgl2YXIgd2lkdGggPSAkKHdpbmRvdykud2lkdGgoKSwKCQloZWlnaHQgPSAkKHdpbmRvdykuaGVpZ2h0KCksCgkJb3B0aW9ucyA9ICQoJy5tYWdhemluZScpLnR1cm4oJ29wdGlvbnMnKTsKCgkkKCcubWFnYXppbmUnKS5yZW1vdmVDbGFzcygnYW5pbWF0ZWQnKTsKCgkkKCcubWFnYXppbmUtdmlld3BvcnQnKS5jc3MoewoJCXdpZHRoOiB3aWR0aCwKCQloZWlnaHQ6IGhlaWdodAoJfSkuCgl6b29tKCdyZXNpemUnKTsKCgoJaWYgKCQoJy5tYWdhemluZScpLnR1cm4oJ3pvb20nKT09MSkgewoJCXZhciBib3VuZCA9IGNhbGN1bGF0ZUJvdW5kKHsKCQkJd2lkdGg6IG9wdGlvbnMud2lkdGgsCgkJCWhlaWdodDogb3B0aW9ucy5oZWlnaHQsCgkJCWJvdW5kV2lkdGg6IE1hdGgubWluKG9wdGlvbnMud2lkdGgsIHdpZHRoKSwKCQkJYm91bmRIZWlnaHQ6IE1hdGgubWluKG9wdGlvbnMuaGVpZ2h0LCBoZWlnaHQpCgkJfSk7CgoJCWlmIChib3VuZC53aWR0aCUyIT09MCkKCQkJYm91bmQud2lkdGgtPTE7CgoJCQkKCQlpZiAoYm91bmQud2lkdGghPSQoJy5tYWdhemluZScpLndpZHRoKCkgfHwgYm91bmQuaGVpZ2h0IT0kKCcubWFnYXppbmUnKS5oZWlnaHQoKSkgewoKCQkJJCgnLm1hZ2F6aW5lJykudHVybignc2l6ZScsIGJvdW5kLndpZHRoLCBib3VuZC5oZWlnaHQpOwoKCQkJaWYgKCQoJy5tYWdhemluZScpLnR1cm4oJ3BhZ2UnKT09MSkKCQkJCSQoJy5tYWdhemluZScpLnR1cm4oJ3BlZWwnLCAnYnInKTsKCgkJCSQoJy5uZXh0LWJ1dHRvbicpLmNzcyh7aGVpZ2h0OiBib3VuZC5oZWlnaHQsIGJhY2tncm91bmRQb3NpdGlvbjogJy0zOHB4ICcrKGJvdW5kLmhlaWdodC8yLTMyLzIpKydweCd9KTsKCQkJJCgnLnByZXZpb3VzLWJ1dHRvbicpLmNzcyh7aGVpZ2h0OiBib3VuZC5oZWlnaHQsIGJhY2tncm91bmRQb3NpdGlvbjogJy00cHggJysoYm91bmQuaGVpZ2h0LzItMzIvMikrJ3B4J30pOwoJCX0KCgkJJCgnLm1hZ2F6aW5lJykuY3NzKHt0b3A6IC1ib3VuZC5oZWlnaHQvMiwgbGVmdDogLWJvdW5kLndpZHRoLzJ9KTsKCX0KCgl2YXIgbWFnYXppbmVPZmZzZXQgPSAkKCcubWFnYXppbmUnKS5vZmZzZXQoKSwKCQlib3VuZEggPSBoZWlnaHQgLSBtYWdhemluZU9mZnNldC50b3AgLSAkKCcubWFnYXppbmUnKS5oZWlnaHQoKSwKCQltYXJnaW5Ub3AgPSAoYm91bmRIIC0gJCgnLnRodW1ibmFpbHMgPiBkaXYnKS5oZWlnaHQoKSkgLyAyOwoKCWlmIChtYXJnaW5Ub3A8MCkgewoJCSQoJy50aHVtYm5haWxzJykuY3NzKHtoZWlnaHQ6MX0pOwoJfSBlbHNlIHsKCQkkKCcudGh1bWJuYWlscycpLmNzcyh7aGVpZ2h0OiBib3VuZEh9KTsKCQkkKCcudGh1bWJuYWlscyA+IGRpdicpLmNzcyh7bWFyZ2luVG9wOiBtYXJnaW5Ub3B9KTsKCX0KCglpZiAobWFnYXppbmVPZmZzZXQudG9wPCQoJy5tYWRlJykuaGVpZ2h0KCkpCgkJJCgnLm1hZGUnKS5oaWRlKCk7CgllbHNlCgkJJCgnLm1hZGUnKS5zaG93KCk7CgoJJCgnLm1hZ2F6aW5lJykuYWRkQ2xhc3MoJ2FuaW1hdGVkJyk7CgkKfQoKCi8vIE51bWJlciBvZiB2aWV3cyBpbiBhIGZsaXBib29rCgpmdW5jdGlvbiBudW1iZXJPZlZpZXdzKGJvb2spIHsKCXJldHVybiBib29rLnR1cm4oJ3BhZ2VzJykgLyAyICsgMTsKfQoKLy8gQ3VycmVudCB2aWV3IGluIGEgZmxpcGJvb2sKCmZ1bmN0aW9uIGdldFZpZXdOdW1iZXIoYm9vaywgcGFnZSkgewoJcmV0dXJuIHBhcnNlSW50KChwYWdlIHx8IGJvb2sudHVybigncGFnZScpKS8yICsgMSwgMTApOwp9CgpmdW5jdGlvbiBtb3ZlQmFyKHllcykgewoJaWYgKE1vZGVybml6ciAmJiBNb2Rlcm5penIuY3NzdHJhbnNmb3JtcykgewoJCSQoJyNzbGlkZXIgLnVpLXNsaWRlci1oYW5kbGUnKS5jc3Moe3pJbmRleDogeWVzID8gLTEgOiAxMDAwMH0pOwoJfQp9CgpmdW5jdGlvbiBzZXRQcmV2aWV3KHZpZXcpIHsKCgl2YXIgcHJldmlld1dpZHRoID0gMTEyLAoJCXByZXZpZXdIZWlnaHQgPSA3MywKCQlwcmV2aWV3U3JjID0gJ3BhZ2VzL3ByZXZpZXcuanBnJywKCQlwcmV2aWV3ID0gJChfdGh1bWJQcmV2aWV3LmNoaWxkcmVuKCc6Zmlyc3QnKSksCgkJbnVtUGFnZXMgPSAodmlldz09MSB8fCB2aWV3PT0kKCcjc2xpZGVyJykuc2xpZGVyKCdvcHRpb24nLCAnbWF4JykpID8gMSA6IDIsCgkJd2lkdGggPSAobnVtUGFnZXM9PTEpID8gcHJldmlld1dpZHRoLzIgOiBwcmV2aWV3V2lkdGg7CgoJX3RodW1iUHJldmlldy4KCQlhZGRDbGFzcygnbm8tdHJhbnNpdGlvbicpLgoJCWNzcyh7d2lkdGg6IHdpZHRoICsgMTUsCgkJCWhlaWdodDogcHJldmlld0hlaWdodCArIDE1LAoJCQl0b3A6IC1wcmV2aWV3SGVpZ2h0IC0gMzAsCgkJCWxlZnQ6ICgkKCQoJyNzbGlkZXInKS5jaGlsZHJlbignOmZpcnN0JykpLndpZHRoKCkgLSB3aWR0aCAtIDE1KS8yCgkJfSk7CgoJcHJldmlldy5jc3MoewoJCXdpZHRoOiB3aWR0aCwKCQloZWlnaHQ6IHByZXZpZXdIZWlnaHQKCX0pOwoKCWlmIChwcmV2aWV3LmNzcygnYmFja2dyb3VuZC1pbWFnZScpPT09JycgfHwKCQlwcmV2aWV3LmNzcygnYmFja2dyb3VuZC1pbWFnZScpPT0nbm9uZScpIHsKCgkJcHJldmlldy5jc3Moe2JhY2tncm91bmRJbWFnZTogJ3VybCgnICsgcHJldmlld1NyYyArICcpJ30pOwoKCQlzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7CgkJCV90aHVtYlByZXZpZXcucmVtb3ZlQ2xhc3MoJ25vLXRyYW5zaXRpb24nKTsKCQl9LCAwKTsKCgl9CgoJcHJldmlldy5jc3Moe2JhY2tncm91bmRQb3NpdGlvbjoKCQknMHB4IC0nKygodmlldy0xKSpwcmV2aWV3SGVpZ2h0KSsncHgnCgl9KTsKfQoKLy8gV2lkdGggb2YgdGhlIGZsaXBib29rIHdoZW4gem9vbWVkIGluCgpmdW5jdGlvbiBsYXJnZU1hZ2F6aW5lV2lkdGgoKSB7CgkKCXJldHVybiAyMjE0OwoKfQoKLy8gZGVjb2RlIFVSTCBQYXJhbWV0ZXJzCgpmdW5jdGlvbiBkZWNvZGVQYXJhbXMoZGF0YSkgewoKCXZhciBwYXJ0cyA9IGRhdGEuc3BsaXQoJyYnKSwgZCwgb2JqID0ge307CgoJZm9yICh2YXIgaSA9MDsgaTxwYXJ0cy5sZW5ndGg7IGkrKykgewoJCWQgPSBwYXJ0c1tpXS5zcGxpdCgnPScpOwoJCW9ialtkZWNvZGVVUklDb21wb25lbnQoZFswXSldID0gZGVjb2RlVVJJQ29tcG9uZW50KGRbMV0pOwoJfQoKCXJldHVybiBvYmo7Cn0KCi8vIENhbGN1bGF0ZSB0aGUgd2lkdGggYW5kIGhlaWdodCBvZiBhIHNxdWFyZSB3aXRoaW4gYW5vdGhlciBzcXVhcmUKCmZ1bmN0aW9uIGNhbGN1bGF0ZUJvdW5kKGQpIHsKCQoJdmFyIGJvdW5kID0ge3dpZHRoOiBkLndpZHRoLCBoZWlnaHQ6IGQuaGVpZ2h0fTsKCglpZiAoYm91bmQud2lkdGg+ZC5ib3VuZFdpZHRoIHx8IGJvdW5kLmhlaWdodD5kLmJvdW5kSGVpZ2h0KSB7CgkJCgkJdmFyIHJlbCA9IGJvdW5kLndpZHRoL2JvdW5kLmhlaWdodDsKCgkJaWYgKGQuYm91bmRXaWR0aC9yZWw+ZC5ib3VuZEhlaWdodCAmJiBkLmJvdW5kSGVpZ2h0KnJlbDw9ZC5ib3VuZFdpZHRoKSB7CgkJCQoJCQlib3VuZC53aWR0aCA9IE1hdGgucm91bmQoZC5ib3VuZEhlaWdodCpyZWwpOwoJCQlib3VuZC5oZWlnaHQgPSBkLmJvdW5kSGVpZ2h0OwoKCQl9IGVsc2UgewoJCQkKCQkJYm91bmQud2lkdGggPSBkLmJvdW5kV2lkdGg7CgkJCWJvdW5kLmhlaWdodCA9IE1hdGgucm91bmQoZC5ib3VuZFdpZHRoL3JlbCk7CgkJCgkJfQoJfQoJCQoJcmV0dXJuIGJvdW5kOwp9'></script> -->

	<script id="fb_extras_jquery_min_17_js" src='data:/text/plain;base64,LyohIGpRdWVyeSB2MS43IGpxdWVyeS5jb20gfCBqcXVlcnkub3JnL2xpY2Vuc2UgKi8KKGZ1bmN0aW9uKGEsYil7ZnVuY3Rpb24gY0EoYSl7cmV0dXJuIGYuaXNXaW5kb3coYSk/YTphLm5vZGVUeXBlPT09OT9hLmRlZmF1bHRWaWV3fHxhLnBhcmVudFdpbmRvdzohMX1mdW5jdGlvbiBjeChhKXtpZighY21bYV0pe3ZhciBiPWMuYm9keSxkPWYoIjwiK2ErIj4iKS5hcHBlbmRUbyhiKSxlPWQuY3NzKCJkaXNwbGF5Iik7ZC5yZW1vdmUoKTtpZihlPT09Im5vbmUifHxlPT09IiIpe2NufHwoY249Yy5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKSxjbi5mcmFtZUJvcmRlcj1jbi53aWR0aD1jbi5oZWlnaHQ9MCksYi5hcHBlbmRDaGlsZChjbik7aWYoIWNvfHwhY24uY3JlYXRlRWxlbWVudCljbz0oY24uY29udGVudFdpbmRvd3x8Y24uY29udGVudERvY3VtZW50KS5kb2N1bWVudCxjby53cml0ZSgoYy5jb21wYXRNb2RlPT09IkNTUzFDb21wYXQiPyI8IWRvY3R5cGUgaHRtbD4iOiIiKSsiPGh0bWw+PGJvZHk+IiksY28uY2xvc2UoKTtkPWNvLmNyZWF0ZUVsZW1lbnQoYSksY28uYm9keS5hcHBlbmRDaGlsZChkKSxlPWYuY3NzKGQsImRpc3BsYXkiKSxiLnJlbW92ZUNoaWxkKGNuKX1jbVthXT1lfXJldHVybiBjbVthXX1mdW5jdGlvbiBjdyhhLGIpe3ZhciBjPXt9O2YuZWFjaChjcy5jb25jYXQuYXBwbHkoW10sY3Muc2xpY2UoMCxiKSksZnVuY3Rpb24oKXtjW3RoaXNdPWF9KTtyZXR1cm4gY31mdW5jdGlvbiBjdigpe2N0PWJ9ZnVuY3Rpb24gY3UoKXtzZXRUaW1lb3V0KGN2LDApO3JldHVybiBjdD1mLm5vdygpfWZ1bmN0aW9uIGNsKCl7dHJ5e3JldHVybiBuZXcgYS5BY3RpdmVYT2JqZWN0KCJNaWNyb3NvZnQuWE1MSFRUUCIpfWNhdGNoKGIpe319ZnVuY3Rpb24gY2soKXt0cnl7cmV0dXJuIG5ldyBhLlhNTEh0dHBSZXF1ZXN0fWNhdGNoKGIpe319ZnVuY3Rpb24gY2UoYSxjKXthLmRhdGFGaWx0ZXImJihjPWEuZGF0YUZpbHRlcihjLGEuZGF0YVR5cGUpKTt2YXIgZD1hLmRhdGFUeXBlcyxlPXt9LGcsaCxpPWQubGVuZ3RoLGosaz1kWzBdLGwsbSxuLG8scDtmb3IoZz0xO2c8aTtnKyspe2lmKGc9PT0xKWZvcihoIGluIGEuY29udmVydGVycyl0eXBlb2YgaD09InN0cmluZyImJihlW2gudG9Mb3dlckNhc2UoKV09YS5jb252ZXJ0ZXJzW2hdKTtsPWssaz1kW2ddO2lmKGs9PT0iKiIpaz1sO2Vsc2UgaWYobCE9PSIqIiYmbCE9PWspe209bCsiICIrayxuPWVbbV18fGVbIiogIitrXTtpZighbil7cD1iO2ZvcihvIGluIGUpe2o9by5zcGxpdCgiICIpO2lmKGpbMF09PT1sfHxqWzBdPT09IioiKXtwPWVbalsxXSsiICIra107aWYocCl7bz1lW29dLG89PT0hMD9uPXA6cD09PSEwJiYobj1vKTticmVha319fX0hbiYmIXAmJmYuZXJyb3IoIk5vIGNvbnZlcnNpb24gZnJvbSAiK20ucmVwbGFjZSgiICIsIiB0byAiKSksbiE9PSEwJiYoYz1uP24oYyk6cChvKGMpKSl9fXJldHVybiBjfWZ1bmN0aW9uIGNkKGEsYyxkKXt2YXIgZT1hLmNvbnRlbnRzLGY9YS5kYXRhVHlwZXMsZz1hLnJlc3BvbnNlRmllbGRzLGgsaSxqLGs7Zm9yKGkgaW4gZylpIGluIGQmJihjW2dbaV1dPWRbaV0pO3doaWxlKGZbMF09PT0iKiIpZi5zaGlmdCgpLGg9PT1iJiYoaD1hLm1pbWVUeXBlfHxjLmdldFJlc3BvbnNlSGVhZGVyKCJjb250ZW50LXR5cGUiKSk7aWYoaClmb3IoaSBpbiBlKWlmKGVbaV0mJmVbaV0udGVzdChoKSl7Zi51bnNoaWZ0KGkpO2JyZWFrfWlmKGZbMF1pbiBkKWo9ZlswXTtlbHNle2ZvcihpIGluIGQpe2lmKCFmWzBdfHxhLmNvbnZlcnRlcnNbaSsiICIrZlswXV0pe2o9aTticmVha31rfHwoaz1pKX1qPWp8fGt9aWYoail7aiE9PWZbMF0mJmYudW5zaGlmdChqKTtyZXR1cm4gZFtqXX19ZnVuY3Rpb24gY2MoYSxiLGMsZCl7aWYoZi5pc0FycmF5KGIpKWYuZWFjaChiLGZ1bmN0aW9uKGIsZSl7Y3x8YkcudGVzdChhKT9kKGEsZSk6Y2MoYSsiWyIrKHR5cGVvZiBlPT0ib2JqZWN0Inx8Zi5pc0FycmF5KGUpP2I6IiIpKyJdIixlLGMsZCl9KTtlbHNlIGlmKCFjJiZiIT1udWxsJiZ0eXBlb2YgYj09Im9iamVjdCIpZm9yKHZhciBlIGluIGIpY2MoYSsiWyIrZSsiXSIsYltlXSxjLGQpO2Vsc2UgZChhLGIpfWZ1bmN0aW9uIGNiKGEsYyl7dmFyIGQsZSxnPWYuYWpheFNldHRpbmdzLmZsYXRPcHRpb25zfHx7fTtmb3IoZCBpbiBjKWNbZF0hPT1iJiYoKGdbZF0/YTplfHwoZT17fSkpW2RdPWNbZF0pO2UmJmYuZXh0ZW5kKCEwLGEsZSl9ZnVuY3Rpb24gY2EoYSxjLGQsZSxmLGcpe2Y9Znx8Yy5kYXRhVHlwZXNbMF0sZz1nfHx7fSxnW2ZdPSEwO3ZhciBoPWFbZl0saT0wLGo9aD9oLmxlbmd0aDowLGs9YT09PWJWLGw7Zm9yKDtpPGomJihrfHwhbCk7aSsrKWw9aFtpXShjLGQsZSksdHlwZW9mIGw9PSJzdHJpbmciJiYoIWt8fGdbbF0/bD1iOihjLmRhdGFUeXBlcy51bnNoaWZ0KGwpLGw9Y2EoYSxjLGQsZSxsLGcpKSk7KGt8fCFsKSYmIWdbIioiXSYmKGw9Y2EoYSxjLGQsZSwiKiIsZykpO3JldHVybiBsfWZ1bmN0aW9uIGJfKGEpe3JldHVybiBmdW5jdGlvbihiLGMpe3R5cGVvZiBiIT0ic3RyaW5nIiYmKGM9YixiPSIqIik7aWYoZi5pc0Z1bmN0aW9uKGMpKXt2YXIgZD1iLnRvTG93ZXJDYXNlKCkuc3BsaXQoYlIpLGU9MCxnPWQubGVuZ3RoLGgsaSxqO2Zvcig7ZTxnO2UrKyloPWRbZV0saj0vXlwrLy50ZXN0KGgpLGomJihoPWguc3Vic3RyKDEpfHwiKiIpLGk9YVtoXT1hW2hdfHxbXSxpW2o/InVuc2hpZnQiOiJwdXNoIl0oYyl9fX1mdW5jdGlvbiBiRShhLGIsYyl7dmFyIGQ9Yj09PSJ3aWR0aCI/YS5vZmZzZXRXaWR0aDphLm9mZnNldEhlaWdodCxlPWI9PT0id2lkdGgiP2J6OmJBO2lmKGQ+MCl7YyE9PSJib3JkZXIiJiZmLmVhY2goZSxmdW5jdGlvbigpe2N8fChkLT1wYXJzZUZsb2F0KGYuY3NzKGEsInBhZGRpbmciK3RoaXMpKXx8MCksYz09PSJtYXJnaW4iP2QrPXBhcnNlRmxvYXQoZi5jc3MoYSxjK3RoaXMpKXx8MDpkLT1wYXJzZUZsb2F0KGYuY3NzKGEsImJvcmRlciIrdGhpcysiV2lkdGgiKSl8fDB9KTtyZXR1cm4gZCsicHgifWQ9YkIoYSxiLGIpO2lmKGQ8MHx8ZD09bnVsbClkPWEuc3R5bGVbYl18fDA7ZD1wYXJzZUZsb2F0KGQpfHwwLGMmJmYuZWFjaChlLGZ1bmN0aW9uKCl7ZCs9cGFyc2VGbG9hdChmLmNzcyhhLCJwYWRkaW5nIit0aGlzKSl8fDAsYyE9PSJwYWRkaW5nIiYmKGQrPXBhcnNlRmxvYXQoZi5jc3MoYSwiYm9yZGVyIit0aGlzKyJXaWR0aCIpKXx8MCksYz09PSJtYXJnaW4iJiYoZCs9cGFyc2VGbG9hdChmLmNzcyhhLGMrdGhpcykpfHwwKX0pO3JldHVybiBkKyJweCJ9ZnVuY3Rpb24gYnIoYSxiKXtiLnNyYz9mLmFqYXgoe3VybDpiLnNyYyxhc3luYzohMSxkYXRhVHlwZToic2NyaXB0In0pOmYuZ2xvYmFsRXZhbCgoYi50ZXh0fHxiLnRleHRDb250ZW50fHxiLmlubmVySFRNTHx8IiIpLnJlcGxhY2UoYmksIi8qJDAqLyIpKSxiLnBhcmVudE5vZGUmJmIucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChiKX1mdW5jdGlvbiBicShhKXt2YXIgYj0oYS5ub2RlTmFtZXx8IiIpLnRvTG93ZXJDYXNlKCk7Yj09PSJpbnB1dCI/YnAoYSk6YiE9PSJzY3JpcHQiJiZ0eXBlb2YgYS5nZXRFbGVtZW50c0J5VGFnTmFtZSE9InVuZGVmaW5lZCImJmYuZ3JlcChhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJpbnB1dCIpLGJwKX1mdW5jdGlvbiBicChhKXtpZihhLnR5cGU9PT0iY2hlY2tib3gifHxhLnR5cGU9PT0icmFkaW8iKWEuZGVmYXVsdENoZWNrZWQ9YS5jaGVja2VkfWZ1bmN0aW9uIGJvKGEpe3JldHVybiB0eXBlb2YgYS5nZXRFbGVtZW50c0J5VGFnTmFtZSE9InVuZGVmaW5lZCI/YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpOnR5cGVvZiBhLnF1ZXJ5U2VsZWN0b3JBbGwhPSJ1bmRlZmluZWQiP2EucXVlcnlTZWxlY3RvckFsbCgiKiIpOltdfWZ1bmN0aW9uIGJuKGEsYil7dmFyIGM7aWYoYi5ub2RlVHlwZT09PTEpe2IuY2xlYXJBdHRyaWJ1dGVzJiZiLmNsZWFyQXR0cmlidXRlcygpLGIubWVyZ2VBdHRyaWJ1dGVzJiZiLm1lcmdlQXR0cmlidXRlcyhhKSxjPWIubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtpZihjPT09Im9iamVjdCIpYi5vdXRlckhUTUw9YS5vdXRlckhUTUw7ZWxzZSBpZihjIT09ImlucHV0Inx8YS50eXBlIT09ImNoZWNrYm94IiYmYS50eXBlIT09InJhZGlvIil7aWYoYz09PSJvcHRpb24iKWIuc2VsZWN0ZWQ9YS5kZWZhdWx0U2VsZWN0ZWQ7ZWxzZSBpZihjPT09ImlucHV0Inx8Yz09PSJ0ZXh0YXJlYSIpYi5kZWZhdWx0VmFsdWU9YS5kZWZhdWx0VmFsdWV9ZWxzZSBhLmNoZWNrZWQmJihiLmRlZmF1bHRDaGVja2VkPWIuY2hlY2tlZD1hLmNoZWNrZWQpLGIudmFsdWUhPT1hLnZhbHVlJiYoYi52YWx1ZT1hLnZhbHVlKTtiLnJlbW92ZUF0dHJpYnV0ZShmLmV4cGFuZG8pfX1mdW5jdGlvbiBibShhLGIpe2lmKGIubm9kZVR5cGU9PT0xJiYhIWYuaGFzRGF0YShhKSl7dmFyIGMsZCxlLGc9Zi5fZGF0YShhKSxoPWYuX2RhdGEoYixnKSxpPWcuZXZlbnRzO2lmKGkpe2RlbGV0ZSBoLmhhbmRsZSxoLmV2ZW50cz17fTtmb3IoYyBpbiBpKWZvcihkPTAsZT1pW2NdLmxlbmd0aDtkPGU7ZCsrKWYuZXZlbnQuYWRkKGIsYysoaVtjXVtkXS5uYW1lc3BhY2U/Ii4iOiIiKStpW2NdW2RdLm5hbWVzcGFjZSxpW2NdW2RdLGlbY11bZF0uZGF0YSl9aC5kYXRhJiYoaC5kYXRhPWYuZXh0ZW5kKHt9LGguZGF0YSkpfX1mdW5jdGlvbiBibChhLGIpe3JldHVybiBmLm5vZGVOYW1lKGEsInRhYmxlIik/YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidGJvZHkiKVswXXx8YS5hcHBlbmRDaGlsZChhLm93bmVyRG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGJvZHkiKSk6YX1mdW5jdGlvbiBYKGEpe3ZhciBiPVkuc3BsaXQoIiAiKSxjPWEuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpO2lmKGMuY3JlYXRlRWxlbWVudCl3aGlsZShiLmxlbmd0aCljLmNyZWF0ZUVsZW1lbnQoYi5wb3AoKSk7cmV0dXJuIGN9ZnVuY3Rpb24gVyhhLGIsYyl7Yj1ifHwwO2lmKGYuaXNGdW5jdGlvbihiKSlyZXR1cm4gZi5ncmVwKGEsZnVuY3Rpb24oYSxkKXt2YXIgZT0hIWIuY2FsbChhLGQsYSk7cmV0dXJuIGU9PT1jfSk7aWYoYi5ub2RlVHlwZSlyZXR1cm4gZi5ncmVwKGEsZnVuY3Rpb24oYSxkKXtyZXR1cm4gYT09PWI9PT1jfSk7aWYodHlwZW9mIGI9PSJzdHJpbmciKXt2YXIgZD1mLmdyZXAoYSxmdW5jdGlvbihhKXtyZXR1cm4gYS5ub2RlVHlwZT09PTF9KTtpZihSLnRlc3QoYikpcmV0dXJuIGYuZmlsdGVyKGIsZCwhYyk7Yj1mLmZpbHRlcihiLGQpfXJldHVybiBmLmdyZXAoYSxmdW5jdGlvbihhLGQpe3JldHVybiBmLmluQXJyYXkoYSxiKT49MD09PWN9KX1mdW5jdGlvbiBWKGEpe3JldHVybiFhfHwhYS5wYXJlbnROb2RlfHxhLnBhcmVudE5vZGUubm9kZVR5cGU9PT0xMX1mdW5jdGlvbiBOKCl7cmV0dXJuITB9ZnVuY3Rpb24gTSgpe3JldHVybiExfWZ1bmN0aW9uIG4oYSxiLGMpe3ZhciBkPWIrImRlZmVyIixlPWIrInF1ZXVlIixnPWIrIm1hcmsiLGg9Zi5fZGF0YShhLGQpO2gmJihjPT09InF1ZXVlInx8IWYuX2RhdGEoYSxlKSkmJihjPT09Im1hcmsifHwhZi5fZGF0YShhLGcpKSYmc2V0VGltZW91dChmdW5jdGlvbigpeyFmLl9kYXRhKGEsZSkmJiFmLl9kYXRhKGEsZykmJihmLnJlbW92ZURhdGEoYSxkLCEwKSxoLmZpcmUoKSl9LDApfWZ1bmN0aW9uIG0oYSl7Zm9yKHZhciBiIGluIGEpe2lmKGI9PT0iZGF0YSImJmYuaXNFbXB0eU9iamVjdChhW2JdKSljb250aW51ZTtpZihiIT09InRvSlNPTiIpcmV0dXJuITF9cmV0dXJuITB9ZnVuY3Rpb24gbChhLGMsZCl7aWYoZD09PWImJmEubm9kZVR5cGU9PT0xKXt2YXIgZT0iZGF0YS0iK2MucmVwbGFjZShrLCItJDEiKS50b0xvd2VyQ2FzZSgpO2Q9YS5nZXRBdHRyaWJ1dGUoZSk7aWYodHlwZW9mIGQ9PSJzdHJpbmciKXt0cnl7ZD1kPT09InRydWUiPyEwOmQ9PT0iZmFsc2UiPyExOmQ9PT0ibnVsbCI/bnVsbDpmLmlzTnVtZXJpYyhkKT9wYXJzZUZsb2F0KGQpOmoudGVzdChkKT9mLnBhcnNlSlNPTihkKTpkfWNhdGNoKGcpe31mLmRhdGEoYSxjLGQpfWVsc2UgZD1ifXJldHVybiBkfWZ1bmN0aW9uIGgoYSl7dmFyIGI9Z1thXT17fSxjLGQ7YT1hLnNwbGl0KC9ccysvKTtmb3IoYz0wLGQ9YS5sZW5ndGg7YzxkO2MrKyliW2FbY11dPSEwO3JldHVybiBifXZhciBjPWEuZG9jdW1lbnQsZD1hLm5hdmlnYXRvcixlPWEubG9jYXRpb24sZj1mdW5jdGlvbigpe2Z1bmN0aW9uIEsoKXtpZighZS5pc1JlYWR5KXt0cnl7Yy5kb2N1bWVudEVsZW1lbnQuZG9TY3JvbGwoImxlZnQiKX1jYXRjaChhKXtzZXRUaW1lb3V0KEssMSk7cmV0dXJufWUucmVhZHkoKX19dmFyIGU9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gbmV3IGUuZm4uaW5pdChhLGIsaCl9LGY9YS5qUXVlcnksZz1hLiQsaCxpPS9eKD86W14jPF0qKDxbXHdcV10rPilbXj5dKiR8IyhbXHdcLV0qKSQpLyxqPS9cUy8saz0vXlxzKy8sbD0vXHMrJC8sbT0vXGQvLG49L148KFx3KylccypcLz8+KD86PFwvXDE+KT8kLyxvPS9eW1xdLDp7fVxzXSokLyxwPS9cXCg/OlsiXFxcL2JmbnJ0XXx1WzAtOWEtZkEtRl17NH0pL2cscT0vIlteIlxcXG5ccl0qInx0cnVlfGZhbHNlfG51bGx8LT9cZCsoPzpcLlxkKik/KD86W2VFXVsrXC1dP1xkKyk/L2cscj0vKD86Xnw6fCwpKD86XHMqXFspKy9nLHM9Lyh3ZWJraXQpWyBcL10oW1x3Ll0rKS8sdD0vKG9wZXJhKSg/Oi4qdmVyc2lvbik/WyBcL10oW1x3Ll0rKS8sdT0vKG1zaWUpIChbXHcuXSspLyx2PS8obW96aWxsYSkoPzouKj8gcnY6KFtcdy5dKykpPy8sdz0vLShbYS16XXxbMC05XSkvaWcseD0vXi1tcy0vLHk9ZnVuY3Rpb24oYSxiKXtyZXR1cm4oYisiIikudG9VcHBlckNhc2UoKX0sej1kLnVzZXJBZ2VudCxBLEIsQyxEPU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcsRT1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LEY9QXJyYXkucHJvdG90eXBlLnB1c2gsRz1BcnJheS5wcm90b3R5cGUuc2xpY2UsSD1TdHJpbmcucHJvdG90eXBlLnRyaW0sST1BcnJheS5wcm90b3R5cGUuaW5kZXhPZixKPXt9O2UuZm49ZS5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOmUsaW5pdDpmdW5jdGlvbihhLGQsZil7dmFyIGcsaCxqLGs7aWYoIWEpcmV0dXJuIHRoaXM7aWYoYS5ub2RlVHlwZSl7dGhpcy5jb250ZXh0PXRoaXNbMF09YSx0aGlzLmxlbmd0aD0xO3JldHVybiB0aGlzfWlmKGE9PT0iYm9keSImJiFkJiZjLmJvZHkpe3RoaXMuY29udGV4dD1jLHRoaXNbMF09Yy5ib2R5LHRoaXMuc2VsZWN0b3I9YSx0aGlzLmxlbmd0aD0xO3JldHVybiB0aGlzfWlmKHR5cGVvZiBhPT0ic3RyaW5nIil7YS5jaGFyQXQoMCkhPT0iPCJ8fGEuY2hhckF0KGEubGVuZ3RoLTEpIT09Ij4ifHxhLmxlbmd0aDwzP2c9aS5leGVjKGEpOmc9W251bGwsYSxudWxsXTtpZihnJiYoZ1sxXXx8IWQpKXtpZihnWzFdKXtkPWQgaW5zdGFuY2VvZiBlP2RbMF06ZCxrPWQ/ZC5vd25lckRvY3VtZW50fHxkOmMsaj1uLmV4ZWMoYSksaj9lLmlzUGxhaW5PYmplY3QoZCk/KGE9W2MuY3JlYXRlRWxlbWVudChqWzFdKV0sZS5mbi5hdHRyLmNhbGwoYSxkLCEwKSk6YT1bay5jcmVhdGVFbGVtZW50KGpbMV0pXTooaj1lLmJ1aWxkRnJhZ21lbnQoW2dbMV1dLFtrXSksYT0oai5jYWNoZWFibGU/ZS5jbG9uZShqLmZyYWdtZW50KTpqLmZyYWdtZW50KS5jaGlsZE5vZGVzKTtyZXR1cm4gZS5tZXJnZSh0aGlzLGEpfWg9Yy5nZXRFbGVtZW50QnlJZChnWzJdKTtpZihoJiZoLnBhcmVudE5vZGUpe2lmKGguaWQhPT1nWzJdKXJldHVybiBmLmZpbmQoYSk7dGhpcy5sZW5ndGg9MSx0aGlzWzBdPWh9dGhpcy5jb250ZXh0PWMsdGhpcy5zZWxlY3Rvcj1hO3JldHVybiB0aGlzfXJldHVybiFkfHxkLmpxdWVyeT8oZHx8ZikuZmluZChhKTp0aGlzLmNvbnN0cnVjdG9yKGQpLmZpbmQoYSl9aWYoZS5pc0Z1bmN0aW9uKGEpKXJldHVybiBmLnJlYWR5KGEpO2Euc2VsZWN0b3IhPT1iJiYodGhpcy5zZWxlY3Rvcj1hLnNlbGVjdG9yLHRoaXMuY29udGV4dD1hLmNvbnRleHQpO3JldHVybiBlLm1ha2VBcnJheShhLHRoaXMpfSxzZWxlY3RvcjoiIixqcXVlcnk6IjEuNyIsbGVuZ3RoOjAsc2l6ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmxlbmd0aH0sdG9BcnJheTpmdW5jdGlvbigpe3JldHVybiBHLmNhbGwodGhpcywwKX0sZ2V0OmZ1bmN0aW9uKGEpe3JldHVybiBhPT1udWxsP3RoaXMudG9BcnJheSgpOmE8MD90aGlzW3RoaXMubGVuZ3RoK2FdOnRoaXNbYV19LHB1c2hTdGFjazpmdW5jdGlvbihhLGIsYyl7dmFyIGQ9dGhpcy5jb25zdHJ1Y3RvcigpO2UuaXNBcnJheShhKT9GLmFwcGx5KGQsYSk6ZS5tZXJnZShkLGEpLGQucHJldk9iamVjdD10aGlzLGQuY29udGV4dD10aGlzLmNvbnRleHQsYj09PSJmaW5kIj9kLnNlbGVjdG9yPXRoaXMuc2VsZWN0b3IrKHRoaXMuc2VsZWN0b3I/IiAiOiIiKStjOmImJihkLnNlbGVjdG9yPXRoaXMuc2VsZWN0b3IrIi4iK2IrIigiK2MrIikiKTtyZXR1cm4gZH0sZWFjaDpmdW5jdGlvbihhLGIpe3JldHVybiBlLmVhY2godGhpcyxhLGIpfSxyZWFkeTpmdW5jdGlvbihhKXtlLmJpbmRSZWFkeSgpLEIuYWRkKGEpO3JldHVybiB0aGlzfSxlcTpmdW5jdGlvbihhKXtyZXR1cm4gYT09PS0xP3RoaXMuc2xpY2UoYSk6dGhpcy5zbGljZShhLCthKzEpfSxmaXJzdDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVxKDApfSxsYXN0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXEoLTEpfSxzbGljZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnB1c2hTdGFjayhHLmFwcGx5KHRoaXMsYXJndW1lbnRzKSwic2xpY2UiLEcuY2FsbChhcmd1bWVudHMpLmpvaW4oIiwiKSl9LG1hcDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2soZS5tYXAodGhpcyxmdW5jdGlvbihiLGMpe3JldHVybiBhLmNhbGwoYixjLGIpfSkpfSxlbmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wcmV2T2JqZWN0fHx0aGlzLmNvbnN0cnVjdG9yKG51bGwpfSxwdXNoOkYsc29ydDpbXS5zb3J0LHNwbGljZTpbXS5zcGxpY2V9LGUuZm4uaW5pdC5wcm90b3R5cGU9ZS5mbixlLmV4dGVuZD1lLmZuLmV4dGVuZD1mdW5jdGlvbigpe3ZhciBhLGMsZCxmLGcsaCxpPWFyZ3VtZW50c1swXXx8e30saj0xLGs9YXJndW1lbnRzLmxlbmd0aCxsPSExO3R5cGVvZiBpPT0iYm9vbGVhbiImJihsPWksaT1hcmd1bWVudHNbMV18fHt9LGo9MiksdHlwZW9mIGkhPSJvYmplY3QiJiYhZS5pc0Z1bmN0aW9uKGkpJiYoaT17fSksaz09PWomJihpPXRoaXMsLS1qKTtmb3IoO2o8aztqKyspaWYoKGE9YXJndW1lbnRzW2pdKSE9bnVsbClmb3IoYyBpbiBhKXtkPWlbY10sZj1hW2NdO2lmKGk9PT1mKWNvbnRpbnVlO2wmJmYmJihlLmlzUGxhaW5PYmplY3QoZil8fChnPWUuaXNBcnJheShmKSkpPyhnPyhnPSExLGg9ZCYmZS5pc0FycmF5KGQpP2Q6W10pOmg9ZCYmZS5pc1BsYWluT2JqZWN0KGQpP2Q6e30saVtjXT1lLmV4dGVuZChsLGgsZikpOmYhPT1iJiYoaVtjXT1mKX1yZXR1cm4gaX0sZS5leHRlbmQoe25vQ29uZmxpY3Q6ZnVuY3Rpb24oYil7YS4kPT09ZSYmKGEuJD1nKSxiJiZhLmpRdWVyeT09PWUmJihhLmpRdWVyeT1mKTtyZXR1cm4gZX0saXNSZWFkeTohMSxyZWFkeVdhaXQ6MSxob2xkUmVhZHk6ZnVuY3Rpb24oYSl7YT9lLnJlYWR5V2FpdCsrOmUucmVhZHkoITApfSxyZWFkeTpmdW5jdGlvbihhKXtpZihhPT09ITAmJiEtLWUucmVhZHlXYWl0fHxhIT09ITAmJiFlLmlzUmVhZHkpe2lmKCFjLmJvZHkpcmV0dXJuIHNldFRpbWVvdXQoZS5yZWFkeSwxKTtlLmlzUmVhZHk9ITA7aWYoYSE9PSEwJiYtLWUucmVhZHlXYWl0PjApcmV0dXJuO0IuZmlyZVdpdGgoYyxbZV0pLGUuZm4udHJpZ2dlciYmZShjKS50cmlnZ2VyKCJyZWFkeSIpLnVuYmluZCgicmVhZHkiKX19LGJpbmRSZWFkeTpmdW5jdGlvbigpe2lmKCFCKXtCPWUuQ2FsbGJhY2tzKCJvbmNlIG1lbW9yeSIpO2lmKGMucmVhZHlTdGF0ZT09PSJjb21wbGV0ZSIpcmV0dXJuIHNldFRpbWVvdXQoZS5yZWFkeSwxKTtpZihjLmFkZEV2ZW50TGlzdGVuZXIpYy5hZGRFdmVudExpc3RlbmVyKCJET01Db250ZW50TG9hZGVkIixDLCExKSxhLmFkZEV2ZW50TGlzdGVuZXIoImxvYWQiLGUucmVhZHksITEpO2Vsc2UgaWYoYy5hdHRhY2hFdmVudCl7Yy5hdHRhY2hFdmVudCgib25yZWFkeXN0YXRlY2hhbmdlIixDKSxhLmF0dGFjaEV2ZW50KCJvbmxvYWQiLGUucmVhZHkpO3ZhciBiPSExO3RyeXtiPWEuZnJhbWVFbGVtZW50PT1udWxsfWNhdGNoKGQpe31jLmRvY3VtZW50RWxlbWVudC5kb1Njcm9sbCYmYiYmSygpfX19LGlzRnVuY3Rpb246ZnVuY3Rpb24oYSl7cmV0dXJuIGUudHlwZShhKT09PSJmdW5jdGlvbiJ9LGlzQXJyYXk6QXJyYXkuaXNBcnJheXx8ZnVuY3Rpb24oYSl7cmV0dXJuIGUudHlwZShhKT09PSJhcnJheSJ9LGlzV2luZG93OmZ1bmN0aW9uKGEpe3JldHVybiBhJiZ0eXBlb2YgYT09Im9iamVjdCImJiJzZXRJbnRlcnZhbCJpbiBhfSxpc051bWVyaWM6ZnVuY3Rpb24oYSl7cmV0dXJuIGEhPW51bGwmJm0udGVzdChhKSYmIWlzTmFOKGEpfSx0eXBlOmZ1bmN0aW9uKGEpe3JldHVybiBhPT1udWxsP1N0cmluZyhhKTpKW0QuY2FsbChhKV18fCJvYmplY3QifSxpc1BsYWluT2JqZWN0OmZ1bmN0aW9uKGEpe2lmKCFhfHxlLnR5cGUoYSkhPT0ib2JqZWN0Inx8YS5ub2RlVHlwZXx8ZS5pc1dpbmRvdyhhKSlyZXR1cm4hMTt0cnl7aWYoYS5jb25zdHJ1Y3RvciYmIUUuY2FsbChhLCJjb25zdHJ1Y3RvciIpJiYhRS5jYWxsKGEuY29uc3RydWN0b3IucHJvdG90eXBlLCJpc1Byb3RvdHlwZU9mIikpcmV0dXJuITF9Y2F0Y2goYyl7cmV0dXJuITF9dmFyIGQ7Zm9yKGQgaW4gYSk7cmV0dXJuIGQ9PT1ifHxFLmNhbGwoYSxkKX0saXNFbXB0eU9iamVjdDpmdW5jdGlvbihhKXtmb3IodmFyIGIgaW4gYSlyZXR1cm4hMTtyZXR1cm4hMH0sZXJyb3I6ZnVuY3Rpb24oYSl7dGhyb3cgYX0scGFyc2VKU09OOmZ1bmN0aW9uKGIpe2lmKHR5cGVvZiBiIT0ic3RyaW5nInx8IWIpcmV0dXJuIG51bGw7Yj1lLnRyaW0oYik7aWYoYS5KU09OJiZhLkpTT04ucGFyc2UpcmV0dXJuIGEuSlNPTi5wYXJzZShiKTtpZihvLnRlc3QoYi5yZXBsYWNlKHAsIkAiKS5yZXBsYWNlKHEsIl0iKS5yZXBsYWNlKHIsIiIpKSlyZXR1cm4obmV3IEZ1bmN0aW9uKCJyZXR1cm4gIitiKSkoKTtlLmVycm9yKCJJbnZhbGlkIEpTT046ICIrYil9LHBhcnNlWE1MOmZ1bmN0aW9uKGMpe3ZhciBkLGY7dHJ5e2EuRE9NUGFyc2VyPyhmPW5ldyBET01QYXJzZXIsZD1mLnBhcnNlRnJvbVN0cmluZyhjLCJ0ZXh0L3htbCIpKTooZD1uZXcgQWN0aXZlWE9iamVjdCgiTWljcm9zb2Z0LlhNTERPTSIpLGQuYXN5bmM9ImZhbHNlIixkLmxvYWRYTUwoYykpfWNhdGNoKGcpe2Q9Yn0oIWR8fCFkLmRvY3VtZW50RWxlbWVudHx8ZC5nZXRFbGVtZW50c0J5VGFnTmFtZSgicGFyc2VyZXJyb3IiKS5sZW5ndGgpJiZlLmVycm9yKCJJbnZhbGlkIFhNTDogIitjKTtyZXR1cm4gZH0sbm9vcDpmdW5jdGlvbigpe30sZ2xvYmFsRXZhbDpmdW5jdGlvbihiKXtiJiZqLnRlc3QoYikmJihhLmV4ZWNTY3JpcHR8fGZ1bmN0aW9uKGIpe2EuZXZhbC5jYWxsKGEsYil9KShiKX0sY2FtZWxDYXNlOmZ1bmN0aW9uKGEpe3JldHVybiBhLnJlcGxhY2UoeCwibXMtIikucmVwbGFjZSh3LHkpfSxub2RlTmFtZTpmdW5jdGlvbihhLGIpe3JldHVybiBhLm5vZGVOYW1lJiZhLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCk9PT1iLnRvVXBwZXJDYXNlKCl9LGVhY2g6ZnVuY3Rpb24oYSxjLGQpe3ZhciBmLGc9MCxoPWEubGVuZ3RoLGk9aD09PWJ8fGUuaXNGdW5jdGlvbihhKTtpZihkKXtpZihpKXtmb3IoZiBpbiBhKWlmKGMuYXBwbHkoYVtmXSxkKT09PSExKWJyZWFrfWVsc2UgZm9yKDtnPGg7KWlmKGMuYXBwbHkoYVtnKytdLGQpPT09ITEpYnJlYWt9ZWxzZSBpZihpKXtmb3IoZiBpbiBhKWlmKGMuY2FsbChhW2ZdLGYsYVtmXSk9PT0hMSlicmVha31lbHNlIGZvcig7ZzxoOylpZihjLmNhbGwoYVtnXSxnLGFbZysrXSk9PT0hMSlicmVhaztyZXR1cm4gYX0sdHJpbTpIP2Z1bmN0aW9uKGEpe3JldHVybiBhPT1udWxsPyIiOkguY2FsbChhKX06ZnVuY3Rpb24oYSl7cmV0dXJuIGE9PW51bGw/IiI6KGErIiIpLnJlcGxhY2UoaywiIikucmVwbGFjZShsLCIiKX0sbWFrZUFycmF5OmZ1bmN0aW9uKGEsYil7dmFyIGM9Ynx8W107aWYoYSE9bnVsbCl7dmFyIGQ9ZS50eXBlKGEpO2EubGVuZ3RoPT1udWxsfHxkPT09InN0cmluZyJ8fGQ9PT0iZnVuY3Rpb24ifHxkPT09InJlZ2V4cCJ8fGUuaXNXaW5kb3coYSk/Ri5jYWxsKGMsYSk6ZS5tZXJnZShjLGEpfXJldHVybiBjfSxpbkFycmF5OmZ1bmN0aW9uKGEsYixjKXt2YXIgZDtpZihiKXtpZihJKXJldHVybiBJLmNhbGwoYixhLGMpO2Q9Yi5sZW5ndGgsYz1jP2M8MD9NYXRoLm1heCgwLGQrYyk6YzowO2Zvcig7YzxkO2MrKylpZihjIGluIGImJmJbY109PT1hKXJldHVybiBjfXJldHVybi0xfSxtZXJnZTpmdW5jdGlvbihhLGMpe3ZhciBkPWEubGVuZ3RoLGU9MDtpZih0eXBlb2YgYy5sZW5ndGg9PSJudW1iZXIiKWZvcih2YXIgZj1jLmxlbmd0aDtlPGY7ZSsrKWFbZCsrXT1jW2VdO2Vsc2Ugd2hpbGUoY1tlXSE9PWIpYVtkKytdPWNbZSsrXTthLmxlbmd0aD1kO3JldHVybiBhfSxncmVwOmZ1bmN0aW9uKGEsYixjKXt2YXIgZD1bXSxlO2M9ISFjO2Zvcih2YXIgZj0wLGc9YS5sZW5ndGg7ZjxnO2YrKyllPSEhYihhW2ZdLGYpLGMhPT1lJiZkLnB1c2goYVtmXSk7cmV0dXJuIGR9LG1hcDpmdW5jdGlvbihhLGMsZCl7dmFyIGYsZyxoPVtdLGk9MCxqPWEubGVuZ3RoLGs9YSBpbnN0YW5jZW9mIGV8fGohPT1iJiZ0eXBlb2Ygaj09Im51bWJlciImJihqPjAmJmFbMF0mJmFbai0xXXx8aj09PTB8fGUuaXNBcnJheShhKSk7aWYoaylmb3IoO2k8ajtpKyspZj1jKGFbaV0saSxkKSxmIT1udWxsJiYoaFtoLmxlbmd0aF09Zik7ZWxzZSBmb3IoZyBpbiBhKWY9YyhhW2ddLGcsZCksZiE9bnVsbCYmKGhbaC5sZW5ndGhdPWYpO3JldHVybiBoLmNvbmNhdC5hcHBseShbXSxoKX0sZ3VpZDoxLHByb3h5OmZ1bmN0aW9uKGEsYyl7aWYodHlwZW9mIGM9PSJzdHJpbmciKXt2YXIgZD1hW2NdO2M9YSxhPWR9aWYoIWUuaXNGdW5jdGlvbihhKSlyZXR1cm4gYjt2YXIgZj1HLmNhbGwoYXJndW1lbnRzLDIpLGc9ZnVuY3Rpb24oKXtyZXR1cm4gYS5hcHBseShjLGYuY29uY2F0KEcuY2FsbChhcmd1bWVudHMpKSl9O2cuZ3VpZD1hLmd1aWQ9YS5ndWlkfHxnLmd1aWR8fGUuZ3VpZCsrO3JldHVybiBnfSxhY2Nlc3M6ZnVuY3Rpb24oYSxjLGQsZixnLGgpe3ZhciBpPWEubGVuZ3RoO2lmKHR5cGVvZiBjPT0ib2JqZWN0Iil7Zm9yKHZhciBqIGluIGMpZS5hY2Nlc3MoYSxqLGNbal0sZixnLGQpO3JldHVybiBhfWlmKGQhPT1iKXtmPSFoJiZmJiZlLmlzRnVuY3Rpb24oZCk7Zm9yKHZhciBrPTA7azxpO2srKylnKGFba10sYyxmP2QuY2FsbChhW2tdLGssZyhhW2tdLGMpKTpkLGgpO3JldHVybiBhfXJldHVybiBpP2coYVswXSxjKTpifSxub3c6ZnVuY3Rpb24oKXtyZXR1cm4obmV3IERhdGUpLmdldFRpbWUoKX0sdWFNYXRjaDpmdW5jdGlvbihhKXthPWEudG9Mb3dlckNhc2UoKTt2YXIgYj1zLmV4ZWMoYSl8fHQuZXhlYyhhKXx8dS5leGVjKGEpfHxhLmluZGV4T2YoImNvbXBhdGlibGUiKTwwJiZ2LmV4ZWMoYSl8fFtdO3JldHVybnticm93c2VyOmJbMV18fCIiLHZlcnNpb246YlsyXXx8IjAifX0sc3ViOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShiLGMpe3JldHVybiBuZXcgYS5mbi5pbml0KGIsYyl9ZS5leHRlbmQoITAsYSx0aGlzKSxhLnN1cGVyY2xhc3M9dGhpcyxhLmZuPWEucHJvdG90eXBlPXRoaXMoKSxhLmZuLmNvbnN0cnVjdG9yPWEsYS5zdWI9dGhpcy5zdWIsYS5mbi5pbml0PWZ1bmN0aW9uKGQsZil7ZiYmZiBpbnN0YW5jZW9mIGUmJiEoZiBpbnN0YW5jZW9mIGEpJiYoZj1hKGYpKTtyZXR1cm4gZS5mbi5pbml0LmNhbGwodGhpcyxkLGYsYil9LGEuZm4uaW5pdC5wcm90b3R5cGU9YS5mbjt2YXIgYj1hKGMpO3JldHVybiBhfSxicm93c2VyOnt9fSksZS5lYWNoKCJCb29sZWFuIE51bWJlciBTdHJpbmcgRnVuY3Rpb24gQXJyYXkgRGF0ZSBSZWdFeHAgT2JqZWN0Ii5zcGxpdCgiICIpLGZ1bmN0aW9uKGEsYil7SlsiW29iamVjdCAiK2IrIl0iXT1iLnRvTG93ZXJDYXNlKCl9KSxBPWUudWFNYXRjaCh6KSxBLmJyb3dzZXImJihlLmJyb3dzZXJbQS5icm93c2VyXT0hMCxlLmJyb3dzZXIudmVyc2lvbj1BLnZlcnNpb24pLGUuYnJvd3Nlci53ZWJraXQmJihlLmJyb3dzZXIuc2FmYXJpPSEwKSxqLnRlc3QoIsKgIikmJihrPS9eW1xzXHhBMF0rLyxsPS9bXHNceEEwXSskLyksaD1lKGMpLGMuYWRkRXZlbnRMaXN0ZW5lcj9DPWZ1bmN0aW9uKCl7Yy5yZW1vdmVFdmVudExpc3RlbmVyKCJET01Db250ZW50TG9hZGVkIixDLCExKSxlLnJlYWR5KCl9OmMuYXR0YWNoRXZlbnQmJihDPWZ1bmN0aW9uKCl7Yy5yZWFkeVN0YXRlPT09ImNvbXBsZXRlIiYmKGMuZGV0YWNoRXZlbnQoIm9ucmVhZHlzdGF0ZWNoYW5nZSIsQyksZS5yZWFkeSgpKX0pLHR5cGVvZiBkZWZpbmU9PSJmdW5jdGlvbiImJmRlZmluZS5hbWQmJmRlZmluZS5hbWQualF1ZXJ5JiZkZWZpbmUoImpxdWVyeSIsW10sZnVuY3Rpb24oKXtyZXR1cm4gZX0pO3JldHVybiBlfSgpLGc9e307Zi5DYWxsYmFja3M9ZnVuY3Rpb24oYSl7YT1hP2dbYV18fGgoYSk6e307dmFyIGM9W10sZD1bXSxlLGksaixrLGwsbT1mdW5jdGlvbihiKXt2YXIgZCxlLGcsaCxpO2ZvcihkPTAsZT1iLmxlbmd0aDtkPGU7ZCsrKWc9YltkXSxoPWYudHlwZShnKSxoPT09ImFycmF5Ij9tKGcpOmg9PT0iZnVuY3Rpb24iJiYoIWEudW5pcXVlfHwhby5oYXMoZykpJiZjLnB1c2goZyl9LG49ZnVuY3Rpb24oYixmKXtmPWZ8fFtdLGU9IWEubWVtb3J5fHxbYixmXSxpPSEwLGw9anx8MCxqPTAsaz1jLmxlbmd0aDtmb3IoO2MmJmw8aztsKyspaWYoY1tsXS5hcHBseShiLGYpPT09ITEmJmEuc3RvcE9uRmFsc2Upe2U9ITA7YnJlYWt9aT0hMSxjJiYoYS5vbmNlP2U9PT0hMD9vLmRpc2FibGUoKTpjPVtdOmQmJmQubGVuZ3RoJiYoZT1kLnNoaWZ0KCksby5maXJlV2l0aChlWzBdLGVbMV0pKSl9LG89e2FkZDpmdW5jdGlvbigpe2lmKGMpe3ZhciBhPWMubGVuZ3RoO20oYXJndW1lbnRzKSxpP2s9Yy5sZW5ndGg6ZSYmZSE9PSEwJiYoaj1hLG4oZVswXSxlWzFdKSl9cmV0dXJuIHRoaXN9LHJlbW92ZTpmdW5jdGlvbigpe2lmKGMpe3ZhciBiPWFyZ3VtZW50cyxkPTAsZT1iLmxlbmd0aDtmb3IoO2Q8ZTtkKyspZm9yKHZhciBmPTA7ZjxjLmxlbmd0aDtmKyspaWYoYltkXT09PWNbZl0pe2kmJmY8PWsmJihrLS0sZjw9bCYmbC0tKSxjLnNwbGljZShmLS0sMSk7aWYoYS51bmlxdWUpYnJlYWt9fXJldHVybiB0aGlzfSxoYXM6ZnVuY3Rpb24oYSl7aWYoYyl7dmFyIGI9MCxkPWMubGVuZ3RoO2Zvcig7YjxkO2IrKylpZihhPT09Y1tiXSlyZXR1cm4hMH1yZXR1cm4hMX0sZW1wdHk6ZnVuY3Rpb24oKXtjPVtdO3JldHVybiB0aGlzfSxkaXNhYmxlOmZ1bmN0aW9uKCl7Yz1kPWU9YjtyZXR1cm4gdGhpc30sZGlzYWJsZWQ6ZnVuY3Rpb24oKXtyZXR1cm4hY30sbG9jazpmdW5jdGlvbigpe2Q9YiwoIWV8fGU9PT0hMCkmJm8uZGlzYWJsZSgpO3JldHVybiB0aGlzfSxsb2NrZWQ6ZnVuY3Rpb24oKXtyZXR1cm4hZH0sZmlyZVdpdGg6ZnVuY3Rpb24oYixjKXtkJiYoaT9hLm9uY2V8fGQucHVzaChbYixjXSk6KCFhLm9uY2V8fCFlKSYmbihiLGMpKTtyZXR1cm4gdGhpc30sZmlyZTpmdW5jdGlvbigpe28uZmlyZVdpdGgodGhpcyxhcmd1bWVudHMpO3JldHVybiB0aGlzfSxmaXJlZDpmdW5jdGlvbigpe3JldHVybiEhZX19O3JldHVybiBvfTt2YXIgaT1bXS5zbGljZTtmLmV4dGVuZCh7RGVmZXJyZWQ6ZnVuY3Rpb24oYSl7dmFyIGI9Zi5DYWxsYmFja3MoIm9uY2UgbWVtb3J5IiksYz1mLkNhbGxiYWNrcygib25jZSBtZW1vcnkiKSxkPWYuQ2FsbGJhY2tzKCJtZW1vcnkiKSxlPSJwZW5kaW5nIixnPXtyZXNvbHZlOmIscmVqZWN0OmMsbm90aWZ5OmR9LGg9e2RvbmU6Yi5hZGQsZmFpbDpjLmFkZCxwcm9ncmVzczpkLmFkZCxzdGF0ZTpmdW5jdGlvbigpe3JldHVybiBlfSxpc1Jlc29sdmVkOmIuZmlyZWQsaXNSZWplY3RlZDpjLmZpcmVkLHRoZW46ZnVuY3Rpb24oYSxiLGMpe2kuZG9uZShhKS5mYWlsKGIpLnByb2dyZXNzKGMpO3JldHVybiB0aGlzfSxhbHdheXM6ZnVuY3Rpb24oKXtyZXR1cm4gaS5kb25lLmFwcGx5KGksYXJndW1lbnRzKS5mYWlsLmFwcGx5KGksYXJndW1lbnRzKX0scGlwZTpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIGYuRGVmZXJyZWQoZnVuY3Rpb24oZCl7Zi5lYWNoKHtkb25lOlthLCJyZXNvbHZlIl0sZmFpbDpbYiwicmVqZWN0Il0scHJvZ3Jlc3M6W2MsIm5vdGlmeSJdfSxmdW5jdGlvbihhLGIpe3ZhciBjPWJbMF0sZT1iWzFdLGc7Zi5pc0Z1bmN0aW9uKGMpP2lbYV0oZnVuY3Rpb24oKXtnPWMuYXBwbHkodGhpcyxhcmd1bWVudHMpLGcmJmYuaXNGdW5jdGlvbihnLnByb21pc2UpP2cucHJvbWlzZSgpLnRoZW4oZC5yZXNvbHZlLGQucmVqZWN0LGQubm90aWZ5KTpkW2UrIldpdGgiXSh0aGlzPT09aT9kOnRoaXMsW2ddKX0pOmlbYV0oZFtlXSl9KX0pLnByb21pc2UoKX0scHJvbWlzZTpmdW5jdGlvbihhKXtpZihhPT1udWxsKWE9aDtlbHNlIGZvcih2YXIgYiBpbiBoKWFbYl09aFtiXTtyZXR1cm4gYX19LGk9aC5wcm9taXNlKHt9KSxqO2ZvcihqIGluIGcpaVtqXT1nW2pdLmZpcmUsaVtqKyJXaXRoIl09Z1tqXS5maXJlV2l0aDtpLmRvbmUoZnVuY3Rpb24oKXtlPSJyZXNvbHZlZCJ9LGMuZGlzYWJsZSxkLmxvY2spLmZhaWwoZnVuY3Rpb24oKXtlPSJyZWplY3RlZCJ9LGIuZGlzYWJsZSxkLmxvY2spLGEmJmEuY2FsbChpLGkpO3JldHVybiBpfSx3aGVuOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIG0oYSl7cmV0dXJuIGZ1bmN0aW9uKGIpe2VbYV09YXJndW1lbnRzLmxlbmd0aD4xP2kuY2FsbChhcmd1bWVudHMsMCk6YixqLm5vdGlmeVdpdGgoayxlKX19ZnVuY3Rpb24gbChhKXtyZXR1cm4gZnVuY3Rpb24oYyl7YlthXT1hcmd1bWVudHMubGVuZ3RoPjE/aS5jYWxsKGFyZ3VtZW50cywwKTpjLC0tZ3x8ai5yZXNvbHZlV2l0aChqLGIpfX12YXIgYj1pLmNhbGwoYXJndW1lbnRzLDApLGM9MCxkPWIubGVuZ3RoLGU9QXJyYXkoZCksZz1kLGg9ZCxqPWQ8PTEmJmEmJmYuaXNGdW5jdGlvbihhLnByb21pc2UpP2E6Zi5EZWZlcnJlZCgpLGs9ai5wcm9taXNlKCk7aWYoZD4xKXtmb3IoO2M8ZDtjKyspYltjXSYmYltjXS5wcm9taXNlJiZmLmlzRnVuY3Rpb24oYltjXS5wcm9taXNlKT9iW2NdLnByb21pc2UoKS50aGVuKGwoYyksai5yZWplY3QsbShjKSk6LS1nO2d8fGoucmVzb2x2ZVdpdGgoaixiKX1lbHNlIGohPT1hJiZqLnJlc29sdmVXaXRoKGosZD9bYV06W10pO3JldHVybiBrfX0pLGYuc3VwcG9ydD1mdW5jdGlvbigpe3ZhciBhPWMuY3JlYXRlRWxlbWVudCgiZGl2IiksYj1jLmRvY3VtZW50RWxlbWVudCxkLGUsZyxoLGksaixrLGwsbSxuLG8scCxxLHIscyx0LHU7YS5zZXRBdHRyaWJ1dGUoImNsYXNzTmFtZSIsInQiKSxhLmlubmVySFRNTD0iICAgPGxpbmsvPjx0YWJsZT48L3RhYmxlPjxhIGhyZWY9Jy9hJyBzdHlsZT0ndG9wOjFweDtmbG9hdDpsZWZ0O29wYWNpdHk6LjU1Oyc+YTwvYT48aW5wdXQgdHlwZT0nY2hlY2tib3gnLz48bmF2PjwvbmF2PiIsZD1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCIqIiksZT1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJhIilbMF07aWYoIWR8fCFkLmxlbmd0aHx8IWUpcmV0dXJue307Zz1jLmNyZWF0ZUVsZW1lbnQoInNlbGVjdCIpLGg9Zy5hcHBlbmRDaGlsZChjLmNyZWF0ZUVsZW1lbnQoIm9wdGlvbiIpKSxpPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImlucHV0IilbMF0saz17bGVhZGluZ1doaXRlc3BhY2U6YS5maXJzdENoaWxkLm5vZGVUeXBlPT09Myx0Ym9keTohYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidGJvZHkiKS5sZW5ndGgsaHRtbFNlcmlhbGl6ZTohIWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImxpbmsiKS5sZW5ndGgsc3R5bGU6L3RvcC8udGVzdChlLmdldEF0dHJpYnV0ZSgic3R5bGUiKSksaHJlZk5vcm1hbGl6ZWQ6ZS5nZXRBdHRyaWJ1dGUoImhyZWYiKT09PSIvYSIsb3BhY2l0eTovXjAuNTUvLnRlc3QoZS5zdHlsZS5vcGFjaXR5KSxjc3NGbG9hdDohIWUuc3R5bGUuY3NzRmxvYXQsdW5rbm93bkVsZW1zOiEhYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgibmF2IikubGVuZ3RoLGNoZWNrT246aS52YWx1ZT09PSJvbiIsb3B0U2VsZWN0ZWQ6aC5zZWxlY3RlZCxnZXRTZXRBdHRyaWJ1dGU6YS5jbGFzc05hbWUhPT0idCIsZW5jdHlwZTohIWMuY3JlYXRlRWxlbWVudCgiZm9ybSIpLmVuY3R5cGUsc3VibWl0QnViYmxlczohMCxjaGFuZ2VCdWJibGVzOiEwLGZvY3VzaW5CdWJibGVzOiExLGRlbGV0ZUV4cGFuZG86ITAsbm9DbG9uZUV2ZW50OiEwLGlubGluZUJsb2NrTmVlZHNMYXlvdXQ6ITEsc2hyaW5rV3JhcEJsb2NrczohMSxyZWxpYWJsZU1hcmdpblJpZ2h0OiEwfSxpLmNoZWNrZWQ9ITAsay5ub0Nsb25lQ2hlY2tlZD1pLmNsb25lTm9kZSghMCkuY2hlY2tlZCxnLmRpc2FibGVkPSEwLGsub3B0RGlzYWJsZWQ9IWguZGlzYWJsZWQ7dHJ5e2RlbGV0ZSBhLnRlc3R9Y2F0Y2godil7ay5kZWxldGVFeHBhbmRvPSExfSFhLmFkZEV2ZW50TGlzdGVuZXImJmEuYXR0YWNoRXZlbnQmJmEuZmlyZUV2ZW50JiYoYS5hdHRhY2hFdmVudCgib25jbGljayIsZnVuY3Rpb24oKXtrLm5vQ2xvbmVFdmVudD0hMX0pLGEuY2xvbmVOb2RlKCEwKS5maXJlRXZlbnQoIm9uY2xpY2siKSksaT1jLmNyZWF0ZUVsZW1lbnQoImlucHV0IiksaS52YWx1ZT0idCIsaS5zZXRBdHRyaWJ1dGUoInR5cGUiLCJyYWRpbyIpLGsucmFkaW9WYWx1ZT1pLnZhbHVlPT09InQiLGkuc2V0QXR0cmlidXRlKCJjaGVja2VkIiwiY2hlY2tlZCIpLGEuYXBwZW5kQ2hpbGQoaSksbD1jLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKSxsLmFwcGVuZENoaWxkKGEubGFzdENoaWxkKSxrLmNoZWNrQ2xvbmU9bC5jbG9uZU5vZGUoITApLmNsb25lTm9kZSghMCkubGFzdENoaWxkLmNoZWNrZWQsYS5pbm5lckhUTUw9IiIsYS5zdHlsZS53aWR0aD1hLnN0eWxlLnBhZGRpbmdMZWZ0PSIxcHgiLG09Yy5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYm9keSIpWzBdLG89Yy5jcmVhdGVFbGVtZW50KG0/ImRpdiI6ImJvZHkiKSxwPXt2aXNpYmlsaXR5OiJoaWRkZW4iLHdpZHRoOjAsaGVpZ2h0OjAsYm9yZGVyOjAsbWFyZ2luOjAsYmFja2dyb3VuZDoibm9uZSJ9LG0mJmYuZXh0ZW5kKHAse3Bvc2l0aW9uOiJhYnNvbHV0ZSIsbGVmdDoiLTk5OXB4Iix0b3A6Ii05OTlweCJ9KTtmb3IodCBpbiBwKW8uc3R5bGVbdF09cFt0XTtvLmFwcGVuZENoaWxkKGEpLG49bXx8YixuLmluc2VydEJlZm9yZShvLG4uZmlyc3RDaGlsZCksay5hcHBlbmRDaGVja2VkPWkuY2hlY2tlZCxrLmJveE1vZGVsPWEub2Zmc2V0V2lkdGg9PT0yLCJ6b29tImluIGEuc3R5bGUmJihhLnN0eWxlLmRpc3BsYXk9ImlubGluZSIsYS5zdHlsZS56b29tPTEsay5pbmxpbmVCbG9ja05lZWRzTGF5b3V0PWEub2Zmc2V0V2lkdGg9PT0yLGEuc3R5bGUuZGlzcGxheT0iIixhLmlubmVySFRNTD0iPGRpdiBzdHlsZT0nd2lkdGg6NHB4Oyc+PC9kaXY+IixrLnNocmlua1dyYXBCbG9ja3M9YS5vZmZzZXRXaWR0aCE9PTIpLGEuaW5uZXJIVE1MPSI8dGFibGU+PHRyPjx0ZCBzdHlsZT0ncGFkZGluZzowO2JvcmRlcjowO2Rpc3BsYXk6bm9uZSc+PC90ZD48dGQ+dDwvdGQ+PC90cj48L3RhYmxlPiIscT1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ0ZCIpLHU9cVswXS5vZmZzZXRIZWlnaHQ9PT0wLHFbMF0uc3R5bGUuZGlzcGxheT0iIixxWzFdLnN0eWxlLmRpc3BsYXk9Im5vbmUiLGsucmVsaWFibGVIaWRkZW5PZmZzZXRzPXUmJnFbMF0ub2Zmc2V0SGVpZ2h0PT09MCxhLmlubmVySFRNTD0iIixjLmRlZmF1bHRWaWV3JiZjLmRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGUmJihqPWMuY3JlYXRlRWxlbWVudCgiZGl2Iiksai5zdHlsZS53aWR0aD0iMCIsai5zdHlsZS5tYXJnaW5SaWdodD0iMCIsYS5hcHBlbmRDaGlsZChqKSxrLnJlbGlhYmxlTWFyZ2luUmlnaHQ9KHBhcnNlSW50KChjLmRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGUoaixudWxsKXx8e21hcmdpblJpZ2h0OjB9KS5tYXJnaW5SaWdodCwxMCl8fDApPT09MCk7aWYoYS5hdHRhY2hFdmVudClmb3IodCBpbntzdWJtaXQ6MSxjaGFuZ2U6MSxmb2N1c2luOjF9KXM9Im9uIit0LHU9cyBpbiBhLHV8fChhLnNldEF0dHJpYnV0ZShzLCJyZXR1cm47IiksdT10eXBlb2YgYVtzXT09ImZ1bmN0aW9uIiksa1t0KyJCdWJibGVzIl09dTtmKGZ1bmN0aW9uKCl7dmFyIGEsYixkLGUsZyxoLGk9MSxqPSJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtsZWZ0OjA7d2lkdGg6MXB4O2hlaWdodDoxcHg7bWFyZ2luOjA7IixsPSJ2aXNpYmlsaXR5OmhpZGRlbjtib3JkZXI6MDsiLG49InN0eWxlPSciK2orImJvcmRlcjo1cHggc29saWQgIzAwMDtwYWRkaW5nOjA7JyIscD0iPGRpdiAiK24rIj48ZGl2PjwvZGl2PjwvZGl2PiIrIjx0YWJsZSAiK24rIiBjZWxscGFkZGluZz0nMCcgY2VsbHNwYWNpbmc9JzAnPiIrIjx0cj48dGQ+PC90ZD48L3RyPjwvdGFibGU+IjttPWMuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImJvZHkiKVswXTshbXx8KGE9Yy5jcmVhdGVFbGVtZW50KCJkaXYiKSxhLnN0eWxlLmNzc1RleHQ9bCsid2lkdGg6MDtoZWlnaHQ6MDtwb3NpdGlvbjpzdGF0aWM7dG9wOjA7bWFyZ2luLXRvcDoiK2krInB4IixtLmluc2VydEJlZm9yZShhLG0uZmlyc3RDaGlsZCksbz1jLmNyZWF0ZUVsZW1lbnQoImRpdiIpLG8uc3R5bGUuY3NzVGV4dD1qK2wsby5pbm5lckhUTUw9cCxhLmFwcGVuZENoaWxkKG8pLGI9by5maXJzdENoaWxkLGQ9Yi5maXJzdENoaWxkLGc9Yi5uZXh0U2libGluZy5maXJzdENoaWxkLmZpcnN0Q2hpbGQsaD17ZG9lc05vdEFkZEJvcmRlcjpkLm9mZnNldFRvcCE9PTUsZG9lc0FkZEJvcmRlckZvclRhYmxlQW5kQ2VsbHM6Zy5vZmZzZXRUb3A9PT01fSxkLnN0eWxlLnBvc2l0aW9uPSJmaXhlZCIsZC5zdHlsZS50b3A9IjIwcHgiLGguZml4ZWRQb3NpdGlvbj1kLm9mZnNldFRvcD09PTIwfHxkLm9mZnNldFRvcD09PTE1LGQuc3R5bGUucG9zaXRpb249ZC5zdHlsZS50b3A9IiIsYi5zdHlsZS5vdmVyZmxvdz0iaGlkZGVuIixiLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsaC5zdWJ0cmFjdHNCb3JkZXJGb3JPdmVyZmxvd05vdFZpc2libGU9ZC5vZmZzZXRUb3A9PT0tNSxoLmRvZXNOb3RJbmNsdWRlTWFyZ2luSW5Cb2R5T2Zmc2V0PW0ub2Zmc2V0VG9wIT09aSxtLnJlbW92ZUNoaWxkKGEpLG89YT1udWxsLGYuZXh0ZW5kKGssaCkpfSksby5pbm5lckhUTUw9IiIsbi5yZW1vdmVDaGlsZChvKSxvPWw9Zz1oPW09aj1hPWk9bnVsbDtyZXR1cm4ga30oKSxmLmJveE1vZGVsPWYuc3VwcG9ydC5ib3hNb2RlbDt2YXIgaj0vXig/Olx7LipcfXxcWy4qXF0pJC8saz0vKFtBLVpdKS9nO2YuZXh0ZW5kKHtjYWNoZTp7fSx1dWlkOjAsZXhwYW5kbzoialF1ZXJ5IisoZi5mbi5qcXVlcnkrTWF0aC5yYW5kb20oKSkucmVwbGFjZSgvXEQvZywiIiksbm9EYXRhOntlbWJlZDohMCxvYmplY3Q6ImNsc2lkOkQyN0NEQjZFLUFFNkQtMTFjZi05NkI4LTQ0NDU1MzU0MDAwMCIsYXBwbGV0OiEwfSxoYXNEYXRhOmZ1bmN0aW9uKGEpe2E9YS5ub2RlVHlwZT9mLmNhY2hlW2FbZi5leHBhbmRvXV06YVtmLmV4cGFuZG9dO3JldHVybiEhYSYmIW0oYSl9LGRhdGE6ZnVuY3Rpb24oYSxjLGQsZSl7aWYoISFmLmFjY2VwdERhdGEoYSkpe3ZhciBnLGgsaSxqPWYuZXhwYW5kbyxrPXR5cGVvZiBjPT0ic3RyaW5nIixsPWEubm9kZVR5cGUsbT1sP2YuY2FjaGU6YSxuPWw/YVtmLmV4cGFuZG9dOmFbZi5leHBhbmRvXSYmZi5leHBhbmRvLG89Yz09PSJldmVudHMiO2lmKCghbnx8IW1bbl18fCFvJiYhZSYmIW1bbl0uZGF0YSkmJmsmJmQ9PT1iKXJldHVybjtufHwobD9hW2YuZXhwYW5kb109bj0rK2YudXVpZDpuPWYuZXhwYW5kbyksbVtuXXx8KG1bbl09e30sbHx8KG1bbl0udG9KU09OPWYubm9vcCkpO2lmKHR5cGVvZiBjPT0ib2JqZWN0Inx8dHlwZW9mIGM9PSJmdW5jdGlvbiIpZT9tW25dPWYuZXh0ZW5kKG1bbl0sYyk6bVtuXS5kYXRhPWYuZXh0ZW5kKG1bbl0uZGF0YSxjKTtnPWg9bVtuXSxlfHwoaC5kYXRhfHwoaC5kYXRhPXt9KSxoPWguZGF0YSksZCE9PWImJihoW2YuY2FtZWxDYXNlKGMpXT1kKTtpZihvJiYhaFtjXSlyZXR1cm4gZy5ldmVudHM7az8oaT1oW2NdLGk9PW51bGwmJihpPWhbZi5jYW1lbENhc2UoYyldKSk6aT1oO3JldHVybiBpfX0scmVtb3ZlRGF0YTpmdW5jdGlvbihhLGIsYyl7aWYoISFmLmFjY2VwdERhdGEoYSkpe3ZhciBkLGUsZyxoPWYuZXhwYW5kbyxpPWEubm9kZVR5cGUsaj1pP2YuY2FjaGU6YSxrPWk/YVtmLmV4cGFuZG9dOmYuZXhwYW5kbztpZighaltrXSlyZXR1cm47aWYoYil7ZD1jP2pba106altrXS5kYXRhO2lmKGQpe2YuaXNBcnJheShiKT9iPWI6YiBpbiBkP2I9W2JdOihiPWYuY2FtZWxDYXNlKGIpLGIgaW4gZD9iPVtiXTpiPWIuc3BsaXQoIiAiKSk7Zm9yKGU9MCxnPWIubGVuZ3RoO2U8ZztlKyspZGVsZXRlIGRbYltlXV07aWYoIShjP206Zi5pc0VtcHR5T2JqZWN0KShkKSlyZXR1cm59fWlmKCFjKXtkZWxldGUgaltrXS5kYXRhO2lmKCFtKGpba10pKXJldHVybn1mLnN1cHBvcnQuZGVsZXRlRXhwYW5kb3x8IWouc2V0SW50ZXJ2YWw/ZGVsZXRlIGpba106altrXT1udWxsLGkmJihmLnN1cHBvcnQuZGVsZXRlRXhwYW5kbz9kZWxldGUgYVtmLmV4cGFuZG9dOmEucmVtb3ZlQXR0cmlidXRlP2EucmVtb3ZlQXR0cmlidXRlKGYuZXhwYW5kbyk6YVtmLmV4cGFuZG9dPW51bGwpfX0sX2RhdGE6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBmLmRhdGEoYSxiLGMsITApfSxhY2NlcHREYXRhOmZ1bmN0aW9uKGEpe2lmKGEubm9kZU5hbWUpe3ZhciBiPWYubm9EYXRhW2Eubm9kZU5hbWUudG9Mb3dlckNhc2UoKV07aWYoYilyZXR1cm4gYiE9PSEwJiZhLmdldEF0dHJpYnV0ZSgiY2xhc3NpZCIpPT09Yn1yZXR1cm4hMH19KSxmLmZuLmV4dGVuZCh7ZGF0YTpmdW5jdGlvbihhLGMpe3ZhciBkLGUsZyxoPW51bGw7aWYodHlwZW9mIGE9PSJ1bmRlZmluZWQiKXtpZih0aGlzLmxlbmd0aCl7aD1mLmRhdGEodGhpc1swXSk7aWYodGhpc1swXS5ub2RlVHlwZT09PTEmJiFmLl9kYXRhKHRoaXNbMF0sInBhcnNlZEF0dHJzIikpe2U9dGhpc1swXS5hdHRyaWJ1dGVzO2Zvcih2YXIgaT0wLGo9ZS5sZW5ndGg7aTxqO2krKylnPWVbaV0ubmFtZSxnLmluZGV4T2YoImRhdGEtIik9PT0wJiYoZz1mLmNhbWVsQ2FzZShnLnN1YnN0cmluZyg1KSksbCh0aGlzWzBdLGcsaFtnXSkpO2YuX2RhdGEodGhpc1swXSwicGFyc2VkQXR0cnMiLCEwKX19cmV0dXJuIGh9aWYodHlwZW9mIGE9PSJvYmplY3QiKXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtmLmRhdGEodGhpcyxhKX0pO2Q9YS5zcGxpdCgiLiIpLGRbMV09ZFsxXT8iLiIrZFsxXToiIjtpZihjPT09Yil7aD10aGlzLnRyaWdnZXJIYW5kbGVyKCJnZXREYXRhIitkWzFdKyIhIixbZFswXV0pLGg9PT1iJiZ0aGlzLmxlbmd0aCYmKGg9Zi5kYXRhKHRoaXNbMF0sYSksaD1sKHRoaXNbMF0sYSxoKSk7cmV0dXJuIGg9PT1iJiZkWzFdP3RoaXMuZGF0YShkWzBdKTpofXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgYj1mKHRoaXMpLGU9W2RbMF0sY107Yi50cmlnZ2VySGFuZGxlcigic2V0RGF0YSIrZFsxXSsiISIsZSksZi5kYXRhKHRoaXMsYSxjKSxiLnRyaWdnZXJIYW5kbGVyKCJjaGFuZ2VEYXRhIitkWzFdKyIhIixlKX0pfSxyZW1vdmVEYXRhOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtmLnJlbW92ZURhdGEodGhpcyxhKX0pfX0pLGYuZXh0ZW5kKHtfbWFyazpmdW5jdGlvbihhLGIpe2EmJihiPShifHwiZngiKSsibWFyayIsZi5fZGF0YShhLGIsKGYuX2RhdGEoYSxiKXx8MCkrMSkpfSxfdW5tYXJrOmZ1bmN0aW9uKGEsYixjKXthIT09ITAmJihjPWIsYj1hLGE9ITEpO2lmKGIpe2M9Y3x8ImZ4Ijt2YXIgZD1jKyJtYXJrIixlPWE/MDooZi5fZGF0YShiLGQpfHwxKS0xO2U/Zi5fZGF0YShiLGQsZSk6KGYucmVtb3ZlRGF0YShiLGQsITApLG4oYixjLCJtYXJrIikpfX0scXVldWU6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkO2lmKGEpe2I9KGJ8fCJmeCIpKyJxdWV1ZSIsZD1mLl9kYXRhKGEsYiksYyYmKCFkfHxmLmlzQXJyYXkoYyk/ZD1mLl9kYXRhKGEsYixmLm1ha2VBcnJheShjKSk6ZC5wdXNoKGMpKTtyZXR1cm4gZHx8W119fSxkZXF1ZXVlOmZ1bmN0aW9uKGEsYil7Yj1ifHwiZngiO3ZhciBjPWYucXVldWUoYSxiKSxkPWMuc2hpZnQoKSxlPXt9O2Q9PT0iaW5wcm9ncmVzcyImJihkPWMuc2hpZnQoKSksZCYmKGI9PT0iZngiJiZjLnVuc2hpZnQoImlucHJvZ3Jlc3MiKSxmLl9kYXRhKGEsYisiLnJ1biIsZSksZC5jYWxsKGEsZnVuY3Rpb24oKXtmLmRlcXVldWUoYSxiKX0sZSkpLGMubGVuZ3RofHwoZi5yZW1vdmVEYXRhKGEsYisicXVldWUgIitiKyIucnVuIiwhMCksbihhLGIsInF1ZXVlIikpfX0pLGYuZm4uZXh0ZW5kKHtxdWV1ZTpmdW5jdGlvbihhLGMpe3R5cGVvZiBhIT0ic3RyaW5nIiYmKGM9YSxhPSJmeCIpO2lmKGM9PT1iKXJldHVybiBmLnF1ZXVlKHRoaXNbMF0sYSk7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciBiPWYucXVldWUodGhpcyxhLGMpO2E9PT0iZngiJiZiWzBdIT09ImlucHJvZ3Jlc3MiJiZmLmRlcXVldWUodGhpcyxhKX0pfSxkZXF1ZXVlOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtmLmRlcXVldWUodGhpcyxhKX0pfSxkZWxheTpmdW5jdGlvbihhLGIpe2E9Zi5meD9mLmZ4LnNwZWVkc1thXXx8YTphLGI9Ynx8ImZ4IjtyZXR1cm4gdGhpcy5xdWV1ZShiLGZ1bmN0aW9uKGIsYyl7dmFyIGQ9c2V0VGltZW91dChiLGEpO2Muc3RvcD1mdW5jdGlvbigpe2NsZWFyVGltZW91dChkKX19KX0sY2xlYXJRdWV1ZTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5xdWV1ZShhfHwiZngiLFtdKX0scHJvbWlzZTpmdW5jdGlvbihhLGMpe2Z1bmN0aW9uIG0oKXstLWh8fGQucmVzb2x2ZVdpdGgoZSxbZV0pfXR5cGVvZiBhIT0ic3RyaW5nIiYmKGM9YSxhPWIpLGE9YXx8ImZ4Ijt2YXIgZD1mLkRlZmVycmVkKCksZT10aGlzLGc9ZS5sZW5ndGgsaD0xLGk9YSsiZGVmZXIiLGo9YSsicXVldWUiLGs9YSsibWFyayIsbDt3aGlsZShnLS0paWYobD1mLmRhdGEoZVtnXSxpLGIsITApfHwoZi5kYXRhKGVbZ10saixiLCEwKXx8Zi5kYXRhKGVbZ10sayxiLCEwKSkmJmYuZGF0YShlW2ddLGksZi5DYWxsYmFja3MoIm9uY2UgbWVtb3J5IiksITApKWgrKyxsLmFkZChtKTttKCk7cmV0dXJuIGQucHJvbWlzZSgpfX0pO3ZhciBvPS9bXG5cdFxyXS9nLHA9L1xzKy8scT0vXHIvZyxyPS9eKD86YnV0dG9ufGlucHV0KSQvaSxzPS9eKD86YnV0dG9ufGlucHV0fG9iamVjdHxzZWxlY3R8dGV4dGFyZWEpJC9pLHQ9L15hKD86cmVhKT8kL2ksdT0vXig/OmF1dG9mb2N1c3xhdXRvcGxheXxhc3luY3xjaGVja2VkfGNvbnRyb2xzfGRlZmVyfGRpc2FibGVkfGhpZGRlbnxsb29wfG11bHRpcGxlfG9wZW58cmVhZG9ubHl8cmVxdWlyZWR8c2NvcGVkfHNlbGVjdGVkKSQvaSx2PWYuc3VwcG9ydC5nZXRTZXRBdHRyaWJ1dGUsdyx4LHk7Zi5mbi5leHRlbmQoe2F0dHI6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gZi5hY2Nlc3ModGhpcyxhLGIsITAsZi5hdHRyKX0scmVtb3ZlQXR0cjpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7Zi5yZW1vdmVBdHRyKHRoaXMsYSl9KX0scHJvcDpmdW5jdGlvbihhLGIpe3JldHVybiBmLmFjY2Vzcyh0aGlzLGEsYiwhMCxmLnByb3ApfSxyZW1vdmVQcm9wOmZ1bmN0aW9uKGEpe2E9Zi5wcm9wRml4W2FdfHxhO3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXt0cnl7dGhpc1thXT1iLGRlbGV0ZSB0aGlzW2FdfWNhdGNoKGMpe319KX0sYWRkQ2xhc3M6ZnVuY3Rpb24oYSl7dmFyIGIsYyxkLGUsZyxoLGk7aWYoZi5pc0Z1bmN0aW9uKGEpKXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oYil7Zih0aGlzKS5hZGRDbGFzcyhhLmNhbGwodGhpcyxiLHRoaXMuY2xhc3NOYW1lKSl9KTtpZihhJiZ0eXBlb2YgYT09InN0cmluZyIpe2I9YS5zcGxpdChwKTtmb3IoYz0wLGQ9dGhpcy5sZW5ndGg7YzxkO2MrKyl7ZT10aGlzW2NdO2lmKGUubm9kZVR5cGU9PT0xKWlmKCFlLmNsYXNzTmFtZSYmYi5sZW5ndGg9PT0xKWUuY2xhc3NOYW1lPWE7ZWxzZXtnPSIgIitlLmNsYXNzTmFtZSsiICI7Zm9yKGg9MCxpPWIubGVuZ3RoO2g8aTtoKyspfmcuaW5kZXhPZigiICIrYltoXSsiICIpfHwoZys9YltoXSsiICIpO2UuY2xhc3NOYW1lPWYudHJpbShnKX19fXJldHVybiB0aGlzfSxyZW1vdmVDbGFzczpmdW5jdGlvbihhKXt2YXIgYyxkLGUsZyxoLGksajtpZihmLmlzRnVuY3Rpb24oYSkpcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihiKXtmKHRoaXMpLnJlbW92ZUNsYXNzKGEuY2FsbCh0aGlzLGIsdGhpcy5jbGFzc05hbWUpKX0pO2lmKGEmJnR5cGVvZiBhPT0ic3RyaW5nInx8YT09PWIpe2M9KGF8fCIiKS5zcGxpdChwKTtmb3IoZD0wLGU9dGhpcy5sZW5ndGg7ZDxlO2QrKyl7Zz10aGlzW2RdO2lmKGcubm9kZVR5cGU9PT0xJiZnLmNsYXNzTmFtZSlpZihhKXtoPSgiICIrZy5jbGFzc05hbWUrIiAiKS5yZXBsYWNlKG8sIiAiKTtmb3IoaT0wLGo9Yy5sZW5ndGg7aTxqO2krKyloPWgucmVwbGFjZSgiICIrY1tpXSsiICIsIiAiKTtnLmNsYXNzTmFtZT1mLnRyaW0oaCl9ZWxzZSBnLmNsYXNzTmFtZT0iIn19cmV0dXJuIHRoaXN9LHRvZ2dsZUNsYXNzOmZ1bmN0aW9uKGEsYil7dmFyIGM9dHlwZW9mIGEsZD10eXBlb2YgYj09ImJvb2xlYW4iO2lmKGYuaXNGdW5jdGlvbihhKSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKGMpe2YodGhpcykudG9nZ2xlQ2xhc3MoYS5jYWxsKHRoaXMsYyx0aGlzLmNsYXNzTmFtZSxiKSxiKX0pO3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtpZihjPT09InN0cmluZyIpe3ZhciBlLGc9MCxoPWYodGhpcyksaT1iLGo9YS5zcGxpdChwKTt3aGlsZShlPWpbZysrXSlpPWQ/aTohaC5oYXNDbGFzcyhlKSxoW2k/ImFkZENsYXNzIjoicmVtb3ZlQ2xhc3MiXShlKX1lbHNlIGlmKGM9PT0idW5kZWZpbmVkInx8Yz09PSJib29sZWFuIil0aGlzLmNsYXNzTmFtZSYmZi5fZGF0YSh0aGlzLCJfX2NsYXNzTmFtZV9fIix0aGlzLmNsYXNzTmFtZSksdGhpcy5jbGFzc05hbWU9dGhpcy5jbGFzc05hbWV8fGE9PT0hMT8iIjpmLl9kYXRhKHRoaXMsIl9fY2xhc3NOYW1lX18iKXx8IiJ9KX0saGFzQ2xhc3M6ZnVuY3Rpb24oYSl7dmFyIGI9IiAiK2ErIiAiLGM9MCxkPXRoaXMubGVuZ3RoO2Zvcig7YzxkO2MrKylpZih0aGlzW2NdLm5vZGVUeXBlPT09MSYmKCIgIit0aGlzW2NdLmNsYXNzTmFtZSsiICIpLnJlcGxhY2UobywiICIpLmluZGV4T2YoYik+LTEpcmV0dXJuITA7cmV0dXJuITF9LHZhbDpmdW5jdGlvbihhKXt2YXIgYyxkLGUsZz10aGlzWzBdO2lmKCFhcmd1bWVudHMubGVuZ3RoKXtpZihnKXtjPWYudmFsSG9va3NbZy5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpXXx8Zi52YWxIb29rc1tnLnR5cGVdO2lmKGMmJiJnZXQiaW4gYyYmKGQ9Yy5nZXQoZywidmFsdWUiKSkhPT1iKXJldHVybiBkO2Q9Zy52YWx1ZTtyZXR1cm4gdHlwZW9mIGQ9PSJzdHJpbmciP2QucmVwbGFjZShxLCIiKTpkPT1udWxsPyIiOmR9cmV0dXJuIGJ9ZT1mLmlzRnVuY3Rpb24oYSk7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihkKXt2YXIgZz1mKHRoaXMpLGg7aWYodGhpcy5ub2RlVHlwZT09PTEpe2U/aD1hLmNhbGwodGhpcyxkLGcudmFsKCkpOmg9YSxoPT1udWxsP2g9IiI6dHlwZW9mIGg9PSJudW1iZXIiP2grPSIiOmYuaXNBcnJheShoKSYmKGg9Zi5tYXAoaCxmdW5jdGlvbihhKXtyZXR1cm4gYT09bnVsbD8iIjphKyIifSkpLGM9Zi52YWxIb29rc1t0aGlzLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCldfHxmLnZhbEhvb2tzW3RoaXMudHlwZV07aWYoIWN8fCEoInNldCJpbiBjKXx8Yy5zZXQodGhpcyxoLCJ2YWx1ZSIpPT09Yil0aGlzLnZhbHVlPWh9fSl9fSksZi5leHRlbmQoe3ZhbEhvb2tzOntvcHRpb246e2dldDpmdW5jdGlvbihhKXt2YXIgYj1hLmF0dHJpYnV0ZXMudmFsdWU7cmV0dXJuIWJ8fGIuc3BlY2lmaWVkP2EudmFsdWU6YS50ZXh0fX0sc2VsZWN0OntnZXQ6ZnVuY3Rpb24oYSl7dmFyIGIsYyxkLGUsZz1hLnNlbGVjdGVkSW5kZXgsaD1bXSxpPWEub3B0aW9ucyxqPWEudHlwZT09PSJzZWxlY3Qtb25lIjtpZihnPDApcmV0dXJuIG51bGw7Yz1qP2c6MCxkPWo/ZysxOmkubGVuZ3RoO2Zvcig7YzxkO2MrKyl7ZT1pW2NdO2lmKGUuc2VsZWN0ZWQmJihmLnN1cHBvcnQub3B0RGlzYWJsZWQ/IWUuZGlzYWJsZWQ6ZS5nZXRBdHRyaWJ1dGUoImRpc2FibGVkIik9PT1udWxsKSYmKCFlLnBhcmVudE5vZGUuZGlzYWJsZWR8fCFmLm5vZGVOYW1lKGUucGFyZW50Tm9kZSwib3B0Z3JvdXAiKSkpe2I9ZihlKS52YWwoKTtpZihqKXJldHVybiBiO2gucHVzaChiKX19aWYoaiYmIWgubGVuZ3RoJiZpLmxlbmd0aClyZXR1cm4gZihpW2ddKS52YWwoKTtyZXR1cm4gaH0sc2V0OmZ1bmN0aW9uKGEsYil7dmFyIGM9Zi5tYWtlQXJyYXkoYik7ZihhKS5maW5kKCJvcHRpb24iKS5lYWNoKGZ1bmN0aW9uKCl7dGhpcy5zZWxlY3RlZD1mLmluQXJyYXkoZih0aGlzKS52YWwoKSxjKT49MH0pLGMubGVuZ3RofHwoYS5zZWxlY3RlZEluZGV4PS0xKTtyZXR1cm4gY319fSxhdHRyRm46e3ZhbDohMCxjc3M6ITAsaHRtbDohMCx0ZXh0OiEwLGRhdGE6ITAsd2lkdGg6ITAsaGVpZ2h0OiEwLG9mZnNldDohMH0sYXR0cjpmdW5jdGlvbihhLGMsZCxlKXt2YXIgZyxoLGksaj1hLm5vZGVUeXBlO2lmKCFhfHxqPT09M3x8aj09PTh8fGo9PT0yKXJldHVybiBiO2lmKGUmJmMgaW4gZi5hdHRyRm4pcmV0dXJuIGYoYSlbY10oZCk7aWYoISgiZ2V0QXR0cmlidXRlImluIGEpKXJldHVybiBmLnByb3AoYSxjLGQpO2k9aiE9PTF8fCFmLmlzWE1MRG9jKGEpLGkmJihjPWMudG9Mb3dlckNhc2UoKSxoPWYuYXR0ckhvb2tzW2NdfHwodS50ZXN0KGMpP3g6dykpO2lmKGQhPT1iKXtpZihkPT09bnVsbCl7Zi5yZW1vdmVBdHRyKGEsYyk7cmV0dXJuIGJ9aWYoaCYmInNldCJpbiBoJiZpJiYoZz1oLnNldChhLGQsYykpIT09YilyZXR1cm4gZzthLnNldEF0dHJpYnV0ZShjLCIiK2QpO3JldHVybiBkfWlmKGgmJiJnZXQiaW4gaCYmaSYmKGc9aC5nZXQoYSxjKSkhPT1udWxsKXJldHVybiBnO2c9YS5nZXRBdHRyaWJ1dGUoYyk7cmV0dXJuIGc9PT1udWxsP2I6Z30scmVtb3ZlQXR0cjpmdW5jdGlvbihhLGIpe3ZhciBjLGQsZSxnLGg9MDtpZihhLm5vZGVUeXBlPT09MSl7ZD0oYnx8IiIpLnNwbGl0KHApLGc9ZC5sZW5ndGg7Zm9yKDtoPGc7aCsrKWU9ZFtoXS50b0xvd2VyQ2FzZSgpLGM9Zi5wcm9wRml4W2VdfHxlLGYuYXR0cihhLGUsIiIpLGEucmVtb3ZlQXR0cmlidXRlKHY/ZTpjKSx1LnRlc3QoZSkmJmMgaW4gYSYmKGFbY109ITEpfX0sYXR0ckhvb2tzOnt0eXBlOntzZXQ6ZnVuY3Rpb24oYSxiKXtpZihyLnRlc3QoYS5ub2RlTmFtZSkmJmEucGFyZW50Tm9kZSlmLmVycm9yKCJ0eXBlIHByb3BlcnR5IGNhbid0IGJlIGNoYW5nZWQiKTtlbHNlIGlmKCFmLnN1cHBvcnQucmFkaW9WYWx1ZSYmYj09PSJyYWRpbyImJmYubm9kZU5hbWUoYSwiaW5wdXQiKSl7dmFyIGM9YS52YWx1ZTthLnNldEF0dHJpYnV0ZSgidHlwZSIsYiksYyYmKGEudmFsdWU9Yyk7cmV0dXJuIGJ9fX0sdmFsdWU6e2dldDpmdW5jdGlvbihhLGIpe2lmKHcmJmYubm9kZU5hbWUoYSwiYnV0dG9uIikpcmV0dXJuIHcuZ2V0KGEsYik7cmV0dXJuIGIgaW4gYT9hLnZhbHVlOm51bGx9LHNldDpmdW5jdGlvbihhLGIsYyl7aWYodyYmZi5ub2RlTmFtZShhLCJidXR0b24iKSlyZXR1cm4gdy5zZXQoYSxiLGMpO2EudmFsdWU9Yn19fSxwcm9wRml4Ont0YWJpbmRleDoidGFiSW5kZXgiLHJlYWRvbmx5OiJyZWFkT25seSIsImZvciI6Imh0bWxGb3IiLCJjbGFzcyI6ImNsYXNzTmFtZSIsbWF4bGVuZ3RoOiJtYXhMZW5ndGgiLGNlbGxzcGFjaW5nOiJjZWxsU3BhY2luZyIsY2VsbHBhZGRpbmc6ImNlbGxQYWRkaW5nIixyb3dzcGFuOiJyb3dTcGFuIixjb2xzcGFuOiJjb2xTcGFuIix1c2VtYXA6InVzZU1hcCIsZnJhbWVib3JkZXI6ImZyYW1lQm9yZGVyIixjb250ZW50ZWRpdGFibGU6ImNvbnRlbnRFZGl0YWJsZSJ9LHByb3A6ZnVuY3Rpb24oYSxjLGQpe3ZhciBlLGcsaCxpPWEubm9kZVR5cGU7aWYoIWF8fGk9PT0zfHxpPT09OHx8aT09PTIpcmV0dXJuIGI7aD1pIT09MXx8IWYuaXNYTUxEb2MoYSksaCYmKGM9Zi5wcm9wRml4W2NdfHxjLGc9Zi5wcm9wSG9va3NbY10pO3JldHVybiBkIT09Yj9nJiYic2V0ImluIGcmJihlPWcuc2V0KGEsZCxjKSkhPT1iP2U6YVtjXT1kOmcmJiJnZXQiaW4gZyYmKGU9Zy5nZXQoYSxjKSkhPT1udWxsP2U6YVtjXX0scHJvcEhvb2tzOnt0YWJJbmRleDp7Z2V0OmZ1bmN0aW9uKGEpe3ZhciBjPWEuZ2V0QXR0cmlidXRlTm9kZSgidGFiaW5kZXgiKTtyZXR1cm4gYyYmYy5zcGVjaWZpZWQ/cGFyc2VJbnQoYy52YWx1ZSwxMCk6cy50ZXN0KGEubm9kZU5hbWUpfHx0LnRlc3QoYS5ub2RlTmFtZSkmJmEuaHJlZj8wOmJ9fX19KSxmLmF0dHJIb29rcy50YWJpbmRleD1mLnByb3BIb29rcy50YWJJbmRleCx4PXtnZXQ6ZnVuY3Rpb24oYSxjKXt2YXIgZCxlPWYucHJvcChhLGMpO3JldHVybiBlPT09ITB8fHR5cGVvZiBlIT0iYm9vbGVhbiImJihkPWEuZ2V0QXR0cmlidXRlTm9kZShjKSkmJmQubm9kZVZhbHVlIT09ITE/Yy50b0xvd2VyQ2FzZSgpOmJ9LHNldDpmdW5jdGlvbihhLGIsYyl7dmFyIGQ7Yj09PSExP2YucmVtb3ZlQXR0cihhLGMpOihkPWYucHJvcEZpeFtjXXx8YyxkIGluIGEmJihhW2RdPSEwKSxhLnNldEF0dHJpYnV0ZShjLGMudG9Mb3dlckNhc2UoKSkpO3JldHVybiBjfX0sdnx8KHk9e25hbWU6ITAsaWQ6ITB9LHc9Zi52YWxIb29rcy5idXR0b249e2dldDpmdW5jdGlvbihhLGMpe3ZhciBkO2Q9YS5nZXRBdHRyaWJ1dGVOb2RlKGMpO3JldHVybiBkJiYoeVtjXT9kLm5vZGVWYWx1ZSE9PSIiOmQuc3BlY2lmaWVkKT9kLm5vZGVWYWx1ZTpifSxzZXQ6ZnVuY3Rpb24oYSxiLGQpe3ZhciBlPWEuZ2V0QXR0cmlidXRlTm9kZShkKTtlfHwoZT1jLmNyZWF0ZUF0dHJpYnV0ZShkKSxhLnNldEF0dHJpYnV0ZU5vZGUoZSkpO3JldHVybiBlLm5vZGVWYWx1ZT1iKyIifX0sZi5hdHRySG9va3MudGFiaW5kZXguc2V0PXcuc2V0LGYuZWFjaChbIndpZHRoIiwiaGVpZ2h0Il0sZnVuY3Rpb24oYSxiKXtmLmF0dHJIb29rc1tiXT1mLmV4dGVuZChmLmF0dHJIb29rc1tiXSx7c2V0OmZ1bmN0aW9uKGEsYyl7aWYoYz09PSIiKXthLnNldEF0dHJpYnV0ZShiLCJhdXRvIik7cmV0dXJuIGN9fX0pfSksZi5hdHRySG9va3MuY29udGVudGVkaXRhYmxlPXtnZXQ6dy5nZXQsc2V0OmZ1bmN0aW9uKGEsYixjKXtiPT09IiImJihiPSJmYWxzZSIpLHcuc2V0KGEsYixjKX19KSxmLnN1cHBvcnQuaHJlZk5vcm1hbGl6ZWR8fGYuZWFjaChbImhyZWYiLCJzcmMiLCJ3aWR0aCIsImhlaWdodCJdLGZ1bmN0aW9uKGEsYyl7Zi5hdHRySG9va3NbY109Zi5leHRlbmQoZi5hdHRySG9va3NbY10se2dldDpmdW5jdGlvbihhKXt2YXIgZD1hLmdldEF0dHJpYnV0ZShjLDIpO3JldHVybiBkPT09bnVsbD9iOmR9fSl9KSxmLnN1cHBvcnQuc3R5bGV8fChmLmF0dHJIb29rcy5zdHlsZT17Z2V0OmZ1bmN0aW9uKGEpe3JldHVybiBhLnN0eWxlLmNzc1RleHQudG9Mb3dlckNhc2UoKXx8Yn0sc2V0OmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuc3R5bGUuY3NzVGV4dD0iIitifX0pLGYuc3VwcG9ydC5vcHRTZWxlY3RlZHx8KGYucHJvcEhvb2tzLnNlbGVjdGVkPWYuZXh0ZW5kKGYucHJvcEhvb2tzLnNlbGVjdGVkLHtnZXQ6ZnVuY3Rpb24oYSl7dmFyIGI9YS5wYXJlbnROb2RlO2ImJihiLnNlbGVjdGVkSW5kZXgsYi5wYXJlbnROb2RlJiZiLnBhcmVudE5vZGUuc2VsZWN0ZWRJbmRleCk7cmV0dXJuIG51bGx9fSkpLGYuc3VwcG9ydC5lbmN0eXBlfHwoZi5wcm9wRml4LmVuY3R5cGU9ImVuY29kaW5nIiksZi5zdXBwb3J0LmNoZWNrT258fGYuZWFjaChbInJhZGlvIiwiY2hlY2tib3giXSxmdW5jdGlvbigpe2YudmFsSG9va3NbdGhpc109e2dldDpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRBdHRyaWJ1dGUoInZhbHVlIik9PT1udWxsPyJvbiI6YS52YWx1ZX19fSksZi5lYWNoKFsicmFkaW8iLCJjaGVja2JveCJdLGZ1bmN0aW9uKCl7Zi52YWxIb29rc1t0aGlzXT1mLmV4dGVuZChmLnZhbEhvb2tzW3RoaXNdLHtzZXQ6ZnVuY3Rpb24oYSxiKXtpZihmLmlzQXJyYXkoYikpcmV0dXJuIGEuY2hlY2tlZD1mLmluQXJyYXkoZihhKS52YWwoKSxiKT49MH19KX0pO3ZhciB6PS9cLiguKikkLyxBPS9eKD86dGV4dGFyZWF8aW5wdXR8c2VsZWN0KSQvaSxCPS9cLi9nLEM9LyAvZyxEPS9bXlx3XHMufGBdL2csRT0vXihbXlwuXSopPyg/OlwuKC4rKSk/JC8sRj0vXGJob3ZlcihcLlxTKyk/LyxHPS9ea2V5LyxIPS9eKD86bW91c2V8Y29udGV4dG1lbnUpfGNsaWNrLyxJPS9eKFx3KikoPzojKFtcd1wtXSspKT8oPzpcLihbXHdcLV0rKSk/JC8sSj1mdW5jdGlvbihhKXt2YXIgYj1JLmV4ZWMoYSk7YiYmCihiWzFdPShiWzFdfHwiIikudG9Mb3dlckNhc2UoKSxiWzNdPWJbM10mJm5ldyBSZWdFeHAoIig/Ol58XFxzKSIrYlszXSsiKD86XFxzfCQpIikpO3JldHVybiBifSxLPWZ1bmN0aW9uKGEsYil7cmV0dXJuKCFiWzFdfHxhLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT1iWzFdKSYmKCFiWzJdfHxhLmlkPT09YlsyXSkmJighYlszXXx8YlszXS50ZXN0KGEuY2xhc3NOYW1lKSl9LEw9ZnVuY3Rpb24oYSl7cmV0dXJuIGYuZXZlbnQuc3BlY2lhbC5ob3Zlcj9hOmEucmVwbGFjZShGLCJtb3VzZWVudGVyJDEgbW91c2VsZWF2ZSQxIil9O2YuZXZlbnQ9e2FkZDpmdW5jdGlvbihhLGMsZCxlLGcpe3ZhciBoLGksaixrLGwsbSxuLG8scCxxLHIscztpZighKGEubm9kZVR5cGU9PT0zfHxhLm5vZGVUeXBlPT09OHx8IWN8fCFkfHwhKGg9Zi5fZGF0YShhKSkpKXtkLmhhbmRsZXImJihwPWQsZD1wLmhhbmRsZXIpLGQuZ3VpZHx8KGQuZ3VpZD1mLmd1aWQrKyksaj1oLmV2ZW50cyxqfHwoaC5ldmVudHM9aj17fSksaT1oLmhhbmRsZSxpfHwoaC5oYW5kbGU9aT1mdW5jdGlvbihhKXtyZXR1cm4gdHlwZW9mIGYhPSJ1bmRlZmluZWQiJiYoIWF8fGYuZXZlbnQudHJpZ2dlcmVkIT09YS50eXBlKT9mLmV2ZW50LmRpc3BhdGNoLmFwcGx5KGkuZWxlbSxhcmd1bWVudHMpOmJ9LGkuZWxlbT1hKSxjPUwoYykuc3BsaXQoIiAiKTtmb3Ioaz0wO2s8Yy5sZW5ndGg7aysrKXtsPUUuZXhlYyhjW2tdKXx8W10sbT1sWzFdLG49KGxbMl18fCIiKS5zcGxpdCgiLiIpLnNvcnQoKSxzPWYuZXZlbnQuc3BlY2lhbFttXXx8e30sbT0oZz9zLmRlbGVnYXRlVHlwZTpzLmJpbmRUeXBlKXx8bSxzPWYuZXZlbnQuc3BlY2lhbFttXXx8e30sbz1mLmV4dGVuZCh7dHlwZTptLG9yaWdUeXBlOmxbMV0sZGF0YTplLGhhbmRsZXI6ZCxndWlkOmQuZ3VpZCxzZWxlY3RvcjpnLG5hbWVzcGFjZTpuLmpvaW4oIi4iKX0scCksZyYmKG8ucXVpY2s9SihnKSwhby5xdWljayYmZi5leHByLm1hdGNoLlBPUy50ZXN0KGcpJiYoby5pc1Bvc2l0aW9uYWw9ITApKSxyPWpbbV07aWYoIXIpe3I9alttXT1bXSxyLmRlbGVnYXRlQ291bnQ9MDtpZighcy5zZXR1cHx8cy5zZXR1cC5jYWxsKGEsZSxuLGkpPT09ITEpYS5hZGRFdmVudExpc3RlbmVyP2EuYWRkRXZlbnRMaXN0ZW5lcihtLGksITEpOmEuYXR0YWNoRXZlbnQmJmEuYXR0YWNoRXZlbnQoIm9uIittLGkpfXMuYWRkJiYocy5hZGQuY2FsbChhLG8pLG8uaGFuZGxlci5ndWlkfHwoby5oYW5kbGVyLmd1aWQ9ZC5ndWlkKSksZz9yLnNwbGljZShyLmRlbGVnYXRlQ291bnQrKywwLG8pOnIucHVzaChvKSxmLmV2ZW50Lmdsb2JhbFttXT0hMH1hPW51bGx9fSxnbG9iYWw6e30scmVtb3ZlOmZ1bmN0aW9uKGEsYixjLGQpe3ZhciBlPWYuaGFzRGF0YShhKSYmZi5fZGF0YShhKSxnLGgsaSxqLGssbCxtLG4sbyxwLHE7aWYoISFlJiYhIShtPWUuZXZlbnRzKSl7Yj1MKGJ8fCIiKS5zcGxpdCgiICIpO2ZvcihnPTA7ZzxiLmxlbmd0aDtnKyspe2g9RS5leGVjKGJbZ10pfHxbXSxpPWhbMV0saj1oWzJdO2lmKCFpKXtqPWo/Ii4iK2o6IiI7Zm9yKGwgaW4gbSlmLmV2ZW50LnJlbW92ZShhLGwraixjLGQpO3JldHVybn1uPWYuZXZlbnQuc3BlY2lhbFtpXXx8e30saT0oZD9uLmRlbGVnYXRlVHlwZTpuLmJpbmRUeXBlKXx8aSxwPW1baV18fFtdLGs9cC5sZW5ndGgsaj1qP25ldyBSZWdFeHAoIihefFxcLikiK2ouc3BsaXQoIi4iKS5zb3J0KCkuam9pbigiXFwuKD86LipcXC4pPyIpKyIoXFwufCQpIik6bnVsbDtpZihjfHxqfHxkfHxuLnJlbW92ZSlmb3IobD0wO2w8cC5sZW5ndGg7bCsrKXtxPXBbbF07aWYoIWN8fGMuZ3VpZD09PXEuZ3VpZClpZighanx8ai50ZXN0KHEubmFtZXNwYWNlKSlpZighZHx8ZD09PXEuc2VsZWN0b3J8fGQ9PT0iKioiJiZxLnNlbGVjdG9yKXAuc3BsaWNlKGwtLSwxKSxxLnNlbGVjdG9yJiZwLmRlbGVnYXRlQ291bnQtLSxuLnJlbW92ZSYmbi5yZW1vdmUuY2FsbChhLHEpfWVsc2UgcC5sZW5ndGg9MDtwLmxlbmd0aD09PTAmJmshPT1wLmxlbmd0aCYmKCghbi50ZWFyZG93bnx8bi50ZWFyZG93bi5jYWxsKGEsaik9PT0hMSkmJmYucmVtb3ZlRXZlbnQoYSxpLGUuaGFuZGxlKSxkZWxldGUgbVtpXSl9Zi5pc0VtcHR5T2JqZWN0KG0pJiYobz1lLmhhbmRsZSxvJiYoby5lbGVtPW51bGwpLGYucmVtb3ZlRGF0YShhLFsiZXZlbnRzIiwiaGFuZGxlIl0sITApKX19LGN1c3RvbUV2ZW50OntnZXREYXRhOiEwLHNldERhdGE6ITAsY2hhbmdlRGF0YTohMH0sdHJpZ2dlcjpmdW5jdGlvbihjLGQsZSxnKXtpZighZXx8ZS5ub2RlVHlwZSE9PTMmJmUubm9kZVR5cGUhPT04KXt2YXIgaD1jLnR5cGV8fGMsaT1bXSxqLGssbCxtLG4sbyxwLHEscixzO2guaW5kZXhPZigiISIpPj0wJiYoaD1oLnNsaWNlKDAsLTEpLGs9ITApLGguaW5kZXhPZigiLiIpPj0wJiYoaT1oLnNwbGl0KCIuIiksaD1pLnNoaWZ0KCksaS5zb3J0KCkpO2lmKCghZXx8Zi5ldmVudC5jdXN0b21FdmVudFtoXSkmJiFmLmV2ZW50Lmdsb2JhbFtoXSlyZXR1cm47Yz10eXBlb2YgYz09Im9iamVjdCI/Y1tmLmV4cGFuZG9dP2M6bmV3IGYuRXZlbnQoaCxjKTpuZXcgZi5FdmVudChoKSxjLnR5cGU9aCxjLmlzVHJpZ2dlcj0hMCxjLmV4Y2x1c2l2ZT1rLGMubmFtZXNwYWNlPWkuam9pbigiLiIpLGMubmFtZXNwYWNlX3JlPWMubmFtZXNwYWNlP25ldyBSZWdFeHAoIihefFxcLikiK2kuam9pbigiXFwuKD86LipcXC4pPyIpKyIoXFwufCQpIik6bnVsbCxvPWguaW5kZXhPZigiOiIpPDA/Im9uIitoOiIiLChnfHwhZSkmJmMucHJldmVudERlZmF1bHQoKTtpZighZSl7aj1mLmNhY2hlO2ZvcihsIGluIGopaltsXS5ldmVudHMmJmpbbF0uZXZlbnRzW2hdJiZmLmV2ZW50LnRyaWdnZXIoYyxkLGpbbF0uaGFuZGxlLmVsZW0sITApO3JldHVybn1jLnJlc3VsdD1iLGMudGFyZ2V0fHwoYy50YXJnZXQ9ZSksZD1kIT1udWxsP2YubWFrZUFycmF5KGQpOltdLGQudW5zaGlmdChjKSxwPWYuZXZlbnQuc3BlY2lhbFtoXXx8e307aWYocC50cmlnZ2VyJiZwLnRyaWdnZXIuYXBwbHkoZSxkKT09PSExKXJldHVybjtyPVtbZSxwLmJpbmRUeXBlfHxoXV07aWYoIWcmJiFwLm5vQnViYmxlJiYhZi5pc1dpbmRvdyhlKSl7cz1wLmRlbGVnYXRlVHlwZXx8aCxuPW51bGw7Zm9yKG09ZS5wYXJlbnROb2RlO207bT1tLnBhcmVudE5vZGUpci5wdXNoKFttLHNdKSxuPW07biYmbj09PWUub3duZXJEb2N1bWVudCYmci5wdXNoKFtuLmRlZmF1bHRWaWV3fHxuLnBhcmVudFdpbmRvd3x8YSxzXSl9Zm9yKGw9MDtsPHIubGVuZ3RoO2wrKyl7bT1yW2xdWzBdLGMudHlwZT1yW2xdWzFdLHE9KGYuX2RhdGEobSwiZXZlbnRzIil8fHt9KVtjLnR5cGVdJiZmLl9kYXRhKG0sImhhbmRsZSIpLHEmJnEuYXBwbHkobSxkKSxxPW8mJm1bb10scSYmZi5hY2NlcHREYXRhKG0pJiZxLmFwcGx5KG0sZCk7aWYoYy5pc1Byb3BhZ2F0aW9uU3RvcHBlZCgpKWJyZWFrfWMudHlwZT1oLGMuaXNEZWZhdWx0UHJldmVudGVkKCl8fCghcC5fZGVmYXVsdHx8cC5fZGVmYXVsdC5hcHBseShlLm93bmVyRG9jdW1lbnQsZCk9PT0hMSkmJihoIT09ImNsaWNrInx8IWYubm9kZU5hbWUoZSwiYSIpKSYmZi5hY2NlcHREYXRhKGUpJiZvJiZlW2hdJiYoaCE9PSJmb2N1cyImJmghPT0iYmx1ciJ8fGMudGFyZ2V0Lm9mZnNldFdpZHRoIT09MCkmJiFmLmlzV2luZG93KGUpJiYobj1lW29dLG4mJihlW29dPW51bGwpLGYuZXZlbnQudHJpZ2dlcmVkPWgsZVtoXSgpLGYuZXZlbnQudHJpZ2dlcmVkPWIsbiYmKGVbb109bikpO3JldHVybiBjLnJlc3VsdH19LGRpc3BhdGNoOmZ1bmN0aW9uKGMpe2M9Zi5ldmVudC5maXgoY3x8YS5ldmVudCk7dmFyIGQ9KGYuX2RhdGEodGhpcywiZXZlbnRzIil8fHt9KVtjLnR5cGVdfHxbXSxlPWQuZGVsZWdhdGVDb3VudCxnPVtdLnNsaWNlLmNhbGwoYXJndW1lbnRzLDApLGg9IWMuZXhjbHVzaXZlJiYhYy5uYW1lc3BhY2UsaT0oZi5ldmVudC5zcGVjaWFsW2MudHlwZV18fHt9KS5oYW5kbGUsaj1bXSxrLGwsbSxuLG8scCxxLHIscyx0LHU7Z1swXT1jLGMuZGVsZWdhdGVUYXJnZXQ9dGhpcztpZihlJiYhYy50YXJnZXQuZGlzYWJsZWQmJighYy5idXR0b258fGMudHlwZSE9PSJjbGljayIpKWZvcihtPWMudGFyZ2V0O20hPXRoaXM7bT1tLnBhcmVudE5vZGV8fHRoaXMpe289e30scT1bXTtmb3Ioaz0wO2s8ZTtrKyspcj1kW2tdLHM9ci5zZWxlY3Rvcix0PW9bc10sci5pc1Bvc2l0aW9uYWw/dD0odHx8KG9bc109ZihzKSkpLmluZGV4KG0pPj0wOnQ9PT1iJiYodD1vW3NdPXIucXVpY2s/SyhtLHIucXVpY2spOmYobSkuaXMocykpLHQmJnEucHVzaChyKTtxLmxlbmd0aCYmai5wdXNoKHtlbGVtOm0sbWF0Y2hlczpxfSl9ZC5sZW5ndGg+ZSYmai5wdXNoKHtlbGVtOnRoaXMsbWF0Y2hlczpkLnNsaWNlKGUpfSk7Zm9yKGs9MDtrPGoubGVuZ3RoJiYhYy5pc1Byb3BhZ2F0aW9uU3RvcHBlZCgpO2srKyl7cD1qW2tdLGMuY3VycmVudFRhcmdldD1wLmVsZW07Zm9yKGw9MDtsPHAubWF0Y2hlcy5sZW5ndGgmJiFjLmlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkKCk7bCsrKXtyPXAubWF0Y2hlc1tsXTtpZihofHwhYy5uYW1lc3BhY2UmJiFyLm5hbWVzcGFjZXx8Yy5uYW1lc3BhY2VfcmUmJmMubmFtZXNwYWNlX3JlLnRlc3Qoci5uYW1lc3BhY2UpKWMuZGF0YT1yLmRhdGEsYy5oYW5kbGVPYmo9cixuPShpfHxyLmhhbmRsZXIpLmFwcGx5KHAuZWxlbSxnKSxuIT09YiYmKGMucmVzdWx0PW4sbj09PSExJiYoYy5wcmV2ZW50RGVmYXVsdCgpLGMuc3RvcFByb3BhZ2F0aW9uKCkpKX19cmV0dXJuIGMucmVzdWx0fSxwcm9wczoiYXR0ckNoYW5nZSBhdHRyTmFtZSByZWxhdGVkTm9kZSBzcmNFbGVtZW50IGFsdEtleSBidWJibGVzIGNhbmNlbGFibGUgY3RybEtleSBjdXJyZW50VGFyZ2V0IGV2ZW50UGhhc2UgbWV0YUtleSByZWxhdGVkVGFyZ2V0IHNoaWZ0S2V5IHRhcmdldCB0aW1lU3RhbXAgdmlldyB3aGljaCIuc3BsaXQoIiAiKSxmaXhIb29rczp7fSxrZXlIb29rczp7cHJvcHM6ImNoYXIgY2hhckNvZGUga2V5IGtleUNvZGUiLnNwbGl0KCIgIiksZmlsdGVyOmZ1bmN0aW9uKGEsYil7YS53aGljaD09bnVsbCYmKGEud2hpY2g9Yi5jaGFyQ29kZSE9bnVsbD9iLmNoYXJDb2RlOmIua2V5Q29kZSk7cmV0dXJuIGF9fSxtb3VzZUhvb2tzOntwcm9wczoiYnV0dG9uIGJ1dHRvbnMgY2xpZW50WCBjbGllbnRZIGZyb21FbGVtZW50IG9mZnNldFggb2Zmc2V0WSBwYWdlWCBwYWdlWSBzY3JlZW5YIHNjcmVlblkgdG9FbGVtZW50IHdoZWVsRGVsdGEiLnNwbGl0KCIgIiksZmlsdGVyOmZ1bmN0aW9uKGEsZCl7dmFyIGUsZixnLGg9ZC5idXR0b24saT1kLmZyb21FbGVtZW50O2EucGFnZVg9PW51bGwmJmQuY2xpZW50WCE9bnVsbCYmKGU9YS50YXJnZXQub3duZXJEb2N1bWVudHx8YyxmPWUuZG9jdW1lbnRFbGVtZW50LGc9ZS5ib2R5LGEucGFnZVg9ZC5jbGllbnRYKyhmJiZmLnNjcm9sbExlZnR8fGcmJmcuc2Nyb2xsTGVmdHx8MCktKGYmJmYuY2xpZW50TGVmdHx8ZyYmZy5jbGllbnRMZWZ0fHwwKSxhLnBhZ2VZPWQuY2xpZW50WSsoZiYmZi5zY3JvbGxUb3B8fGcmJmcuc2Nyb2xsVG9wfHwwKS0oZiYmZi5jbGllbnRUb3B8fGcmJmcuY2xpZW50VG9wfHwwKSksIWEucmVsYXRlZFRhcmdldCYmaSYmKGEucmVsYXRlZFRhcmdldD1pPT09YS50YXJnZXQ/ZC50b0VsZW1lbnQ6aSksIWEud2hpY2gmJmghPT1iJiYoYS53aGljaD1oJjE/MTpoJjI/MzpoJjQ/MjowKTtyZXR1cm4gYX19LGZpeDpmdW5jdGlvbihhKXtpZihhW2YuZXhwYW5kb10pcmV0dXJuIGE7dmFyIGQsZSxnPWEsaD1mLmV2ZW50LmZpeEhvb2tzW2EudHlwZV18fHt9LGk9aC5wcm9wcz90aGlzLnByb3BzLmNvbmNhdChoLnByb3BzKTp0aGlzLnByb3BzO2E9Zi5FdmVudChnKTtmb3IoZD1pLmxlbmd0aDtkOyllPWlbLS1kXSxhW2VdPWdbZV07YS50YXJnZXR8fChhLnRhcmdldD1nLnNyY0VsZW1lbnR8fGMpLGEudGFyZ2V0Lm5vZGVUeXBlPT09MyYmKGEudGFyZ2V0PWEudGFyZ2V0LnBhcmVudE5vZGUpLGEubWV0YUtleT09PWImJihhLm1ldGFLZXk9YS5jdHJsS2V5KTtyZXR1cm4gaC5maWx0ZXI/aC5maWx0ZXIoYSxnKTphfSxzcGVjaWFsOntyZWFkeTp7c2V0dXA6Zi5iaW5kUmVhZHl9LGZvY3VzOntkZWxlZ2F0ZVR5cGU6ImZvY3VzaW4iLG5vQnViYmxlOiEwfSxibHVyOntkZWxlZ2F0ZVR5cGU6ImZvY3Vzb3V0Iixub0J1YmJsZTohMH0sYmVmb3JldW5sb2FkOntzZXR1cDpmdW5jdGlvbihhLGIsYyl7Zi5pc1dpbmRvdyh0aGlzKSYmKHRoaXMub25iZWZvcmV1bmxvYWQ9Yyl9LHRlYXJkb3duOmZ1bmN0aW9uKGEsYil7dGhpcy5vbmJlZm9yZXVubG9hZD09PWImJih0aGlzLm9uYmVmb3JldW5sb2FkPW51bGwpfX19LHNpbXVsYXRlOmZ1bmN0aW9uKGEsYixjLGQpe3ZhciBlPWYuZXh0ZW5kKG5ldyBmLkV2ZW50LGMse3R5cGU6YSxpc1NpbXVsYXRlZDohMCxvcmlnaW5hbEV2ZW50Ont9fSk7ZD9mLmV2ZW50LnRyaWdnZXIoZSxudWxsLGIpOmYuZXZlbnQuZGlzcGF0Y2guY2FsbChiLGUpLGUuaXNEZWZhdWx0UHJldmVudGVkKCkmJmMucHJldmVudERlZmF1bHQoKX19LGYuZXZlbnQuaGFuZGxlPWYuZXZlbnQuZGlzcGF0Y2gsZi5yZW1vdmVFdmVudD1jLnJlbW92ZUV2ZW50TGlzdGVuZXI/ZnVuY3Rpb24oYSxiLGMpe2EucmVtb3ZlRXZlbnRMaXN0ZW5lciYmYS5yZW1vdmVFdmVudExpc3RlbmVyKGIsYywhMSl9OmZ1bmN0aW9uKGEsYixjKXthLmRldGFjaEV2ZW50JiZhLmRldGFjaEV2ZW50KCJvbiIrYixjKX0sZi5FdmVudD1mdW5jdGlvbihhLGIpe2lmKCEodGhpcyBpbnN0YW5jZW9mIGYuRXZlbnQpKXJldHVybiBuZXcgZi5FdmVudChhLGIpO2EmJmEudHlwZT8odGhpcy5vcmlnaW5hbEV2ZW50PWEsdGhpcy50eXBlPWEudHlwZSx0aGlzLmlzRGVmYXVsdFByZXZlbnRlZD1hLmRlZmF1bHRQcmV2ZW50ZWR8fGEucmV0dXJuVmFsdWU9PT0hMXx8YS5nZXRQcmV2ZW50RGVmYXVsdCYmYS5nZXRQcmV2ZW50RGVmYXVsdCgpP046TSk6dGhpcy50eXBlPWEsYiYmZi5leHRlbmQodGhpcyxiKSx0aGlzLnRpbWVTdGFtcD1hJiZhLnRpbWVTdGFtcHx8Zi5ub3coKSx0aGlzW2YuZXhwYW5kb109ITB9LGYuRXZlbnQucHJvdG90eXBlPXtwcmV2ZW50RGVmYXVsdDpmdW5jdGlvbigpe3RoaXMuaXNEZWZhdWx0UHJldmVudGVkPU47dmFyIGE9dGhpcy5vcmlnaW5hbEV2ZW50OyFhfHwoYS5wcmV2ZW50RGVmYXVsdD9hLnByZXZlbnREZWZhdWx0KCk6YS5yZXR1cm5WYWx1ZT0hMSl9LHN0b3BQcm9wYWdhdGlvbjpmdW5jdGlvbigpe3RoaXMuaXNQcm9wYWdhdGlvblN0b3BwZWQ9Tjt2YXIgYT10aGlzLm9yaWdpbmFsRXZlbnQ7IWF8fChhLnN0b3BQcm9wYWdhdGlvbiYmYS5zdG9wUHJvcGFnYXRpb24oKSxhLmNhbmNlbEJ1YmJsZT0hMCl9LHN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbjpmdW5jdGlvbigpe3RoaXMuaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQ9Tix0aGlzLnN0b3BQcm9wYWdhdGlvbigpfSxpc0RlZmF1bHRQcmV2ZW50ZWQ6TSxpc1Byb3BhZ2F0aW9uU3RvcHBlZDpNLGlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkOk19LGYuZWFjaCh7bW91c2VlbnRlcjoibW91c2VvdmVyIixtb3VzZWxlYXZlOiJtb3VzZW91dCJ9LGZ1bmN0aW9uKGEsYil7Zi5ldmVudC5zcGVjaWFsW2FdPWYuZXZlbnQuc3BlY2lhbFtiXT17ZGVsZWdhdGVUeXBlOmIsYmluZFR5cGU6YixoYW5kbGU6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcyxjPWEucmVsYXRlZFRhcmdldCxkPWEuaGFuZGxlT2JqLGU9ZC5zZWxlY3RvcixnLGg7aWYoIWN8fGQub3JpZ1R5cGU9PT1hLnR5cGV8fGMhPT1iJiYhZi5jb250YWlucyhiLGMpKWc9YS50eXBlLGEudHlwZT1kLm9yaWdUeXBlLGg9ZC5oYW5kbGVyLmFwcGx5KHRoaXMsYXJndW1lbnRzKSxhLnR5cGU9ZztyZXR1cm4gaH19fSksZi5zdXBwb3J0LnN1Ym1pdEJ1YmJsZXN8fChmLmV2ZW50LnNwZWNpYWwuc3VibWl0PXtzZXR1cDpmdW5jdGlvbigpe2lmKGYubm9kZU5hbWUodGhpcywiZm9ybSIpKXJldHVybiExO2YuZXZlbnQuYWRkKHRoaXMsImNsaWNrLl9zdWJtaXQga2V5cHJlc3MuX3N1Ym1pdCIsZnVuY3Rpb24oYSl7dmFyIGM9YS50YXJnZXQsZD1mLm5vZGVOYW1lKGMsImlucHV0Iil8fGYubm9kZU5hbWUoYywiYnV0dG9uIik/Yy5mb3JtOmI7ZCYmIWQuX3N1Ym1pdF9hdHRhY2hlZCYmKGYuZXZlbnQuYWRkKGQsInN1Ym1pdC5fc3VibWl0IixmdW5jdGlvbihhKXt0aGlzLnBhcmVudE5vZGUmJmYuZXZlbnQuc2ltdWxhdGUoInN1Ym1pdCIsdGhpcy5wYXJlbnROb2RlLGEsITApfSksZC5fc3VibWl0X2F0dGFjaGVkPSEwKX0pfSx0ZWFyZG93bjpmdW5jdGlvbigpe2lmKGYubm9kZU5hbWUodGhpcywiZm9ybSIpKXJldHVybiExO2YuZXZlbnQucmVtb3ZlKHRoaXMsIi5fc3VibWl0Iil9fSksZi5zdXBwb3J0LmNoYW5nZUJ1YmJsZXN8fChmLmV2ZW50LnNwZWNpYWwuY2hhbmdlPXtzZXR1cDpmdW5jdGlvbigpe2lmKEEudGVzdCh0aGlzLm5vZGVOYW1lKSl7aWYodGhpcy50eXBlPT09ImNoZWNrYm94Inx8dGhpcy50eXBlPT09InJhZGlvIilmLmV2ZW50LmFkZCh0aGlzLCJwcm9wZXJ0eWNoYW5nZS5fY2hhbmdlIixmdW5jdGlvbihhKXthLm9yaWdpbmFsRXZlbnQucHJvcGVydHlOYW1lPT09ImNoZWNrZWQiJiYodGhpcy5fanVzdF9jaGFuZ2VkPSEwKX0pLGYuZXZlbnQuYWRkKHRoaXMsImNsaWNrLl9jaGFuZ2UiLGZ1bmN0aW9uKGEpe3RoaXMuX2p1c3RfY2hhbmdlZCYmKHRoaXMuX2p1c3RfY2hhbmdlZD0hMSxmLmV2ZW50LnNpbXVsYXRlKCJjaGFuZ2UiLHRoaXMsYSwhMCkpfSk7cmV0dXJuITF9Zi5ldmVudC5hZGQodGhpcywiYmVmb3JlYWN0aXZhdGUuX2NoYW5nZSIsZnVuY3Rpb24oYSl7dmFyIGI9YS50YXJnZXQ7QS50ZXN0KGIubm9kZU5hbWUpJiYhYi5fY2hhbmdlX2F0dGFjaGVkJiYoZi5ldmVudC5hZGQoYiwiY2hhbmdlLl9jaGFuZ2UiLGZ1bmN0aW9uKGEpe3RoaXMucGFyZW50Tm9kZSYmIWEuaXNTaW11bGF0ZWQmJmYuZXZlbnQuc2ltdWxhdGUoImNoYW5nZSIsdGhpcy5wYXJlbnROb2RlLGEsITApfSksYi5fY2hhbmdlX2F0dGFjaGVkPSEwKX0pfSxoYW5kbGU6ZnVuY3Rpb24oYSl7dmFyIGI9YS50YXJnZXQ7aWYodGhpcyE9PWJ8fGEuaXNTaW11bGF0ZWR8fGEuaXNUcmlnZ2VyfHxiLnR5cGUhPT0icmFkaW8iJiZiLnR5cGUhPT0iY2hlY2tib3giKXJldHVybiBhLmhhbmRsZU9iai5oYW5kbGVyLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sdGVhcmRvd246ZnVuY3Rpb24oKXtmLmV2ZW50LnJlbW92ZSh0aGlzLCIuX2NoYW5nZSIpO3JldHVybiBBLnRlc3QodGhpcy5ub2RlTmFtZSl9fSksZi5zdXBwb3J0LmZvY3VzaW5CdWJibGVzfHxmLmVhY2goe2ZvY3VzOiJmb2N1c2luIixibHVyOiJmb2N1c291dCJ9LGZ1bmN0aW9uKGEsYil7dmFyIGQ9MCxlPWZ1bmN0aW9uKGEpe2YuZXZlbnQuc2ltdWxhdGUoYixhLnRhcmdldCxmLmV2ZW50LmZpeChhKSwhMCl9O2YuZXZlbnQuc3BlY2lhbFtiXT17c2V0dXA6ZnVuY3Rpb24oKXtkKys9PT0wJiZjLmFkZEV2ZW50TGlzdGVuZXIoYSxlLCEwKX0sdGVhcmRvd246ZnVuY3Rpb24oKXstLWQ9PT0wJiZjLnJlbW92ZUV2ZW50TGlzdGVuZXIoYSxlLCEwKX19fSksZi5mbi5leHRlbmQoe29uOmZ1bmN0aW9uKGEsYyxkLGUsZyl7dmFyIGgsaTtpZih0eXBlb2YgYT09Im9iamVjdCIpe3R5cGVvZiBjIT0ic3RyaW5nIiYmKGQ9YyxjPWIpO2ZvcihpIGluIGEpdGhpcy5vbihpLGMsZCxhW2ldLGcpO3JldHVybiB0aGlzfWQ9PW51bGwmJmU9PW51bGw/KGU9YyxkPWM9Yik6ZT09bnVsbCYmKHR5cGVvZiBjPT0ic3RyaW5nIj8oZT1kLGQ9Yik6KGU9ZCxkPWMsYz1iKSk7aWYoZT09PSExKWU9TTtlbHNlIGlmKCFlKXJldHVybiB0aGlzO2c9PT0xJiYoaD1lLGU9ZnVuY3Rpb24oYSl7ZigpLm9mZihhKTtyZXR1cm4gaC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LGUuZ3VpZD1oLmd1aWR8fChoLmd1aWQ9Zi5ndWlkKyspKTtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7Zi5ldmVudC5hZGQodGhpcyxhLGUsZCxjKX0pfSxvbmU6ZnVuY3Rpb24oYSxiLGMsZCl7cmV0dXJuIHRoaXMub24uY2FsbCh0aGlzLGEsYixjLGQsMSl9LG9mZjpmdW5jdGlvbihhLGMsZCl7aWYoYSYmYS5wcmV2ZW50RGVmYXVsdCYmYS5oYW5kbGVPYmope3ZhciBlPWEuaGFuZGxlT2JqO2YoYS5kZWxlZ2F0ZVRhcmdldCkub2ZmKGUubmFtZXNwYWNlP2UudHlwZSsiLiIrZS5uYW1lc3BhY2U6ZS50eXBlLGUuc2VsZWN0b3IsZS5oYW5kbGVyKTtyZXR1cm4gdGhpc31pZih0eXBlb2YgYT09Im9iamVjdCIpe2Zvcih2YXIgZyBpbiBhKXRoaXMub2ZmKGcsYyxhW2ddKTtyZXR1cm4gdGhpc31pZihjPT09ITF8fHR5cGVvZiBjPT0iZnVuY3Rpb24iKWQ9YyxjPWI7ZD09PSExJiYoZD1NKTtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7Zi5ldmVudC5yZW1vdmUodGhpcyxhLGQsYyl9KX0sYmluZDpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIHRoaXMub24oYSxudWxsLGIsYyl9LHVuYmluZDpmdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLm9mZihhLG51bGwsYil9LGxpdmU6ZnVuY3Rpb24oYSxiLGMpe2YodGhpcy5jb250ZXh0KS5vbihhLHRoaXMuc2VsZWN0b3IsYixjKTtyZXR1cm4gdGhpc30sZGllOmZ1bmN0aW9uKGEsYil7Zih0aGlzLmNvbnRleHQpLm9mZihhLHRoaXMuc2VsZWN0b3J8fCIqKiIsYik7cmV0dXJuIHRoaXN9LGRlbGVnYXRlOmZ1bmN0aW9uKGEsYixjLGQpe3JldHVybiB0aGlzLm9uKGIsYSxjLGQpfSx1bmRlbGVnYXRlOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD09MT90aGlzLm9mZihhLCIqKiIpOnRoaXMub2ZmKGIsYSxjKX0sdHJpZ2dlcjpmdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtmLmV2ZW50LnRyaWdnZXIoYSxiLHRoaXMpfSl9LHRyaWdnZXJIYW5kbGVyOmZ1bmN0aW9uKGEsYil7aWYodGhpc1swXSlyZXR1cm4gZi5ldmVudC50cmlnZ2VyKGEsYix0aGlzWzBdLCEwKX0sdG9nZ2xlOmZ1bmN0aW9uKGEpe3ZhciBiPWFyZ3VtZW50cyxjPWEuZ3VpZHx8Zi5ndWlkKyssZD0wLGU9ZnVuY3Rpb24oYyl7dmFyIGU9KGYuX2RhdGEodGhpcywibGFzdFRvZ2dsZSIrYS5ndWlkKXx8MCklZDtmLl9kYXRhKHRoaXMsImxhc3RUb2dnbGUiK2EuZ3VpZCxlKzEpLGMucHJldmVudERlZmF1bHQoKTtyZXR1cm4gYltlXS5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fCExfTtlLmd1aWQ9Yzt3aGlsZShkPGIubGVuZ3RoKWJbZCsrXS5ndWlkPWM7cmV0dXJuIHRoaXMuY2xpY2soZSl9LGhvdmVyOmZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMubW91c2VlbnRlcihhKS5tb3VzZWxlYXZlKGJ8fGEpfX0pLGYuZWFjaCgiYmx1ciBmb2N1cyBmb2N1c2luIGZvY3Vzb3V0IGxvYWQgcmVzaXplIHNjcm9sbCB1bmxvYWQgY2xpY2sgZGJsY2xpY2sgbW91c2Vkb3duIG1vdXNldXAgbW91c2Vtb3ZlIG1vdXNlb3ZlciBtb3VzZW91dCBtb3VzZWVudGVyIG1vdXNlbGVhdmUgY2hhbmdlIHNlbGVjdCBzdWJtaXQga2V5ZG93biBrZXlwcmVzcyBrZXl1cCBlcnJvciBjb250ZXh0bWVudSIuc3BsaXQoIiAiKSxmdW5jdGlvbihhLGIpe2YuZm5bYl09ZnVuY3Rpb24oYSxjKXtjPT1udWxsJiYoYz1hLGE9bnVsbCk7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg+MD90aGlzLmJpbmQoYixhLGMpOnRoaXMudHJpZ2dlcihiKX0sZi5hdHRyRm4mJihmLmF0dHJGbltiXT0hMCksRy50ZXN0KGIpJiYoZi5ldmVudC5maXhIb29rc1tiXT1mLmV2ZW50LmtleUhvb2tzKSxILnRlc3QoYikmJihmLmV2ZW50LmZpeEhvb2tzW2JdPWYuZXZlbnQubW91c2VIb29rcyl9KSxmdW5jdGlvbigpe2Z1bmN0aW9uIHgoYSxiLGMsZSxmLGcpe2Zvcih2YXIgaD0wLGk9ZS5sZW5ndGg7aDxpO2grKyl7dmFyIGo9ZVtoXTtpZihqKXt2YXIgaz0hMTtqPWpbYV07d2hpbGUoail7aWYoaltkXT09PWMpe2s9ZVtqLnNpenNldF07YnJlYWt9aWYoai5ub2RlVHlwZT09PTEpe2d8fChqW2RdPWMsai5zaXpzZXQ9aCk7aWYodHlwZW9mIGIhPSJzdHJpbmciKXtpZihqPT09Yil7az0hMDticmVha319ZWxzZSBpZihtLmZpbHRlcihiLFtqXSkubGVuZ3RoPjApe2s9ajticmVha319aj1qW2FdfWVbaF09a319fWZ1bmN0aW9uIHcoYSxiLGMsZSxmLGcpe2Zvcih2YXIgaD0wLGk9ZS5sZW5ndGg7aDxpO2grKyl7dmFyIGo9ZVtoXTtpZihqKXt2YXIgaz0hMTtqPWpbYV07d2hpbGUoail7aWYoaltkXT09PWMpe2s9ZVtqLnNpenNldF07YnJlYWt9ai5ub2RlVHlwZT09PTEmJiFnJiYoaltkXT1jLGouc2l6c2V0PWgpO2lmKGoubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PWIpe2s9ajticmVha31qPWpbYV19ZVtoXT1rfX19dmFyIGE9LygoPzpcKCg/OlwoW14oKV0rXCl8W14oKV0rKStcKXxcWyg/OlxbW15cW1xdXSpcXXxbJyJdW14nIl0qWyciXXxbXlxbXF0nIl0rKStcXXxcXC58W14gPit+LChcW1xcXSspK3xbPit+XSkoXHMqLFxzKik/KCg/Oi58XHJ8XG4pKikvZyxkPSJzaXpjYWNoZSIrKE1hdGgucmFuZG9tKCkrIiIpLnJlcGxhY2UoIi4iLCIiKSxlPTAsZz1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLGg9ITEsaT0hMCxqPS9cXC9nLGs9L1xyXG4vZyxsPS9cVy87WzAsMF0uc29ydChmdW5jdGlvbigpe2k9ITE7cmV0dXJuIDB9KTt2YXIgbT1mdW5jdGlvbihiLGQsZSxmKXtlPWV8fFtdLGQ9ZHx8Yzt2YXIgaD1kO2lmKGQubm9kZVR5cGUhPT0xJiZkLm5vZGVUeXBlIT09OSlyZXR1cm5bXTtpZighYnx8dHlwZW9mIGIhPSJzdHJpbmciKXJldHVybiBlO3ZhciBpLGosayxsLG4scSxyLHQsdT0hMCx2PW0uaXNYTUwoZCksdz1bXSx4PWI7ZG97YS5leGVjKCIiKSxpPWEuZXhlYyh4KTtpZihpKXt4PWlbM10sdy5wdXNoKGlbMV0pO2lmKGlbMl0pe2w9aVszXTticmVha319fXdoaWxlKGkpO2lmKHcubGVuZ3RoPjEmJnAuZXhlYyhiKSlpZih3Lmxlbmd0aD09PTImJm8ucmVsYXRpdmVbd1swXV0paj15KHdbMF0rd1sxXSxkLGYpO2Vsc2V7aj1vLnJlbGF0aXZlW3dbMF1dP1tkXTptKHcuc2hpZnQoKSxkKTt3aGlsZSh3Lmxlbmd0aCliPXcuc2hpZnQoKSxvLnJlbGF0aXZlW2JdJiYoYis9dy5zaGlmdCgpKSxqPXkoYixqLGYpfWVsc2V7IWYmJncubGVuZ3RoPjEmJmQubm9kZVR5cGU9PT05JiYhdiYmby5tYXRjaC5JRC50ZXN0KHdbMF0pJiYhby5tYXRjaC5JRC50ZXN0KHdbdy5sZW5ndGgtMV0pJiYobj1tLmZpbmQody5zaGlmdCgpLGQsdiksZD1uLmV4cHI/bS5maWx0ZXIobi5leHByLG4uc2V0KVswXTpuLnNldFswXSk7aWYoZCl7bj1mP3tleHByOncucG9wKCksc2V0OnMoZil9Om0uZmluZCh3LnBvcCgpLHcubGVuZ3RoPT09MSYmKHdbMF09PT0ifiJ8fHdbMF09PT0iKyIpJiZkLnBhcmVudE5vZGU/ZC5wYXJlbnROb2RlOmQsdiksaj1uLmV4cHI/bS5maWx0ZXIobi5leHByLG4uc2V0KTpuLnNldCx3Lmxlbmd0aD4wP2s9cyhqKTp1PSExO3doaWxlKHcubGVuZ3RoKXE9dy5wb3AoKSxyPXEsby5yZWxhdGl2ZVtxXT9yPXcucG9wKCk6cT0iIixyPT1udWxsJiYocj1kKSxvLnJlbGF0aXZlW3FdKGsscix2KX1lbHNlIGs9dz1bXX1rfHwoaz1qKSxrfHxtLmVycm9yKHF8fGIpO2lmKGcuY2FsbChrKT09PSJbb2JqZWN0IEFycmF5XSIpaWYoIXUpZS5wdXNoLmFwcGx5KGUsayk7ZWxzZSBpZihkJiZkLm5vZGVUeXBlPT09MSlmb3IodD0wO2tbdF0hPW51bGw7dCsrKWtbdF0mJihrW3RdPT09ITB8fGtbdF0ubm9kZVR5cGU9PT0xJiZtLmNvbnRhaW5zKGQsa1t0XSkpJiZlLnB1c2goalt0XSk7ZWxzZSBmb3IodD0wO2tbdF0hPW51bGw7dCsrKWtbdF0mJmtbdF0ubm9kZVR5cGU9PT0xJiZlLnB1c2goalt0XSk7ZWxzZSBzKGssZSk7bCYmKG0obCxoLGUsZiksbS51bmlxdWVTb3J0KGUpKTtyZXR1cm4gZX07bS51bmlxdWVTb3J0PWZ1bmN0aW9uKGEpe2lmKHUpe2g9aSxhLnNvcnQodSk7aWYoaClmb3IodmFyIGI9MTtiPGEubGVuZ3RoO2IrKylhW2JdPT09YVtiLTFdJiZhLnNwbGljZShiLS0sMSl9cmV0dXJuIGF9LG0ubWF0Y2hlcz1mdW5jdGlvbihhLGIpe3JldHVybiBtKGEsbnVsbCxudWxsLGIpfSxtLm1hdGNoZXNTZWxlY3Rvcj1mdW5jdGlvbihhLGIpe3JldHVybiBtKGIsbnVsbCxudWxsLFthXSkubGVuZ3RoPjB9LG0uZmluZD1mdW5jdGlvbihhLGIsYyl7dmFyIGQsZSxmLGcsaCxpO2lmKCFhKXJldHVybltdO2ZvcihlPTAsZj1vLm9yZGVyLmxlbmd0aDtlPGY7ZSsrKXtoPW8ub3JkZXJbZV07aWYoZz1vLmxlZnRNYXRjaFtoXS5leGVjKGEpKXtpPWdbMV0sZy5zcGxpY2UoMSwxKTtpZihpLnN1YnN0cihpLmxlbmd0aC0xKSE9PSJcXCIpe2dbMV09KGdbMV18fCIiKS5yZXBsYWNlKGosIiIpLGQ9by5maW5kW2hdKGcsYixjKTtpZihkIT1udWxsKXthPWEucmVwbGFjZShvLm1hdGNoW2hdLCIiKTticmVha319fX1kfHwoZD10eXBlb2YgYi5nZXRFbGVtZW50c0J5VGFnTmFtZSE9InVuZGVmaW5lZCI/Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpOltdKTtyZXR1cm57c2V0OmQsZXhwcjphfX0sbS5maWx0ZXI9ZnVuY3Rpb24oYSxjLGQsZSl7dmFyIGYsZyxoLGksaixrLGwsbixwLHE9YSxyPVtdLHM9Yyx0PWMmJmNbMF0mJm0uaXNYTUwoY1swXSk7d2hpbGUoYSYmYy5sZW5ndGgpe2ZvcihoIGluIG8uZmlsdGVyKWlmKChmPW8ubGVmdE1hdGNoW2hdLmV4ZWMoYSkpIT1udWxsJiZmWzJdKXtrPW8uZmlsdGVyW2hdLGw9ZlsxXSxnPSExLGYuc3BsaWNlKDEsMSk7aWYobC5zdWJzdHIobC5sZW5ndGgtMSk9PT0iXFwiKWNvbnRpbnVlO3M9PT1yJiYocj1bXSk7aWYoby5wcmVGaWx0ZXJbaF0pe2Y9by5wcmVGaWx0ZXJbaF0oZixzLGQscixlLHQpO2lmKCFmKWc9aT0hMDtlbHNlIGlmKGY9PT0hMCljb250aW51ZX1pZihmKWZvcihuPTA7KGo9c1tuXSkhPW51bGw7bisrKWomJihpPWsoaixmLG4scykscD1lXmksZCYmaSE9bnVsbD9wP2c9ITA6c1tuXT0hMTpwJiYoci5wdXNoKGopLGc9ITApKTtpZihpIT09Yil7ZHx8KHM9ciksYT1hLnJlcGxhY2Uoby5tYXRjaFtoXSwiIik7aWYoIWcpcmV0dXJuW107YnJlYWt9fWlmKGE9PT1xKWlmKGc9PW51bGwpbS5lcnJvcihhKTtlbHNlIGJyZWFrO3E9YX1yZXR1cm4gc30sbS5lcnJvcj1mdW5jdGlvbihhKXt0aHJvdyJTeW50YXggZXJyb3IsIHVucmVjb2duaXplZCBleHByZXNzaW9uOiAiK2F9O3ZhciBuPW0uZ2V0VGV4dD1mdW5jdGlvbihhKXt2YXIgYixjLGQ9YS5ub2RlVHlwZSxlPSIiO2lmKGQpe2lmKGQ9PT0xKXtpZih0eXBlb2YgYS50ZXh0Q29udGVudD09InN0cmluZyIpcmV0dXJuIGEudGV4dENvbnRlbnQ7aWYodHlwZW9mIGEuaW5uZXJUZXh0PT0ic3RyaW5nIilyZXR1cm4gYS5pbm5lclRleHQucmVwbGFjZShrLCIiKTtmb3IoYT1hLmZpcnN0Q2hpbGQ7YTthPWEubmV4dFNpYmxpbmcpZSs9bihhKX1lbHNlIGlmKGQ9PT0zfHxkPT09NClyZXR1cm4gYS5ub2RlVmFsdWV9ZWxzZSBmb3IoYj0wO2M9YVtiXTtiKyspYy5ub2RlVHlwZSE9PTgmJihlKz1uKGMpKTtyZXR1cm4gZX0sbz1tLnNlbGVjdG9ycz17b3JkZXI6WyJJRCIsIk5BTUUiLCJUQUciXSxtYXRjaDp7SUQ6LyMoKD86W1x3XHUwMGMwLVx1RkZGRlwtXXxcXC4pKykvLENMQVNTOi9cLigoPzpbXHdcdTAwYzAtXHVGRkZGXC1dfFxcLikrKS8sTkFNRTovXFtuYW1lPVsnIl0qKCg/Oltcd1x1MDBjMC1cdUZGRkZcLV18XFwuKSspWyciXSpcXS8sQVRUUjovXFtccyooKD86W1x3XHUwMGMwLVx1RkZGRlwtXXxcXC4pKylccyooPzooXFM/PSlccyooPzooWyciXSkoLio/KVwzfCgjPyg/Oltcd1x1MDBjMC1cdUZGRkZcLV18XFwuKSopfCl8KVxzKlxdLyxUQUc6L14oKD86W1x3XHUwMGMwLVx1RkZGRlwqXC1dfFxcLikrKS8sQ0hJTEQ6Lzoob25seXxudGh8bGFzdHxmaXJzdCktY2hpbGQoPzpcKFxzKihldmVufG9kZHwoPzpbK1wtXT9cZCt8KD86WytcLV0/XGQqKT9uXHMqKD86WytcLV1ccypcZCspPykpXHMqXCkpPy8sUE9TOi86KG50aHxlcXxndHxsdHxmaXJzdHxsYXN0fGV2ZW58b2RkKSg/OlwoKFxkKilcKSk/KD89W15cLV18JCkvLFBTRVVETzovOigoPzpbXHdcdTAwYzAtXHVGRkZGXC1dfFxcLikrKSg/OlwoKFsnIl0/KSgoPzpcKFteXCldK1wpfFteXChcKV0qKSspXDJcKSk/L30sbGVmdE1hdGNoOnt9LGF0dHJNYXA6eyJjbGFzcyI6ImNsYXNzTmFtZSIsImZvciI6Imh0bWxGb3IifSxhdHRySGFuZGxlOntocmVmOmZ1bmN0aW9uKGEpe3JldHVybiBhLmdldEF0dHJpYnV0ZSgiaHJlZiIpfSx0eXBlOmZ1bmN0aW9uKGEpe3JldHVybiBhLmdldEF0dHJpYnV0ZSgidHlwZSIpfX0scmVsYXRpdmU6eyIrIjpmdW5jdGlvbihhLGIpe3ZhciBjPXR5cGVvZiBiPT0ic3RyaW5nIixkPWMmJiFsLnRlc3QoYiksZT1jJiYhZDtkJiYoYj1iLnRvTG93ZXJDYXNlKCkpO2Zvcih2YXIgZj0wLGc9YS5sZW5ndGgsaDtmPGc7ZisrKWlmKGg9YVtmXSl7d2hpbGUoKGg9aC5wcmV2aW91c1NpYmxpbmcpJiZoLm5vZGVUeXBlIT09MSk7YVtmXT1lfHxoJiZoLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT1iP2h8fCExOmg9PT1ifWUmJm0uZmlsdGVyKGIsYSwhMCl9LCI+IjpmdW5jdGlvbihhLGIpe3ZhciBjLGQ9dHlwZW9mIGI9PSJzdHJpbmciLGU9MCxmPWEubGVuZ3RoO2lmKGQmJiFsLnRlc3QoYikpe2I9Yi50b0xvd2VyQ2FzZSgpO2Zvcig7ZTxmO2UrKyl7Yz1hW2VdO2lmKGMpe3ZhciBnPWMucGFyZW50Tm9kZTthW2VdPWcubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PWI/ZzohMX19fWVsc2V7Zm9yKDtlPGY7ZSsrKWM9YVtlXSxjJiYoYVtlXT1kP2MucGFyZW50Tm9kZTpjLnBhcmVudE5vZGU9PT1iKTtkJiZtLmZpbHRlcihiLGEsITApfX0sIiI6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkLGY9ZSsrLGc9eDt0eXBlb2YgYj09InN0cmluZyImJiFsLnRlc3QoYikmJihiPWIudG9Mb3dlckNhc2UoKSxkPWIsZz13KSxnKCJwYXJlbnROb2RlIixiLGYsYSxkLGMpfSwifiI6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkLGY9ZSsrLGc9eDt0eXBlb2YgYj09InN0cmluZyImJiFsLnRlc3QoYikmJihiPWIudG9Mb3dlckNhc2UoKSxkPWIsZz13KSxnKCJwcmV2aW91c1NpYmxpbmciLGIsZixhLGQsYyl9fSxmaW5kOntJRDpmdW5jdGlvbihhLGIsYyl7aWYodHlwZW9mIGIuZ2V0RWxlbWVudEJ5SWQhPSJ1bmRlZmluZWQiJiYhYyl7dmFyIGQ9Yi5nZXRFbGVtZW50QnlJZChhWzFdKTtyZXR1cm4gZCYmZC5wYXJlbnROb2RlP1tkXTpbXX19LE5BTUU6ZnVuY3Rpb24oYSxiKXtpZih0eXBlb2YgYi5nZXRFbGVtZW50c0J5TmFtZSE9InVuZGVmaW5lZCIpe3ZhciBjPVtdLGQ9Yi5nZXRFbGVtZW50c0J5TmFtZShhWzFdKTtmb3IodmFyIGU9MCxmPWQubGVuZ3RoO2U8ZjtlKyspZFtlXS5nZXRBdHRyaWJ1dGUoIm5hbWUiKT09PWFbMV0mJmMucHVzaChkW2VdKTtyZXR1cm4gYy5sZW5ndGg9PT0wP251bGw6Y319LFRBRzpmdW5jdGlvbihhLGIpe2lmKHR5cGVvZiBiLmdldEVsZW1lbnRzQnlUYWdOYW1lIT0idW5kZWZpbmVkIilyZXR1cm4gYi5nZXRFbGVtZW50c0J5VGFnTmFtZShhWzFdKX19LHByZUZpbHRlcjp7Q0xBU1M6ZnVuY3Rpb24oYSxiLGMsZCxlLGYpe2E9IiAiK2FbMV0ucmVwbGFjZShqLCIiKSsiICI7aWYoZilyZXR1cm4gYTtmb3IodmFyIGc9MCxoOyhoPWJbZ10pIT1udWxsO2crKyloJiYoZV4oaC5jbGFzc05hbWUmJigiICIraC5jbGFzc05hbWUrIiAiKS5yZXBsYWNlKC9bXHRcblxyXS9nLCIgIikuaW5kZXhPZihhKT49MCk/Y3x8ZC5wdXNoKGgpOmMmJihiW2ddPSExKSk7cmV0dXJuITF9LElEOmZ1bmN0aW9uKGEpe3JldHVybiBhWzFdLnJlcGxhY2UoaiwiIil9LFRBRzpmdW5jdGlvbihhLGIpe3JldHVybiBhWzFdLnJlcGxhY2UoaiwiIikudG9Mb3dlckNhc2UoKX0sQ0hJTEQ6ZnVuY3Rpb24oYSl7aWYoYVsxXT09PSJudGgiKXthWzJdfHxtLmVycm9yKGFbMF0pLGFbMl09YVsyXS5yZXBsYWNlKC9eXCt8XHMqL2csIiIpO3ZhciBiPS8oLT8pKFxkKikoPzpuKFsrXC1dP1xkKikpPy8uZXhlYyhhWzJdPT09ImV2ZW4iJiYiMm4ifHxhWzJdPT09Im9kZCImJiIybisxInx8IS9cRC8udGVzdChhWzJdKSYmIjBuKyIrYVsyXXx8YVsyXSk7YVsyXT1iWzFdKyhiWzJdfHwxKS0wLGFbM109YlszXS0wfWVsc2UgYVsyXSYmbS5lcnJvcihhWzBdKTthWzBdPWUrKztyZXR1cm4gYX0sQVRUUjpmdW5jdGlvbihhLGIsYyxkLGUsZil7dmFyIGc9YVsxXT1hWzFdLnJlcGxhY2UoaiwiIik7IWYmJm8uYXR0ck1hcFtnXSYmKGFbMV09by5hdHRyTWFwW2ddKSxhWzRdPShhWzRdfHxhWzVdfHwiIikucmVwbGFjZShqLCIiKSxhWzJdPT09In49IiYmKGFbNF09IiAiK2FbNF0rIiAiKTtyZXR1cm4gYX0sUFNFVURPOmZ1bmN0aW9uKGIsYyxkLGUsZil7aWYoYlsxXT09PSJub3QiKWlmKChhLmV4ZWMoYlszXSl8fCIiKS5sZW5ndGg+MXx8L15cdy8udGVzdChiWzNdKSliWzNdPW0oYlszXSxudWxsLG51bGwsYyk7ZWxzZXt2YXIgZz1tLmZpbHRlcihiWzNdLGMsZCwhMF5mKTtkfHxlLnB1c2guYXBwbHkoZSxnKTtyZXR1cm4hMX1lbHNlIGlmKG8ubWF0Y2guUE9TLnRlc3QoYlswXSl8fG8ubWF0Y2guQ0hJTEQudGVzdChiWzBdKSlyZXR1cm4hMDtyZXR1cm4gYn0sUE9TOmZ1bmN0aW9uKGEpe2EudW5zaGlmdCghMCk7cmV0dXJuIGF9fSxmaWx0ZXJzOntlbmFibGVkOmZ1bmN0aW9uKGEpe3JldHVybiBhLmRpc2FibGVkPT09ITEmJmEudHlwZSE9PSJoaWRkZW4ifSxkaXNhYmxlZDpmdW5jdGlvbihhKXtyZXR1cm4gYS5kaXNhYmxlZD09PSEwfSxjaGVja2VkOmZ1bmN0aW9uKGEpe3JldHVybiBhLmNoZWNrZWQ9PT0hMH0sc2VsZWN0ZWQ6ZnVuY3Rpb24oYSl7YS5wYXJlbnROb2RlJiZhLnBhcmVudE5vZGUuc2VsZWN0ZWRJbmRleDtyZXR1cm4gYS5zZWxlY3RlZD09PSEwfSxwYXJlbnQ6ZnVuY3Rpb24oYSl7cmV0dXJuISFhLmZpcnN0Q2hpbGR9LGVtcHR5OmZ1bmN0aW9uKGEpe3JldHVybiFhLmZpcnN0Q2hpbGR9LGhhczpmdW5jdGlvbihhLGIsYyl7cmV0dXJuISFtKGNbM10sYSkubGVuZ3RofSxoZWFkZXI6ZnVuY3Rpb24oYSl7cmV0dXJuL2hcZC9pLnRlc3QoYS5ub2RlTmFtZSl9LHRleHQ6ZnVuY3Rpb24oYSl7dmFyIGI9YS5nZXRBdHRyaWJ1dGUoInR5cGUiKSxjPWEudHlwZTtyZXR1cm4gYS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09ImlucHV0IiYmInRleHQiPT09YyYmKGI9PT1jfHxiPT09bnVsbCl9LHJhZGlvOmZ1bmN0aW9uKGEpe3JldHVybiBhLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT0iaW5wdXQiJiYicmFkaW8iPT09YS50eXBlfSxjaGVja2JveDpmdW5jdGlvbihhKXtyZXR1cm4gYS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09ImlucHV0IiYmImNoZWNrYm94Ij09PWEudHlwZX0sZmlsZTpmdW5jdGlvbihhKXtyZXR1cm4gYS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09ImlucHV0IiYmImZpbGUiPT09YS50eXBlfSxwYXNzd29yZDpmdW5jdGlvbihhKXtyZXR1cm4gYS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09ImlucHV0IiYmInBhc3N3b3JkIj09PWEudHlwZX0sc3VibWl0OmZ1bmN0aW9uKGEpe3ZhciBiPWEubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtyZXR1cm4oYj09PSJpbnB1dCJ8fGI9PT0iYnV0dG9uIikmJiJzdWJtaXQiPT09YS50eXBlfSxpbWFnZTpmdW5jdGlvbihhKXtyZXR1cm4gYS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09ImlucHV0IiYmImltYWdlIj09PWEudHlwZX0scmVzZXQ6ZnVuY3Rpb24oYSl7dmFyIGI9YS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO3JldHVybihiPT09ImlucHV0Inx8Yj09PSJidXR0b24iKSYmInJlc2V0Ij09PWEudHlwZX0sYnV0dG9uOmZ1bmN0aW9uKGEpe3ZhciBiPWEubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtyZXR1cm4gYj09PSJpbnB1dCImJiJidXR0b24iPT09YS50eXBlfHxiPT09ImJ1dHRvbiJ9LGlucHV0OmZ1bmN0aW9uKGEpe3JldHVybi9pbnB1dHxzZWxlY3R8dGV4dGFyZWF8YnV0dG9uL2kudGVzdChhLm5vZGVOYW1lKX0sZm9jdXM6ZnVuY3Rpb24oYSl7cmV0dXJuIGE9PT1hLm93bmVyRG9jdW1lbnQuYWN0aXZlRWxlbWVudH19LHNldEZpbHRlcnM6e2ZpcnN0OmZ1bmN0aW9uKGEsYil7cmV0dXJuIGI9PT0wfSxsYXN0OmZ1bmN0aW9uKGEsYixjLGQpe3JldHVybiBiPT09ZC5sZW5ndGgtMX0sZXZlbjpmdW5jdGlvbihhLGIpe3JldHVybiBiJTI9PT0wfSxvZGQ6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYiUyPT09MX0sbHQ6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBiPGNbM10tMH0sZ3Q6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBiPmNbM10tMH0sbnRoOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gY1szXS0wPT09Yn0sZXE6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBjWzNdLTA9PT1ifX0sZmlsdGVyOntQU0VVRE86ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIGU9YlsxXSxmPW8uZmlsdGVyc1tlXTtpZihmKXJldHVybiBmKGEsYyxiLGQpO2lmKGU9PT0iY29udGFpbnMiKXJldHVybihhLnRleHRDb250ZW50fHxhLmlubmVyVGV4dHx8bihbYV0pfHwiIikuaW5kZXhPZihiWzNdKT49MDtpZihlPT09Im5vdCIpe3ZhciBnPWJbM107Zm9yKHZhciBoPTAsaT1nLmxlbmd0aDtoPGk7aCsrKWlmKGdbaF09PT1hKXJldHVybiExO3JldHVybiEwfW0uZXJyb3IoZSl9LENISUxEOmZ1bmN0aW9uKGEsYil7dmFyIGMsZSxmLGcsaCxpLGosaz1iWzFdLGw9YTtzd2l0Y2goayl7Y2FzZSJvbmx5IjpjYXNlImZpcnN0Ijp3aGlsZShsPWwucHJldmlvdXNTaWJsaW5nKWlmKGwubm9kZVR5cGU9PT0xKXJldHVybiExO2lmKGs9PT0iZmlyc3QiKXJldHVybiEwO2w9YTtjYXNlImxhc3QiOndoaWxlKGw9bC5uZXh0U2libGluZylpZihsLm5vZGVUeXBlPT09MSlyZXR1cm4hMTtyZXR1cm4hMDtjYXNlIm50aCI6Yz1iWzJdLGU9YlszXTtpZihjPT09MSYmZT09PTApcmV0dXJuITA7Zj1iWzBdLGc9YS5wYXJlbnROb2RlO2lmKGcmJihnW2RdIT09Znx8IWEubm9kZUluZGV4KSl7aT0wO2ZvcihsPWcuZmlyc3RDaGlsZDtsO2w9bC5uZXh0U2libGluZylsLm5vZGVUeXBlPT09MSYmKGwubm9kZUluZGV4PSsraSk7Z1tkXT1mfWo9YS5ub2RlSW5kZXgtZTtyZXR1cm4gYz09PTA/aj09PTA6aiVjPT09MCYmai9jPj0wfX0sSUQ6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5ub2RlVHlwZT09PTEmJmEuZ2V0QXR0cmlidXRlKCJpZCIpPT09Yn0sVEFHOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGI9PT0iKiImJmEubm9kZVR5cGU9PT0xfHwhIWEubm9kZU5hbWUmJmEubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PWJ9LENMQVNTOmZ1bmN0aW9uKGEsYil7cmV0dXJuKCIgIisoYS5jbGFzc05hbWV8fGEuZ2V0QXR0cmlidXRlKCJjbGFzcyIpKSsiICIpLmluZGV4T2YoYik+LTF9LEFUVFI6ZnVuY3Rpb24oYSxiKXt2YXIgYz1iWzFdLGQ9bS5hdHRyP20uYXR0cihhLGMpOm8uYXR0ckhhbmRsZVtjXT9vLmF0dHJIYW5kbGVbY10oYSk6YVtjXSE9bnVsbD9hW2NdOmEuZ2V0QXR0cmlidXRlKGMpLGU9ZCsiIixmPWJbMl0sZz1iWzRdO3JldHVybiBkPT1udWxsP2Y9PT0iIT0iOiFmJiZtLmF0dHI/ZCE9bnVsbDpmPT09Ij0iP2U9PT1nOmY9PT0iKj0iP2UuaW5kZXhPZihnKT49MDpmPT09In49Ij8oIiAiK2UrIiAiKS5pbmRleE9mKGcpPj0wOmc/Zj09PSIhPSI/ZSE9PWc6Zj09PSJePSI/ZS5pbmRleE9mKGcpPT09MDpmPT09IiQ9Ij9lLnN1YnN0cihlLmxlbmd0aC1nLmxlbmd0aCk9PT1nOmY9PT0ifD0iP2U9PT1nfHxlLnN1YnN0cigwLGcubGVuZ3RoKzEpPT09ZysiLSI6ITE6ZSYmZCE9PSExfSxQT1M6ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIGU9YlsyXSxmPW8uc2V0RmlsdGVyc1tlXTtpZihmKXJldHVybiBmKGEsYyxiLGQpfX19LHA9by5tYXRjaC5QT1MscT1mdW5jdGlvbihhLGIpe3JldHVybiJcXCIrKGItMCsxKX07Zm9yKHZhciByIGluIG8ubWF0Y2gpby5tYXRjaFtyXT1uZXcgUmVnRXhwKG8ubWF0Y2hbcl0uc291cmNlKy8oPyFbXlxbXSpcXSkoPyFbXlwoXSpcKSkvLnNvdXJjZSksby5sZWZ0TWF0Y2hbcl09bmV3IFJlZ0V4cCgvKF4oPzoufFxyfFxuKSo/KS8uc291cmNlK28ubWF0Y2hbcl0uc291cmNlLnJlcGxhY2UoL1xcKFxkKykvZyxxKSk7dmFyIHM9ZnVuY3Rpb24oYSxiKXthPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGEsMCk7aWYoYil7Yi5wdXNoLmFwcGx5KGIsYSk7cmV0dXJuIGJ9cmV0dXJuIGF9O3RyeXtBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChjLmRvY3VtZW50RWxlbWVudC5jaGlsZE5vZGVzLDApWzBdLm5vZGVUeXBlfWNhdGNoKHQpe3M9ZnVuY3Rpb24oYSxiKXt2YXIgYz0wLGQ9Ynx8W107aWYoZy5jYWxsKGEpPT09IltvYmplY3QgQXJyYXldIilBcnJheS5wcm90b3R5cGUucHVzaC5hcHBseShkLGEpO2Vsc2UgaWYodHlwZW9mIGEubGVuZ3RoPT0ibnVtYmVyIilmb3IodmFyIGU9YS5sZW5ndGg7YzxlO2MrKylkLnB1c2goYVtjXSk7ZWxzZSBmb3IoO2FbY107YysrKWQucHVzaChhW2NdKTtyZXR1cm4gZH19dmFyIHUsdjtjLmRvY3VtZW50RWxlbWVudC5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbj91PWZ1bmN0aW9uKGEsYil7aWYoYT09PWIpe2g9ITA7cmV0dXJuIDB9aWYoIWEuY29tcGFyZURvY3VtZW50UG9zaXRpb258fCFiLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKXJldHVybiBhLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uPy0xOjE7cmV0dXJuIGEuY29tcGFyZURvY3VtZW50UG9zaXRpb24oYikmND8tMToxfToodT1mdW5jdGlvbihhLGIpe2lmKGE9PT1iKXtoPSEwO3JldHVybiAwfWlmKGEuc291cmNlSW5kZXgmJmIuc291cmNlSW5kZXgpcmV0dXJuIGEuc291cmNlSW5kZXgtYi5zb3VyY2VJbmRleDt2YXIgYyxkLGU9W10sZj1bXSxnPWEucGFyZW50Tm9kZSxpPWIucGFyZW50Tm9kZSxqPWc7aWYoZz09PWkpcmV0dXJuIHYoYSxiKTtpZighZylyZXR1cm4tMTtpZighaSlyZXR1cm4gMTt3aGlsZShqKWUudW5zaGlmdChqKSxqPWoucGFyZW50Tm9kZTtqPWk7d2hpbGUoailmLnVuc2hpZnQoaiksaj1qLnBhcmVudE5vZGU7Yz1lLmxlbmd0aCxkPWYubGVuZ3RoO2Zvcih2YXIgaz0wO2s8YyYmazxkO2srKylpZihlW2tdIT09ZltrXSlyZXR1cm4gdihlW2tdLGZba10pO3JldHVybiBrPT09Yz92KGEsZltrXSwtMSk6dihlW2tdLGIsMSl9LHY9ZnVuY3Rpb24oYSxiLGMpe2lmKGE9PT1iKXJldHVybiBjO3ZhciBkPWEubmV4dFNpYmxpbmc7d2hpbGUoZCl7aWYoZD09PWIpcmV0dXJuLTE7ZD1kLm5leHRTaWJsaW5nfXJldHVybiAxfSksZnVuY3Rpb24oKXt2YXIgYT1jLmNyZWF0ZUVsZW1lbnQoImRpdiIpLGQ9InNjcmlwdCIrKG5ldyBEYXRlKS5nZXRUaW1lKCksZT1jLmRvY3VtZW50RWxlbWVudDthLmlubmVySFRNTD0iPGEgbmFtZT0nIitkKyInLz4iLGUuaW5zZXJ0QmVmb3JlKGEsZS5maXJzdENoaWxkKSxjLmdldEVsZW1lbnRCeUlkKGQpJiYoby5maW5kLklEPWZ1bmN0aW9uKGEsYyxkKXtpZih0eXBlb2YgYy5nZXRFbGVtZW50QnlJZCE9InVuZGVmaW5lZCImJiFkKXt2YXIgZT1jLmdldEVsZW1lbnRCeUlkKGFbMV0pO3JldHVybiBlP2UuaWQ9PT1hWzFdfHx0eXBlb2YgZS5nZXRBdHRyaWJ1dGVOb2RlIT0idW5kZWZpbmVkIiYmZS5nZXRBdHRyaWJ1dGVOb2RlKCJpZCIpLm5vZGVWYWx1ZT09PWFbMV0/W2VdOmI6W119fSxvLmZpbHRlci5JRD1mdW5jdGlvbihhLGIpe3ZhciBjPXR5cGVvZiBhLmdldEF0dHJpYnV0ZU5vZGUhPSJ1bmRlZmluZWQiJiZhLmdldEF0dHJpYnV0ZU5vZGUoImlkIik7cmV0dXJuIGEubm9kZVR5cGU9PT0xJiZjJiZjLm5vZGVWYWx1ZT09PWJ9KSxlLnJlbW92ZUNoaWxkKGEpLGU9YT1udWxsfSgpLGZ1bmN0aW9uKCl7dmFyIGE9Yy5jcmVhdGVFbGVtZW50KCJkaXYiKTthLmFwcGVuZENoaWxkKGMuY3JlYXRlQ29tbWVudCgiIikpLGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKS5sZW5ndGg+MCYmKG8uZmluZC5UQUc9ZnVuY3Rpb24oYSxiKXt2YXIgYz1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKGFbMV0pO2lmKGFbMV09PT0iKiIpe3ZhciBkPVtdO2Zvcih2YXIgZT0wO2NbZV07ZSsrKWNbZV0ubm9kZVR5cGU9PT0xJiZkLnB1c2goY1tlXSk7Yz1kfXJldHVybiBjfSksYS5pbm5lckhUTUw9IjxhIGhyZWY9JyMnPjwvYT4iLGEuZmlyc3RDaGlsZCYmdHlwZW9mIGEuZmlyc3RDaGlsZC5nZXRBdHRyaWJ1dGUhPSJ1bmRlZmluZWQiJiZhLmZpcnN0Q2hpbGQuZ2V0QXR0cmlidXRlKCJocmVmIikhPT0iIyImJihvLmF0dHJIYW5kbGUuaHJlZj1mdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRBdHRyaWJ1dGUoImhyZWYiLDIpfSksYT1udWxsfSgpLGMucXVlcnlTZWxlY3RvckFsbCYmZnVuY3Rpb24oKXt2YXIgYT1tLGI9Yy5jcmVhdGVFbGVtZW50KCJkaXYiKSxkPSJfX3NpenpsZV9fIjtiLmlubmVySFRNTD0iPHAgY2xhc3M9J1RFU1QnPjwvcD4iO2lmKCFiLnF1ZXJ5U2VsZWN0b3JBbGx8fGIucXVlcnlTZWxlY3RvckFsbCgiLlRFU1QiKS5sZW5ndGghPT0wKXttPWZ1bmN0aW9uKGIsZSxmLGcpe2U9ZXx8YztpZighZyYmIW0uaXNYTUwoZSkpe3ZhciBoPS9eKFx3KyQpfF5cLihbXHdcLV0rJCl8XiMoW1x3XC1dKyQpLy5leGVjKGIpO2lmKGgmJihlLm5vZGVUeXBlPT09MXx8ZS5ub2RlVHlwZT09PTkpKXtpZihoWzFdKXJldHVybiBzKGUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYiksZik7aWYoaFsyXSYmby5maW5kLkNMQVNTJiZlLmdldEVsZW1lbnRzQnlDbGFzc05hbWUpcmV0dXJuIHMoZS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKGhbMl0pLGYpfWlmKGUubm9kZVR5cGU9PT05KXtpZihiPT09ImJvZHkiJiZlLmJvZHkpcmV0dXJuIHMoW2UuYm9keV0sZik7aWYoaCYmaFszXSl7dmFyIGk9ZS5nZXRFbGVtZW50QnlJZChoWzNdKTtpZighaXx8IWkucGFyZW50Tm9kZSlyZXR1cm4gcyhbXSxmKTtpZihpLmlkPT09aFszXSlyZXR1cm4gcyhbaV0sZil9dHJ5e3JldHVybiBzKGUucXVlcnlTZWxlY3RvckFsbChiKSxmKX1jYXRjaChqKXt9fWVsc2UgaWYoZS5ub2RlVHlwZT09PTEmJmUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSE9PSJvYmplY3QiKXt2YXIgaz1lLGw9ZS5nZXRBdHRyaWJ1dGUoImlkIiksbj1sfHxkLHA9ZS5wYXJlbnROb2RlLHE9L15ccypbK35dLy50ZXN0KGIpO2w/bj1uLnJlcGxhY2UoLycvZywiXFwkJiIpOmUuc2V0QXR0cmlidXRlKCJpZCIsbikscSYmcCYmKGU9ZS5wYXJlbnROb2RlKTt0cnl7aWYoIXF8fHApcmV0dXJuIHMoZS5xdWVyeVNlbGVjdG9yQWxsKCJbaWQ9JyIrbisiJ10gIitiKSxmKX1jYXRjaChyKXt9ZmluYWxseXtsfHxrLnJlbW92ZUF0dHJpYnV0ZSgiaWQiKX19fXJldHVybiBhKGIsZSxmLGcpfTtmb3IodmFyIGUgaW4gYSltW2VdPWFbZV07Yj1udWxsfX0oKSxmdW5jdGlvbigpe3ZhciBhPWMuZG9jdW1lbnRFbGVtZW50LGI9YS5tYXRjaGVzU2VsZWN0b3J8fGEubW96TWF0Y2hlc1NlbGVjdG9yfHxhLndlYmtpdE1hdGNoZXNTZWxlY3Rvcnx8YS5tc01hdGNoZXNTZWxlY3RvcjtpZihiKXt2YXIgZD0hYi5jYWxsKGMuY3JlYXRlRWxlbWVudCgiZGl2IiksImRpdiIpLGU9ITE7dHJ5e2IuY2FsbChjLmRvY3VtZW50RWxlbWVudCwiW3Rlc3QhPScnXTpzaXp6bGUiKX1jYXRjaChmKXtlPSEwfW0ubWF0Y2hlc1NlbGVjdG9yPWZ1bmN0aW9uKGEsYyl7Yz1jLnJlcGxhY2UoL1w9XHMqKFteJyJcXV0qKVxzKlxdL2csIj0nJDEnXSIpO2lmKCFtLmlzWE1MKGEpKXRyeXtpZihlfHwhby5tYXRjaC5QU0VVRE8udGVzdChjKSYmIS8hPS8udGVzdChjKSl7dmFyIGY9Yi5jYWxsKGEsYyk7aWYoZnx8IWR8fGEuZG9jdW1lbnQmJmEuZG9jdW1lbnQubm9kZVR5cGUhPT0xMSlyZXR1cm4gZn19Y2F0Y2goZyl7fXJldHVybiBtKGMsbnVsbCxudWxsLFthXSkubGVuZ3RoPjB9fX0oKSxmdW5jdGlvbigpe3ZhciBhPWMuY3JlYXRlRWxlbWVudCgiZGl2Iik7YS5pbm5lckhUTUw9IjxkaXYgY2xhc3M9J3Rlc3QgZSc+PC9kaXY+PGRpdiBjbGFzcz0ndGVzdCc+PC9kaXY+IjtpZighIWEuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSYmYS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJlIikubGVuZ3RoIT09MCl7YS5sYXN0Q2hpbGQuY2xhc3NOYW1lPSJlIjtpZihhLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoImUiKS5sZW5ndGg9PT0xKXJldHVybjtvLm9yZGVyLnNwbGljZSgxLDAsIkNMQVNTIiksby5maW5kLkNMQVNTPWZ1bmN0aW9uKGEsYixjKXtpZih0eXBlb2YgYi5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lIT0idW5kZWZpbmVkIiYmIWMpcmV0dXJuIGIuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShhWzFdKX0sYT1udWxsfX0oKSxjLmRvY3VtZW50RWxlbWVudC5jb250YWlucz9tLmNvbnRhaW5zPWZ1bmN0aW9uKGEsYil7cmV0dXJuIGEhPT1iJiYoYS5jb250YWlucz9hLmNvbnRhaW5zKGIpOiEwKX06Yy5kb2N1bWVudEVsZW1lbnQuY29tcGFyZURvY3VtZW50UG9zaXRpb24/bS5jb250YWlucz1mdW5jdGlvbihhLGIpe3JldHVybiEhKGEuY29tcGFyZURvY3VtZW50UG9zaXRpb24oYikmMTYpfTptLmNvbnRhaW5zPWZ1bmN0aW9uKCl7cmV0dXJuITF9LG0uaXNYTUw9ZnVuY3Rpb24oYSl7dmFyIGI9KGE/YS5vd25lckRvY3VtZW50fHxhOjApLmRvY3VtZW50RWxlbWVudDtyZXR1cm4gYj9iLm5vZGVOYW1lIT09IkhUTUwiOiExfTt2YXIgeT1mdW5jdGlvbihhLGIsYyl7dmFyIGQsZT1bXSxmPSIiLGc9Yi5ub2RlVHlwZT9bYl06Yjt3aGlsZShkPW8ubWF0Y2guUFNFVURPLmV4ZWMoYSkpZis9ZFswXSxhPWEucmVwbGFjZShvLm1hdGNoLlBTRVVETywiIik7YT1vLnJlbGF0aXZlW2FdP2ErIioiOmE7Zm9yKHZhciBoPTAsaT1nLmxlbmd0aDtoPGk7aCsrKW0oYSxnW2hdLGUsYyk7cmV0dXJuIG0uZmlsdGVyKGYsZSl9O20uYXR0cj1mLmF0dHIsbS5zZWxlY3RvcnMuYXR0ck1hcD17fSxmLmZpbmQ9bSxmLmV4cHI9bS5zZWxlY3RvcnMsZi5leHByWyI6Il09Zi5leHByLmZpbHRlcnMsZi51bmlxdWU9bS51bmlxdWVTb3J0LGYudGV4dD1tLmdldFRleHQsZi5pc1hNTERvYz1tLmlzWE1MLGYuY29udGFpbnM9bS5jb250YWluc30oKTt2YXIgTz0vVW50aWwkLyxQPS9eKD86cGFyZW50c3xwcmV2VW50aWx8cHJldkFsbCkvLFE9LywvLFI9L14uW146I1xbXC4sXSokLyxTPUFycmF5LnByb3RvdHlwZS5zbGljZSxUPWYuZXhwci5tYXRjaC5QT1MsVT17Y2hpbGRyZW46ITAsY29udGVudHM6ITAsbmV4dDohMCxwcmV2OiEwfTtmLmZuLmV4dGVuZCh7ZmluZDpmdW5jdGlvbihhKXt2YXIgYj10aGlzLGMsZDtpZih0eXBlb2YgYSE9InN0cmluZyIpcmV0dXJuIGYoYSkuZmlsdGVyKGZ1bmN0aW9uKCl7Zm9yKGM9MCxkPWIubGVuZ3RoO2M8ZDtjKyspaWYoZi5jb250YWlucyhiW2NdLHRoaXMpKXJldHVybiEwfSk7dmFyIGU9dGhpcy5wdXNoU3RhY2soIiIsImZpbmQiLGEpLGcsaCxpO2ZvcihjPTAsZD10aGlzLmxlbmd0aDtjPGQ7YysrKXtnPWUubGVuZ3RoLGYuZmluZChhLHRoaXNbY10sZSk7aWYoYz4wKWZvcihoPWc7aDxlLmxlbmd0aDtoKyspZm9yKGk9MDtpPGc7aSsrKWlmKGVbaV09PT1lW2hdKXtlLnNwbGljZShoLS0sMSk7YnJlYWt9fXJldHVybiBlfSxoYXM6ZnVuY3Rpb24oYSl7dmFyIGI9ZihhKTtyZXR1cm4gdGhpcy5maWx0ZXIoZnVuY3Rpb24oKXtmb3IodmFyIGE9MCxjPWIubGVuZ3RoO2E8YzthKyspaWYoZi5jb250YWlucyh0aGlzLGJbYV0pKXJldHVybiEwfSl9LG5vdDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2soVyh0aGlzLGEsITEpLCJub3QiLGEpfSxmaWx0ZXI6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMucHVzaFN0YWNrKFcodGhpcyxhLCEwKSwiZmlsdGVyIixhKX0saXM6ZnVuY3Rpb24oYSl7cmV0dXJuISFhJiYodHlwZW9mIGE9PSJzdHJpbmciP1QudGVzdChhKT9mKGEsdGhpcy5jb250ZXh0KS5pbmRleCh0aGlzWzBdKT49MDpmLmZpbHRlcihhLHRoaXMpLmxlbmd0aD4wOnRoaXMuZmlsdGVyKGEpLmxlbmd0aD4wKX0sY2xvc2VzdDpmdW5jdGlvbihhLGIpe3ZhciBjPVtdLGQsZSxnPXRoaXNbMF07aWYoZi5pc0FycmF5KGEpKXt2YXIgaD0xO3doaWxlKGcmJmcub3duZXJEb2N1bWVudCYmZyE9PWIpe2ZvcihkPTA7ZDxhLmxlbmd0aDtkKyspZihnKS5pcyhhW2RdKSYmYy5wdXNoKHtzZWxlY3RvcjphW2RdLGVsZW06ZyxsZXZlbDpofSk7Zz1nLnBhcmVudE5vZGUsaCsrfXJldHVybiBjfXZhciBpPVQudGVzdChhKXx8dHlwZW9mIGEhPSJzdHJpbmciP2YoYSxifHx0aGlzLmNvbnRleHQpOjA7Zm9yKGQ9MCxlPXRoaXMubGVuZ3RoO2Q8ZTtkKyspe2c9dGhpc1tkXTt3aGlsZShnKXtpZihpP2kuaW5kZXgoZyk+LTE6Zi5maW5kLm1hdGNoZXNTZWxlY3RvcihnLGEpKXtjLnB1c2goZyk7YnJlYWt9Zz1nLnBhcmVudE5vZGU7aWYoIWd8fCFnLm93bmVyRG9jdW1lbnR8fGc9PT1ifHxnLm5vZGVUeXBlPT09MTEpYnJlYWt9fWM9Yy5sZW5ndGg+MT9mLnVuaXF1ZShjKTpjO3JldHVybiB0aGlzLnB1c2hTdGFjayhjLCJjbG9zZXN0IixhKX0saW5kZXg6ZnVuY3Rpb24oYSl7aWYoIWEpcmV0dXJuIHRoaXNbMF0mJnRoaXNbMF0ucGFyZW50Tm9kZT90aGlzLnByZXZBbGwoKS5sZW5ndGg6LTE7aWYodHlwZW9mIGE9PSJzdHJpbmciKXJldHVybiBmLmluQXJyYXkodGhpc1swXSxmKGEpKTtyZXR1cm4gZi5pbkFycmF5KGEuanF1ZXJ5P2FbMF06YSx0aGlzKX0sYWRkOmZ1bmN0aW9uKGEsYil7dmFyIGM9dHlwZW9mIGE9PSJzdHJpbmciP2YoYSxiKTpmLm1ha2VBcnJheShhJiZhLm5vZGVUeXBlP1thXTphKSxkPWYubWVyZ2UodGhpcy5nZXQoKSxjKTtyZXR1cm4gdGhpcy5wdXNoU3RhY2soVihjWzBdKXx8VihkWzBdKT9kOmYudW5pcXVlKGQpKX0sYW5kU2VsZjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmFkZCh0aGlzLnByZXZPYmplY3QpfX0pLGYuZWFjaCh7cGFyZW50OmZ1bmN0aW9uKGEpe3ZhciBiPWEucGFyZW50Tm9kZTtyZXR1cm4gYiYmYi5ub2RlVHlwZSE9PTExP2I6bnVsbH0scGFyZW50czpmdW5jdGlvbihhKXtyZXR1cm4gZi5kaXIoYSwicGFyZW50Tm9kZSIpfSxwYXJlbnRzVW50aWw6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBmLmRpcihhLCJwYXJlbnROb2RlIixjKX0sbmV4dDpmdW5jdGlvbihhKXtyZXR1cm4gZi5udGgoYSwyLCJuZXh0U2libGluZyIpfSxwcmV2OmZ1bmN0aW9uKGEpe3JldHVybiBmLm50aChhLDIsInByZXZpb3VzU2libGluZyIpfSxuZXh0QWxsOmZ1bmN0aW9uKGEpe3JldHVybiBmLmRpcihhLCJuZXh0U2libGluZyIpfSxwcmV2QWxsOmZ1bmN0aW9uKGEpe3JldHVybiBmLmRpcihhLCJwcmV2aW91c1NpYmxpbmciKX0sbmV4dFVudGlsOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gZi5kaXIoYSwibmV4dFNpYmxpbmciLGMpfSxwcmV2VW50aWw6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBmLmRpcihhLCJwcmV2aW91c1NpYmxpbmciLGMpfSxzaWJsaW5nczpmdW5jdGlvbihhKXtyZXR1cm4gZi5zaWJsaW5nKGEucGFyZW50Tm9kZS5maXJzdENoaWxkLGEpfSxjaGlsZHJlbjpmdW5jdGlvbihhKXtyZXR1cm4gZi5zaWJsaW5nKGEuZmlyc3RDaGlsZCl9LGNvbnRlbnRzOmZ1bmN0aW9uKGEpe3JldHVybiBmLm5vZGVOYW1lKGEsImlmcmFtZSIpP2EuY29udGVudERvY3VtZW50fHxhLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQ6Zi5tYWtlQXJyYXkoYS5jaGlsZE5vZGVzKX19LGZ1bmN0aW9uKGEsYil7Zi5mblthXT1mdW5jdGlvbihjLGQpe3ZhciBlPWYubWFwKHRoaXMsYixjKSxnPVMuY2FsbChhcmd1bWVudHMpO08udGVzdChhKXx8KGQ9YyksZCYmdHlwZW9mIGQ9PSJzdHJpbmciJiYoZT1mLmZpbHRlcihkLGUpKSxlPXRoaXMubGVuZ3RoPjEmJiFVW2FdP2YudW5pcXVlKGUpOmUsKHRoaXMubGVuZ3RoPjF8fFEudGVzdChkKSkmJlAudGVzdChhKSYmKGU9ZS5yZXZlcnNlKCkpO3JldHVybiB0aGlzLnB1c2hTdGFjayhlLGEsZy5qb2luKCIsIikpfX0pLGYuZXh0ZW5kKHtmaWx0ZXI6ZnVuY3Rpb24oYSxiLGMpe2MmJihhPSI6bm90KCIrYSsiKSIpO3JldHVybiBiLmxlbmd0aD09PTE/Zi5maW5kLm1hdGNoZXNTZWxlY3RvcihiWzBdLGEpP1tiWzBdXTpbXTpmLmZpbmQubWF0Y2hlcyhhLGIpfSxkaXI6ZnVuY3Rpb24oYSxjLGQpe3ZhciBlPVtdLGc9YVtjXTt3aGlsZShnJiZnLm5vZGVUeXBlIT09OSYmKGQ9PT1ifHxnLm5vZGVUeXBlIT09MXx8IWYoZykuaXMoZCkpKWcubm9kZVR5cGU9PT0xJiZlLnB1c2goZyksZz1nW2NdO3JldHVybiBlfSxudGg6ZnVuY3Rpb24oYSxiLGMsZCl7Yj1ifHwxO3ZhciBlPTA7Zm9yKDthO2E9YVtjXSlpZihhLm5vZGVUeXBlPT09MSYmKytlPT09YilicmVhaztyZXR1cm4gYX0sc2libGluZzpmdW5jdGlvbihhLGIpe3ZhciBjPVtdO2Zvcig7YTthPWEubmV4dFNpYmxpbmcpYS5ub2RlVHlwZT09PTEmJmEhPT1iJiZjLnB1c2goYSk7cmV0dXJuIGN9fSk7dmFyIFk9ImFiYnIgYXJ0aWNsZSBhc2lkZSBhdWRpbyBjYW52YXMgZGF0YWxpc3QgZGV0YWlscyBmaWdjYXB0aW9uIGZpZ3VyZSBmb290ZXIgaGVhZGVyIGhncm91cCBtYXJrIG1ldGVyIG5hdiBvdXRwdXQgcHJvZ3Jlc3Mgc2VjdGlvbiBzdW1tYXJ5IHRpbWUgdmlkZW8iLFo9LyBqUXVlcnlcZCs9Iig/OlxkK3xudWxsKSIvZywkPS9eXHMrLyxfPS88KD8hYXJlYXxicnxjb2x8ZW1iZWR8aHJ8aW1nfGlucHV0fGxpbmt8bWV0YXxwYXJhbSkoKFtcdzpdKylbXj5dKilcLz4vaWcsYmE9LzwoW1x3Ol0rKS8sYmI9Lzx0Ym9keS9pLGJjPS88fCYjP1x3KzsvLGJkPS88KD86c2NyaXB0fHN0eWxlKS9pLGJlPS88KD86c2NyaXB0fG9iamVjdHxlbWJlZHxvcHRpb258c3R5bGUpL2ksYmY9bmV3IFJlZ0V4cCgiPCg/OiIrWS5yZXBsYWNlKCIgIiwifCIpKyIpIiwiaSIpLGJnPS9jaGVja2VkXHMqKD86W149XXw9XHMqLmNoZWNrZWQuKS9pLGJoPS9cLyhqYXZhfGVjbWEpc2NyaXB0L2ksYmk9L15ccyo8ISg/OlxbQ0RBVEFcW3xcLVwtKS8sYmo9e29wdGlvbjpbMSwiPHNlbGVjdCBtdWx0aXBsZT0nbXVsdGlwbGUnPiIsIjwvc2VsZWN0PiJdLGxlZ2VuZDpbMSwiPGZpZWxkc2V0PiIsIjwvZmllbGRzZXQ+Il0sdGhlYWQ6WzEsIjx0YWJsZT4iLCI8L3RhYmxlPiJdLHRyOlsyLCI8dGFibGU+PHRib2R5PiIsIjwvdGJvZHk+PC90YWJsZT4iXSx0ZDpbMywiPHRhYmxlPjx0Ym9keT48dHI+IiwiPC90cj48L3Rib2R5PjwvdGFibGU+Il0sY29sOlsyLCI8dGFibGU+PHRib2R5PjwvdGJvZHk+PGNvbGdyb3VwPiIsIjwvY29sZ3JvdXA+PC90YWJsZT4iXSxhcmVhOlsxLCI8bWFwPiIsIjwvbWFwPiJdLF9kZWZhdWx0OlswLCIiLCIiXX0sYms9WChjKTtiai5vcHRncm91cD1iai5vcHRpb24sYmoudGJvZHk9YmoudGZvb3Q9YmouY29sZ3JvdXA9YmouY2FwdGlvbj1iai50aGVhZCxiai50aD1iai50ZCxmLnN1cHBvcnQuaHRtbFNlcmlhbGl6ZXx8KGJqLl9kZWZhdWx0PVsxLCJkaXY8ZGl2PiIsIjwvZGl2PiJdKSxmLmZuLmV4dGVuZCh7dGV4dDpmdW5jdGlvbihhKXtpZihmLmlzRnVuY3Rpb24oYSkpcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihiKXt2YXIgYz1mKHRoaXMpO2MudGV4dChhLmNhbGwodGhpcyxiLGMudGV4dCgpKSl9KTtpZih0eXBlb2YgYSE9Im9iamVjdCImJmEhPT1iKXJldHVybiB0aGlzLmVtcHR5KCkuYXBwZW5kKCh0aGlzWzBdJiZ0aGlzWzBdLm93bmVyRG9jdW1lbnR8fGMpLmNyZWF0ZVRleHROb2RlKGEpKTtyZXR1cm4gZi50ZXh0KHRoaXMpfSx3cmFwQWxsOmZ1bmN0aW9uKGEpe2lmKGYuaXNGdW5jdGlvbihhKSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKGIpe2YodGhpcykud3JhcEFsbChhLmNhbGwodGhpcyxiKSl9KTtpZih0aGlzWzBdKXt2YXIgYj1mKGEsdGhpc1swXS5vd25lckRvY3VtZW50KS5lcSgwKS5jbG9uZSghMCk7dGhpc1swXS5wYXJlbnROb2RlJiZiLmluc2VydEJlZm9yZSh0aGlzWzBdKSxiLm1hcChmdW5jdGlvbigpe3ZhciBhPXRoaXM7d2hpbGUoYS5maXJzdENoaWxkJiZhLmZpcnN0Q2hpbGQubm9kZVR5cGU9PT0xKWE9YS5maXJzdENoaWxkO3JldHVybiBhfSkuYXBwZW5kKHRoaXMpfXJldHVybiB0aGlzfSx3cmFwSW5uZXI6ZnVuY3Rpb24oYSl7aWYoZi5pc0Z1bmN0aW9uKGEpKXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oYil7Zih0aGlzKS53cmFwSW5uZXIoYS5jYWxsKHRoaXMsYikpfSk7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciBiPWYodGhpcyksYz1iLmNvbnRlbnRzKCk7Yy5sZW5ndGg/Yy53cmFwQWxsKGEpOmIuYXBwZW5kKGEpfSl9LHdyYXA6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe2YodGhpcykud3JhcEFsbChhKX0pfSx1bndyYXA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wYXJlbnQoKS5lYWNoKGZ1bmN0aW9uKCl7Zi5ub2RlTmFtZSh0aGlzLCJib2R5Iil8fGYodGhpcykucmVwbGFjZVdpdGgodGhpcy5jaGlsZE5vZGVzKX0pLmVuZCgpfSxhcHBlbmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kb21NYW5pcChhcmd1bWVudHMsITAsZnVuY3Rpb24oYSl7dGhpcy5ub2RlVHlwZT09PTEmJnRoaXMuYXBwZW5kQ2hpbGQoYSl9KX0scHJlcGVuZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmRvbU1hbmlwKGFyZ3VtZW50cywhMCxmdW5jdGlvbihhKXt0aGlzLm5vZGVUeXBlPT09MSYmdGhpcy5pbnNlcnRCZWZvcmUoYSx0aGlzLmZpcnN0Q2hpbGQpfSl9LGJlZm9yZTpmdW5jdGlvbigpe2lmKHRoaXNbMF0mJnRoaXNbMF0ucGFyZW50Tm9kZSlyZXR1cm4gdGhpcy5kb21NYW5pcChhcmd1bWVudHMsITEsZnVuY3Rpb24oYSl7dGhpcy5wYXJlbnROb2RlLmluc2VydEJlZm9yZShhLHRoaXMpfSk7aWYoYXJndW1lbnRzLmxlbmd0aCl7dmFyIGE9Zihhcmd1bWVudHNbMF0pO2EucHVzaC5hcHBseShhLHRoaXMudG9BcnJheSgpKTtyZXR1cm4gdGhpcy5wdXNoU3RhY2soYSwiYmVmb3JlIixhcmd1bWVudHMpfX0sYWZ0ZXI6ZnVuY3Rpb24oKXtpZih0aGlzWzBdJiZ0aGlzWzBdLnBhcmVudE5vZGUpcmV0dXJuIHRoaXMuZG9tTWFuaXAoYXJndW1lbnRzLCExLGZ1bmN0aW9uKGEpe3RoaXMucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoYSx0aGlzLm5leHRTaWJsaW5nKX0pO2lmKGFyZ3VtZW50cy5sZW5ndGgpe3ZhciBhPXRoaXMucHVzaFN0YWNrKHRoaXMsImFmdGVyIgosYXJndW1lbnRzKTthLnB1c2guYXBwbHkoYSxmKGFyZ3VtZW50c1swXSkudG9BcnJheSgpKTtyZXR1cm4gYX19LHJlbW92ZTpmdW5jdGlvbihhLGIpe2Zvcih2YXIgYz0wLGQ7KGQ9dGhpc1tjXSkhPW51bGw7YysrKWlmKCFhfHxmLmZpbHRlcihhLFtkXSkubGVuZ3RoKSFiJiZkLm5vZGVUeXBlPT09MSYmKGYuY2xlYW5EYXRhKGQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKSksZi5jbGVhbkRhdGEoW2RdKSksZC5wYXJlbnROb2RlJiZkLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZCk7cmV0dXJuIHRoaXN9LGVtcHR5OmZ1bmN0aW9uKCl7Zm9yKHZhciBhPTAsYjsoYj10aGlzW2FdKSE9bnVsbDthKyspe2Iubm9kZVR5cGU9PT0xJiZmLmNsZWFuRGF0YShiLmdldEVsZW1lbnRzQnlUYWdOYW1lKCIqIikpO3doaWxlKGIuZmlyc3RDaGlsZCliLnJlbW92ZUNoaWxkKGIuZmlyc3RDaGlsZCl9cmV0dXJuIHRoaXN9LGNsb25lOmZ1bmN0aW9uKGEsYil7YT1hPT1udWxsPyExOmEsYj1iPT1udWxsP2E6YjtyZXR1cm4gdGhpcy5tYXAoZnVuY3Rpb24oKXtyZXR1cm4gZi5jbG9uZSh0aGlzLGEsYil9KX0saHRtbDpmdW5jdGlvbihhKXtpZihhPT09YilyZXR1cm4gdGhpc1swXSYmdGhpc1swXS5ub2RlVHlwZT09PTE/dGhpc1swXS5pbm5lckhUTUwucmVwbGFjZShaLCIiKTpudWxsO2lmKHR5cGVvZiBhPT0ic3RyaW5nIiYmIWJkLnRlc3QoYSkmJihmLnN1cHBvcnQubGVhZGluZ1doaXRlc3BhY2V8fCEkLnRlc3QoYSkpJiYhYmpbKGJhLmV4ZWMoYSl8fFsiIiwiIl0pWzFdLnRvTG93ZXJDYXNlKCldKXthPWEucmVwbGFjZShfLCI8JDE+PC8kMj4iKTt0cnl7Zm9yKHZhciBjPTAsZD10aGlzLmxlbmd0aDtjPGQ7YysrKXRoaXNbY10ubm9kZVR5cGU9PT0xJiYoZi5jbGVhbkRhdGEodGhpc1tjXS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpKSx0aGlzW2NdLmlubmVySFRNTD1hKX1jYXRjaChlKXt0aGlzLmVtcHR5KCkuYXBwZW5kKGEpfX1lbHNlIGYuaXNGdW5jdGlvbihhKT90aGlzLmVhY2goZnVuY3Rpb24oYil7dmFyIGM9Zih0aGlzKTtjLmh0bWwoYS5jYWxsKHRoaXMsYixjLmh0bWwoKSkpfSk6dGhpcy5lbXB0eSgpLmFwcGVuZChhKTtyZXR1cm4gdGhpc30scmVwbGFjZVdpdGg6ZnVuY3Rpb24oYSl7aWYodGhpc1swXSYmdGhpc1swXS5wYXJlbnROb2RlKXtpZihmLmlzRnVuY3Rpb24oYSkpcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihiKXt2YXIgYz1mKHRoaXMpLGQ9Yy5odG1sKCk7Yy5yZXBsYWNlV2l0aChhLmNhbGwodGhpcyxiLGQpKX0pO3R5cGVvZiBhIT0ic3RyaW5nIiYmKGE9ZihhKS5kZXRhY2goKSk7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciBiPXRoaXMubmV4dFNpYmxpbmcsYz10aGlzLnBhcmVudE5vZGU7Zih0aGlzKS5yZW1vdmUoKSxiP2YoYikuYmVmb3JlKGEpOmYoYykuYXBwZW5kKGEpfSl9cmV0dXJuIHRoaXMubGVuZ3RoP3RoaXMucHVzaFN0YWNrKGYoZi5pc0Z1bmN0aW9uKGEpP2EoKTphKSwicmVwbGFjZVdpdGgiLGEpOnRoaXN9LGRldGFjaDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5yZW1vdmUoYSwhMCl9LGRvbU1hbmlwOmZ1bmN0aW9uKGEsYyxkKXt2YXIgZSxnLGgsaSxqPWFbMF0saz1bXTtpZighZi5zdXBwb3J0LmNoZWNrQ2xvbmUmJmFyZ3VtZW50cy5sZW5ndGg9PT0zJiZ0eXBlb2Ygaj09InN0cmluZyImJmJnLnRlc3QoaikpcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe2YodGhpcykuZG9tTWFuaXAoYSxjLGQsITApfSk7aWYoZi5pc0Z1bmN0aW9uKGopKXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oZSl7dmFyIGc9Zih0aGlzKTthWzBdPWouY2FsbCh0aGlzLGUsYz9nLmh0bWwoKTpiKSxnLmRvbU1hbmlwKGEsYyxkKX0pO2lmKHRoaXNbMF0pe2k9aiYmai5wYXJlbnROb2RlLGYuc3VwcG9ydC5wYXJlbnROb2RlJiZpJiZpLm5vZGVUeXBlPT09MTEmJmkuY2hpbGROb2Rlcy5sZW5ndGg9PT10aGlzLmxlbmd0aD9lPXtmcmFnbWVudDppfTplPWYuYnVpbGRGcmFnbWVudChhLHRoaXMsayksaD1lLmZyYWdtZW50LGguY2hpbGROb2Rlcy5sZW5ndGg9PT0xP2c9aD1oLmZpcnN0Q2hpbGQ6Zz1oLmZpcnN0Q2hpbGQ7aWYoZyl7Yz1jJiZmLm5vZGVOYW1lKGcsInRyIik7Zm9yKHZhciBsPTAsbT10aGlzLmxlbmd0aCxuPW0tMTtsPG07bCsrKWQuY2FsbChjP2JsKHRoaXNbbF0sZyk6dGhpc1tsXSxlLmNhY2hlYWJsZXx8bT4xJiZsPG4/Zi5jbG9uZShoLCEwLCEwKTpoKX1rLmxlbmd0aCYmZi5lYWNoKGssYnIpfXJldHVybiB0aGlzfX0pLGYuYnVpbGRGcmFnbWVudD1mdW5jdGlvbihhLGIsZCl7dmFyIGUsZyxoLGksaj1hWzBdO2ImJmJbMF0mJihpPWJbMF0ub3duZXJEb2N1bWVudHx8YlswXSksaS5jcmVhdGVEb2N1bWVudEZyYWdtZW50fHwoaT1jKSxhLmxlbmd0aD09PTEmJnR5cGVvZiBqPT0ic3RyaW5nIiYmai5sZW5ndGg8NTEyJiZpPT09YyYmai5jaGFyQXQoMCk9PT0iPCImJiFiZS50ZXN0KGopJiYoZi5zdXBwb3J0LmNoZWNrQ2xvbmV8fCFiZy50ZXN0KGopKSYmIWYuc3VwcG9ydC51bmtub3duRWxlbXMmJmJmLnRlc3QoaikmJihnPSEwLGg9Zi5mcmFnbWVudHNbal0saCYmaCE9PTEmJihlPWgpKSxlfHwoZT1pLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKSxmLmNsZWFuKGEsaSxlLGQpKSxnJiYoZi5mcmFnbWVudHNbal09aD9lOjEpO3JldHVybntmcmFnbWVudDplLGNhY2hlYWJsZTpnfX0sZi5mcmFnbWVudHM9e30sZi5lYWNoKHthcHBlbmRUbzoiYXBwZW5kIixwcmVwZW5kVG86InByZXBlbmQiLGluc2VydEJlZm9yZToiYmVmb3JlIixpbnNlcnRBZnRlcjoiYWZ0ZXIiLHJlcGxhY2VBbGw6InJlcGxhY2VXaXRoIn0sZnVuY3Rpb24oYSxiKXtmLmZuW2FdPWZ1bmN0aW9uKGMpe3ZhciBkPVtdLGU9ZihjKSxnPXRoaXMubGVuZ3RoPT09MSYmdGhpc1swXS5wYXJlbnROb2RlO2lmKGcmJmcubm9kZVR5cGU9PT0xMSYmZy5jaGlsZE5vZGVzLmxlbmd0aD09PTEmJmUubGVuZ3RoPT09MSl7ZVtiXSh0aGlzWzBdKTtyZXR1cm4gdGhpc31mb3IodmFyIGg9MCxpPWUubGVuZ3RoO2g8aTtoKyspe3ZhciBqPShoPjA/dGhpcy5jbG9uZSghMCk6dGhpcykuZ2V0KCk7ZihlW2hdKVtiXShqKSxkPWQuY29uY2F0KGopfXJldHVybiB0aGlzLnB1c2hTdGFjayhkLGEsZS5zZWxlY3Rvcil9fSksZi5leHRlbmQoe2Nsb25lOmZ1bmN0aW9uKGEsYixjKXt2YXIgZD1hLmNsb25lTm9kZSghMCksZSxnLGg7aWYoKCFmLnN1cHBvcnQubm9DbG9uZUV2ZW50fHwhZi5zdXBwb3J0Lm5vQ2xvbmVDaGVja2VkKSYmKGEubm9kZVR5cGU9PT0xfHxhLm5vZGVUeXBlPT09MTEpJiYhZi5pc1hNTERvYyhhKSl7Ym4oYSxkKSxlPWJvKGEpLGc9Ym8oZCk7Zm9yKGg9MDtlW2hdOysraClnW2hdJiZibihlW2hdLGdbaF0pfWlmKGIpe2JtKGEsZCk7aWYoYyl7ZT1ibyhhKSxnPWJvKGQpO2ZvcihoPTA7ZVtoXTsrK2gpYm0oZVtoXSxnW2hdKX19ZT1nPW51bGw7cmV0dXJuIGR9LGNsZWFuOmZ1bmN0aW9uKGEsYixkLGUpe3ZhciBnO2I9Ynx8Yyx0eXBlb2YgYi5jcmVhdGVFbGVtZW50PT0idW5kZWZpbmVkIiYmKGI9Yi5vd25lckRvY3VtZW50fHxiWzBdJiZiWzBdLm93bmVyRG9jdW1lbnR8fGMpO3ZhciBoPVtdLGk7Zm9yKHZhciBqPTAsazsoaz1hW2pdKSE9bnVsbDtqKyspe3R5cGVvZiBrPT0ibnVtYmVyIiYmKGsrPSIiKTtpZighayljb250aW51ZTtpZih0eXBlb2Ygaz09InN0cmluZyIpaWYoIWJjLnRlc3Qoaykpaz1iLmNyZWF0ZVRleHROb2RlKGspO2Vsc2V7az1rLnJlcGxhY2UoXywiPCQxPjwvJDI+Iik7dmFyIGw9KGJhLmV4ZWMoayl8fFsiIiwiIl0pWzFdLnRvTG93ZXJDYXNlKCksbT1ialtsXXx8YmouX2RlZmF1bHQsbj1tWzBdLG89Yi5jcmVhdGVFbGVtZW50KCJkaXYiKTtiPT09Yz9iay5hcHBlbmRDaGlsZChvKTpYKGIpLmFwcGVuZENoaWxkKG8pLG8uaW5uZXJIVE1MPW1bMV0rayttWzJdO3doaWxlKG4tLSlvPW8ubGFzdENoaWxkO2lmKCFmLnN1cHBvcnQudGJvZHkpe3ZhciBwPWJiLnRlc3QoaykscT1sPT09InRhYmxlIiYmIXA/by5maXJzdENoaWxkJiZvLmZpcnN0Q2hpbGQuY2hpbGROb2RlczptWzFdPT09Ijx0YWJsZT4iJiYhcD9vLmNoaWxkTm9kZXM6W107Zm9yKGk9cS5sZW5ndGgtMTtpPj0wOy0taSlmLm5vZGVOYW1lKHFbaV0sInRib2R5IikmJiFxW2ldLmNoaWxkTm9kZXMubGVuZ3RoJiZxW2ldLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQocVtpXSl9IWYuc3VwcG9ydC5sZWFkaW5nV2hpdGVzcGFjZSYmJC50ZXN0KGspJiZvLmluc2VydEJlZm9yZShiLmNyZWF0ZVRleHROb2RlKCQuZXhlYyhrKVswXSksby5maXJzdENoaWxkKSxrPW8uY2hpbGROb2Rlc312YXIgcjtpZighZi5zdXBwb3J0LmFwcGVuZENoZWNrZWQpaWYoa1swXSYmdHlwZW9mIChyPWsubGVuZ3RoKT09Im51bWJlciIpZm9yKGk9MDtpPHI7aSsrKWJxKGtbaV0pO2Vsc2UgYnEoayk7ay5ub2RlVHlwZT9oLnB1c2goayk6aD1mLm1lcmdlKGgsayl9aWYoZCl7Zz1mdW5jdGlvbihhKXtyZXR1cm4hYS50eXBlfHxiaC50ZXN0KGEudHlwZSl9O2ZvcihqPTA7aFtqXTtqKyspaWYoZSYmZi5ub2RlTmFtZShoW2pdLCJzY3JpcHQiKSYmKCFoW2pdLnR5cGV8fGhbal0udHlwZS50b0xvd2VyQ2FzZSgpPT09InRleHQvamF2YXNjcmlwdCIpKWUucHVzaChoW2pdLnBhcmVudE5vZGU/aFtqXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGhbal0pOmhbal0pO2Vsc2V7aWYoaFtqXS5ub2RlVHlwZT09PTEpe3ZhciBzPWYuZ3JlcChoW2pdLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzY3JpcHQiKSxnKTtoLnNwbGljZS5hcHBseShoLFtqKzEsMF0uY29uY2F0KHMpKX1kLmFwcGVuZENoaWxkKGhbal0pfX1yZXR1cm4gaH0sY2xlYW5EYXRhOmZ1bmN0aW9uKGEpe3ZhciBiLGMsZD1mLmNhY2hlLGU9Zi5ldmVudC5zcGVjaWFsLGc9Zi5zdXBwb3J0LmRlbGV0ZUV4cGFuZG87Zm9yKHZhciBoPTAsaTsoaT1hW2hdKSE9bnVsbDtoKyspe2lmKGkubm9kZU5hbWUmJmYubm9EYXRhW2kubm9kZU5hbWUudG9Mb3dlckNhc2UoKV0pY29udGludWU7Yz1pW2YuZXhwYW5kb107aWYoYyl7Yj1kW2NdO2lmKGImJmIuZXZlbnRzKXtmb3IodmFyIGogaW4gYi5ldmVudHMpZVtqXT9mLmV2ZW50LnJlbW92ZShpLGopOmYucmVtb3ZlRXZlbnQoaSxqLGIuaGFuZGxlKTtiLmhhbmRsZSYmKGIuaGFuZGxlLmVsZW09bnVsbCl9Zz9kZWxldGUgaVtmLmV4cGFuZG9dOmkucmVtb3ZlQXR0cmlidXRlJiZpLnJlbW92ZUF0dHJpYnV0ZShmLmV4cGFuZG8pLGRlbGV0ZSBkW2NdfX19fSk7dmFyIGJzPS9hbHBoYVwoW14pXSpcKS9pLGJ0PS9vcGFjaXR5PShbXildKikvLGJ1PS8oW0EtWl18Xm1zKS9nLGJ2PS9eLT9cZCsoPzpweCk/JC9pLGJ3PS9eLT9cZC8sYng9L14oW1wtK10pPShbXC0rLlxkZV0rKS8sYnk9e3Bvc2l0aW9uOiJhYnNvbHV0ZSIsdmlzaWJpbGl0eToiaGlkZGVuIixkaXNwbGF5OiJibG9jayJ9LGJ6PVsiTGVmdCIsIlJpZ2h0Il0sYkE9WyJUb3AiLCJCb3R0b20iXSxiQixiQyxiRDtmLmZuLmNzcz1mdW5jdGlvbihhLGMpe2lmKGFyZ3VtZW50cy5sZW5ndGg9PT0yJiZjPT09YilyZXR1cm4gdGhpcztyZXR1cm4gZi5hY2Nlc3ModGhpcyxhLGMsITAsZnVuY3Rpb24oYSxjLGQpe3JldHVybiBkIT09Yj9mLnN0eWxlKGEsYyxkKTpmLmNzcyhhLGMpfSl9LGYuZXh0ZW5kKHtjc3NIb29rczp7b3BhY2l0eTp7Z2V0OmZ1bmN0aW9uKGEsYil7aWYoYil7dmFyIGM9YkIoYSwib3BhY2l0eSIsIm9wYWNpdHkiKTtyZXR1cm4gYz09PSIiPyIxIjpjfXJldHVybiBhLnN0eWxlLm9wYWNpdHl9fX0sY3NzTnVtYmVyOntmaWxsT3BhY2l0eTohMCxmb250V2VpZ2h0OiEwLGxpbmVIZWlnaHQ6ITAsb3BhY2l0eTohMCxvcnBoYW5zOiEwLHdpZG93czohMCx6SW5kZXg6ITAsem9vbTohMH0sY3NzUHJvcHM6eyJmbG9hdCI6Zi5zdXBwb3J0LmNzc0Zsb2F0PyJjc3NGbG9hdCI6InN0eWxlRmxvYXQifSxzdHlsZTpmdW5jdGlvbihhLGMsZCxlKXtpZighIWEmJmEubm9kZVR5cGUhPT0zJiZhLm5vZGVUeXBlIT09OCYmISFhLnN0eWxlKXt2YXIgZyxoLGk9Zi5jYW1lbENhc2UoYyksaj1hLnN0eWxlLGs9Zi5jc3NIb29rc1tpXTtjPWYuY3NzUHJvcHNbaV18fGk7aWYoZD09PWIpe2lmKGsmJiJnZXQiaW4gayYmKGc9ay5nZXQoYSwhMSxlKSkhPT1iKXJldHVybiBnO3JldHVybiBqW2NdfWg9dHlwZW9mIGQsaD09PSJzdHJpbmciJiYoZz1ieC5leGVjKGQpKSYmKGQ9KyhnWzFdKzEpKitnWzJdK3BhcnNlRmxvYXQoZi5jc3MoYSxjKSksaD0ibnVtYmVyIik7aWYoZD09bnVsbHx8aD09PSJudW1iZXIiJiZpc05hTihkKSlyZXR1cm47aD09PSJudW1iZXIiJiYhZi5jc3NOdW1iZXJbaV0mJihkKz0icHgiKTtpZigha3x8ISgic2V0ImluIGspfHwoZD1rLnNldChhLGQpKSE9PWIpdHJ5e2pbY109ZH1jYXRjaChsKXt9fX0sY3NzOmZ1bmN0aW9uKGEsYyxkKXt2YXIgZSxnO2M9Zi5jYW1lbENhc2UoYyksZz1mLmNzc0hvb2tzW2NdLGM9Zi5jc3NQcm9wc1tjXXx8YyxjPT09ImNzc0Zsb2F0IiYmKGM9ImZsb2F0Iik7aWYoZyYmImdldCJpbiBnJiYoZT1nLmdldChhLCEwLGQpKSE9PWIpcmV0dXJuIGU7aWYoYkIpcmV0dXJuIGJCKGEsYyl9LHN3YXA6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPXt9O2Zvcih2YXIgZSBpbiBiKWRbZV09YS5zdHlsZVtlXSxhLnN0eWxlW2VdPWJbZV07Yy5jYWxsKGEpO2ZvcihlIGluIGIpYS5zdHlsZVtlXT1kW2VdfX0pLGYuY3VyQ1NTPWYuY3NzLGYuZWFjaChbImhlaWdodCIsIndpZHRoIl0sZnVuY3Rpb24oYSxiKXtmLmNzc0hvb2tzW2JdPXtnZXQ6ZnVuY3Rpb24oYSxjLGQpe3ZhciBlO2lmKGMpe2lmKGEub2Zmc2V0V2lkdGghPT0wKXJldHVybiBiRShhLGIsZCk7Zi5zd2FwKGEsYnksZnVuY3Rpb24oKXtlPWJFKGEsYixkKX0pO3JldHVybiBlfX0sc2V0OmZ1bmN0aW9uKGEsYil7aWYoIWJ2LnRlc3QoYikpcmV0dXJuIGI7Yj1wYXJzZUZsb2F0KGIpO2lmKGI+PTApcmV0dXJuIGIrInB4In19fSksZi5zdXBwb3J0Lm9wYWNpdHl8fChmLmNzc0hvb2tzLm9wYWNpdHk9e2dldDpmdW5jdGlvbihhLGIpe3JldHVybiBidC50ZXN0KChiJiZhLmN1cnJlbnRTdHlsZT9hLmN1cnJlbnRTdHlsZS5maWx0ZXI6YS5zdHlsZS5maWx0ZXIpfHwiIik/cGFyc2VGbG9hdChSZWdFeHAuJDEpLzEwMCsiIjpiPyIxIjoiIn0sc2V0OmZ1bmN0aW9uKGEsYil7dmFyIGM9YS5zdHlsZSxkPWEuY3VycmVudFN0eWxlLGU9Zi5pc051bWVyaWMoYik/ImFscGhhKG9wYWNpdHk9IitiKjEwMCsiKSI6IiIsZz1kJiZkLmZpbHRlcnx8Yy5maWx0ZXJ8fCIiO2Muem9vbT0xO2lmKGI+PTEmJmYudHJpbShnLnJlcGxhY2UoYnMsIiIpKT09PSIiKXtjLnJlbW92ZUF0dHJpYnV0ZSgiZmlsdGVyIik7aWYoZCYmIWQuZmlsdGVyKXJldHVybn1jLmZpbHRlcj1icy50ZXN0KGcpP2cucmVwbGFjZShicyxlKTpnKyIgIitlfX0pLGYoZnVuY3Rpb24oKXtmLnN1cHBvcnQucmVsaWFibGVNYXJnaW5SaWdodHx8KGYuY3NzSG9va3MubWFyZ2luUmlnaHQ9e2dldDpmdW5jdGlvbihhLGIpe3ZhciBjO2Yuc3dhcChhLHtkaXNwbGF5OiJpbmxpbmUtYmxvY2sifSxmdW5jdGlvbigpe2I/Yz1iQihhLCJtYXJnaW4tcmlnaHQiLCJtYXJnaW5SaWdodCIpOmM9YS5zdHlsZS5tYXJnaW5SaWdodH0pO3JldHVybiBjfX0pfSksYy5kZWZhdWx0VmlldyYmYy5kZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlJiYoYkM9ZnVuY3Rpb24oYSxjKXt2YXIgZCxlLGc7Yz1jLnJlcGxhY2UoYnUsIi0kMSIpLnRvTG93ZXJDYXNlKCk7aWYoIShlPWEub3duZXJEb2N1bWVudC5kZWZhdWx0VmlldykpcmV0dXJuIGI7aWYoZz1lLmdldENvbXB1dGVkU3R5bGUoYSxudWxsKSlkPWcuZ2V0UHJvcGVydHlWYWx1ZShjKSxkPT09IiImJiFmLmNvbnRhaW5zKGEub3duZXJEb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsYSkmJihkPWYuc3R5bGUoYSxjKSk7cmV0dXJuIGR9KSxjLmRvY3VtZW50RWxlbWVudC5jdXJyZW50U3R5bGUmJihiRD1mdW5jdGlvbihhLGIpe3ZhciBjLGQsZSxmPWEuY3VycmVudFN0eWxlJiZhLmN1cnJlbnRTdHlsZVtiXSxnPWEuc3R5bGU7Zj09PW51bGwmJmcmJihlPWdbYl0pJiYoZj1lKSwhYnYudGVzdChmKSYmYncudGVzdChmKSYmKGM9Zy5sZWZ0LGQ9YS5ydW50aW1lU3R5bGUmJmEucnVudGltZVN0eWxlLmxlZnQsZCYmKGEucnVudGltZVN0eWxlLmxlZnQ9YS5jdXJyZW50U3R5bGUubGVmdCksZy5sZWZ0PWI9PT0iZm9udFNpemUiPyIxZW0iOmZ8fDAsZj1nLnBpeGVsTGVmdCsicHgiLGcubGVmdD1jLGQmJihhLnJ1bnRpbWVTdHlsZS5sZWZ0PWQpKTtyZXR1cm4gZj09PSIiPyJhdXRvIjpmfSksYkI9YkN8fGJELGYuZXhwciYmZi5leHByLmZpbHRlcnMmJihmLmV4cHIuZmlsdGVycy5oaWRkZW49ZnVuY3Rpb24oYSl7dmFyIGI9YS5vZmZzZXRXaWR0aCxjPWEub2Zmc2V0SGVpZ2h0O3JldHVybiBiPT09MCYmYz09PTB8fCFmLnN1cHBvcnQucmVsaWFibGVIaWRkZW5PZmZzZXRzJiYoYS5zdHlsZSYmYS5zdHlsZS5kaXNwbGF5fHxmLmNzcyhhLCJkaXNwbGF5IikpPT09Im5vbmUifSxmLmV4cHIuZmlsdGVycy52aXNpYmxlPWZ1bmN0aW9uKGEpe3JldHVybiFmLmV4cHIuZmlsdGVycy5oaWRkZW4oYSl9KTt2YXIgYkY9LyUyMC9nLGJHPS9cW1xdJC8sYkg9L1xyP1xuL2csYkk9LyMuKiQvLGJKPS9eKC4qPyk6WyBcdF0qKFteXHJcbl0qKVxyPyQvbWcsYks9L14oPzpjb2xvcnxkYXRlfGRhdGV0aW1lfGRhdGV0aW1lLWxvY2FsfGVtYWlsfGhpZGRlbnxtb250aHxudW1iZXJ8cGFzc3dvcmR8cmFuZ2V8c2VhcmNofHRlbHx0ZXh0fHRpbWV8dXJsfHdlZWspJC9pLGJMPS9eKD86YWJvdXR8YXBwfGFwcFwtc3RvcmFnZXwuK1wtZXh0ZW5zaW9ufGZpbGV8cmVzfHdpZGdldCk6JC8sYk09L14oPzpHRVR8SEVBRCkkLyxiTj0vXlwvXC8vLGJPPS9cPy8sYlA9LzxzY3JpcHRcYltePF0qKD86KD8hPFwvc2NyaXB0Pik8W148XSopKjxcL3NjcmlwdD4vZ2ksYlE9L14oPzpzZWxlY3R8dGV4dGFyZWEpL2ksYlI9L1xzKy8sYlM9LyhbPyZdKV89W14mXSovLGJUPS9eKFtcd1wrXC5cLV0rOikoPzpcL1wvKFteXC8/IzpdKikoPzo6KFxkKykpPyk/LyxiVT1mLmZuLmxvYWQsYlY9e30sYlc9e30sYlgsYlksYlo9WyIqLyJdK1siKiJdO3RyeXtiWD1lLmhyZWZ9Y2F0Y2goYiQpe2JYPWMuY3JlYXRlRWxlbWVudCgiYSIpLGJYLmhyZWY9IiIsYlg9YlguaHJlZn1iWT1iVC5leGVjKGJYLnRvTG93ZXJDYXNlKCkpfHxbXSxmLmZuLmV4dGVuZCh7bG9hZDpmdW5jdGlvbihhLGMsZCl7aWYodHlwZW9mIGEhPSJzdHJpbmciJiZiVSlyZXR1cm4gYlUuYXBwbHkodGhpcyxhcmd1bWVudHMpO2lmKCF0aGlzLmxlbmd0aClyZXR1cm4gdGhpczt2YXIgZT1hLmluZGV4T2YoIiAiKTtpZihlPj0wKXt2YXIgZz1hLnNsaWNlKGUsYS5sZW5ndGgpO2E9YS5zbGljZSgwLGUpfXZhciBoPSJHRVQiO2MmJihmLmlzRnVuY3Rpb24oYyk/KGQ9YyxjPWIpOnR5cGVvZiBjPT0ib2JqZWN0IiYmKGM9Zi5wYXJhbShjLGYuYWpheFNldHRpbmdzLnRyYWRpdGlvbmFsKSxoPSJQT1NUIikpO3ZhciBpPXRoaXM7Zi5hamF4KHt1cmw6YSx0eXBlOmgsZGF0YVR5cGU6Imh0bWwiLGRhdGE6Yyxjb21wbGV0ZTpmdW5jdGlvbihhLGIsYyl7Yz1hLnJlc3BvbnNlVGV4dCxhLmlzUmVzb2x2ZWQoKSYmKGEuZG9uZShmdW5jdGlvbihhKXtjPWF9KSxpLmh0bWwoZz9mKCI8ZGl2PiIpLmFwcGVuZChjLnJlcGxhY2UoYlAsIiIpKS5maW5kKGcpOmMpKSxkJiZpLmVhY2goZCxbYyxiLGFdKX19KTtyZXR1cm4gdGhpc30sc2VyaWFsaXplOmZ1bmN0aW9uKCl7cmV0dXJuIGYucGFyYW0odGhpcy5zZXJpYWxpemVBcnJheSgpKX0sc2VyaWFsaXplQXJyYXk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tYXAoZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lbGVtZW50cz9mLm1ha2VBcnJheSh0aGlzLmVsZW1lbnRzKTp0aGlzfSkuZmlsdGVyKGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubmFtZSYmIXRoaXMuZGlzYWJsZWQmJih0aGlzLmNoZWNrZWR8fGJRLnRlc3QodGhpcy5ub2RlTmFtZSl8fGJLLnRlc3QodGhpcy50eXBlKSl9KS5tYXAoZnVuY3Rpb24oYSxiKXt2YXIgYz1mKHRoaXMpLnZhbCgpO3JldHVybiBjPT1udWxsP251bGw6Zi5pc0FycmF5KGMpP2YubWFwKGMsZnVuY3Rpb24oYSxjKXtyZXR1cm57bmFtZTpiLm5hbWUsdmFsdWU6YS5yZXBsYWNlKGJILCJcclxuIil9fSk6e25hbWU6Yi5uYW1lLHZhbHVlOmMucmVwbGFjZShiSCwiXHJcbiIpfX0pLmdldCgpfX0pLGYuZWFjaCgiYWpheFN0YXJ0IGFqYXhTdG9wIGFqYXhDb21wbGV0ZSBhamF4RXJyb3IgYWpheFN1Y2Nlc3MgYWpheFNlbmQiLnNwbGl0KCIgIiksZnVuY3Rpb24oYSxiKXtmLmZuW2JdPWZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmJpbmQoYixhKX19KSxmLmVhY2goWyJnZXQiLCJwb3N0Il0sZnVuY3Rpb24oYSxjKXtmW2NdPWZ1bmN0aW9uKGEsZCxlLGcpe2YuaXNGdW5jdGlvbihkKSYmKGc9Z3x8ZSxlPWQsZD1iKTtyZXR1cm4gZi5hamF4KHt0eXBlOmMsdXJsOmEsZGF0YTpkLHN1Y2Nlc3M6ZSxkYXRhVHlwZTpnfSl9fSksZi5leHRlbmQoe2dldFNjcmlwdDpmdW5jdGlvbihhLGMpe3JldHVybiBmLmdldChhLGIsYywic2NyaXB0Iil9LGdldEpTT046ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBmLmdldChhLGIsYywianNvbiIpfSxhamF4U2V0dXA6ZnVuY3Rpb24oYSxiKXtiP2NiKGEsZi5hamF4U2V0dGluZ3MpOihiPWEsYT1mLmFqYXhTZXR0aW5ncyksY2IoYSxiKTtyZXR1cm4gYX0sYWpheFNldHRpbmdzOnt1cmw6YlgsaXNMb2NhbDpiTC50ZXN0KGJZWzFdKSxnbG9iYWw6ITAsdHlwZToiR0VUIixjb250ZW50VHlwZToiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIixwcm9jZXNzRGF0YTohMCxhc3luYzohMCxhY2NlcHRzOnt4bWw6ImFwcGxpY2F0aW9uL3htbCwgdGV4dC94bWwiLGh0bWw6InRleHQvaHRtbCIsdGV4dDoidGV4dC9wbGFpbiIsanNvbjoiYXBwbGljYXRpb24vanNvbiwgdGV4dC9qYXZhc2NyaXB0IiwiKiI6Ylp9LGNvbnRlbnRzOnt4bWw6L3htbC8saHRtbDovaHRtbC8sanNvbjovanNvbi99LHJlc3BvbnNlRmllbGRzOnt4bWw6InJlc3BvbnNlWE1MIix0ZXh0OiJyZXNwb25zZVRleHQifSxjb252ZXJ0ZXJzOnsiKiB0ZXh0IjphLlN0cmluZywidGV4dCBodG1sIjohMCwidGV4dCBqc29uIjpmLnBhcnNlSlNPTiwidGV4dCB4bWwiOmYucGFyc2VYTUx9LGZsYXRPcHRpb25zOntjb250ZXh0OiEwLHVybDohMH19LGFqYXhQcmVmaWx0ZXI6Yl8oYlYpLGFqYXhUcmFuc3BvcnQ6Yl8oYlcpLGFqYXg6ZnVuY3Rpb24oYSxjKXtmdW5jdGlvbiB3KGEsYyxsLG0pe2lmKHMhPT0yKXtzPTIscSYmY2xlYXJUaW1lb3V0KHEpLHA9YixuPW18fCIiLHYucmVhZHlTdGF0ZT1hPjA/NDowO3ZhciBvLHIsdSx3PWMseD1sP2NkKGQsdixsKTpiLHksejtpZihhPj0yMDAmJmE8MzAwfHxhPT09MzA0KXtpZihkLmlmTW9kaWZpZWQpe2lmKHk9di5nZXRSZXNwb25zZUhlYWRlcigiTGFzdC1Nb2RpZmllZCIpKWYubGFzdE1vZGlmaWVkW2tdPXk7aWYoej12LmdldFJlc3BvbnNlSGVhZGVyKCJFdGFnIikpZi5ldGFnW2tdPXp9aWYoYT09PTMwNCl3PSJub3Rtb2RpZmllZCIsbz0hMDtlbHNlIHRyeXtyPWNlKGQseCksdz0ic3VjY2VzcyIsbz0hMH1jYXRjaChBKXt3PSJwYXJzZXJlcnJvciIsdT1BfX1lbHNle3U9dztpZighd3x8YSl3PSJlcnJvciIsYTwwJiYoYT0wKX12LnN0YXR1cz1hLHYuc3RhdHVzVGV4dD0iIisoY3x8dyksbz9oLnJlc29sdmVXaXRoKGUsW3Isdyx2XSk6aC5yZWplY3RXaXRoKGUsW3Ysdyx1XSksdi5zdGF0dXNDb2RlKGopLGo9Yix0JiZnLnRyaWdnZXIoImFqYXgiKyhvPyJTdWNjZXNzIjoiRXJyb3IiKSxbdixkLG8/cjp1XSksaS5maXJlV2l0aChlLFt2LHddKSx0JiYoZy50cmlnZ2VyKCJhamF4Q29tcGxldGUiLFt2LGRdKSwtLWYuYWN0aXZlfHxmLmV2ZW50LnRyaWdnZXIoImFqYXhTdG9wIikpfX10eXBlb2YgYT09Im9iamVjdCImJihjPWEsYT1iKSxjPWN8fHt9O3ZhciBkPWYuYWpheFNldHVwKHt9LGMpLGU9ZC5jb250ZXh0fHxkLGc9ZSE9PWQmJihlLm5vZGVUeXBlfHxlIGluc3RhbmNlb2YgZik/ZihlKTpmLmV2ZW50LGg9Zi5EZWZlcnJlZCgpLGk9Zi5DYWxsYmFja3MoIm9uY2UgbWVtb3J5Iiksaj1kLnN0YXR1c0NvZGV8fHt9LGssbD17fSxtPXt9LG4sbyxwLHEscixzPTAsdCx1LHY9e3JlYWR5U3RhdGU6MCxzZXRSZXF1ZXN0SGVhZGVyOmZ1bmN0aW9uKGEsYil7aWYoIXMpe3ZhciBjPWEudG9Mb3dlckNhc2UoKTthPW1bY109bVtjXXx8YSxsW2FdPWJ9cmV0dXJuIHRoaXN9LGdldEFsbFJlc3BvbnNlSGVhZGVyczpmdW5jdGlvbigpe3JldHVybiBzPT09Mj9uOm51bGx9LGdldFJlc3BvbnNlSGVhZGVyOmZ1bmN0aW9uKGEpe3ZhciBjO2lmKHM9PT0yKXtpZighbyl7bz17fTt3aGlsZShjPWJKLmV4ZWMobikpb1tjWzFdLnRvTG93ZXJDYXNlKCldPWNbMl19Yz1vW2EudG9Mb3dlckNhc2UoKV19cmV0dXJuIGM9PT1iP251bGw6Y30sb3ZlcnJpZGVNaW1lVHlwZTpmdW5jdGlvbihhKXtzfHwoZC5taW1lVHlwZT1hKTtyZXR1cm4gdGhpc30sYWJvcnQ6ZnVuY3Rpb24oYSl7YT1hfHwiYWJvcnQiLHAmJnAuYWJvcnQoYSksdygwLGEpO3JldHVybiB0aGlzfX07aC5wcm9taXNlKHYpLHYuc3VjY2Vzcz12LmRvbmUsdi5lcnJvcj12LmZhaWwsdi5jb21wbGV0ZT1pLmFkZCx2LnN0YXR1c0NvZGU9ZnVuY3Rpb24oYSl7aWYoYSl7dmFyIGI7aWYoczwyKWZvcihiIGluIGEpaltiXT1baltiXSxhW2JdXTtlbHNlIGI9YVt2LnN0YXR1c10sdi50aGVuKGIsYil9cmV0dXJuIHRoaXN9LGQudXJsPSgoYXx8ZC51cmwpKyIiKS5yZXBsYWNlKGJJLCIiKS5yZXBsYWNlKGJOLGJZWzFdKyIvLyIpLGQuZGF0YVR5cGVzPWYudHJpbShkLmRhdGFUeXBlfHwiKiIpLnRvTG93ZXJDYXNlKCkuc3BsaXQoYlIpLGQuY3Jvc3NEb21haW49PW51bGwmJihyPWJULmV4ZWMoZC51cmwudG9Mb3dlckNhc2UoKSksZC5jcm9zc0RvbWFpbj0hKCFyfHxyWzFdPT1iWVsxXSYmclsyXT09YllbMl0mJihyWzNdfHwoclsxXT09PSJodHRwOiI/ODA6NDQzKSk9PShiWVszXXx8KGJZWzFdPT09Imh0dHA6Ij84MDo0NDMpKSkpLGQuZGF0YSYmZC5wcm9jZXNzRGF0YSYmdHlwZW9mIGQuZGF0YSE9InN0cmluZyImJihkLmRhdGE9Zi5wYXJhbShkLmRhdGEsZC50cmFkaXRpb25hbCkpLGNhKGJWLGQsYyx2KTtpZihzPT09MilyZXR1cm4hMTt0PWQuZ2xvYmFsLGQudHlwZT1kLnR5cGUudG9VcHBlckNhc2UoKSxkLmhhc0NvbnRlbnQ9IWJNLnRlc3QoZC50eXBlKSx0JiZmLmFjdGl2ZSsrPT09MCYmZi5ldmVudC50cmlnZ2VyKCJhamF4U3RhcnQiKTtpZighZC5oYXNDb250ZW50KXtkLmRhdGEmJihkLnVybCs9KGJPLnRlc3QoZC51cmwpPyImIjoiPyIpK2QuZGF0YSxkZWxldGUgZC5kYXRhKSxrPWQudXJsO2lmKGQuY2FjaGU9PT0hMSl7dmFyIHg9Zi5ub3coKSx5PWQudXJsLnJlcGxhY2UoYlMsIiQxXz0iK3gpO2QudXJsPXkrKHk9PT1kLnVybD8oYk8udGVzdChkLnVybCk/IiYiOiI/IikrIl89Iit4OiIiKX19KGQuZGF0YSYmZC5oYXNDb250ZW50JiZkLmNvbnRlbnRUeXBlIT09ITF8fGMuY29udGVudFR5cGUpJiZ2LnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtVHlwZSIsZC5jb250ZW50VHlwZSksZC5pZk1vZGlmaWVkJiYoaz1rfHxkLnVybCxmLmxhc3RNb2RpZmllZFtrXSYmdi5zZXRSZXF1ZXN0SGVhZGVyKCJJZi1Nb2RpZmllZC1TaW5jZSIsZi5sYXN0TW9kaWZpZWRba10pLGYuZXRhZ1trXSYmdi5zZXRSZXF1ZXN0SGVhZGVyKCJJZi1Ob25lLU1hdGNoIixmLmV0YWdba10pKSx2LnNldFJlcXVlc3RIZWFkZXIoIkFjY2VwdCIsZC5kYXRhVHlwZXNbMF0mJmQuYWNjZXB0c1tkLmRhdGFUeXBlc1swXV0/ZC5hY2NlcHRzW2QuZGF0YVR5cGVzWzBdXSsoZC5kYXRhVHlwZXNbMF0hPT0iKiI/IiwgIitiWisiOyBxPTAuMDEiOiIiKTpkLmFjY2VwdHNbIioiXSk7Zm9yKHUgaW4gZC5oZWFkZXJzKXYuc2V0UmVxdWVzdEhlYWRlcih1LGQuaGVhZGVyc1t1XSk7aWYoZC5iZWZvcmVTZW5kJiYoZC5iZWZvcmVTZW5kLmNhbGwoZSx2LGQpPT09ITF8fHM9PT0yKSl7di5hYm9ydCgpO3JldHVybiExfWZvcih1IGlue3N1Y2Nlc3M6MSxlcnJvcjoxLGNvbXBsZXRlOjF9KXZbdV0oZFt1XSk7cD1jYShiVyxkLGMsdik7aWYoIXApdygtMSwiTm8gVHJhbnNwb3J0Iik7ZWxzZXt2LnJlYWR5U3RhdGU9MSx0JiZnLnRyaWdnZXIoImFqYXhTZW5kIixbdixkXSksZC5hc3luYyYmZC50aW1lb3V0PjAmJihxPXNldFRpbWVvdXQoZnVuY3Rpb24oKXt2LmFib3J0KCJ0aW1lb3V0Iil9LGQudGltZW91dCkpO3RyeXtzPTEscC5zZW5kKGwsdyl9Y2F0Y2goeil7czwyP3coLTEseik6Zi5lcnJvcih6KX19cmV0dXJuIHZ9LHBhcmFtOmZ1bmN0aW9uKGEsYyl7dmFyIGQ9W10sZT1mdW5jdGlvbihhLGIpe2I9Zi5pc0Z1bmN0aW9uKGIpP2IoKTpiLGRbZC5sZW5ndGhdPWVuY29kZVVSSUNvbXBvbmVudChhKSsiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGIpfTtjPT09YiYmKGM9Zi5hamF4U2V0dGluZ3MudHJhZGl0aW9uYWwpO2lmKGYuaXNBcnJheShhKXx8YS5qcXVlcnkmJiFmLmlzUGxhaW5PYmplY3QoYSkpZi5lYWNoKGEsZnVuY3Rpb24oKXtlKHRoaXMubmFtZSx0aGlzLnZhbHVlKX0pO2Vsc2UgZm9yKHZhciBnIGluIGEpY2MoZyxhW2ddLGMsZSk7cmV0dXJuIGQuam9pbigiJiIpLnJlcGxhY2UoYkYsIisiKX19KSxmLmV4dGVuZCh7YWN0aXZlOjAsbGFzdE1vZGlmaWVkOnt9LGV0YWc6e319KTt2YXIgY2Y9Zi5ub3coKSxjZz0vKFw9KVw/KCZ8JCl8XD9cPy9pO2YuYWpheFNldHVwKHtqc29ucDoiY2FsbGJhY2siLGpzb25wQ2FsbGJhY2s6ZnVuY3Rpb24oKXtyZXR1cm4gZi5leHBhbmRvKyJfIitjZisrfX0pLGYuYWpheFByZWZpbHRlcigianNvbiBqc29ucCIsZnVuY3Rpb24oYixjLGQpe3ZhciBlPWIuY29udGVudFR5cGU9PT0iYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiYmdHlwZW9mIGIuZGF0YT09InN0cmluZyI7aWYoYi5kYXRhVHlwZXNbMF09PT0ianNvbnAifHxiLmpzb25wIT09ITEmJihjZy50ZXN0KGIudXJsKXx8ZSYmY2cudGVzdChiLmRhdGEpKSl7dmFyIGcsaD1iLmpzb25wQ2FsbGJhY2s9Zi5pc0Z1bmN0aW9uKGIuanNvbnBDYWxsYmFjayk/Yi5qc29ucENhbGxiYWNrKCk6Yi5qc29ucENhbGxiYWNrLGk9YVtoXSxqPWIudXJsLGs9Yi5kYXRhLGw9IiQxIitoKyIkMiI7Yi5qc29ucCE9PSExJiYoaj1qLnJlcGxhY2UoY2csbCksYi51cmw9PT1qJiYoZSYmKGs9ay5yZXBsYWNlKGNnLGwpKSxiLmRhdGE9PT1rJiYoais9KC9cPy8udGVzdChqKT8iJiI6Ij8iKStiLmpzb25wKyI9IitoKSkpLGIudXJsPWosYi5kYXRhPWssYVtoXT1mdW5jdGlvbihhKXtnPVthXX0sZC5hbHdheXMoZnVuY3Rpb24oKXthW2hdPWksZyYmZi5pc0Z1bmN0aW9uKGkpJiZhW2hdKGdbMF0pfSksYi5jb252ZXJ0ZXJzWyJzY3JpcHQganNvbiJdPWZ1bmN0aW9uKCl7Z3x8Zi5lcnJvcihoKyIgd2FzIG5vdCBjYWxsZWQiKTtyZXR1cm4gZ1swXX0sYi5kYXRhVHlwZXNbMF09Impzb24iO3JldHVybiJzY3JpcHQifX0pLGYuYWpheFNldHVwKHthY2NlcHRzOntzY3JpcHQ6InRleHQvamF2YXNjcmlwdCwgYXBwbGljYXRpb24vamF2YXNjcmlwdCwgYXBwbGljYXRpb24vZWNtYXNjcmlwdCwgYXBwbGljYXRpb24veC1lY21hc2NyaXB0In0sY29udGVudHM6e3NjcmlwdDovamF2YXNjcmlwdHxlY21hc2NyaXB0L30sY29udmVydGVyczp7InRleHQgc2NyaXB0IjpmdW5jdGlvbihhKXtmLmdsb2JhbEV2YWwoYSk7cmV0dXJuIGF9fX0pLGYuYWpheFByZWZpbHRlcigic2NyaXB0IixmdW5jdGlvbihhKXthLmNhY2hlPT09YiYmKGEuY2FjaGU9ITEpLGEuY3Jvc3NEb21haW4mJihhLnR5cGU9IkdFVCIsYS5nbG9iYWw9ITEpfSksZi5hamF4VHJhbnNwb3J0KCJzY3JpcHQiLGZ1bmN0aW9uKGEpe2lmKGEuY3Jvc3NEb21haW4pe3ZhciBkLGU9Yy5oZWFkfHxjLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJoZWFkIilbMF18fGMuZG9jdW1lbnRFbGVtZW50O3JldHVybntzZW5kOmZ1bmN0aW9uKGYsZyl7ZD1jLmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpLGQuYXN5bmM9ImFzeW5jIixhLnNjcmlwdENoYXJzZXQmJihkLmNoYXJzZXQ9YS5zY3JpcHRDaGFyc2V0KSxkLnNyYz1hLnVybCxkLm9ubG9hZD1kLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbihhLGMpe2lmKGN8fCFkLnJlYWR5U3RhdGV8fC9sb2FkZWR8Y29tcGxldGUvLnRlc3QoZC5yZWFkeVN0YXRlKSlkLm9ubG9hZD1kLm9ucmVhZHlzdGF0ZWNoYW5nZT1udWxsLGUmJmQucGFyZW50Tm9kZSYmZS5yZW1vdmVDaGlsZChkKSxkPWIsY3x8ZygyMDAsInN1Y2Nlc3MiKX0sZS5pbnNlcnRCZWZvcmUoZCxlLmZpcnN0Q2hpbGQpfSxhYm9ydDpmdW5jdGlvbigpe2QmJmQub25sb2FkKDAsMSl9fX19KTt2YXIgY2g9YS5BY3RpdmVYT2JqZWN0P2Z1bmN0aW9uKCl7Zm9yKHZhciBhIGluIGNqKWNqW2FdKDAsMSl9OiExLGNpPTAsY2o7Zi5hamF4U2V0dGluZ3MueGhyPWEuQWN0aXZlWE9iamVjdD9mdW5jdGlvbigpe3JldHVybiF0aGlzLmlzTG9jYWwmJmNrKCl8fGNsKCl9OmNrLGZ1bmN0aW9uKGEpe2YuZXh0ZW5kKGYuc3VwcG9ydCx7YWpheDohIWEsY29yczohIWEmJiJ3aXRoQ3JlZGVudGlhbHMiaW4gYX0pfShmLmFqYXhTZXR0aW5ncy54aHIoKSksZi5zdXBwb3J0LmFqYXgmJmYuYWpheFRyYW5zcG9ydChmdW5jdGlvbihjKXtpZighYy5jcm9zc0RvbWFpbnx8Zi5zdXBwb3J0LmNvcnMpe3ZhciBkO3JldHVybntzZW5kOmZ1bmN0aW9uKGUsZyl7dmFyIGg9Yy54aHIoKSxpLGo7Yy51c2VybmFtZT9oLm9wZW4oYy50eXBlLGMudXJsLGMuYXN5bmMsYy51c2VybmFtZSxjLnBhc3N3b3JkKTpoLm9wZW4oYy50eXBlLGMudXJsLGMuYXN5bmMpO2lmKGMueGhyRmllbGRzKWZvcihqIGluIGMueGhyRmllbGRzKWhbal09Yy54aHJGaWVsZHNbal07Yy5taW1lVHlwZSYmaC5vdmVycmlkZU1pbWVUeXBlJiZoLm92ZXJyaWRlTWltZVR5cGUoYy5taW1lVHlwZSksIWMuY3Jvc3NEb21haW4mJiFlWyJYLVJlcXVlc3RlZC1XaXRoIl0mJihlWyJYLVJlcXVlc3RlZC1XaXRoIl09IlhNTEh0dHBSZXF1ZXN0Iik7dHJ5e2ZvcihqIGluIGUpaC5zZXRSZXF1ZXN0SGVhZGVyKGosZVtqXSl9Y2F0Y2goayl7fWguc2VuZChjLmhhc0NvbnRlbnQmJmMuZGF0YXx8bnVsbCksZD1mdW5jdGlvbihhLGUpe3ZhciBqLGssbCxtLG47dHJ5e2lmKGQmJihlfHxoLnJlYWR5U3RhdGU9PT00KSl7ZD1iLGkmJihoLm9ucmVhZHlzdGF0ZWNoYW5nZT1mLm5vb3AsY2gmJmRlbGV0ZSBjaltpXSk7aWYoZSloLnJlYWR5U3RhdGUhPT00JiZoLmFib3J0KCk7ZWxzZXtqPWguc3RhdHVzLGw9aC5nZXRBbGxSZXNwb25zZUhlYWRlcnMoKSxtPXt9LG49aC5yZXNwb25zZVhNTCxuJiZuLmRvY3VtZW50RWxlbWVudCYmKG0ueG1sPW4pLG0udGV4dD1oLnJlc3BvbnNlVGV4dDt0cnl7az1oLnN0YXR1c1RleHR9Y2F0Y2gobyl7az0iIn0haiYmYy5pc0xvY2FsJiYhYy5jcm9zc0RvbWFpbj9qPW0udGV4dD8yMDA6NDA0Omo9PT0xMjIzJiYoaj0yMDQpfX19Y2F0Y2gocCl7ZXx8ZygtMSxwKX1tJiZnKGosayxtLGwpfSwhYy5hc3luY3x8aC5yZWFkeVN0YXRlPT09ND9kKCk6KGk9KytjaSxjaCYmKGNqfHwoY2o9e30sZihhKS51bmxvYWQoY2gpKSxjaltpXT1kKSxoLm9ucmVhZHlzdGF0ZWNoYW5nZT1kKX0sYWJvcnQ6ZnVuY3Rpb24oKXtkJiZkKDAsMSl9fX19KTt2YXIgY209e30sY24sY28sY3A9L14oPzp0b2dnbGV8c2hvd3xoaWRlKSQvLGNxPS9eKFsrXC1dPSk/KFtcZCsuXC1dKykoW2EteiVdKikkL2ksY3IsY3M9W1siaGVpZ2h0IiwibWFyZ2luVG9wIiwibWFyZ2luQm90dG9tIiwicGFkZGluZ1RvcCIsInBhZGRpbmdCb3R0b20iXSxbIndpZHRoIiwibWFyZ2luTGVmdCIsIm1hcmdpblJpZ2h0IiwicGFkZGluZ0xlZnQiLCJwYWRkaW5nUmlnaHQiXSxbIm9wYWNpdHkiXV0sY3Q7Zi5mbi5leHRlbmQoe3Nob3c6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkLGU7aWYoYXx8YT09PTApcmV0dXJuIHRoaXMuYW5pbWF0ZShjdygic2hvdyIsMyksYSxiLGMpO2Zvcih2YXIgZz0wLGg9dGhpcy5sZW5ndGg7ZzxoO2crKylkPXRoaXNbZ10sZC5zdHlsZSYmKGU9ZC5zdHlsZS5kaXNwbGF5LCFmLl9kYXRhKGQsIm9sZGRpc3BsYXkiKSYmZT09PSJub25lIiYmKGU9ZC5zdHlsZS5kaXNwbGF5PSIiKSxlPT09IiImJmYuY3NzKGQsImRpc3BsYXkiKT09PSJub25lIiYmZi5fZGF0YShkLCJvbGRkaXNwbGF5IixjeChkLm5vZGVOYW1lKSkpO2ZvcihnPTA7ZzxoO2crKyl7ZD10aGlzW2ddO2lmKGQuc3R5bGUpe2U9ZC5zdHlsZS5kaXNwbGF5O2lmKGU9PT0iInx8ZT09PSJub25lIilkLnN0eWxlLmRpc3BsYXk9Zi5fZGF0YShkLCJvbGRkaXNwbGF5Iil8fCIifX1yZXR1cm4gdGhpc30saGlkZTpmdW5jdGlvbihhLGIsYyl7aWYoYXx8YT09PTApcmV0dXJuIHRoaXMuYW5pbWF0ZShjdygiaGlkZSIsMyksYSxiLGMpO3ZhciBkLGUsZz0wLGg9dGhpcy5sZW5ndGg7Zm9yKDtnPGg7ZysrKWQ9dGhpc1tnXSxkLnN0eWxlJiYoZT1mLmNzcyhkLCJkaXNwbGF5IiksZSE9PSJub25lIiYmIWYuX2RhdGEoZCwib2xkZGlzcGxheSIpJiZmLl9kYXRhKGQsIm9sZGRpc3BsYXkiLGUpKTtmb3IoZz0wO2c8aDtnKyspdGhpc1tnXS5zdHlsZSYmKHRoaXNbZ10uc3R5bGUuZGlzcGxheT0ibm9uZSIpO3JldHVybiB0aGlzfSxfdG9nZ2xlOmYuZm4udG9nZ2xlLHRvZ2dsZTpmdW5jdGlvbihhLGIsYyl7dmFyIGQ9dHlwZW9mIGE9PSJib29sZWFuIjtmLmlzRnVuY3Rpb24oYSkmJmYuaXNGdW5jdGlvbihiKT90aGlzLl90b2dnbGUuYXBwbHkodGhpcyxhcmd1bWVudHMpOmE9PW51bGx8fGQ/dGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGI9ZD9hOmYodGhpcykuaXMoIjpoaWRkZW4iKTtmKHRoaXMpW2I/InNob3ciOiJoaWRlIl0oKX0pOnRoaXMuYW5pbWF0ZShjdygidG9nZ2xlIiwzKSxhLGIsYyk7cmV0dXJuIHRoaXN9LGZhZGVUbzpmdW5jdGlvbihhLGIsYyxkKXtyZXR1cm4gdGhpcy5maWx0ZXIoIjpoaWRkZW4iKS5jc3MoIm9wYWNpdHkiLDApLnNob3coKS5lbmQoKS5hbmltYXRlKHtvcGFjaXR5OmJ9LGEsYyxkKX0sYW5pbWF0ZTpmdW5jdGlvbihhLGIsYyxkKXtmdW5jdGlvbiBnKCl7ZS5xdWV1ZT09PSExJiZmLl9tYXJrKHRoaXMpO3ZhciBiPWYuZXh0ZW5kKHt9LGUpLGM9dGhpcy5ub2RlVHlwZT09PTEsZD1jJiZmKHRoaXMpLmlzKCI6aGlkZGVuIiksZyxoLGksaixrLGwsbSxuLG87Yi5hbmltYXRlZFByb3BlcnRpZXM9e307Zm9yKGkgaW4gYSl7Zz1mLmNhbWVsQ2FzZShpKSxpIT09ZyYmKGFbZ109YVtpXSxkZWxldGUgYVtpXSksaD1hW2ddLGYuaXNBcnJheShoKT8oYi5hbmltYXRlZFByb3BlcnRpZXNbZ109aFsxXSxoPWFbZ109aFswXSk6Yi5hbmltYXRlZFByb3BlcnRpZXNbZ109Yi5zcGVjaWFsRWFzaW5nJiZiLnNwZWNpYWxFYXNpbmdbZ118fGIuZWFzaW5nfHwic3dpbmciO2lmKGg9PT0iaGlkZSImJmR8fGg9PT0ic2hvdyImJiFkKXJldHVybiBiLmNvbXBsZXRlLmNhbGwodGhpcyk7YyYmKGc9PT0iaGVpZ2h0Inx8Zz09PSJ3aWR0aCIpJiYoYi5vdmVyZmxvdz1bdGhpcy5zdHlsZS5vdmVyZmxvdyx0aGlzLnN0eWxlLm92ZXJmbG93WCx0aGlzLnN0eWxlLm92ZXJmbG93WV0sZi5jc3ModGhpcywiZGlzcGxheSIpPT09ImlubGluZSImJmYuY3NzKHRoaXMsImZsb2F0Iik9PT0ibm9uZSImJighZi5zdXBwb3J0LmlubGluZUJsb2NrTmVlZHNMYXlvdXR8fGN4KHRoaXMubm9kZU5hbWUpPT09ImlubGluZSI/dGhpcy5zdHlsZS5kaXNwbGF5PSJpbmxpbmUtYmxvY2siOnRoaXMuc3R5bGUuem9vbT0xKSl9Yi5vdmVyZmxvdyE9bnVsbCYmKHRoaXMuc3R5bGUub3ZlcmZsb3c9ImhpZGRlbiIpO2ZvcihpIGluIGEpaj1uZXcgZi5meCh0aGlzLGIsaSksaD1hW2ldLGNwLnRlc3QoaCk/KG89Zi5fZGF0YSh0aGlzLCJ0b2dnbGUiK2kpfHwoaD09PSJ0b2dnbGUiP2Q/InNob3ciOiJoaWRlIjowKSxvPyhmLl9kYXRhKHRoaXMsInRvZ2dsZSIraSxvPT09InNob3ciPyJoaWRlIjoic2hvdyIpLGpbb10oKSk6altoXSgpKTooaz1jcS5leGVjKGgpLGw9ai5jdXIoKSxrPyhtPXBhcnNlRmxvYXQoa1syXSksbj1rWzNdfHwoZi5jc3NOdW1iZXJbaV0/IiI6InB4IiksbiE9PSJweCImJihmLnN0eWxlKHRoaXMsaSwobXx8MSkrbiksbD0obXx8MSkvai5jdXIoKSpsLGYuc3R5bGUodGhpcyxpLGwrbikpLGtbMV0mJihtPShrWzFdPT09Ii09Ij8tMToxKSptK2wpLGouY3VzdG9tKGwsbSxuKSk6ai5jdXN0b20obCxoLCIiKSk7cmV0dXJuITB9dmFyIGU9Zi5zcGVlZChiLGMsZCk7aWYoZi5pc0VtcHR5T2JqZWN0KGEpKXJldHVybiB0aGlzLmVhY2goZS5jb21wbGV0ZSxbITFdKTthPWYuZXh0ZW5kKHt9LGEpO3JldHVybiBlLnF1ZXVlPT09ITE/dGhpcy5lYWNoKGcpOnRoaXMucXVldWUoZS5xdWV1ZSxnKX0sc3RvcDpmdW5jdGlvbihhLGMsZCl7dHlwZW9mIGEhPSJzdHJpbmciJiYoZD1jLGM9YSxhPWIpLGMmJmEhPT0hMSYmdGhpcy5xdWV1ZShhfHwiZngiLFtdKTtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7ZnVuY3Rpb24gaChhLGIsYyl7dmFyIGU9YltjXTtmLnJlbW92ZURhdGEoYSxjLCEwKSxlLnN0b3AoZCl9dmFyIGIsYz0hMSxlPWYudGltZXJzLGc9Zi5fZGF0YSh0aGlzKTtkfHxmLl91bm1hcmsoITAsdGhpcyk7aWYoYT09bnVsbClmb3IoYiBpbiBnKWdbYl0uc3RvcCYmYi5pbmRleE9mKCIucnVuIik9PT1iLmxlbmd0aC00JiZoKHRoaXMsZyxiKTtlbHNlIGdbYj1hKyIucnVuIl0mJmdbYl0uc3RvcCYmaCh0aGlzLGcsYik7Zm9yKGI9ZS5sZW5ndGg7Yi0tOyllW2JdLmVsZW09PT10aGlzJiYoYT09bnVsbHx8ZVtiXS5xdWV1ZT09PWEpJiYoZD9lW2JdKCEwKTplW2JdLnNhdmVTdGF0ZSgpLGM9ITAsZS5zcGxpY2UoYiwxKSk7KCFkfHwhYykmJmYuZGVxdWV1ZSh0aGlzLGEpfSl9fSksZi5lYWNoKHtzbGlkZURvd246Y3coInNob3ciLDEpLHNsaWRlVXA6Y3coImhpZGUiLDEpLHNsaWRlVG9nZ2xlOmN3KCJ0b2dnbGUiLDEpLGZhZGVJbjp7b3BhY2l0eToic2hvdyJ9LGZhZGVPdXQ6e29wYWNpdHk6ImhpZGUifSxmYWRlVG9nZ2xlOntvcGFjaXR5OiJ0b2dnbGUifX0sZnVuY3Rpb24oYSxiKXtmLmZuW2FdPWZ1bmN0aW9uKGEsYyxkKXtyZXR1cm4gdGhpcy5hbmltYXRlKGIsYSxjLGQpfX0pLGYuZXh0ZW5kKHtzcGVlZDpmdW5jdGlvbihhLGIsYyl7dmFyIGQ9YSYmdHlwZW9mIGE9PSJvYmplY3QiP2YuZXh0ZW5kKHt9LGEpOntjb21wbGV0ZTpjfHwhYyYmYnx8Zi5pc0Z1bmN0aW9uKGEpJiZhLGR1cmF0aW9uOmEsZWFzaW5nOmMmJmJ8fGImJiFmLmlzRnVuY3Rpb24oYikmJmJ9O2QuZHVyYXRpb249Zi5meC5vZmY/MDp0eXBlb2YgZC5kdXJhdGlvbj09Im51bWJlciI/ZC5kdXJhdGlvbjpkLmR1cmF0aW9uIGluIGYuZnguc3BlZWRzP2YuZnguc3BlZWRzW2QuZHVyYXRpb25dOmYuZnguc3BlZWRzLl9kZWZhdWx0O2lmKGQucXVldWU9PW51bGx8fGQucXVldWU9PT0hMClkLnF1ZXVlPSJmeCI7ZC5vbGQ9ZC5jb21wbGV0ZSxkLmNvbXBsZXRlPWZ1bmN0aW9uKGEpe2YuaXNGdW5jdGlvbihkLm9sZCkmJmQub2xkLmNhbGwodGhpcyksZC5xdWV1ZT9mLmRlcXVldWUodGhpcyxkLnF1ZXVlKTphIT09ITEmJmYuX3VubWFyayh0aGlzKX07cmV0dXJuIGR9LGVhc2luZzp7bGluZWFyOmZ1bmN0aW9uKGEsYixjLGQpe3JldHVybiBjK2QqYX0sc3dpbmc6ZnVuY3Rpb24oYSxiLGMsZCl7cmV0dXJuKC1NYXRoLmNvcyhhKk1hdGguUEkpLzIrLjUpKmQrY319LHRpbWVyczpbXSxmeDpmdW5jdGlvbihhLGIsYyl7dGhpcy5vcHRpb25zPWIsdGhpcy5lbGVtPWEsdGhpcy5wcm9wPWMsYi5vcmlnPWIub3JpZ3x8e319fSksZi5meC5wcm90b3R5cGU9e3VwZGF0ZTpmdW5jdGlvbigpe3RoaXMub3B0aW9ucy5zdGVwJiZ0aGlzLm9wdGlvbnMuc3RlcC5jYWxsKHRoaXMuZWxlbSx0aGlzLm5vdyx0aGlzKSwoZi5meC5zdGVwW3RoaXMucHJvcF18fGYuZnguc3RlcC5fZGVmYXVsdCkodGhpcyl9LGN1cjpmdW5jdGlvbigpe2lmKHRoaXMuZWxlbVt0aGlzLnByb3BdIT1udWxsJiYoIXRoaXMuZWxlbS5zdHlsZXx8dGhpcy5lbGVtLnN0eWxlW3RoaXMucHJvcF09PW51bGwpKXJldHVybiB0aGlzLmVsZW1bdGhpcy5wcm9wXTt2YXIgYSxiPWYuY3NzKHRoaXMuZWxlbSx0aGlzLnByb3ApO3JldHVybiBpc05hTihhPXBhcnNlRmxvYXQoYikpPyFifHxiPT09ImF1dG8iPzA6YjphfSxjdXN0b206ZnVuY3Rpb24oYSxjLGQpe2Z1bmN0aW9uIGgoYSl7cmV0dXJuIGUuc3RlcChhKX12YXIgZT10aGlzLGc9Zi5meDt0aGlzLnN0YXJ0VGltZT1jdHx8Y3UoKSx0aGlzLmVuZD1jLHRoaXMubm93PXRoaXMuc3RhcnQ9YSx0aGlzLnBvcz10aGlzLnN0YXRlPTAsdGhpcy51bml0PWR8fHRoaXMudW5pdHx8KGYuY3NzTnVtYmVyW3RoaXMucHJvcF0/IiI6InB4IiksaC5xdWV1ZT10aGlzLm9wdGlvbnMucXVldWUsaC5lbGVtPXRoaXMuZWxlbSxoLnNhdmVTdGF0ZT1mdW5jdGlvbigpe2Uub3B0aW9ucy5oaWRlJiZmLl9kYXRhKGUuZWxlbSwiZnhzaG93IitlLnByb3ApPT09YiYmZi5fZGF0YShlLmVsZW0sImZ4c2hvdyIrZS5wcm9wLGUuc3RhcnQpfSxoKCkmJmYudGltZXJzLnB1c2goaCkmJiFjciYmKGNyPXNldEludGVydmFsKGcudGljayxnLmludGVydmFsKSl9LHNob3c6ZnVuY3Rpb24oKXt2YXIgYT1mLl9kYXRhKHRoaXMuZWxlbSwiZnhzaG93Iit0aGlzLnByb3ApO3RoaXMub3B0aW9ucy5vcmlnW3RoaXMucHJvcF09YXx8Zi5zdHlsZSh0aGlzLmVsZW0sdGhpcy5wcm9wKSx0aGlzLm9wdGlvbnMuc2hvdz0hMCxhIT09Yj90aGlzLmN1c3RvbSh0aGlzLmN1cigpLGEpOnRoaXMuY3VzdG9tKHRoaXMucHJvcD09PSJ3aWR0aCJ8fHRoaXMucHJvcD09PSJoZWlnaHQiPzE6MCx0aGlzLmN1cigpKSxmKHRoaXMuZWxlbSkuc2hvdygpfSxoaWRlOmZ1bmN0aW9uKCl7dGhpcy5vcHRpb25zLm9yaWdbdGhpcy5wcm9wXT1mLl9kYXRhKHRoaXMuZWxlbSwiZnhzaG93Iit0aGlzLnByb3ApfHxmLnN0eWxlKHRoaXMuZWxlbSx0aGlzLnByb3ApLHRoaXMub3B0aW9ucy5oaWRlPSEwLHRoaXMuY3VzdG9tKHRoaXMuY3VyKCksMCl9LHN0ZXA6ZnVuY3Rpb24oYSl7dmFyIGIsYyxkLGU9Y3R8fGN1KCksZz0hMCxoPXRoaXMuZWxlbSxpPXRoaXMub3B0aW9ucztpZihhfHxlPj1pLmR1cmF0aW9uK3RoaXMuc3RhcnRUaW1lKXt0aGlzLm5vdz10aGlzLmVuZCx0aGlzLnBvcz10aGlzLnN0YXRlPTEsdGhpcy51cGRhdGUoKSxpLmFuaW1hdGVkUHJvcGVydGllc1t0aGlzLnByb3BdPSEwO2ZvcihiIGluIGkuYW5pbWF0ZWRQcm9wZXJ0aWVzKWkuYW5pbWF0ZWRQcm9wZXJ0aWVzW2JdIT09ITAmJihnPSExKTtpZihnKXtpLm92ZXJmbG93IT1udWxsJiYhZi5zdXBwb3J0LnNocmlua1dyYXBCbG9ja3MmJmYuZWFjaChbIiIsIlgiLCJZIl0sZnVuY3Rpb24oYSxiKXtoLnN0eWxlWyJvdmVyZmxvdyIrYl09aS5vdmVyZmxvd1thXX0pLGkuaGlkZSYmZihoKS5oaWRlKCk7aWYoaS5oaWRlfHxpLnNob3cpZm9yKGIgaW4gaS5hbmltYXRlZFByb3BlcnRpZXMpZi5zdHlsZShoLGIsaS5vcmlnW2JdKSxmLnJlbW92ZURhdGEoaCwiZnhzaG93IitiLCEwKSxmLnJlbW92ZURhdGEoaCwidG9nZ2xlIitiLCEwKTtkPWkuY29tcGxldGUsZCYmKGkuY29tcGxldGU9ITEsZC5jYWxsKGgpKX1yZXR1cm4hMX1pLmR1cmF0aW9uPT1JbmZpbml0eT90aGlzLm5vdz1lOihjPWUtdGhpcy5zdGFydFRpbWUsdGhpcy5zdGF0ZT1jL2kuZHVyYXRpb24sdGhpcy5wb3M9Zi5lYXNpbmdbaS5hbmltYXRlZFByb3BlcnRpZXNbdGhpcy5wcm9wXV0odGhpcy5zdGF0ZSxjLDAsMSxpLmR1cmF0aW9uKSx0aGlzLm5vdz10aGlzLnN0YXJ0Kyh0aGlzLmVuZC10aGlzLnN0YXJ0KSp0aGlzLnBvcyksdGhpcy51cGRhdGUoKTtyZXR1cm4hMH19LGYuZXh0ZW5kKGYuZngse3RpY2s6ZnVuY3Rpb24oKXt2YXIgYSxiPWYudGltZXJzLGM9MDtmb3IoO2M8Yi5sZW5ndGg7YysrKWE9YltjXSwhYSgpJiZiW2NdPT09YSYmYi5zcGxpY2UoYy0tLDEpO2IubGVuZ3RofHxmLmZ4LnN0b3AoKX0saW50ZXJ2YWw6MTMsc3RvcDpmdW5jdGlvbigpe2NsZWFySW50ZXJ2YWwoY3IpLGNyPW51bGx9LHNwZWVkczp7c2xvdzo2MDAsZmFzdDoyMDAsX2RlZmF1bHQ6NDAwfSxzdGVwOntvcGFjaXR5OmZ1bmN0aW9uKGEpe2Yuc3R5bGUoYS5lbGVtLCJvcGFjaXR5IixhLm5vdyl9LF9kZWZhdWx0OmZ1bmN0aW9uKGEpe2EuZWxlbS5zdHlsZSYmYS5lbGVtLnN0eWxlW2EucHJvcF0hPW51bGw/YS5lbGVtLnN0eWxlW2EucHJvcF09YS5ub3crYS51bml0OmEuZWxlbVthLnByb3BdPWEubm93fX19KSxmLmVhY2goWyJ3aWR0aCIsImhlaWdodCJdLGZ1bmN0aW9uKGEsYil7Zi5meC5zdGVwW2JdPWZ1bmN0aW9uKGEpe2Yuc3R5bGUoYS5lbGVtLGIsTWF0aC5tYXgoMCxhLm5vdykpfX0pLGYuZXhwciYmZi5leHByLmZpbHRlcnMmJihmLmV4cHIuZmlsdGVycy5hbmltYXRlZD1mdW5jdGlvbihhKXtyZXR1cm4gZi5ncmVwKGYudGltZXJzLGZ1bmN0aW9uKGIpe3JldHVybiBhPT09Yi5lbGVtfSkubGVuZ3RofSk7dmFyIGN5PS9edCg/OmFibGV8ZHxoKSQvaSxjej0vXig/OmJvZHl8aHRtbCkkL2k7ImdldEJvdW5kaW5nQ2xpZW50UmVjdCJpbiBjLmRvY3VtZW50RWxlbWVudD9mLmZuLm9mZnNldD1mdW5jdGlvbihhKXt2YXIgYj10aGlzWzBdLGM7aWYoYSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKGIpe2Yub2Zmc2V0LnNldE9mZnNldCh0aGlzLGEsYil9KTtpZighYnx8IWIub3duZXJEb2N1bWVudClyZXR1cm4gbnVsbDtpZihiPT09Yi5vd25lckRvY3VtZW50LmJvZHkpcmV0dXJuIGYub2Zmc2V0LmJvZHlPZmZzZXQoYik7dHJ5e2M9Yi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKX1jYXRjaChkKXt9dmFyIGU9Yi5vd25lckRvY3VtZW50LGc9ZS5kb2N1bWVudEVsZW1lbnQ7aWYoIWN8fCFmLmNvbnRhaW5zKGcsYikpcmV0dXJuIGM/e3RvcDpjLnRvcCxsZWZ0OmMubGVmdH06e3RvcDowLGxlZnQ6MH07dmFyIGg9ZS5ib2R5LGk9Y0EoZSksaj1nLmNsaWVudFRvcHx8aC5jbGllbnRUb3B8fDAsaz1nLmNsaWVudExlZnR8fGguY2xpZW50TGVmdHx8MCxsPWkucGFnZVlPZmZzZXR8fGYuc3VwcG9ydC5ib3hNb2RlbCYmZy5zY3JvbGxUb3B8fGguc2Nyb2xsVG9wLG09aS5wYWdlWE9mZnNldHx8Zi5zdXBwb3J0LmJveE1vZGVsJiZnLnNjcm9sbExlZnR8fGguc2Nyb2xsTGVmdCxuPWMudG9wK2wtaixvPWMubGVmdCttLWs7cmV0dXJue3RvcDpuLGxlZnQ6b319OmYuZm4ub2Zmc2V0PWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXNbMF07aWYoYSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKGIpe2Yub2Zmc2V0LnNldE9mZnNldCh0aGlzLGEsYil9KTtpZighYnx8IWIub3duZXJEb2N1bWVudClyZXR1cm4gbnVsbDtpZihiPT09Yi5vd25lckRvY3VtZW50LmJvZHkpcmV0dXJuIGYub2Zmc2V0LmJvZHlPZmZzZXQoYik7dmFyIGMsZD1iLm9mZnNldFBhcmVudCxlPWIsZz1iLm93bmVyRG9jdW1lbnQsaD1nLmRvY3VtZW50RWxlbWVudCxpPWcuYm9keSxqPWcuZGVmYXVsdFZpZXcsaz1qP2ouZ2V0Q29tcHV0ZWRTdHlsZShiLG51bGwpOmIuY3VycmVudFN0eWxlLGw9Yi5vZmZzZXRUb3AsbT1iLm9mZnNldExlZnQ7d2hpbGUoKGI9Yi5wYXJlbnROb2RlKSYmYiE9PWkmJmIhPT1oKXtpZihmLnN1cHBvcnQuZml4ZWRQb3NpdGlvbiYmay5wb3NpdGlvbj09PSJmaXhlZCIpYnJlYWs7Yz1qP2ouZ2V0Q29tcHV0ZWRTdHlsZShiLG51bGwpOmIuY3VycmVudFN0eWxlLGwtPWIuc2Nyb2xsVG9wLG0tPWIuc2Nyb2xsTGVmdCxiPT09ZCYmKGwrPWIub2Zmc2V0VG9wLG0rPWIub2Zmc2V0TGVmdCxmLnN1cHBvcnQuZG9lc05vdEFkZEJvcmRlciYmKCFmLnN1cHBvcnQuZG9lc0FkZEJvcmRlckZvclRhYmxlQW5kQ2VsbHN8fCFjeS50ZXN0KGIubm9kZU5hbWUpKSYmKGwrPXBhcnNlRmxvYXQoYy5ib3JkZXJUb3BXaWR0aCl8fDAsbSs9cGFyc2VGbG9hdChjLmJvcmRlckxlZnRXaWR0aCl8fDApLGU9ZCxkPWIub2Zmc2V0UGFyZW50KSxmLnN1cHBvcnQuc3VidHJhY3RzQm9yZGVyRm9yT3ZlcmZsb3dOb3RWaXNpYmxlJiZjLm92ZXJmbG93IT09InZpc2libGUiJiYobCs9cGFyc2VGbG9hdChjLmJvcmRlclRvcFdpZHRoKXx8MCxtKz1wYXJzZUZsb2F0KGMuYm9yZGVyTGVmdFdpZHRoKXx8MCksaz1jfWlmKGsucG9zaXRpb249PT0icmVsYXRpdmUifHxrLnBvc2l0aW9uPT09InN0YXRpYyIpbCs9aS5vZmZzZXRUb3AsbSs9aS5vZmZzZXRMZWZ0O2Yuc3VwcG9ydC5maXhlZFBvc2l0aW9uJiZrLnBvc2l0aW9uPT09ImZpeGVkIiYmKGwrPU1hdGgubWF4KGguc2Nyb2xsVG9wLGkuc2Nyb2xsVG9wKSxtKz1NYXRoLm1heChoLnNjcm9sbExlZnQsaS5zY3JvbGxMZWZ0KSk7cmV0dXJue3RvcDpsLGxlZnQ6bX19LGYub2Zmc2V0PXtib2R5T2Zmc2V0OmZ1bmN0aW9uKGEpe3ZhciBiPWEub2Zmc2V0VG9wLGM9YS5vZmZzZXRMZWZ0O2Yuc3VwcG9ydC5kb2VzTm90SW5jbHVkZU1hcmdpbkluQm9keU9mZnNldCYmKGIrPXBhcnNlRmxvYXQoZi5jc3MoYSwibWFyZ2luVG9wIikpfHwwLGMrPXBhcnNlRmxvYXQoZi5jc3MoYSwibWFyZ2luTGVmdCIpKXx8MCk7cmV0dXJue3RvcDpiLGxlZnQ6Y319LHNldE9mZnNldDpmdW5jdGlvbihhLGIsYyl7dmFyIGQ9Zi5jc3MoYSwicG9zaXRpb24iKTtkPT09InN0YXRpYyImJihhLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIpO3ZhciBlPWYoYSksZz1lLm9mZnNldCgpLGg9Zi5jc3MoYSwidG9wIiksaT1mLmNzcyhhLCJsZWZ0Iiksaj0oZD09PSJhYnNvbHV0ZSJ8fGQ9PT0iZml4ZWQiKSYmZi5pbkFycmF5KCJhdXRvIixbaCxpXSk+LTEsaz17fSxsPXt9LG0sbjtqPyhsPWUucG9zaXRpb24oKSxtPWwudG9wLG49bC5sZWZ0KToobT1wYXJzZUZsb2F0KGgpfHwwLG49cGFyc2VGbG9hdChpKXx8MCksZi5pc0Z1bmN0aW9uKGIpJiYoYj1iLmNhbGwoYSxjLGcpKSxiLnRvcCE9bnVsbCYmKGsudG9wPWIudG9wLWcudG9wK20pLGIubGVmdCE9bnVsbCYmKGsubGVmdD1iLmxlZnQtZy5sZWZ0K24pLCJ1c2luZyJpbiBiP2IudXNpbmcuY2FsbChhLGspOmUuY3NzKGspfX0sZi5mbi5leHRlbmQoe3Bvc2l0aW9uOmZ1bmN0aW9uKCl7aWYoIXRoaXNbMF0pcmV0dXJuIG51bGw7dmFyIGE9dGhpc1swXSxiPXRoaXMub2Zmc2V0UGFyZW50KCksYz10aGlzLm9mZnNldCgpLGQ9Y3oudGVzdChiWzBdLm5vZGVOYW1lKT97dG9wOjAsbGVmdDowfTpiLm9mZnNldCgpO2MudG9wLT1wYXJzZUZsb2F0KGYuY3NzKGEsIm1hcmdpblRvcCIpKXx8MCxjLmxlZnQtPXBhcnNlRmxvYXQoZi5jc3MoYSwibWFyZ2luTGVmdCIpKXx8MCxkLnRvcCs9cGFyc2VGbG9hdChmLmNzcyhiWzBdLCJib3JkZXJUb3BXaWR0aCIpKXx8MCxkLmxlZnQrPXBhcnNlRmxvYXQoZi5jc3MoYlswXSwiYm9yZGVyTGVmdFdpZHRoIikpfHwwO3JldHVybnt0b3A6Yy50b3AtZC50b3AsbGVmdDpjLmxlZnQtZC5sZWZ0fX0sb2Zmc2V0UGFyZW50OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubWFwKGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5vZmZzZXRQYXJlbnR8fGMuYm9keTt3aGlsZShhJiYhY3oudGVzdChhLm5vZGVOYW1lKSYmZi5jc3MoYSwicG9zaXRpb24iKT09PSJzdGF0aWMiKWE9YS5vZmZzZXRQYXJlbnQ7cmV0dXJuIGF9KX19KSxmLmVhY2goWyJMZWZ0IiwiVG9wIl0sZnVuY3Rpb24oYSxjKXt2YXIgZD0ic2Nyb2xsIitjO2YuZm5bZF09ZnVuY3Rpb24oYyl7dmFyIGUsZztpZihjPT09Yil7ZT10aGlzWzBdO2lmKCFlKXJldHVybiBudWxsO2c9Y0EoZSk7cmV0dXJuIGc/InBhZ2VYT2Zmc2V0ImluIGc/Z1thPyJwYWdlWU9mZnNldCI6InBhZ2VYT2Zmc2V0Il06Zi5zdXBwb3J0LmJveE1vZGVsJiZnLmRvY3VtZW50LmRvY3VtZW50RWxlbWVudFtkXXx8Zy5kb2N1bWVudC5ib2R5W2RdOmVbZF19cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe2c9Y0EodGhpcyksZz9nLnNjcm9sbFRvKGE/ZihnKS5zY3JvbGxMZWZ0KCk6YyxhP2M6ZihnKS5zY3JvbGxUb3AoKSk6dGhpc1tkXT1jfSl9fSksZi5lYWNoKFsiSGVpZ2h0IiwiV2lkdGgiXSxmdW5jdGlvbihhLGMpe3ZhciBkPWMudG9Mb3dlckNhc2UoKTtmLmZuWyJpbm5lciIrY109ZnVuY3Rpb24oKXt2YXIgYT10aGlzWzBdO3JldHVybiBhP2Euc3R5bGU/cGFyc2VGbG9hdChmLmNzcyhhLGQsInBhZGRpbmciKSk6dGhpc1tkXSgpOm51bGx9LGYuZm5bIm91dGVyIitjXT1mdW5jdGlvbihhKXt2YXIgYj10aGlzWzBdO3JldHVybiBiP2Iuc3R5bGU/cGFyc2VGbG9hdChmLmNzcyhiLGQsYT8ibWFyZ2luIjoiYm9yZGVyIikpOnRoaXNbZF0oKTpudWxsfSxmLmZuW2RdPWZ1bmN0aW9uKGEpe3ZhciBlPXRoaXNbMF07aWYoIWUpcmV0dXJuIGE9PW51bGw/bnVsbDp0aGlzO2lmKGYuaXNGdW5jdGlvbihhKSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKGIpe3ZhciBjPWYodGhpcyk7Y1tkXShhLmNhbGwodGhpcyxiLGNbZF0oKSkpfSk7aWYoZi5pc1dpbmRvdyhlKSl7dmFyIGc9ZS5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnRbImNsaWVudCIrY10saD1lLmRvY3VtZW50LmJvZHk7cmV0dXJuIGUuZG9jdW1lbnQuY29tcGF0TW9kZT09PSJDU1MxQ29tcGF0IiYmZ3x8aCYmaFsiY2xpZW50IitjXXx8Z31pZihlLm5vZGVUeXBlPT09OSlyZXR1cm4gTWF0aC5tYXgoZS5kb2N1bWVudEVsZW1lbnRbImNsaWVudCIrY10sZS5ib2R5WyJzY3JvbGwiK2NdLGUuZG9jdW1lbnRFbGVtZW50WyJzY3JvbGwiK2NdLGUuYm9keVsib2Zmc2V0IitjXSxlLmRvY3VtZW50RWxlbWVudFsib2Zmc2V0IitjXSk7aWYoYT09PWIpe3ZhciBpPWYuY3NzKGUsZCksaj1wYXJzZUZsb2F0KGkpO3JldHVybiBmLmlzTnVtZXJpYyhqKT9qOml9cmV0dXJuIHRoaXMuY3NzKGQsdHlwZW9mIGE9PSJzdHJpbmciP2E6YSsicHgiKX19KSxhLmpRdWVyeT1hLiQ9Zn0pKHdpbmRvdyk7'></script>
	<script id="fb_extras_modnizr_253_min_js" src='data:/text/plain;base64,LyogTW9kZXJuaXpyIDIuNS4zIChDdXN0b20gQnVpbGQpIHwgTUlUICYgQlNECiAqIEJ1aWxkOiBodHRwOi8vd3d3Lm1vZGVybml6ci5jb20vZG93bmxvYWQvIy1jc3N0cmFuc2Zvcm1zLWNzc3RyYW5zZm9ybXMzZC1zaGl2LWNzc2NsYXNzZXMtdGVzdHN0eWxlcy10ZXN0cHJvcC10ZXN0YWxscHJvcHMtcHJlZml4ZXMtZG9tcHJlZml4ZXMtbG9hZAogKi8KO3dpbmRvdy5Nb2Rlcm5penI9ZnVuY3Rpb24oYSxiLGMpe2Z1bmN0aW9uIHooYSl7ai5jc3NUZXh0PWF9ZnVuY3Rpb24gQShhLGIpe3JldHVybiB6KG0uam9pbihhKyI7IikrKGJ8fCIiKSl9ZnVuY3Rpb24gQihhLGIpe3JldHVybiB0eXBlb2YgYT09PWJ9ZnVuY3Rpb24gQyhhLGIpe3JldHVybiEhfigiIithKS5pbmRleE9mKGIpfWZ1bmN0aW9uIEQoYSxiKXtmb3IodmFyIGQgaW4gYSlpZihqW2FbZF1dIT09YylyZXR1cm4gYj09InBmeCI/YVtkXTohMDtyZXR1cm4hMX1mdW5jdGlvbiBFKGEsYixkKXtmb3IodmFyIGUgaW4gYSl7dmFyIGY9YlthW2VdXTtpZihmIT09YylyZXR1cm4gZD09PSExP2FbZV06QihmLCJmdW5jdGlvbiIpP2YuYmluZChkfHxiKTpmfXJldHVybiExfWZ1bmN0aW9uIEYoYSxiLGMpe3ZhciBkPWEuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkrYS5zdWJzdHIoMSksZT0oYSsiICIrby5qb2luKGQrIiAiKStkKS5zcGxpdCgiICIpO3JldHVybiBCKGIsInN0cmluZyIpfHxCKGIsInVuZGVmaW5lZCIpP0QoZSxiKTooZT0oYSsiICIrcC5qb2luKGQrIiAiKStkKS5zcGxpdCgiICIpLEUoZSxiLGMpKX12YXIgZD0iMi41LjMiLGU9e30sZj0hMCxnPWIuZG9jdW1lbnRFbGVtZW50LGg9Im1vZGVybml6ciIsaT1iLmNyZWF0ZUVsZW1lbnQoaCksaj1pLnN0eWxlLGssbD17fS50b1N0cmluZyxtPSIgLXdlYmtpdC0gLW1vei0gLW8tIC1tcy0gIi5zcGxpdCgiICIpLG49IldlYmtpdCBNb3ogTyBtcyIsbz1uLnNwbGl0KCIgIikscD1uLnRvTG93ZXJDYXNlKCkuc3BsaXQoIiAiKSxxPXt9LHI9e30scz17fSx0PVtdLHU9dC5zbGljZSx2LHc9ZnVuY3Rpb24oYSxjLGQsZSl7dmFyIGYsaSxqLGs9Yi5jcmVhdGVFbGVtZW50KCJkaXYiKSxsPWIuYm9keSxtPWw/bDpiLmNyZWF0ZUVsZW1lbnQoImJvZHkiKTtpZihwYXJzZUludChkLDEwKSl3aGlsZShkLS0paj1iLmNyZWF0ZUVsZW1lbnQoImRpdiIpLGouaWQ9ZT9lW2RdOmgrKGQrMSksay5hcHBlbmRDaGlsZChqKTtyZXR1cm4gZj1bIiYjMTczOyIsIjxzdHlsZT4iLGEsIjwvc3R5bGU+Il0uam9pbigiIiksay5pZD1oLChsP2s6bSkuaW5uZXJIVE1MKz1mLG0uYXBwZW5kQ2hpbGQoayksbHx8KG0uc3R5bGUuYmFja2dyb3VuZD0iIixnLmFwcGVuZENoaWxkKG0pKSxpPWMoayxhKSxsP2sucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChrKTptLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQobSksISFpfSx4PXt9Lmhhc093blByb3BlcnR5LHk7IUIoeCwidW5kZWZpbmVkIikmJiFCKHguY2FsbCwidW5kZWZpbmVkIik/eT1mdW5jdGlvbihhLGIpe3JldHVybiB4LmNhbGwoYSxiKX06eT1mdW5jdGlvbihhLGIpe3JldHVybiBiIGluIGEmJkIoYS5jb25zdHJ1Y3Rvci5wcm90b3R5cGVbYl0sInVuZGVmaW5lZCIpfSxGdW5jdGlvbi5wcm90b3R5cGUuYmluZHx8KEZ1bmN0aW9uLnByb3RvdHlwZS5iaW5kPWZ1bmN0aW9uKGIpe3ZhciBjPXRoaXM7aWYodHlwZW9mIGMhPSJmdW5jdGlvbiIpdGhyb3cgbmV3IFR5cGVFcnJvcjt2YXIgZD11LmNhbGwoYXJndW1lbnRzLDEpLGU9ZnVuY3Rpb24oKXtpZih0aGlzIGluc3RhbmNlb2YgZSl7dmFyIGE9ZnVuY3Rpb24oKXt9O2EucHJvdG90eXBlPWMucHJvdG90eXBlO3ZhciBmPW5ldyBhLGc9Yy5hcHBseShmLGQuY29uY2F0KHUuY2FsbChhcmd1bWVudHMpKSk7cmV0dXJuIE9iamVjdChnKT09PWc/ZzpmfXJldHVybiBjLmFwcGx5KGIsZC5jb25jYXQodS5jYWxsKGFyZ3VtZW50cykpKX07cmV0dXJuIGV9KTt2YXIgRz1mdW5jdGlvbihhLGMpe3ZhciBkPWEuam9pbigiIiksZj1jLmxlbmd0aDt3KGQsZnVuY3Rpb24oYSxjKXt2YXIgZD1iLnN0eWxlU2hlZXRzW2Iuc3R5bGVTaGVldHMubGVuZ3RoLTFdLGc9ZD9kLmNzc1J1bGVzJiZkLmNzc1J1bGVzWzBdP2QuY3NzUnVsZXNbMF0uY3NzVGV4dDpkLmNzc1RleHR8fCIiOiIiLGg9YS5jaGlsZE5vZGVzLGk9e307d2hpbGUoZi0tKWlbaFtmXS5pZF09aFtmXTtlLmNzc3RyYW5zZm9ybXMzZD0oaS5jc3N0cmFuc2Zvcm1zM2QmJmkuY3NzdHJhbnNmb3JtczNkLm9mZnNldExlZnQpPT09OSYmaS5jc3N0cmFuc2Zvcm1zM2Qub2Zmc2V0SGVpZ2h0PT09M30sZixjKX0oWyxbIkBtZWRpYSAoIixtLmpvaW4oInRyYW5zZm9ybS0zZCksKCIpLGgsIikiLCJ7I2Nzc3RyYW5zZm9ybXMzZHtsZWZ0OjlweDtwb3NpdGlvbjphYnNvbHV0ZTtoZWlnaHQ6M3B4O319Il0uam9pbigiIildLFssImNzc3RyYW5zZm9ybXMzZCJdKTtxLmNzc3RyYW5zZm9ybXM9ZnVuY3Rpb24oKXtyZXR1cm4hIUYoInRyYW5zZm9ybSIpfSxxLmNzc3RyYW5zZm9ybXMzZD1mdW5jdGlvbigpe3ZhciBhPSEhRigicGVyc3BlY3RpdmUiKTtyZXR1cm4gYSYmIndlYmtpdFBlcnNwZWN0aXZlImluIGcuc3R5bGUmJihhPWUuY3NzdHJhbnNmb3JtczNkKSxhfTtmb3IodmFyIEggaW4gcSl5KHEsSCkmJih2PUgudG9Mb3dlckNhc2UoKSxlW3ZdPXFbSF0oKSx0LnB1c2goKGVbdl0/IiI6Im5vLSIpK3YpKTtyZXR1cm4geigiIiksaT1rPW51bGwsZnVuY3Rpb24oYSxiKXtmdW5jdGlvbiBnKGEsYil7dmFyIGM9YS5jcmVhdGVFbGVtZW50KCJwIiksZD1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJoZWFkIilbMF18fGEuZG9jdW1lbnRFbGVtZW50O3JldHVybiBjLmlubmVySFRNTD0ieDxzdHlsZT4iK2IrIjwvc3R5bGU+IixkLmluc2VydEJlZm9yZShjLmxhc3RDaGlsZCxkLmZpcnN0Q2hpbGQpfWZ1bmN0aW9uIGgoKXt2YXIgYT1rLmVsZW1lbnRzO3JldHVybiB0eXBlb2YgYT09InN0cmluZyI/YS5zcGxpdCgiICIpOmF9ZnVuY3Rpb24gaShhKXt2YXIgYj17fSxjPWEuY3JlYXRlRWxlbWVudCxlPWEuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCxmPWUoKTthLmNyZWF0ZUVsZW1lbnQ9ZnVuY3Rpb24oYSl7dmFyIGU9KGJbYV18fChiW2FdPWMoYSkpKS5jbG9uZU5vZGUoKTtyZXR1cm4gay5zaGl2TWV0aG9kcyYmZS5jYW5IYXZlQ2hpbGRyZW4mJiFkLnRlc3QoYSk/Zi5hcHBlbmRDaGlsZChlKTplfSxhLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQ9RnVuY3Rpb24oImgsZiIsInJldHVybiBmdW5jdGlvbigpe3ZhciBuPWYuY2xvbmVOb2RlKCksYz1uLmNyZWF0ZUVsZW1lbnQ7aC5zaGl2TWV0aG9kcyYmKCIraCgpLmpvaW4oKS5yZXBsYWNlKC9cdysvZyxmdW5jdGlvbihhKXtyZXR1cm4gYlthXT1jKGEpLGYuY3JlYXRlRWxlbWVudChhKSwnYygiJythKyciKSd9KSsiKTtyZXR1cm4gbn0iKShrLGYpfWZ1bmN0aW9uIGooYSl7dmFyIGI7cmV0dXJuIGEuZG9jdW1lbnRTaGl2ZWQ/YTooay5zaGl2Q1NTJiYhZSYmKGI9ISFnKGEsImFydGljbGUsYXNpZGUsZGV0YWlscyxmaWdjYXB0aW9uLGZpZ3VyZSxmb290ZXIsaGVhZGVyLGhncm91cCxuYXYsc2VjdGlvbntkaXNwbGF5OmJsb2NrfWF1ZGlve2Rpc3BsYXk6bm9uZX1jYW52YXMsdmlkZW97ZGlzcGxheTppbmxpbmUtYmxvY2s7KmRpc3BsYXk6aW5saW5lOyp6b29tOjF9W2hpZGRlbl17ZGlzcGxheTpub25lfWF1ZGlvW2NvbnRyb2xzXXtkaXNwbGF5OmlubGluZS1ibG9jazsqZGlzcGxheTppbmxpbmU7Knpvb206MX1tYXJre2JhY2tncm91bmQ6I0ZGMDtjb2xvcjojMDAwfSIpKSxmfHwoYj0haShhKSksYiYmKGEuZG9jdW1lbnRTaGl2ZWQ9YiksYSl9dmFyIGM9YS5odG1sNXx8e30sZD0vXjx8Xig/OmJ1dHRvbnxmb3JtfG1hcHxzZWxlY3R8dGV4dGFyZWEpJC9pLGUsZjsoZnVuY3Rpb24oKXt2YXIgYT1iLmNyZWF0ZUVsZW1lbnQoImEiKTthLmlubmVySFRNTD0iPHh5ej48L3h5ej4iLGU9ImhpZGRlbiJpbiBhLGY9YS5jaGlsZE5vZGVzLmxlbmd0aD09MXx8ZnVuY3Rpb24oKXt0cnl7Yi5jcmVhdGVFbGVtZW50KCJhIil9Y2F0Y2goYSl7cmV0dXJuITB9dmFyIGM9Yi5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7cmV0dXJuIHR5cGVvZiBjLmNsb25lTm9kZT09InVuZGVmaW5lZCJ8fHR5cGVvZiBjLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQ9PSJ1bmRlZmluZWQifHx0eXBlb2YgYy5jcmVhdGVFbGVtZW50PT0idW5kZWZpbmVkIn0oKX0pKCk7dmFyIGs9e2VsZW1lbnRzOmMuZWxlbWVudHN8fCJhYmJyIGFydGljbGUgYXNpZGUgYXVkaW8gYmRpIGNhbnZhcyBkYXRhIGRhdGFsaXN0IGRldGFpbHMgZmlnY2FwdGlvbiBmaWd1cmUgZm9vdGVyIGhlYWRlciBoZ3JvdXAgbWFyayBtZXRlciBuYXYgb3V0cHV0IHByb2dyZXNzIHNlY3Rpb24gc3VtbWFyeSB0aW1lIHZpZGVvIixzaGl2Q1NTOmMuc2hpdkNTUyE9PSExLHNoaXZNZXRob2RzOmMuc2hpdk1ldGhvZHMhPT0hMSx0eXBlOiJkZWZhdWx0IixzaGl2RG9jdW1lbnQ6an07YS5odG1sNT1rLGooYil9KHRoaXMsYiksZS5fdmVyc2lvbj1kLGUuX3ByZWZpeGVzPW0sZS5fZG9tUHJlZml4ZXM9cCxlLl9jc3NvbVByZWZpeGVzPW8sZS50ZXN0UHJvcD1mdW5jdGlvbihhKXtyZXR1cm4gRChbYV0pfSxlLnRlc3RBbGxQcm9wcz1GLGUudGVzdFN0eWxlcz13LGcuY2xhc3NOYW1lPWcuY2xhc3NOYW1lLnJlcGxhY2UoLyhefFxzKW5vLWpzKFxzfCQpLywiJDEkMiIpKyhmPyIganMgIit0LmpvaW4oIiAiKToiIiksZX0odGhpcyx0aGlzLmRvY3VtZW50KSxmdW5jdGlvbihhLGIsYyl7ZnVuY3Rpb24gZChhKXtyZXR1cm4gby5jYWxsKGEpPT0iW29iamVjdCBGdW5jdGlvbl0ifWZ1bmN0aW9uIGUoYSl7cmV0dXJuIHR5cGVvZiBhPT0ic3RyaW5nIn1mdW5jdGlvbiBmKCl7fWZ1bmN0aW9uIGcoYSl7cmV0dXJuIWF8fGE9PSJsb2FkZWQifHxhPT0iY29tcGxldGUifHxhPT0idW5pbml0aWFsaXplZCJ9ZnVuY3Rpb24gaCgpe3ZhciBhPXAuc2hpZnQoKTtxPTEsYT9hLnQ/bShmdW5jdGlvbigpeyhhLnQ9PSJjIj9CLmluamVjdENzczpCLmluamVjdEpzKShhLnMsMCxhLmEsYS54LGEuZSwxKX0sMCk6KGEoKSxoKCkpOnE9MH1mdW5jdGlvbiBpKGEsYyxkLGUsZixpLGope2Z1bmN0aW9uIGsoYil7aWYoIW8mJmcobC5yZWFkeVN0YXRlKSYmKHUucj1vPTEsIXEmJmgoKSxsLm9ubG9hZD1sLm9ucmVhZHlzdGF0ZWNoYW5nZT1udWxsLGIpKXthIT0iaW1nIiYmbShmdW5jdGlvbigpe3QucmVtb3ZlQ2hpbGQobCl9LDUwKTtmb3IodmFyIGQgaW4geVtjXSl5W2NdLmhhc093blByb3BlcnR5KGQpJiZ5W2NdW2RdLm9ubG9hZCgpfX12YXIgaj1qfHxCLmVycm9yVGltZW91dCxsPXt9LG89MCxyPTAsdT17dDpkLHM6YyxlOmYsYTppLHg6an07eVtjXT09PTEmJihyPTEseVtjXT1bXSxsPWIuY3JlYXRlRWxlbWVudChhKSksYT09Im9iamVjdCI/bC5kYXRhPWM6KGwuc3JjPWMsbC50eXBlPWEpLGwud2lkdGg9bC5oZWlnaHQ9IjAiLGwub25lcnJvcj1sLm9ubG9hZD1sLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpe2suY2FsbCh0aGlzLHIpfSxwLnNwbGljZShlLDAsdSksYSE9ImltZyImJihyfHx5W2NdPT09Mj8odC5pbnNlcnRCZWZvcmUobCxzP251bGw6biksbShrLGopKTp5W2NdLnB1c2gobCkpfWZ1bmN0aW9uIGooYSxiLGMsZCxmKXtyZXR1cm4gcT0wLGI9Ynx8ImoiLGUoYSk/aShiPT0iYyI/djp1LGEsYix0aGlzLmkrKyxjLGQsZik6KHAuc3BsaWNlKHRoaXMuaSsrLDAsYSkscC5sZW5ndGg9PTEmJmgoKSksdGhpc31mdW5jdGlvbiBrKCl7dmFyIGE9QjtyZXR1cm4gYS5sb2FkZXI9e2xvYWQ6aixpOjB9LGF9dmFyIGw9Yi5kb2N1bWVudEVsZW1lbnQsbT1hLnNldFRpbWVvdXQsbj1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzY3JpcHQiKVswXSxvPXt9LnRvU3RyaW5nLHA9W10scT0wLHI9Ik1vekFwcGVhcmFuY2UiaW4gbC5zdHlsZSxzPXImJiEhYi5jcmVhdGVSYW5nZSgpLmNvbXBhcmVOb2RlLHQ9cz9sOm4ucGFyZW50Tm9kZSxsPWEub3BlcmEmJm8uY2FsbChhLm9wZXJhKT09IltvYmplY3QgT3BlcmFdIixsPSEhYi5hdHRhY2hFdmVudCYmIWwsdT1yPyJvYmplY3QiOmw/InNjcmlwdCI6ImltZyIsdj1sPyJzY3JpcHQiOnUsdz1BcnJheS5pc0FycmF5fHxmdW5jdGlvbihhKXtyZXR1cm4gby5jYWxsKGEpPT0iW29iamVjdCBBcnJheV0ifSx4PVtdLHk9e30sej17dGltZW91dDpmdW5jdGlvbihhLGIpe3JldHVybiBiLmxlbmd0aCYmKGEudGltZW91dD1iWzBdKSxhfX0sQSxCO0I9ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhKXt2YXIgYT1hLnNwbGl0KCIhIiksYj14Lmxlbmd0aCxjPWEucG9wKCksZD1hLmxlbmd0aCxjPXt1cmw6YyxvcmlnVXJsOmMscHJlZml4ZXM6YX0sZSxmLGc7Zm9yKGY9MDtmPGQ7ZisrKWc9YVtmXS5zcGxpdCgiPSIpLChlPXpbZy5zaGlmdCgpXSkmJihjPWUoYyxnKSk7Zm9yKGY9MDtmPGI7ZisrKWM9eFtmXShjKTtyZXR1cm4gY31mdW5jdGlvbiBnKGEsZSxmLGcsaSl7dmFyIGo9YihhKSxsPWouYXV0b0NhbGxiYWNrO2oudXJsLnNwbGl0KCIuIikucG9wKCkuc3BsaXQoIj8iKS5zaGlmdCgpLGouYnlwYXNzfHwoZSYmKGU9ZChlKT9lOmVbYV18fGVbZ118fGVbYS5zcGxpdCgiLyIpLnBvcCgpLnNwbGl0KCI/IilbMF1dfHxoKSxqLmluc3RlYWQ/ai5pbnN0ZWFkKGEsZSxmLGcsaSk6KHlbai51cmxdP2oubm9leGVjPSEwOnlbai51cmxdPTEsZi5sb2FkKGoudXJsLGouZm9yY2VDU1N8fCFqLmZvcmNlSlMmJiJjc3MiPT1qLnVybC5zcGxpdCgiLiIpLnBvcCgpLnNwbGl0KCI/Iikuc2hpZnQoKT8iYyI6YyxqLm5vZXhlYyxqLmF0dHJzLGoudGltZW91dCksKGQoZSl8fGQobCkpJiZmLmxvYWQoZnVuY3Rpb24oKXtrKCksZSYmZShqLm9yaWdVcmwsaSxnKSxsJiZsKGoub3JpZ1VybCxpLGcpLHlbai51cmxdPTJ9KSkpfWZ1bmN0aW9uIGkoYSxiKXtmdW5jdGlvbiBjKGEsYyl7aWYoYSl7aWYoZShhKSljfHwoaj1mdW5jdGlvbigpe3ZhciBhPVtdLnNsaWNlLmNhbGwoYXJndW1lbnRzKTtrLmFwcGx5KHRoaXMsYSksbCgpfSksZyhhLGosYiwwLGgpO2Vsc2UgaWYoT2JqZWN0KGEpPT09YSlmb3IobiBpbiBtPWZ1bmN0aW9uKCl7dmFyIGI9MCxjO2ZvcihjIGluIGEpYS5oYXNPd25Qcm9wZXJ0eShjKSYmYisrO3JldHVybiBifSgpLGEpYS5oYXNPd25Qcm9wZXJ0eShuKSYmKCFjJiYhLS1tJiYoZChqKT9qPWZ1bmN0aW9uKCl7dmFyIGE9W10uc2xpY2UuY2FsbChhcmd1bWVudHMpO2suYXBwbHkodGhpcyxhKSxsKCl9Ompbbl09ZnVuY3Rpb24oYSl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGI9W10uc2xpY2UuY2FsbChhcmd1bWVudHMpO2EmJmEuYXBwbHkodGhpcyxiKSxsKCl9fShrW25dKSksZyhhW25dLGosYixuLGgpKX1lbHNlIWMmJmwoKX12YXIgaD0hIWEudGVzdCxpPWEubG9hZHx8YS5ib3RoLGo9YS5jYWxsYmFja3x8ZixrPWosbD1hLmNvbXBsZXRlfHxmLG0sbjtjKGg/YS55ZXA6YS5ub3BlLCEhaSksaSYmYyhpKX12YXIgaixsLG09dGhpcy55ZXBub3BlLmxvYWRlcjtpZihlKGEpKWcoYSwwLG0sMCk7ZWxzZSBpZih3KGEpKWZvcihqPTA7ajxhLmxlbmd0aDtqKyspbD1hW2pdLGUobCk/ZyhsLDAsbSwwKTp3KGwpP0IobCk6T2JqZWN0KGwpPT09bCYmaShsLG0pO2Vsc2UgT2JqZWN0KGEpPT09YSYmaShhLG0pfSxCLmFkZFByZWZpeD1mdW5jdGlvbihhLGIpe3pbYV09Yn0sQi5hZGRGaWx0ZXI9ZnVuY3Rpb24oYSl7eC5wdXNoKGEpfSxCLmVycm9yVGltZW91dD0xZTQsYi5yZWFkeVN0YXRlPT1udWxsJiZiLmFkZEV2ZW50TGlzdGVuZXImJihiLnJlYWR5U3RhdGU9ImxvYWRpbmciLGIuYWRkRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsQT1mdW5jdGlvbigpe2IucmVtb3ZlRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsQSwwKSxiLnJlYWR5U3RhdGU9ImNvbXBsZXRlIn0sMCkpLGEueWVwbm9wZT1rKCksYS55ZXBub3BlLmV4ZWN1dGVTdGFjaz1oLGEueWVwbm9wZS5pbmplY3RKcz1mdW5jdGlvbihhLGMsZCxlLGksail7dmFyIGs9Yi5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKSxsLG8sZT1lfHxCLmVycm9yVGltZW91dDtrLnNyYz1hO2ZvcihvIGluIGQpay5zZXRBdHRyaWJ1dGUobyxkW29dKTtjPWo/aDpjfHxmLGsub25yZWFkeXN0YXRlY2hhbmdlPWsub25sb2FkPWZ1bmN0aW9uKCl7IWwmJmcoay5yZWFkeVN0YXRlKSYmKGw9MSxjKCksay5vbmxvYWQ9ay5vbnJlYWR5c3RhdGVjaGFuZ2U9bnVsbCl9LG0oZnVuY3Rpb24oKXtsfHwobD0xLGMoMSkpfSxlKSxpP2sub25sb2FkKCk6bi5wYXJlbnROb2RlLmluc2VydEJlZm9yZShrLG4pfSxhLnllcG5vcGUuaW5qZWN0Q3NzPWZ1bmN0aW9uKGEsYyxkLGUsZyxpKXt2YXIgZT1iLmNyZWF0ZUVsZW1lbnQoImxpbmsiKSxqLGM9aT9oOmN8fGY7ZS5ocmVmPWEsZS5yZWw9InN0eWxlc2hlZXQiLGUudHlwZT0idGV4dC9jc3MiO2ZvcihqIGluIGQpZS5zZXRBdHRyaWJ1dGUoaixkW2pdKTtnfHwobi5wYXJlbnROb2RlLmluc2VydEJlZm9yZShlLG4pLG0oYywwKSl9fSh0aGlzLGRvY3VtZW50KSxNb2Rlcm5penIubG9hZD1mdW5jdGlvbigpe3llcG5vcGUuYXBwbHkod2luZG93LFtdLnNsaWNlLmNhbGwoYXJndW1lbnRzLDApKX07'></script>
	<script id="fb_lib_hash_js" src='data:/text/plain;base64,LyoqCiAqIGhhc2guanMKICoKICogQ29weXJpZ2h0IChDKSAyMDEyIEVtbWFudWVsIEdhcmNpYQogKiBNSVQgTGljZW5zZWQKICoKICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKiBIYXNoLnB1c2hTdGF0ZSh0cnVlKTsKICoKICogSGFzaC5vbignL3BhZ2UvKFswLTldKykkJywKICoJe3llcDogZnVuY3Rpb24ocGF0aCwgcGFydHMpIHsgfSwgbm9wOiBmdW5jdGlvbigpIHsgfX0sCiAqCSdQYWdlICQxJyk7CiAqCiAqIEhhc2guZ28oJy9wYWdlLzEnKTsKICoqLwoKKGZ1bmN0aW9uKCkgewoKJ3VzZSBzdHJpY3QnOwoKdmFyIGhhc2hlcyA9IHt9LAoJcmVnZXhwID0ge30sCgloaXN0b3J5ID0gW10sCglmcmVxID0gMTAwLAoJbnVtID0gMCwKCXB1c2hTdGF0ZSA9IGZhbHNlLAoJdGltZXIgPSBudWxsLAoJY3VycmVudFVybCA9IG51bGwsCgoJZnJlZXplID0gZnVuY3Rpb24ob2JqKSB7CgkJaWYgKE9iamVjdC5mcmVlemUpIHJldHVybiBPYmplY3QuZnJlZXplKG9iaik7CgkJcmV0dXJuIG9iajsKCX0sCgoJZ2V0SGFzaFBhcnRzID0gZnVuY3Rpb24oKSB7CgkJcmV0dXJuIHdpbmRvdy5sb2NhdGlvbi5ocmVmLnNwbGl0KCcjJyk7Cgl9LAoKCXN0YXJ0VGltZXIgPSBmdW5jdGlvbigpIHsKCQkKCQlpZiAoIXRpbWVyKQoJCQl0aW1lciA9IHNldEludGVydmFsKGZ1bmN0aW9uKCkgewoJCQkJaWYgKG51bT4wICYmIGN1cnJlbnRVcmwhPXdpbmRvdy5sb2NhdGlvbi5ocmVmKSB7CgkJCQkJY3VycmVudFVybCA9IHdpbmRvdy5sb2NhdGlvbi5ocmVmOwoJCQkJCXdpbmRvdy5IYXNoLmNoZWNrKCk7CgkJCQl9CgkJCX0sIGZyZXEpOwoKCX0sCgoJc3RvcFRpbWVyID0gZnVuY3Rpb24oKSB7CgoJCWlmICh0aW1lcikgewoJCQljbGVhckludGVydmFsKHRpbWVyKTsKCQkJdGltZXIgPSBudWxsOwoJCX0KCgl9OwoKd2luZG93Lkhhc2ggPSBmcmVlemUoewoKCQlwdXNoU3RhdGU6IGZ1bmN0aW9uKHllcykgewoKCQkJaWYgKHdpbmRvdy5oaXN0b3J5ICYmIHdpbmRvdy5oaXN0b3J5LnB1c2hTdGF0ZSkKCQkJCXB1c2hTdGF0ZSA9IHllczsKCgkJCXJldHVybiB0aGlzOwoJCX0sCgoJCWZyYWdtZW50OiBmdW5jdGlvbigpIHsKCQkJCgkJCXZhciBoYXNoID0gZ2V0SGFzaFBhcnRzKCk7CgkJCXJldHVybiAocHVzaFN0YXRlKSA/CgkJCQl3aW5kb3cubG9jYXRpb24ucGF0aG5hbWUgKyAoKGhhc2hbMV0pID8gJyMnICsgaGFzaFsxXSA6ICcnKQoJCQkJOiBoYXNoWzFdIHx8ICcnOwoKCQl9LAoJCQoJCWdldDogZnVuY3Rpb24ocGF0aCwgcGFyYW1zKSB7CgkJCQoJCQl2YXIgcCwgZnJhZ21lbnQgPSAnJywgcGFyYW1ldGVycyA9IFtdOwoKCQkJZm9yKHAgaW4gcGFyYW1zKSB7CgkJCQlpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkocCkpCgkJCQkJY29udGludWU7CgkJCQlwYXJhbWV0ZXJzLnB1c2goZW5jb2RlVVJJQ29tcG9uZW50KHApICsgJz0nICsgZW5jb2RlVVJJQ29tcG9uZW50KHBhcmFtc1twXSkpOwoJCQl9CgoJCQlpZiAocGFyYW1ldGVycy5sZW5ndGg+MCkKCQkJCXBhcmFtZXRlcnMgPSAnPycgKyBwYXJhbWV0ZXJzLmpvaW4oJyYnKTsKCQkKCQkJcmV0dXJuIChwdXNoU3RhdGUpID8gcGF0aCArIHBhcmFtZXRlcnMgOgoJCQkJZ2V0SGFzaFBhcnRzKClbMF0gKyAnIycgKyBwYXRoICsgcGFyYW1ldGVyczsKCgkJfSwKCgkJZ286IGZ1bmN0aW9uKGhhc2gsIHBhcmFtcykgewoKCQkJaWYgKHRoaXMuZnJhZ21lbnQoKSE9aGFzaCkgewoJCQkJdmFyIHRvID0gdGhpcy5nZXQoaGFzaCwgcGFyYW1zKTsKCgkJCQlpZiAocHVzaFN0YXRlKQoJCQkJCXdpbmRvdy5oaXN0b3J5LnB1c2hTdGF0ZShudWxsLCBkb2N1bWVudC50aXRsZSwgdG8pOwoJCQkJZWxzZQoJCQkJCXdpbmRvdy5sb2NhdGlvbi5ocmVmID0gdG87CgkJCQl9CgkJCQoJCQlyZXR1cm4gdGhpczsKCQl9LAoKCQl1cGRhdGU6IGZ1bmN0aW9uICgpIHsKCQkJCgkJCWN1cnJlbnRVcmwgPSB3aW5kb3cubG9jYXRpb24uaHJlZjsKCQkJcmV0dXJuIHRoaXM7CgoJCX0sCgoJCW9uOiBmdW5jdGlvbihoYXNoLCBjYWxsYmFjaywgdGl0bGUpIHsKCgkJCWlmICghaGFzaGVzW2hhc2hdKQoJCQkJaGFzaGVzW2hhc2hdID0ge3RpdGxlOiB0aXRsZSwgbGlzdGVuZXJzOiBbXX07CgkJCQoJCQloYXNoZXNbaGFzaF0ubGlzdGVuZXJzLnB1c2goY2FsbGJhY2spOwoJCQludW0rKzsKCQkJc3RhcnRUaW1lcigpOwoKCQkJcmV0dXJuIHRoaXM7CgkJfSwKCgkJY2hlY2s6IGZ1bmN0aW9uKCkgewoKCQkJdmFyIGksCgkJCQloYXNoLAoJCQkJcGFydHMsCgkJCQlmcmFnbWVudCA9IHRoaXMuZnJhZ21lbnQoKTsKCgoJCQlmb3IgKGhhc2ggaW4gaGFzaGVzKSB7CgkJCQlpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChoYXNoZXMsIGhhc2gpKQoJCQkJCWNvbnRpbnVlOwoKCQkJCWhhc2hlc1toYXNoXS5yZWdleHAgPSBoYXNoZXNbaGFzaF0ucmVnZXhwIHx8IG5ldyBSZWdFeHAoaGFzaCk7CgoJCQkJaWYgKChwYXJ0cyA9IGhhc2hlc1toYXNoXS5yZWdleHAuZXhlYyhmcmFnbWVudCkpKSB7CgkJCQkJaWYgKGhhc2hlc1toYXNoXS50aXRsZSkKCQkJCQkJZG9jdW1lbnQudGl0bGUgPSBoYXNoZXNbaGFzaF0udGl0bGU7CgoJCQkJCWZvciAoaSA9IDA7IGk8aGFzaGVzW2hhc2hdLmxpc3RlbmVycy5sZW5ndGg7IGkrKykKCQkJCQkJaWYgKGhhc2hlc1toYXNoXS5saXN0ZW5lcnNbaV0ueWVwKQoJCQkJCQkJaGFzaGVzW2hhc2hdLmxpc3RlbmVyc1tpXS55ZXAoZnJhZ21lbnQsIHBhcnRzKTsKCQkJCX0gZWxzZSB7CgkJCQkJZm9yIChpID0gMDsgaTxoYXNoZXNbaGFzaF0ubGlzdGVuZXJzLmxlbmd0aDsgaSsrKQoJCQkJCQlpZiAoaGFzaGVzW2hhc2hdLmxpc3RlbmVyc1tpXS5ub3ApCgkJCQkJCQloYXNoZXNbaGFzaF0ubGlzdGVuZXJzW2ldLm5vcChmcmFnbWVudCk7CgkJCQl9CgoJCQl9CgoJCQlyZXR1cm4gdGhpczsKCQl9Cn0pOwoKfSkoKTsK'></script>
	<script id="fb_lib_turn_html4_js" src='data:/text/plain;base64,LyoqCiAqIHR1cm4uanMgNHRoIHJlbGVhc2UgSFRNTDQgdmVyc2lvbgogKiB0dXJuanMuY29tCiAqIHR1cm5qcy5jb20vbGljZW5zZS50eHQKICoKICogQ29weXJpZ2h0IChDKSAyMDEyIEVtbWFudWVsIEdhcmNpYQogKiBBbGwgcmlnaHRzIHJlc2VydmVkCiAqKi8KCihmdW5jdGlvbigkKSB7CgondXNlIHN0cmljdCc7Cgp2YXIgaGFzM2QsCgogIHZlbmRvciA9ICcnLAogIAogIHZlcnNpb24gPSAnNC4xLjAnLAoKICBpc1RvdWNoID0gZmFsc2UsCgogIG1vdXNlRXZlbnRzID0KICAgIHsKICAgICAgZG93bjogJ21vdXNlZG93bicsCiAgICAgIG1vdmU6ICdtb3VzZW1vdmUnLAogICAgICB1cDogJ21vdXNldXAnLAogICAgICBvdmVyOiAnbW91c2VvdmVyJywKICAgICAgb3V0OiAnbW91c2VvdXQnCiAgICB9LAoKICBjb3JuZXJzID0gewogICAgYmFja3dhcmQ6IFsnbCddLAogICAgZm9yd2FyZDogWydyJ10sCiAgICBhbGw6IFsnbCcsICdyJ10KICB9LAoKICAvLyBEaXNwbGF5IHZhbHVlcwoKICBkaXNwbGF5cyA9IFsnc2luZ2xlJywgJ2RvdWJsZSddLAoKICAvLyBEaXJlY3Rpb24gdmFsdWVzCgogIGRpcmVjdGlvbnMgPSBbJ2x0cicsICdydGwnXSwKCiAgLy8gRGVmYXVsdCBvcHRpb25zCgogIHR1cm5PcHRpb25zID0gewoKICAgIC8vIEVuYWJsZXMgaGFyZHdhcmUgYWNjZWxlcmF0aW9uCgogICAgYWNjZWxlcmF0aW9uOiB0cnVlLAoKICAgIC8vIERpc3BsYXkKCiAgICBkaXNwbGF5OiAnZG91YmxlJywKCiAgICAvLyBEdXJhdGlvbiBvZiB0cmFuc2l0aW9uIGluIG1pbGxpc2Vjb25kcwoKICAgIGR1cmF0aW9uOiA2MDAsCgogICAgLy8gRmlyc3QgcGFnZQoKICAgIHBhZ2U6IDEsCiAgICAKICAgIC8vIEVuYWJsZXMgZ3JhZGllbnRzCgogICAgZ3JhZGllbnRzOiB0cnVlLAoKICAgIC8vIEV2ZW50cwoKICAgIHdoZW46IG51bGwKICB9LAoKICBmbGlwT3B0aW9ucyA9IHsKCiAgICAvLyBFbmFibGVzIGhhcmR3YXJlIGFjY2VsZXJhdGlvbgoKICAgIGFjY2VsZXJhdGlvbjogdHJ1ZSwKICAgIAogICAgLy8gQ29ybmVycwogICAgLy8gYmFja3dhcmQ6IEFjdGl2YXRlcyBib3RoIHRsIGFuZCBibCBjb3JuZXJzCiAgICAvLyBmb3J3YXJkOiBBY3RpdmF0ZXMgYm90aCB0ciBhbmQgYnIgY29ybmVycwogICAgLy8gYWxsOiBBY3RpdmF0ZXMgYWxsIHRoZSBjb3JuZXJzCgogICAgY29ybmVyczogJ2ZvcndhcmQnLAogICAgCiAgICAvLyBTaXplIG9mIHRoZSBhY3RpdmUgem9uZSBvZiBlYWNoIGNvcm5lcgoKICAgIGNvcm5lclNpemU6IDEwMCwKCgogICAgLy8gRHVyYXRpb24gb2YgdHJhbnNpdGlvbiBpbiBtaWxsaXNlY29uZHMKCiAgICBkdXJhdGlvbjogNjAwLAogICAgCiAgICAvLyBFbmFibGVzIGdyYWRpZW50cwoKICAgIGdyYWRpZW50czogdHJ1ZQoKICB9LAoKICAvLyBOdW1iZXIgb2YgcGFnZXMgaW4gdGhlIERPTSwgbWluaW11bSB2YWx1ZTogNgoKICBwYWdlc0luRE9NID0gNiwKICAKCnR1cm5NZXRob2RzID0gewoKICAvLyBTaW5nbGV0b24gY29uc3RydWN0b3IKICAvLyAkKCcjc2VsZWN0b3InKS50dXJuKFtvcHRpb25zXSk7CgogIGluaXQ6IGZ1bmN0aW9uKG9wdHMpIHsKCiAgICBpZiAodGhpcy5sZW5ndGg+MSkKICAgICAgdGhyb3cgdHVybkVycm9yKCdUaGlzIHNlbGVjdG9yIGhhcyBtb3JlIHRoYW4gMSBlbGVtZW50Jyk7CiAgICAKICAgIC8vIERlZmluZSBjb25zdGFudHMKICAgIAogICAgdmVuZG9yID0gZ2V0UHJlZml4KCk7CgogICAgdmFyIGksIHBhZ2VOdW0gPSAwLCBkYXRhID0gdGhpcy5kYXRhKCksIGNoID0gdGhpcy5jaGlsZHJlbigpOwoKICAgIC8vIFNldCBpbml0aWFsIGNvbmZpZ3VyYXRpb24KCiAgICBvcHRzID0gJC5leHRlbmQoewogICAgICB3aWR0aDogdGhpcy53aWR0aCgpLAogICAgICBoZWlnaHQ6IHRoaXMuaGVpZ2h0KCksCiAgICAgIGRpcmVjdGlvbjogdGhpcy5hdHRyKCdkaXInKSB8fCB0aGlzLmNzcygnZGlyZWN0aW9uJykgfHwgJ2x0cicKICAgIH0sIHR1cm5PcHRpb25zLCBvcHRzKTsKCiAgICBkYXRhLm9wdHMgPSBvcHRzOwogICAgZGF0YS5wYWdlT2JqcyA9IHt9OwogICAgZGF0YS5wYWdlcyA9IHt9OwogICAgZGF0YS5wYWdlV3JhcCA9IHt9OwogICAgZGF0YS5wYWdlUGxhY2UgPSB7fTsKICAgIGRhdGEucGFnZU12ID0gW107CiAgICBkYXRhLnpvb20gPSAxOwogICAgZGF0YS50b3RhbFBhZ2VzID0gb3B0cy5wYWdlcyB8fCAwOwogICAgZGF0YS5kb2NFdmVudHMgPSB7CiAgICAgIG1vdXNlU3RhcnQ6IGZ1bmN0aW9uKGUpIHsKICAgICAgICBmb3IgKHZhciBwYWdlIGluIGRhdGEucGFnZXMpCiAgICAgICAgICBpZiAoaGFzKHBhZ2UsIGRhdGEucGFnZXMpICYmCiAgICAgICAgICAgIGZsaXBNZXRob2RzLl9ldmVudFN0YXJ0LmNhbGwoZGF0YS5wYWdlc1twYWdlXSwgZSk9PT1mYWxzZSkKICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0sCgogICAgICBtb3VzZU1vdmU6IGZ1bmN0aW9uKGUpIHsKICAgICAgICBmb3IgKHZhciBwYWdlIGluIGRhdGEucGFnZXMpCiAgICAgICAgICBpZiAoaGFzKHBhZ2UsIGRhdGEucGFnZXMpKQogICAgICAgICAgICBmbGlwTWV0aG9kcy5fZXZlbnRNb3ZlLmNhbGwoZGF0YS5wYWdlc1twYWdlXSwgZSk7CiAgICAgIH0sCgogICAgICBtb3VzZUVuZDogZnVuY3Rpb24oZSkgewogICAgICAgIGZvciAodmFyIHBhZ2UgaW4gZGF0YS5wYWdlcykKICAgICAgICAgIGlmIChoYXMocGFnZSwgZGF0YS5wYWdlcykpCiAgICAgICAgICAgIGZsaXBNZXRob2RzLl9ldmVudEVuZC5jYWxsKGRhdGEucGFnZXNbcGFnZV0sIGUpOwogICAgICB9CiAgICB9OwoKICAgIC8vIEFkZCBldmVudCBsaXN0ZW5lcnMKCiAgICBpZiAob3B0cy53aGVuKQogICAgICBmb3IgKGkgaW4gb3B0cy53aGVuKQogICAgICAgIGlmIChoYXMoaSwgb3B0cy53aGVuKSkKICAgICAgICAgIHRoaXMuYmluZChpLCBvcHRzLndoZW5baV0pOwoKICAgIC8vIFNldCB0aGUgY3NzCgogICAgdGhpcy5jc3Moe3Bvc2l0aW9uOiAncmVsYXRpdmUnLCB3aWR0aDogb3B0cy53aWR0aCwgaGVpZ2h0OiBvcHRzLmhlaWdodH0pOwoKICAgIC8vIFNldCB0aGUgaW5pdGlhbCBkaXNwbGF5CgogICAgdGhpcy50dXJuKCdkaXNwbGF5Jywgb3B0cy5kaXNwbGF5KTsKCiAgICAvLyBTZXQgdGhlIGRpcmVjdGlvbgoKICAgIGlmIChvcHRzLmRpcmVjdGlvbiE9PScnKQogICAgICB0aGlzLnR1cm4oJ2RpcmVjdGlvbicsIG9wdHMuZGlyZWN0aW9uKTsKCgogICAgLy8gQWRkIHBhZ2VzIGZyb20gdGhlIERPTQoKICAgIGZvciAoaSA9IDA7IGk8Y2gubGVuZ3RoOyBpKyspIHsKICAgICAgaWYgKCQoY2hbaV0pLmF0dHIoJ2lnbm9yZScpIT0nMScpIHsKICAgICAgICB0aGlzLnR1cm4oJ2FkZFBhZ2UnLCBjaFtpXSwgKytwYWdlTnVtKTsKICAgICAgfQogICAgfQoKICAgIC8vIEV2ZW50IGxpc3RlbmVycwoKICAgICQodGhpcykuYmluZChtb3VzZUV2ZW50cy5kb3duLCBkYXRhLmRvY0V2ZW50cy5tb3VzZVN0YXJ0KS4KICAgICAgYmluZCgnc3RhcnQnLCB0dXJuTWV0aG9kcy5fc3RhcnQpLgogICAgICBiaW5kKCdlbmQnLCB0dXJuTWV0aG9kcy5fZW5kKS4KICAgICAgYmluZCgncHJlc3NlZCcsIHR1cm5NZXRob2RzLl9wcmVzc2VkKS4KICAgICAgYmluZCgncmVsZWFzZWQnLCB0dXJuTWV0aG9kcy5fcmVsZWFzZWQpLgogICAgICBiaW5kKCdmbGlwJywgdHVybk1ldGhvZHMuX2ZsaXApOwoKICAgICQoZG9jdW1lbnQpLmJpbmQobW91c2VFdmVudHMubW92ZSwgZGF0YS5kb2NFdmVudHMubW91c2VNb3ZlKS4KICAgICAgYmluZChtb3VzZUV2ZW50cy51cCwgZGF0YS5kb2NFdmVudHMubW91c2VFbmQpOwoKICAgIC8vIFNldCB0aGUgaW5pdGlhbCBwYWdlCgogICAgdGhpcy50dXJuKCdwYWdlJywgb3B0cy5wYWdlKTsKCiAgICBkYXRhLmRvbmUgPSB0cnVlOwoKICAgIHJldHVybiB0aGlzOwogIH0sCgogIC8vIEFkZHMgYSBwYWdlIGZyb20gZXh0ZXJuYWwgZGF0YQoKICBhZGRQYWdlOiBmdW5jdGlvbihlbGVtZW50LCBwYWdlKSB7CgogICAgdmFyIGN1cnJlbnRQYWdlLAogICAgICBjbGFzc05hbWUsCiAgICAgIGluY1BhZ2VzID0gZmFsc2UsCiAgICAgIGRhdGEgPSB0aGlzLmRhdGEoKSwKICAgICAgbGFzdFBhZ2UgPSBkYXRhLnRvdGFsUGFnZXMrMTsKCiAgICBpZiAoZGF0YS5kZXN0cm95aW5nKQogICAgICByZXR1cm4gZmFsc2U7CgogICAgLy8gUmVhZCB0aGUgcGFnZSBudW1iZXIgZnJvbSB0aGUgY2xhc3NOYW1lIG9mIGBlbGVtZW50YCAtIGZvcm1hdDogcFswLTldKwoKICAgIGlmICgoY3VycmVudFBhZ2UgPSAvXGJwKFswLTldKylcYi8uZXhlYygkKGVsZW1lbnQpLmF0dHIoJ2NsYXNzJykpKSkKICAgICAgcGFnZSA9IHBhcnNlSW50KGN1cnJlbnRQYWdlWzFdLCAxMCk7CgogICAgaWYgKHBhZ2UpIHsKICAgICAgCiAgICAgIGlmIChwYWdlPT1sYXN0UGFnZSkKICAgICAgICBpbmNQYWdlcyA9IHRydWU7CiAgICAgIGVsc2UgaWYgKHBhZ2U+bGFzdFBhZ2UpCiAgICAgICAgdGhyb3cgdHVybkVycm9yKCdQYWdlICInK3BhZ2UrJyIgY2Fubm90IGJlIGluc2VydGVkJyk7CgogICAgfSBlbHNlIHsKICAgICAgCiAgICAgIHBhZ2UgPSBsYXN0UGFnZTsKICAgICAgaW5jUGFnZXMgPSB0cnVlOwoKICAgIH0KCiAgICBpZiAocGFnZT49MSAmJiBwYWdlPD1sYXN0UGFnZSkgewoKICAgICAgaWYgKGRhdGEuZGlzcGxheT09J2RvdWJsZScpCiAgICAgICAgY2xhc3NOYW1lID0gKHBhZ2UlMikgPyAnIG9kZCcgOiAnIGV2ZW4nOwogICAgICBlbHNlCiAgICAgICAgY2xhc3NOYW1lID0gJyc7CgogICAgICAvLyBTdG9wIGFuaW1hdGlvbnMKICAgICAgaWYgKGRhdGEuZG9uZSkKICAgICAgICB0aGlzLnR1cm4oJ3N0b3AnKTsKCiAgICAgIC8vIE1vdmUgcGFnZXMgaWYgaXQncyBuZWNlc3NhcnkKICAgICAgaWYgKHBhZ2UgaW4gZGF0YS5wYWdlT2JqcykKICAgICAgICB0dXJuTWV0aG9kcy5fbW92ZVBhZ2VzLmNhbGwodGhpcywgcGFnZSwgMSk7CgogICAgICAvLyBJbmNyZWFzZSB0aGUgbnVtYmVyIG9mIHBhZ2VzCiAgICAgIGlmIChpbmNQYWdlcykKICAgICAgICBkYXRhLnRvdGFsUGFnZXMgPSBsYXN0UGFnZTsKCiAgICAgIC8vIEFkZCBlbGVtZW50CiAgICAgIGRhdGEucGFnZU9ianNbcGFnZV0gPSAkKGVsZW1lbnQpLgogICAgICAgIGNzcyh7J2Zsb2F0JzogJ2xlZnQnfSkuCiAgICAgICAgYWRkQ2xhc3MoJ3BhZ2UgcCcgKyBwYWdlICsgY2xhc3NOYW1lKTsKCiAgICAgIC8vIEFkZCBwYWdlCiAgICAgIHR1cm5NZXRob2RzLl9hZGRQYWdlLmNhbGwodGhpcywgcGFnZSk7CgoKICAgICAgLy8gVXBkYXRlIHZpZXcKICAgICAgaWYgKGRhdGEuZG9uZSkKICAgICAgICB0aGlzLnR1cm4oJ3VwZGF0ZScpOwoKCiAgICAgIC8vIFJlbW92ZSBwYWdlcyBvdXQgb2YgcmFuZ2UKICAgICAgdHVybk1ldGhvZHMuX3JlbW92ZUZyb21ET00uY2FsbCh0aGlzKTsKICAgIH0KCiAgICByZXR1cm4gdGhpczsKICB9LAoKICAvLyBBZGRzIGEgcGFnZQoKICBfYWRkUGFnZTogZnVuY3Rpb24ocGFnZSkgewogICAgCiAgICB2YXIgZGF0YSA9IHRoaXMuZGF0YSgpLAogICAgICBlbGVtZW50ID0gZGF0YS5wYWdlT2Jqc1twYWdlXTsKCiAgICBpZiAoZWxlbWVudCkKICAgICAgaWYgKHR1cm5NZXRob2RzLl9uZWNlc3NQYWdlLmNhbGwodGhpcywgcGFnZSkpIHsKCiAgICAgICAgaWYgKCFkYXRhLnBhZ2VXcmFwW3BhZ2VdKSB7CgogICAgICAgICAgdmFyIHByb3AgPSB0dXJuTWV0aG9kcy5fcGFnZVNpemUuY2FsbCh0aGlzLCBwYWdlLCB0cnVlKTsKCiAgICAgICAgICBlbGVtZW50LmNzcyh7d2lkdGg6IHByb3Aud2lkdGgsIGhlaWdodDogcHJvcC5oZWlnaHR9KTsKCiAgICAgICAgICAvLyBQbGFjZQogICAgICAgICAgZGF0YS5wYWdlUGxhY2VbcGFnZV0gPSBwYWdlOwoKICAgICAgICAgIC8vIFdyYXBwZXIKICAgICAgICAgIGRhdGEucGFnZVdyYXBbcGFnZV0gPSAkKCc8ZGl2Lz4nLAogICAgICAgICAgICB7J2NsYXNzJzogJ3R1cm4tcGFnZS13cmFwcGVyJywKICAgICAgICAgICAgICBwYWdlOiBwYWdlLAogICAgICAgICAgICAgIGNzczoge3Bvc2l0aW9uOiAnYWJzb2x1dGUnLAogICAgICAgICAgICAgIG92ZXJmbG93OiAnaGlkZGVuJ319KS4KICAgICAgICAgICAgY3NzKHByb3ApOwoKICAgICAgICAgIC8vIEFwcGVuZCB0byB0aGlzCiAgICAgICAgICB0aGlzLmFwcGVuZChkYXRhLnBhZ2VXcmFwW3BhZ2VdKTsKCiAgICAgICAgICAvLyBNb3ZlIGVsZW1lbnQgdG8gd3JhcHBlcgogICAgICAgICAgZGF0YS5wYWdlV3JhcFtwYWdlXS5wcmVwZW5kKGRhdGEucGFnZU9ianNbcGFnZV0pOwoKICAgICAgICB9CgogICAgICAgIC8vIElmIHRoZSBwYWdlIGlzIGluIHRoZSBjdXJyZW50IHZpZXcsIGNyZWF0ZSB0aGUgZmxpcCBlZmZlY3QKICAgICAgICBpZiAoIXBhZ2UgfHwgdHVybk1ldGhvZHMuX3NldFBhZ2VMb2MuY2FsbCh0aGlzLCBwYWdlKT09MSkKICAgICAgICAgIHR1cm5NZXRob2RzLl9tYWtlRmxpcC5jYWxsKHRoaXMsIHBhZ2UpOwogICAgICAgIAogICAgICB9IGVsc2UgewoKICAgICAgICAvLyBQbGFjZQogICAgICAgIGRhdGEucGFnZVBsYWNlW3BhZ2VdID0gMDsKCiAgICAgICAgLy8gUmVtb3ZlIGVsZW1lbnQgZnJvbSB0aGUgRE9NCiAgICAgICAgaWYgKGRhdGEucGFnZU9ianNbcGFnZV0pCiAgICAgICAgICBkYXRhLnBhZ2VPYmpzW3BhZ2VdLnJlbW92ZSgpOwoKICAgICAgfQoKICB9LAoKICAvLyBDaGVja3MgaWYgYSBwYWdlIGlzIGluIG1lbW9yeQogIAogIGhhc1BhZ2U6IGZ1bmN0aW9uKHBhZ2UpIHsKCiAgICByZXR1cm4gaGFzKHBhZ2UsIHRoaXMuZGF0YSgpLnBhZ2VPYmpzKTsKICAKICB9LAoKICAvLyBDZW50ZXJzIHRoZSBmbGlwYm9vawoKICBjZW50ZXI6IGZ1bmN0aW9uKHBhZ2UpIHsKICAgIAogICAgdmFyIGRhdGEgPSB0aGlzLmRhdGEoKSwKICAgICAgc2l6ZSA9ICQodGhpcykudHVybignc2l6ZScpLAogICAgICBsZWZ0ID0gc2l6ZS53aWR0aC8oZGF0YS56b29tKjIpIC1zaXplLndpZHRoLzI7CgogICAgaWYgKGRhdGEuZGlzcGxheT09J2RvdWJsZScpIHsKICAgICAgdmFyIHZpZXcgPSB0aGlzLnR1cm4oJ3ZpZXcnLCBwYWdlIHx8IGRhdGEudHBhZ2UgfHwgZGF0YS5wYWdlKTsKCiAgICAgIGlmIChkYXRhLmRpcmVjdGlvbj09J2x0cicpIHsKICAgICAgICBpZiAoIXZpZXdbMF0pCiAgICAgICAgICBsZWZ0IC09IHNpemUud2lkdGgvNDsKICAgICAgICBlbHNlIGlmICghdmlld1sxXSkKICAgICAgICAgIGxlZnQgKz0gc2l6ZS53aWR0aC80OwogICAgICB9IGVsc2UgewogICAgICAgIGlmICghdmlld1swXSkKICAgICAgICAgIGxlZnQgKz0gc2l6ZS53aWR0aC80OwogICAgICAgIGVsc2UgaWYgKCF2aWV3WzFdKQogICAgICAgICAgbGVmdCAtPSBzaXplLndpZHRoLzQ7CiAgICAgIH0KICAgIH0KCiAgICAkKHRoaXMpLmNzcyh7bWFyZ2luTGVmdDogbGVmdH0pOwoKICAgIHJldHVybiB0aGlzOwoKICB9LAoKICAvLyBEZXN0cm95cyB0aGUgZmxpcGJvb2sKCiAgZGVzdHJveTogZnVuY3Rpb24gKCkgewoKICAgIHZhciBwYWdlLAogICAgICBkYXRhID0gdGhpcy5kYXRhKCk7CgogICAgZGF0YS5kZXN0cm95aW5nID0gdHJ1ZTsKCiAgICAkKHRoaXMpLnVuYmluZChtb3VzZUV2ZW50cy5kb3duKQogICAgICAudW5iaW5kKCdlbmQnKQogICAgICAudW5iaW5kKCdmaXJzdCcpCiAgICAgIC51bmJpbmQoJ2ZsaXAnKQogICAgICAudW5iaW5kKCdsYXN0JykKICAgICAgLnVuYmluZCgncHJlc3NlZCcpCiAgICAgIC51bmJpbmQoJ3JlbGVhc2VkJykKICAgICAgLnVuYmluZCgnc3RhcnQnKQogICAgICAudW5iaW5kKCd0dXJuaW5nJykKICAgICAgLnVuYmluZCgndHVybmVkJykKICAgICAgLnVuYmluZCgnem9vbWluZycpOwoKICAgICQoZG9jdW1lbnQpLnVuYmluZChtb3VzZUV2ZW50cy5tb3ZlLCBkYXRhLmRvY0V2ZW50cy5tb3VzZU1vdmUpLgogICAgICB1bmJpbmQobW91c2VFdmVudHMudXAsIGRhdGEuZG9jRXZlbnRzLm1vdXNlRW5kKTsKICAgIAogICAgd2hpbGUgKGRhdGEudG90YWxQYWdlcyE9PTApIHsKICAgICAgdGhpcy50dXJuKCdyZW1vdmVQYWdlJywgZGF0YS50b3RhbFBhZ2VzKTsKICAgIH0KCiAgICBpZiAoZGF0YS5mcGFyZW50KQogICAgICBkYXRhLmZwYXJlbnQucmVtb3ZlKCk7CgogICAgaWYgKGRhdGEuc2hhZG93KQogICAgICBkYXRhLnNoYWRvdy5yZW1vdmUoKTsKCiAgICB0aGlzLnJlbW92ZURhdGEoKTsKICAgIGRhdGEgPSBudWxsOwoKICAgIHJldHVybiB0aGlzOwoKICB9LAoKICAvLyBDaGVja3MgaWYgdGhpcyBlbGVtZW50IGlzIGEgZmxpcGJvb2sKCiAgaXM6IGZ1bmN0aW9uKCkgewoKICAgIHJldHVybiB0eXBlb2YodGhpcy5kYXRhKCkucGFnZXMpPT0nb2JqZWN0JzsKCiAgfSwKCiAgLy8gU2V0cyBhbmQgZ2V0cyB0aGUgem9vbSB2YWx1ZQoKICB6b29tOiBmdW5jdGlvbihuZXdab29tKSB7CiAgICAKICAgIHZhciBkYXRhID0gdGhpcy5kYXRhKCk7CgogICAgaWYgKHR5cGVvZihuZXdab29tKT09J251bWJlcicpIHsKCiAgICAgIGlmIChuZXdab29tPDAuMDAxIHx8IG5ld1pvb20+MTAwKQogICAgICAgIHRocm93IHR1cm5FcnJvcihuZXdab29tKyAnIGlzIG5vdCBhIHZhbHVlIGZvciB6b29tJyk7CiAgICAKICAgICAgdmFyIGV2ZW50ID0gJC5FdmVudCgnem9vbWluZycpOwogICAgICB0aGlzLnRyaWdnZXIoZXZlbnQsIFtuZXdab29tLCBkYXRhLnpvb21dKTsKCiAgICAgIGlmIChldmVudC5pc0RlZmF1bHRQcmV2ZW50ZWQoKSkKICAgICAgICByZXR1cm4gdGhpczsKICAgICAgCiAgICAgIHZhciBzaXplID0gJCh0aGlzKS50dXJuKCdzaXplJyksCiAgICAgICAgaXogPSAxL2RhdGEuem9vbSwKICAgICAgICBuZXdXaWR0aCA9IE1hdGgucm91bmQoc2l6ZS53aWR0aCAqIGl6ICogbmV3Wm9vbSksCiAgICAgICAgbmV3SGVpZ2h0ID0gTWF0aC5yb3VuZChzaXplLmhlaWdodCAqIGl6ICogbmV3Wm9vbSk7CiAgICAKICAgICAgZGF0YS56b29tID0gbmV3Wm9vbTsKCiAgICAgICQodGhpcykudHVybignc3RvcCcpLgogICAgICAgIHR1cm4oJ3NpemUnLCBuZXdXaWR0aCwgbmV3SGVpZ2h0KS4KICAgICAgICBjc3Moe21hcmdpblRvcDogc2l6ZS5oZWlnaHQgKiBpeiAvIDIgLSBuZXdIZWlnaHQgLyAyfSk7CgogICAgICBpZiAoZGF0YS5vcHRzLmF1dG9DZW50ZXIpCiAgICAgICAgdGhpcy50dXJuKCdjZW50ZXInKTsKICAgICAgZWxzZQogICAgICAgICQodGhpcykuY3NzKHttYXJnaW5MZWZ0OiBzaXplLndpZHRoICogaXogLyAyIC0gbmV3V2lkdGggLyAyfSk7CiAgICAgIAogICAgICB0dXJuTWV0aG9kcy5fdXBkYXRlU2hhZG93LmNhbGwodGhpcyk7CiAgCiAgICAgIHJldHVybiB0aGlzOwoKICAgIH0gZWxzZQogICAgICByZXR1cm4gZGF0YS56b29tOwoKICB9LAoKICAvLyBHZXRzIHRoZSBzaXplIG9mIGEgcGFnZQoKICBfcGFnZVNpemU6IGZ1bmN0aW9uKHBhZ2UsIHBvc2l0aW9uKSB7CgogICAgdmFyIGRhdGEgPSB0aGlzLmRhdGEoKSwKICAgICAgcHJvcCA9IHt9OwoKICAgIGlmIChkYXRhLmRpc3BsYXk9PSdzaW5nbGUnKSB7CgogICAgICBwcm9wLndpZHRoID0gdGhpcy53aWR0aCgpOwogICAgICBwcm9wLmhlaWdodCA9IHRoaXMuaGVpZ2h0KCk7CgogICAgICBpZiAocG9zaXRpb24pIHsKICAgICAgICBwcm9wLnRvcCA9IDA7CiAgICAgICAgcHJvcC5sZWZ0ID0gMDsKICAgICAgICBwcm9wLnJpZ2h0ID0gJ2F1dG8nOwogICAgICB9CgogICAgfSBlbHNlIHsKCiAgICAgIHZhciBwYWdlV2lkdGggPSB0aGlzLndpZHRoKCkvMiwKICAgICAgICBwYWdlSGVpZ2h0ID0gdGhpcy5oZWlnaHQoKTsKCiAgICAgIGlmIChkYXRhLnBhZ2VPYmpzW3BhZ2VdLmhhc0NsYXNzKCdvd24tc2l6ZScpKSB7CiAgICAgICAgcHJvcC53aWR0aCA9IGRhdGEucGFnZU9ianNbcGFnZV0ud2lkdGgoKTsKICAgICAgICBwcm9wLmhlaWdodCA9IGRhdGEucGFnZU9ianNbcGFnZV0uaGVpZ2h0KCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcHJvcC53aWR0aCA9IHBhZ2VXaWR0aDsKICAgICAgICBwcm9wLmhlaWdodCA9IHBhZ2VIZWlnaHQ7CiAgICAgIH0KCiAgICAgIGlmIChwb3NpdGlvbikgewogICAgICAgIHZhciBvZGQgPSBwYWdlJTI7CiAgICAgICAgcHJvcC50b3AgPSAocGFnZUhlaWdodC1wcm9wLmhlaWdodCkvMjsKCiAgICAgICAgaWYgKGRhdGEuZGlyZWN0aW9uPT0nbHRyJykgewogICAgICAgICAgCiAgICAgICAgICBwcm9wWyhvZGQpID8gJ3JpZ2h0JyA6ICdsZWZ0J10gPSBwYWdlV2lkdGgtcHJvcC53aWR0aDsKICAgICAgICAgIHByb3BbKG9kZCkgPyAnbGVmdCcgOiAncmlnaHQnXSA9ICdhdXRvJzsKCiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIAogICAgICAgICAgcHJvcFsob2RkKSA/ICdsZWZ0JyA6ICdyaWdodCddID0gcGFnZVdpZHRoLXByb3Aud2lkdGg7CiAgICAgICAgICBwcm9wWyhvZGQpID8gJ3JpZ2h0JyA6ICdsZWZ0J10gPSAnYXV0byc7CgogICAgICAgIH0KCiAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gcHJvcDsKCiAgfSwKCiAgLy8gUHJlcGFyZXMgdGhlIGZsaXAgZWZmZWN0IGZvciBhIHBhZ2UKCiAgX21ha2VGbGlwOiBmdW5jdGlvbihwYWdlKSB7CgogICAgdmFyIGRhdGEgPSB0aGlzLmRhdGEoKTsKCiAgICBpZiAoIWRhdGEucGFnZXNbcGFnZV0gJiYgZGF0YS5wYWdlUGxhY2VbcGFnZV09PXBhZ2UpIHsKICAgICAgdmFyIGNvcm5lciwKICAgICAgICBzaW5nbGUgPSBkYXRhLmRpc3BsYXk9PSdzaW5nbGUnLAogICAgICAgIG9kZCA9IHBhZ2UlMjsKCiAgICAgIGRhdGEucGFnZXNbcGFnZV0gPSBkYXRhLnBhZ2VPYmpzW3BhZ2VdLgogICAgICAgIGNzcyh0dXJuTWV0aG9kcy5fcGFnZVNpemUuY2FsbCh0aGlzLCBwYWdlKSkuCiAgICAgICAgZmxpcCh7cGFnZTogcGFnZSwKICAgICAgICAgIG5leHQ6IChvZGQgfHwgc2luZ2xlKSA/IHBhZ2UrMSA6IHBhZ2UtMSwKICAgICAgICAgIHR1cm46IHRoaXMsCiAgICAgICAgICBkdXJhdGlvbjogZGF0YS5vcHRzLmR1cmF0aW9uLAogICAgICAgICAgYWNjZWxlcmF0aW9uIDogZGF0YS5vcHRzLmFjY2VsZXJhdGlvbiwKICAgICAgICAgIGdyYWRpZW50czogZGF0YS5vcHRzLmdyYWRpZW50cwogICAgICAgICAgfSkuCiAgICAgICAgICBmbGlwKCdkaXNhYmxlJywgZGF0YS5kaXNhYmxlZCk7CiAgICB9CgogICAgcmV0dXJuIGRhdGEucGFnZXNbcGFnZV07CiAgfSwKCiAgLy8gTWFrZXMgcGFnZXMgd2l0aGluIGEgcmFuZ2UKCiAgX21ha2VSYW5nZTogZnVuY3Rpb24oKSB7CgogICAgdmFyIHBhZ2UsIHJhbmdlLAogICAgICBkYXRhID0gdGhpcy5kYXRhKCk7CgogICAgaWYgKGRhdGEudG90YWxQYWdlczwxKQogICAgICByZXR1cm47CgogICAgcmFuZ2UgPSB0aGlzLnR1cm4oJ3JhbmdlJyk7CgogICAgZm9yIChwYWdlID0gcmFuZ2VbMF07IHBhZ2U8PXJhbmdlWzFdOyBwYWdlKyspCiAgICAgIHR1cm5NZXRob2RzLl9hZGRQYWdlLmNhbGwodGhpcywgcGFnZSk7CgogIH0sCgogIC8vIFJldHVybnMgYSByYW5nZSBvZiBwYWdlcyB0aGF0IHNob3VsZCBiZSBpbiB0aGUgRE9NCiAgLy8gRXhhbXBsZToKICAvLyAtIHBhZ2UgaW4gdGhlIGN1cnJlbnQgdmlldywgcmV0dXJuIHRydWUKICAvLyAqIHBhZ2UgaXMgaW4gdGhlIHJhbmdlLCByZXR1cm4gdHJ1ZQogIC8vIE90aGVyd2lzZSwgcmV0dXJuIGZhbHNlCiAgLy8KICAvLyAxIDItMyA0LTUgNi03IDgtOSAxMC0xMSAxMi0xMwogIC8vICAgKiogICoqICAtLSAgICoqICAqKgoKICByYW5nZTogZnVuY3Rpb24ocGFnZSkgewoKICAgIHZhciByZW1haW5pbmdQYWdlcywgbGVmdCwgcmlnaHQsIHZpZXcsCiAgICAgIGRhdGEgPSB0aGlzLmRhdGEoKTsKCgogICAgICBwYWdlID0gcGFnZSB8fCBkYXRhLnRwYWdlIHx8IGRhdGEucGFnZSB8fCAxOwogICAgICB2aWV3ID0gdHVybk1ldGhvZHMuX3ZpZXcuY2FsbCh0aGlzLCBwYWdlKTsKCiAgICAgIGlmIChwYWdlPDEgfHwgcGFnZT5kYXRhLnRvdGFsUGFnZXMpCiAgICAgICAgdGhyb3cgdHVybkVycm9yKCciJytwYWdlKyciIGlzIG5vdCBhIHBhZ2UgZm9yIHJhbmdlJyk7CiAgICAKICAgICAgdmlld1sxXSA9IHZpZXdbMV0gfHwgdmlld1swXTsKICAgICAgCiAgICAgIGlmICh2aWV3WzBdPj0xICYmIHZpZXdbMV08PWRhdGEudG90YWxQYWdlcykgewoKICAgICAgICByZW1haW5pbmdQYWdlcyA9IE1hdGguZmxvb3IoKHBhZ2VzSW5ET00tMikvMik7CgogICAgICAgIGlmIChkYXRhLnRvdGFsUGFnZXMtdmlld1sxXSA+IHZpZXdbMF0pIHsKICAgICAgICAgIGxlZnQgPSBNYXRoLm1pbih2aWV3WzBdLTEsIHJlbWFpbmluZ1BhZ2VzKTsKICAgICAgICAgIHJpZ2h0ID0gMipyZW1haW5pbmdQYWdlcy1sZWZ0OwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICByaWdodCA9IE1hdGgubWluKGRhdGEudG90YWxQYWdlcy12aWV3WzFdLCByZW1haW5pbmdQYWdlcyk7CiAgICAgICAgICBsZWZ0ID0gMipyZW1haW5pbmdQYWdlcy1yaWdodDsKICAgICAgICB9CgogICAgICB9IGVsc2UgewogICAgICAgIGxlZnQgPSBwYWdlc0luRE9NLTE7CiAgICAgICAgcmlnaHQgPSBwYWdlc0luRE9NLTE7CiAgICAgIH0KCiAgICAgIHJldHVybiBbTWF0aC5tYXgoMSwgdmlld1swXS1sZWZ0KSwKICAgICAgICAgIE1hdGgubWluKGRhdGEudG90YWxQYWdlcywgdmlld1sxXStyaWdodCldOwoKICB9LAoKICAvLyBEZXRlY3RzIGlmIGEgcGFnZSBpcyB3aXRoaW4gdGhlIHJhbmdlIG9mIGBwYWdlc0luRE9NYCBmcm9tIHRoZSBjdXJyZW50IHZpZXcKCiAgX25lY2Vzc1BhZ2U6IGZ1bmN0aW9uKHBhZ2UpIHsKICAgIAogICAgaWYgKHBhZ2U9PT0wKQogICAgICByZXR1cm4gdHJ1ZTsKCiAgICB2YXIgZGF0YSA9IHRoaXMuZGF0YSgpLAogICAgICByYW5nZSA9IHRoaXMudHVybigncmFuZ2UnKTsKCiAgICByZXR1cm4gZGF0YS5wYWdlT2Jqc1twYWdlXS5oYXNDbGFzcygnZml4ZWQnKSB8fAogICAgICAocGFnZT49cmFuZ2VbMF0gJiYgcGFnZTw9cmFuZ2VbMV0pOwogICAgCiAgfSwKCiAgLy8gUmVsZWFzZXMgbWVtb3J5IGJ5IHJlbW92aW5nIHBhZ2VzIGZyb20gdGhlIERPTQoKICBfcmVtb3ZlRnJvbURPTTogZnVuY3Rpb24oKSB7CgogICAgdmFyIHBhZ2UsIGRhdGEgPSB0aGlzLmRhdGEoKTsKCiAgICBmb3IgKHBhZ2UgaW4gZGF0YS5wYWdlV3JhcCkKICAgICAgaWYgKGhhcyhwYWdlLCBkYXRhLnBhZ2VXcmFwKSAmJgogICAgICAgICF0dXJuTWV0aG9kcy5fbmVjZXNzUGFnZS5jYWxsKHRoaXMsIHBhZ2UpKQogICAgICB0dXJuTWV0aG9kcy5fcmVtb3ZlUGFnZUZyb21ET00uY2FsbCh0aGlzLCBwYWdlKTsKICAgIAogIH0sCgogIC8vIFJlbW92ZXMgYSBwYWdlIGZyb20gRE9NIGFuZCBpdHMgaW50ZXJuYWwgcmVmZXJlbmNlcwoKICBfcmVtb3ZlUGFnZUZyb21ET006IGZ1bmN0aW9uKHBhZ2UpIHsKCiAgICB2YXIgZGF0YSA9IHRoaXMuZGF0YSgpOwoKICAgIGlmIChkYXRhLnBhZ2VzW3BhZ2VdKSB7CiAgICAgIHZhciBkZCA9IGRhdGEucGFnZXNbcGFnZV0uZGF0YSgpOwoKICAgICAgZmxpcE1ldGhvZHMuX21vdmVGb2xkaW5nUGFnZS5jYWxsKGRhdGEucGFnZXNbcGFnZV0sIGZhbHNlKTsKCiAgICAgIGlmIChkZC5mICYmIGRkLmYuZndyYXBwZXIpCiAgICAgICAgZGQuZi5md3JhcHBlci5yZW1vdmUoKTsKCiAgICAgIGRhdGEucGFnZXNbcGFnZV0ucmVtb3ZlRGF0YSgpOwogICAgICBkYXRhLnBhZ2VzW3BhZ2VdLnJlbW92ZSgpOwogICAgICBkZWxldGUgZGF0YS5wYWdlc1twYWdlXTsKICAgIH0KCiAgICBpZiAoZGF0YS5wYWdlT2Jqc1twYWdlXSkKICAgICAgZGF0YS5wYWdlT2Jqc1twYWdlXS5yZW1vdmUoKTsKCiAgICBpZiAoZGF0YS5wYWdlV3JhcFtwYWdlXSkgewogICAgICBkYXRhLnBhZ2VXcmFwW3BhZ2VdLnJlbW92ZSgpOwogICAgICBkZWxldGUgZGF0YS5wYWdlV3JhcFtwYWdlXTsKICAgIH0KCiAgICBkZWxldGUgZGF0YS5wYWdlUGxhY2VbcGFnZV07CgogIH0sCgogIC8vIFJlbW92ZXMgYSBwYWdlCgogIHJlbW92ZVBhZ2U6IGZ1bmN0aW9uKHBhZ2UpIHsKCiAgICB2YXIgZGF0YSA9IHRoaXMuZGF0YSgpOwoKICAgIGlmIChwYWdlPDEgfHwgcGFnZT5kYXRhLnRvdGFsUGFnZXMpCiAgICAgIHRocm93IHR1cm5FcnJvcignVGhlIHBhZ2UgJysgcGFnZSArICcgZG9lc25cJ3QgZXhpc3QnKTsKICAgICAgCiAgICBpZiAoZGF0YS5wYWdlT2Jqc1twYWdlXSkgewoKICAgICAgLy8gU3RvcCBhbmltYXRpb25zCiAgICAgIHRoaXMudHVybignc3RvcCcpOwoKICAgICAgLy8gUmVtb3ZlIGBwYWdlYAogICAgICB0dXJuTWV0aG9kcy5fcmVtb3ZlUGFnZUZyb21ET00uY2FsbCh0aGlzLCBwYWdlKTsKICAgICAgZGVsZXRlIGRhdGEucGFnZU9ianNbcGFnZV07CgogICAgfQoKICAgIC8vIE1vdmUgdGhlIHBhZ2VzIGJlaGluZCBgcGFnZWAKICAgIHR1cm5NZXRob2RzLl9tb3ZlUGFnZXMuY2FsbCh0aGlzLCBwYWdlLCAtMSk7CgogICAgLy8gUmVzaXplIHRoZSBzaXplIG9mIHRoaXMgZmxpcGJvb2sKICAgIGRhdGEudG90YWxQYWdlcyA9IGRhdGEudG90YWxQYWdlcy0xOwoKICAgIC8vIENoZWNrIHRoZSBjdXJyZW50IHZpZXcKCiAgICBpZiAoZGF0YS5wYWdlPmRhdGEudG90YWxQYWdlcykKICAgICAgdGhpcy50dXJuKCdwYWdlJywgZGF0YS50b3RhbFBhZ2VzKTsKICAgIGVsc2UKICAgICAgdHVybk1ldGhvZHMuX21ha2VSYW5nZS5jYWxsKHRoaXMpOwoKICAgIHJldHVybiB0aGlzOwogIAogIH0sCgogIC8vIE1vdmVzIHBhZ2VzCgogIF9tb3ZlUGFnZXM6IGZ1bmN0aW9uKGZyb20sIGNoYW5nZSkgewoKICAgIHZhciBwYWdlLAogICAgICB0aGF0ID0gdGhpcywKICAgICAgZGF0YSA9IHRoaXMuZGF0YSgpLAogICAgICBzaW5nbGUgPSBkYXRhLmRpc3BsYXk9PSdzaW5nbGUnLAogICAgICBtb3ZlID0gZnVuY3Rpb24ocGFnZSkgewoKICAgICAgICB2YXIgbmV4dCA9IHBhZ2UgKyBjaGFuZ2UsCiAgICAgICAgICBvZGQgPSBuZXh0JTIsCiAgICAgICAgICBjbGFzc05hbWUgPSAob2RkKSA/ICcgb2RkICcgOiAnIGV2ZW4gJzsKCiAgICAgICAgaWYgKGRhdGEucGFnZU9ianNbcGFnZV0pCiAgICAgICAgICBkYXRhLnBhZ2VPYmpzW25leHRdID0gZGF0YS5wYWdlT2Jqc1twYWdlXQogICAgICAgICAgICAucmVtb3ZlQ2xhc3MoJ3AnICsgcGFnZSArICcgb2RkIGV2ZW4nKQogICAgICAgICAgICAuYWRkQ2xhc3MoJ3AnICsgbmV4dCArIGNsYXNzTmFtZSk7CgogICAgICAgIGlmIChkYXRhLnBhZ2VQbGFjZVtwYWdlXSAmJiBkYXRhLnBhZ2VXcmFwW3BhZ2VdKSB7CiAgICAgICAgICBkYXRhLnBhZ2VQbGFjZVtuZXh0XSA9IG5leHQ7CiAgICAgICAgCiAgICAgICAgaWYgKGRhdGEucGFnZU9ianNbbmV4dF0uaGFzQ2xhc3MoJ2ZpeGVkJykpCiAgICAgICAgICBkYXRhLnBhZ2VXcmFwW25leHRdID0gZGF0YS5wYWdlV3JhcFtwYWdlXQogICAgICAgICAgICAuYXR0cigncGFnZScsIG5leHQpOwogICAgICAgIGVsc2UKICAgICAgICAgIGRhdGEucGFnZVdyYXBbbmV4dF0gPSBkYXRhLnBhZ2VXcmFwW3BhZ2VdLgogICAgICAgICAgICBjc3ModHVybk1ldGhvZHMuX3BhZ2VTaXplLmNhbGwodGhhdCwgbmV4dCwgdHJ1ZSkpLgogICAgICAgICAgICBhdHRyKCdwYWdlJywgbmV4dCk7CiAgICAKICAgICAgICAgIGlmIChkYXRhLnBhZ2VzW3BhZ2VdKQogICAgICAgICAgICBkYXRhLnBhZ2VzW25leHRdID0gZGF0YS5wYWdlc1twYWdlXQogICAgICAgICAgICAgIC5mbGlwKCdvcHRpb25zJywgewogICAgICAgICAgICAgICAgcGFnZTogbmV4dCwKICAgICAgICAgICAgICAgIG5leHQ6IChzaW5nbGUgfHwgb2RkKSA/IG5leHQrMSA6IG5leHQtMSwKICAgICAgICAgICAgICAgIGNvcm5lcnM6IChzaW5nbGUpID8gJ2FsbCcgOgogICAgICAgICAgICAgICAgICAoKG9kZCkgPyAnZm9yd2FyZCcgOiAnYmFja3dhcmQnKQogICAgICAgICAgICAgIH0pOwoKICAgICAgICAgIGlmIChjaGFuZ2UpIHsKICAgICAgICAgICAgZGVsZXRlIGRhdGEucGFnZXNbcGFnZV07CiAgICAgICAgICAgIGRlbGV0ZSBkYXRhLnBhZ2VQbGFjZVtwYWdlXTsKICAgICAgICAgICAgZGVsZXRlIGRhdGEucGFnZU9ianNbcGFnZV07CiAgICAgICAgICAgIGRlbGV0ZSBkYXRhLnBhZ2VXcmFwW3BhZ2VdOwogICAgICAgICAgICBkZWxldGUgZGF0YS5wYWdlT2Jqc1twYWdlXTsKICAgICAgICAgIH0KICAgICAgfQogICAgfTsKCiAgICBpZiAoY2hhbmdlPjApCiAgICAgIGZvciAocGFnZT1kYXRhLnRvdGFsUGFnZXM7IHBhZ2U+PWZyb207IHBhZ2UtLSkKICAgICAgICBtb3ZlKHBhZ2UpOwogICAgZWxzZQogICAgICBmb3IgKHBhZ2U9ZnJvbTsgcGFnZTw9ZGF0YS50b3RhbFBhZ2VzOyBwYWdlKyspCiAgICAgICAgbW92ZShwYWdlKTsKCiAgfSwKCiAgLy8gU2V0cyBvciBHZXRzIHRoZSBkaXNwbGF5IG1vZGUKCiAgZGlzcGxheTogZnVuY3Rpb24oZGlzcGxheSkgewoKICAgIHZhciBkYXRhID0gdGhpcy5kYXRhKCksCiAgICAgIGN1cnJlbnREaXNwbGF5ID0gZGF0YS5kaXNwbGF5OwoKICAgIGlmIChkaXNwbGF5KSB7CgogICAgICBpZiAoJC5pbkFycmF5KGRpc3BsYXksIGRpc3BsYXlzKT09LTEpCiAgICAgICAgdGhyb3cgdHVybkVycm9yKCciJytkaXNwbGF5ICsgJyIgaXMgbm90IGEgdmFsdWUgZm9yIGRpc3BsYXknKTsKICAgICAgCiAgICAgIGlmIChkaXNwbGF5PT0nc2luZ2xlJykgewogICAgICAgIGlmICghZGF0YS5wYWdlT2Jqc1swXSkgewoKICAgICAgICAgIHRoaXMudHVybignc3RvcCcpLgogICAgICAgICAgICBjc3MoeydvdmVyZmxvdyc6ICdoaWRkZW4nfSk7CgogICAgICAgICAgZGF0YS5wYWdlT2Jqc1swXSA9ICQoJzxkaXYgLz4nLAogICAgICAgICAgICAgIHsnY2xhc3MnOiAncGFnZSBwLXRlbXBvcmFsJ30pLgogICAgICAgICAgICBjc3Moe3dpZHRoOiB0aGlzLndpZHRoKCksIGhlaWdodDogdGhpcy5oZWlnaHQoKX0pLgogICAgICAgICAgICBhcHBlbmRUbyh0aGlzKTsKCiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIGlmIChkYXRhLnBhZ2VPYmpzWzBdKSB7CiAgICAgICAgICB0aGlzLnR1cm4oJ3N0b3AnKS5jc3MoeydvdmVyZmxvdyc6ICcnfSk7CiAgICAgICAgICBkYXRhLnBhZ2VPYmpzWzBdLnJlbW92ZSgpOwogICAgICAgICAgZGVsZXRlIGRhdGEucGFnZU9ianNbMF07CiAgICAgICAgfQogICAgICB9CgogICAgICBkYXRhLmRpc3BsYXkgPSBkaXNwbGF5OwoKICAgICAgaWYgKGN1cnJlbnREaXNwbGF5KSB7CiAgICAgICAgdmFyIHNpemUgPSB0aGlzLnR1cm4oJ3NpemUnKTsKICAgICAgICB0dXJuTWV0aG9kcy5fbW92ZVBhZ2VzLmNhbGwodGhpcywgMSwgMCk7CiAgICAgICAgdGhpcy50dXJuKCdzaXplJywgc2l6ZS53aWR0aCwgc2l6ZS5oZWlnaHQpLgogICAgICAgICAgdHVybigndXBkYXRlJyk7CiAgICAgIH0KCiAgICAgIHJldHVybiB0aGlzOwoKICAgIH0gZWxzZQogICAgICByZXR1cm4gY3VycmVudERpc3BsYXk7CiAgCiAgfSwKCiAgLy8gR2V0cyBhbmQgc2V0cyB0aGUgZGlyZWN0aW9uIG9mIHRoZSBmbGlwYm9vawoKICBkaXJlY3Rpb246IGZ1bmN0aW9uKGRpcikgewoKICAgIHZhciBkYXRhID0gdGhpcy5kYXRhKCk7CgogICAgaWYgKHR5cGVvZihkaXIpPT0ndW5kZWZpbmVkJykgewoKICAgICAgcmV0dXJuIGRhdGEuZGlyZWN0aW9uOwoKICAgIH0gZWxzZSB7CgogICAgICBkaXIgPSBkaXIudG9Mb3dlckNhc2UoKTsKCiAgICAgIGlmICgkLmluQXJyYXkoZGlyLCBkaXJlY3Rpb25zKT09LTEpCiAgICAgICAgdGhyb3cgdHVybkVycm9yKCciJyArIGRpciArICciIGlzIG5vdCBhIHZhbHVlIGZvciBkaXJlY3Rpb24nKTsKCiAgICAgIGlmIChkaXI9PSdydGwnKSB7CiAgICAgICAgJCh0aGlzKS5hdHRyKCdkaXInLCAnbHRyJykuCiAgICAgICAgICBjc3Moe2RpcmVjdGlvbjogJ2x0cid9KTsKICAgICAgfQoKICAgICAgZGF0YS5kaXJlY3Rpb24gPSBkaXI7CgogICAgICBpZiAoZGF0YS5kb25lKQogICAgICAgIHRoaXMudHVybignc2l6ZScsICQodGhpcykud2lkdGgoKSwgJCh0aGlzKS5oZWlnaHQoKSk7CgogICAgICByZXR1cm4gdGhpczsKICAgIH0KCiAgfSwKCiAgLy8gRGV0ZWN0cyBpZiB0aGUgcGFnZXMgYXJlIGJlaW5nIGFuaW1hdGVkCgogIGFuaW1hdGluZzogZnVuY3Rpb24oKSB7CgogICAgcmV0dXJuIHRoaXMuZGF0YSgpLnBhZ2VNdi5sZW5ndGg+MDsKCiAgfSwKCiAgLy8gRGlzYWJsZXMgYW5kIGVuYWJsZXMgdGhlIGVmZmVjdAoKICBkaXNhYmxlOiBmdW5jdGlvbihib29sKSB7CgogICAgdmFyIHBhZ2UsCiAgICAgIGRhdGEgPSB0aGlzLmRhdGEoKSwKICAgICAgdmlldyA9IHRoaXMudHVybigndmlldycpOwoKICAgICAgZGF0YS5kaXNhYmxlZCA9IGJvb2w9PT11bmRlZmluZWQgfHwgYm9vbD09PXRydWU7CgogICAgZm9yIChwYWdlIGluIGRhdGEucGFnZXMpCiAgICAgIGlmIChoYXMocGFnZSwgZGF0YS5wYWdlcykpCiAgICAgICAgZGF0YS5wYWdlc1twYWdlXS5mbGlwKCdkaXNhYmxlJywgKGJvb2wpID8gJC5pbkFycmF5KHBhZ2UsIHZpZXcpIDogZmFsc2UpOwoKICAgIHJldHVybiB0aGlzOwoKICB9LAoKICAvLyBEaXNhYmxlcyBhbmQgZW5hYmxlcyB0aGUgZWZmZWN0CgogIGRpc2FibGVkOiBmdW5jdGlvbihkaXNhYmxlKSB7CgogICAgaWYgKGRpc2FibGU9PT11bmRlZmluZWQpIHsKICAgICAgcmV0dXJuIHRoaXMuZGF0YSgpLmRpc2FibGVkPT09dHJ1ZTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiB0aGlzLnR1cm4oJ2Rpc2FibGUnLCBkaXNhYmxlKTsKICAgIH0KCiAgfSwKCiAgLy8gR2V0cyBhbmQgc2V0cyB0aGUgc2l6ZQoKICBzaXplOiBmdW5jdGlvbih3aWR0aCwgaGVpZ2h0KSB7CgogICAgaWYgKHdpZHRoICYmIGhlaWdodCkgewoKICAgICAgdmFyIHBhZ2UsIHByb3AsCiAgICAgICAgZGF0YSA9IHRoaXMuZGF0YSgpLAogICAgICAgIHBhZ2VXaWR0aCA9IChkYXRhLmRpc3BsYXk9PSdkb3VibGUnKSA/IHdpZHRoLzIgOiB3aWR0aDsKCiAgICAgIHRoaXMuY3NzKHt3aWR0aDogd2lkdGgsIGhlaWdodDogaGVpZ2h0fSk7CgogICAgICBpZiAoZGF0YS5wYWdlT2Jqc1swXSkKICAgICAgICBkYXRhLnBhZ2VPYmpzWzBdLmNzcyh7d2lkdGg6IHBhZ2VXaWR0aCwgaGVpZ2h0OiBoZWlnaHR9KTsKICAgICAgCiAgICAgIGZvciAocGFnZSBpbiBkYXRhLnBhZ2VXcmFwKSB7CiAgICAgICAgaWYgKCFoYXMocGFnZSwgZGF0YS5wYWdlV3JhcCkpIGNvbnRpbnVlOwoKICAgICAgICBwcm9wID0gdHVybk1ldGhvZHMuX3BhZ2VTaXplLmNhbGwodGhpcywgcGFnZSwgdHJ1ZSk7CgogICAgICAgIGRhdGEucGFnZU9ianNbcGFnZV0uY3NzKHt3aWR0aDogcHJvcC53aWR0aCwgaGVpZ2h0OiBwcm9wLmhlaWdodH0pOwogICAgICAgIGRhdGEucGFnZVdyYXBbcGFnZV0uY3NzKHByb3ApOwoKICAgICAgICBpZiAoZGF0YS5wYWdlc1twYWdlXSkKICAgICAgICAgIGRhdGEucGFnZXNbcGFnZV0uY3NzKHt3aWR0aDogcHJvcC53aWR0aCwgaGVpZ2h0OiBwcm9wLmhlaWdodH0pOwogICAgICB9CgogICAgICB0aGlzLnR1cm4oJ3Jlc2l6ZScpOwoKICAgICAgcmV0dXJuIHRoaXM7CgogICAgfSBlbHNlIHsKICAgICAgCiAgICAgIHJldHVybiB7d2lkdGg6IHRoaXMud2lkdGgoKSwgaGVpZ2h0OiB0aGlzLmhlaWdodCgpfTsKCiAgICB9CiAgfSwKCiAgLy8gUmVzaXplcyBlYWNoIHBhZ2UKCiAgcmVzaXplOiBmdW5jdGlvbigpIHsKCiAgICB2YXIgcGFnZSwgZGF0YSA9IHRoaXMuZGF0YSgpOwoKICAgIGlmIChkYXRhLnBhZ2VzWzBdKSB7CiAgICAgIGRhdGEucGFnZVdyYXBbMF0uY3NzKHtsZWZ0OiAtdGhpcy53aWR0aCgpfSk7CiAgICAgIGRhdGEucGFnZXNbMF0uZmxpcCgncmVzaXplJywgdHJ1ZSk7CiAgICB9CgogICAgZm9yIChwYWdlID0gMTsgcGFnZSA8PSBkYXRhLnRvdGFsUGFnZXM7IHBhZ2UrKykKICAgICAgaWYgKGRhdGEucGFnZXNbcGFnZV0pCiAgICAgICAgZGF0YS5wYWdlc1twYWdlXS5mbGlwKCdyZXNpemUnLCB0cnVlKTsKCgogIH0sCgogIC8vIFJlbW92ZXMgYW4gYW5pbWF0aW9uIGZyb20gdGhlIGNhY2hlCgogIF9yZW1vdmVNdjogZnVuY3Rpb24ocGFnZSkgewoKICAgIHZhciBpLCBkYXRhID0gdGhpcy5kYXRhKCk7CiAgICAgIAogICAgZm9yIChpPTA7IGk8ZGF0YS5wYWdlTXYubGVuZ3RoOyBpKyspCiAgICAgIGlmIChkYXRhLnBhZ2VNdltpXT09cGFnZSkgewogICAgICAgIGRhdGEucGFnZU12LnNwbGljZShpLCAxKTsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfQoKICAgIHJldHVybiBmYWxzZTsKCiAgfSwKCiAgLy8gQWRkcyBhbiBhbmltYXRpb24gdG8gdGhlIGNhY2hlCiAgCiAgX2FkZE12OiBmdW5jdGlvbihwYWdlKSB7CgogICAgdmFyIGRhdGEgPSB0aGlzLmRhdGEoKTsKCiAgICB0dXJuTWV0aG9kcy5fcmVtb3ZlTXYuY2FsbCh0aGlzLCBwYWdlKTsKICAgIGRhdGEucGFnZU12LnB1c2gocGFnZSk7CgogIH0sCgogIC8vIEdldHMgaW5kZXhlcyBmb3IgYSB2aWV3CgogIF92aWV3OiBmdW5jdGlvbihwYWdlKSB7CiAgCiAgICB2YXIgZGF0YSA9IHRoaXMuZGF0YSgpOwogICAgCiAgICBwYWdlID0gcGFnZSB8fCBkYXRhLnBhZ2U7CgogICAgaWYgKGRhdGEuZGlzcGxheT09J2RvdWJsZScpCiAgICAgIHJldHVybiAocGFnZSUyKSA/IFtwYWdlLTEsIHBhZ2VdIDogW3BhZ2UsIHBhZ2UrMV07CiAgICBlbHNlCiAgICAgIHJldHVybiBbcGFnZV07CgogIH0sCgogIC8vIEdldHMgYSB2aWV3CgogIHZpZXc6IGZ1bmN0aW9uKHBhZ2UpIHsKCiAgICB2YXIgZGF0YSA9IHRoaXMuZGF0YSgpLAogICAgICB2aWV3ID0gdHVybk1ldGhvZHMuX3ZpZXcuY2FsbCh0aGlzLCBwYWdlKTsKCiAgICBpZiAoZGF0YS5kaXNwbGF5PT0nZG91YmxlJykKICAgICAgcmV0dXJuIFsodmlld1swXT4wKSA/IHZpZXdbMF0gOiAwLAogICAgICAgICh2aWV3WzFdPD1kYXRhLnRvdGFsUGFnZXMpID8gdmlld1sxXSA6IDBdOwogICAgZWxzZQogICAgICByZXR1cm4gWyh2aWV3WzBdPjAgJiYgdmlld1swXTw9ZGF0YS50b3RhbFBhZ2VzKSA/IHZpZXdbMF0gOiAwXTsKCiAgfSwKCiAgLy8gU3RvcHMgYW5pbWF0aW9ucwoKICBzdG9wOiBmdW5jdGlvbihpZ25vcmUsIGFuaW1hdGUpIHsKCiAgICBpZiAodGhpcy50dXJuKCdhbmltYXRpbmcnKSkgewogICAgICB2YXIgaSwgb3B0cywgcGFnZSwKICAgICAgICBkYXRhID0gdGhpcy5kYXRhKCksCiAgICAgICAgcGFnZXMgPSBkYXRhLnBhZ2VNdjsKCiAgICAgIGRhdGEucGFnZU12ID0gW107CgogICAgICBpZiAoZGF0YS50cGFnZSkgewogICAgICAgIGRhdGEucGFnZSA9IGRhdGEudHBhZ2U7CiAgICAgICAgZGVsZXRlIGRhdGFbJ3RwYWdlJ107CiAgICAgIH0KCiAgICAgIGZvciAoaSA9IDA7IGk8cGFnZXMubGVuZ3RoOyBpKyspIHsKCiAgICAgICAgcGFnZSA9IGRhdGEucGFnZXNbcGFnZXNbaV1dOwogICAgICAgIG9wdHMgPSBwYWdlLmRhdGEoKS5mLm9wdHM7CgogICAgICAgIHBhZ2UuZmxpcCgnaGlkZUZvbGRlZFBhZ2UnLCBmYWxzZSk7CgogICAgICAgIGZsaXBNZXRob2RzLl9tb3ZlRm9sZGluZ1BhZ2UuY2FsbChwYWdlLCBmYWxzZSk7CgogICAgICAgIGRhdGEucGFnZVBsYWNlW29wdHMubmV4dF0gPSBvcHRzLm5leHQ7CgogICAgICAgIGlmIChvcHRzLmZvcmNlKSB7CiAgICAgICAgICBvcHRzLm5leHQgPSAob3B0cy5wYWdlJTI9PT0wKSA/IG9wdHMucGFnZS0xIDogb3B0cy5wYWdlKzE7CiAgICAgICAgICBkZWxldGUgb3B0c1snZm9yY2UnXTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICB0aGlzLnR1cm4oJ3VwZGF0ZScpOwoKICAgIHJldHVybiB0aGlzOwogIAogIH0sCgogIC8vIEdldHMgYW5kIHNldHMgdGhlIG51bWJlciBvZiBwYWdlcwoKICBwYWdlczogZnVuY3Rpb24ocGFnZXMpIHsKCiAgICB2YXIgZGF0YSA9IHRoaXMuZGF0YSgpOwoKICAgIGlmIChwYWdlcykgewogICAgICBpZiAocGFnZXM8ZGF0YS50b3RhbFBhZ2VzKSB7CgogICAgICAgIGZvciAodmFyIHBhZ2UgPSBwYWdlcysxOyBwYWdlPD1kYXRhLnRvdGFsUGFnZXM7IHBhZ2UrKykKICAgICAgICAgIHRoaXMudHVybigncmVtb3ZlUGFnZScsIHBhZ2UpOwoKICAgICAgICBpZiAodGhpcy50dXJuKCdwYWdlJyk+cGFnZXMpCiAgICAgICAgICB0aGlzLnR1cm4oJ3BhZ2UnLCBwYWdlcyk7CiAgICAgIH0KCiAgICAgIGRhdGEudG90YWxQYWdlcyA9IHBhZ2VzOwoKICAgICAgcmV0dXJuIHRoaXM7CiAgICB9IGVsc2UKICAgICAgcmV0dXJuIGRhdGEudG90YWxQYWdlczsKCiAgfSwKCiAgLy8gQ2hlY2tzIG1pc3NpbmcgcGFnZXMKCiAgX21pc3NpbmcgOiBmdW5jdGlvbihwYWdlKSB7CiAgICAKICAgIHZhciBwLAogICAgICBkYXRhID0gdGhpcy5kYXRhKCksCiAgICAgIHJhbmdlID0gdGhpcy50dXJuKCdyYW5nZScsIHBhZ2UpLAogICAgICBtaXNzaW5nID0gW107CgogICAgZm9yIChwID0gcmFuZ2VbMF07IHA8PXJhbmdlWzFdOyBwKyspIHsKICAgICAgaWYgKCFkYXRhLnBhZ2VPYmpzW3BdKQogICAgICAgIG1pc3NpbmcucHVzaChwKTsKICAgIH0KCiAgICBpZiAobWlzc2luZy5sZW5ndGg+MCkKICAgICAgdGhpcy50cmlnZ2VyKCdtaXNzaW5nJywgW21pc3NpbmddKTsKICAgIAogIH0sCgogIC8vIFNldHMgYSBwYWdlIHdpdGhvdXQgZWZmZWN0CgogIF9maXRQYWdlOiBmdW5jdGlvbihwYWdlKSB7CgogICAgdmFyIGRhdGEgPSB0aGlzLmRhdGEoKSwKICAgICAgbmV3VmlldyA9IHRoaXMudHVybigndmlldycsIHBhZ2UpOwogICAgCiAgICB0dXJuTWV0aG9kcy5fbWlzc2luZy5jYWxsKHRoaXMsIHBhZ2UpOwoKICAgIGlmICghZGF0YS5wYWdlT2Jqc1twYWdlXSkKICAgICAgcmV0dXJuOwoKICAgIGRhdGEucGFnZSA9IHBhZ2U7CgogICAgdGhpcy50dXJuKCdzdG9wJyk7CiAgICB0dXJuTWV0aG9kcy5fcmVtb3ZlRnJvbURPTS5jYWxsKHRoaXMpOwogICAgdHVybk1ldGhvZHMuX21ha2VSYW5nZS5jYWxsKHRoaXMpOwogICAgdHVybk1ldGhvZHMuX3VwZGF0ZVNoYWRvdy5jYWxsKHRoaXMpOwogICAgdGhpcy50cmlnZ2VyKCd0dXJuZWQnLCBbcGFnZSwgbmV3Vmlld10pOwoKICAgIGlmIChkYXRhLm9wdHMuYXV0b0NlbnRlcikKICAgICAgdGhpcy50dXJuKCdjZW50ZXInKTsKCiAgfSwKICAKICAvLyBUdXJucyB0byBhIHBhZ2UKCiAgX3R1cm5QYWdlOiBmdW5jdGlvbihwYWdlLCBmcm9tTW91c2VBY3Rpb24pIHsKCiAgICB2YXIgY3VycmVudCwgbmV4dCwKICAgICAgZGF0YSA9IHRoaXMuZGF0YSgpLAogICAgICBwbGFjZSA9IGRhdGEucGFnZVBsYWNlW3BhZ2VdLAogICAgICB2aWV3ID0gdGhpcy50dXJuKCd2aWV3JyksCiAgICAgIG5ld1ZpZXcgPSB0aGlzLnR1cm4oJ3ZpZXcnLCBwYWdlKTsKICAKICAgIGlmIChkYXRhLnBhZ2UhPXBhZ2UpIHsKCiAgICAgIHZhciBldmVudCA9ICQuRXZlbnQoJ3R1cm5pbmcnKTsKICAgICAgdGhpcy50cmlnZ2VyKGV2ZW50LCBbcGFnZSwgbmV3Vmlld10pOwoKICAgICAgaWYgKGV2ZW50LmlzRGVmYXVsdFByZXZlbnRlZCgpKQogICAgICAgIHJldHVybjsKCiAgICAgIGlmICgkLmluQXJyYXkoMSwgbmV3VmlldykhPS0xKQogICAgICAgIHRoaXMudHJpZ2dlcignZmlyc3QnKTsKICAgICAgaWYgKCQuaW5BcnJheShkYXRhLnRvdGFsUGFnZXMsIG5ld1ZpZXcpIT0tMSkKICAgICAgICB0aGlzLnRyaWdnZXIoJ2xhc3QnKTsKCiAgICB9CgoKCiAgICBpZiAoZnJvbU1vdXNlQWN0aW9uKSB7CgogICAgICB0aGlzLnR1cm4oJ3N0b3AnLCBwbGFjZSk7CgogICAgfSBlbHNlIHsKCiAgICAgIHR1cm5NZXRob2RzLl9taXNzaW5nLmNhbGwodGhpcywgcGFnZSk7CiAgICAgIAogICAgICBpZiAoIWRhdGEucGFnZU9ianNbcGFnZV0pCiAgICAgICAgcmV0dXJuOwoKICAgICAgdGhpcy50dXJuKCdzdG9wJyk7CiAgICAgIGRhdGEucGFnZSA9IHBhZ2U7CiAgICB9CiAgICAKCiAgICB0dXJuTWV0aG9kcy5fbWFrZVJhbmdlLmNhbGwodGhpcyk7CgogICAgaWYgKGRhdGEuZGlzcGxheT09J3NpbmdsZScpIHsKICAgICAgY3VycmVudCA9IHZpZXdbMF07CiAgICAgIG5leHQgPSBuZXdWaWV3WzBdOwogICAgfSBlbHNlIGlmICh2aWV3WzFdICYmIHBhZ2U+dmlld1sxXSkgewogICAgICBjdXJyZW50ID0gdmlld1sxXTsKICAgICAgbmV4dCA9IG5ld1ZpZXdbMF07CiAgICB9IGVsc2UgaWYgKHZpZXdbMF0gJiYgcGFnZTx2aWV3WzBdKSB7CiAgICAgIGN1cnJlbnQgPSB2aWV3WzBdOwogICAgICBuZXh0ID0gbmV3Vmlld1sxXTsKICAgIH0KCiAgICBpZiAoZGF0YS5wYWdlc1tjdXJyZW50XSkgewoKICAgICAgdmFyIG9wdHMgPSBkYXRhLnBhZ2VzW2N1cnJlbnRdLmRhdGEoKS5mLm9wdHM7CiAgICAgIGRhdGEudHBhZ2UgPSBuZXh0OwogICAgICAKICAgICAgaWYgKG9wdHMubmV4dCE9bmV4dCkgewogICAgICAgIG9wdHMubmV4dCA9IG5leHQ7CiAgICAgICAgZGF0YS5wYWdlUGxhY2VbbmV4dF0gPSBvcHRzLnBhZ2U7CiAgICAgICAgb3B0cy5mb3JjZSA9IHRydWU7CiAgICAgIH0KCiAgICAgIGlmIChkYXRhLmRpc3BsYXk9PSdzaW5nbGUnKSB7CgogICAgICAgIGlmIChkYXRhLmRpcmVjdGlvbj09J2x0cicpIHsKICAgICAgICAgIGRhdGEucGFnZXNbY3VycmVudF0uZmxpcCgndHVyblBhZ2UnLAogICAgICAgICAgICAobmV3Vmlld1swXSA+IHZpZXdbMF0pID8gJ3InIDogJ2wnKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgZGF0YS5wYWdlc1tjdXJyZW50XS5mbGlwKCd0dXJuUGFnZScsCiAgICAgICAgICAgIChuZXdWaWV3WzBdID4gdmlld1swXSkgPyAnbCcgOiAncicpOwogICAgICAgIH0KCiAgICAgIH0gZWxzZSB7CiAgICAgICAgCiAgICAgICAgZGF0YS5wYWdlc1tjdXJyZW50XS5mbGlwKCd0dXJuUGFnZScpOwoKICAgICAgfQogICAgfQoKICB9LAoKICAvLyBHZXRzIGFuZCBzZXRzIGEgcGFnZQoKICBwYWdlOiBmdW5jdGlvbihwYWdlKSB7CgogICAgcGFnZSA9IHBhcnNlSW50KHBhZ2UsIDEwKTsKCiAgICB2YXIgZGF0YSA9IHRoaXMuZGF0YSgpOwoKICAgIGlmIChwYWdlPjAgJiYgcGFnZTw9ZGF0YS50b3RhbFBhZ2VzKSB7CiAgICAgIGlmICghZGF0YS5kb25lIHx8ICQuaW5BcnJheShwYWdlLCB0aGlzLnR1cm4oJ3ZpZXcnKSkhPS0xKQogICAgICAgIHR1cm5NZXRob2RzLl9maXRQYWdlLmNhbGwodGhpcywgcGFnZSk7CiAgICAgIGVsc2UKICAgICAgICB0dXJuTWV0aG9kcy5fdHVyblBhZ2UuY2FsbCh0aGlzLCBwYWdlKTsKICAgIAogICAgICByZXR1cm4gdGhpczsKCiAgICB9IGVsc2UKICAgICAgcmV0dXJuIGRhdGEucGFnZTsKICAKICB9LAoKICAvLyBUdXJucyB0byB0aGUgbmV4dCB2aWV3CgogIG5leHQ6IGZ1bmN0aW9uKCkgewoKICAgIHJldHVybiB0aGlzLnR1cm4oJ3BhZ2UnLAogICAgICB0dXJuTWV0aG9kcy5fdmlldy5jYWxsKHRoaXMsIHRoaXMuZGF0YSgpLnBhZ2UpLnBvcCgpICsgMSk7CiAgCiAgfSwKCiAgLy8gVHVybnMgdG8gdGhlIHByZXZpb3VzIHZpZXcKCiAgcHJldmlvdXM6IGZ1bmN0aW9uKCkgewogICAgCiAgICByZXR1cm4gdGhpcy50dXJuKCdwYWdlJywKICAgICAgdHVybk1ldGhvZHMuX3ZpZXcuY2FsbCh0aGlzLCB0aGlzLmRhdGEoKS5wYWdlKS5zaGlmdCgpIC0gMSk7CgogIH0sCgogIHBlZWw6IGZ1bmN0aW9uKGNvcm5lciwgYW5pbWF0ZSkgewogICAgCiAgICByZXR1cm4gdGhpczsKCiAgfSwKCiAgLy8gQWRkcyBhIG1vdGlvbiB0byB0aGUgaW50ZXJuYWwgbGlzdAogIC8vIFRoaXMgZXZlbnQgaXMgY2FsbGVkIGluIGNvbnRleHQgb2YgZmxpcAoKICBfYWRkTW90aW9uUGFnZTogZnVuY3Rpb24oKSB7CgogICAgdmFyIG9wdHMgPSAkKHRoaXMpLmRhdGEoKS5mLm9wdHMsCiAgICAgIHR1cm4gPSBvcHRzLnR1cm4sCiAgICAgIGRkID0gdHVybi5kYXRhKCk7CgogICAgdHVybk1ldGhvZHMuX2FkZE12LmNhbGwodHVybiwgb3B0cy5wYWdlKTsKICAgIGRkLnBhZ2VQbGFjZVtvcHRzLm5leHRdID0gb3B0cy5wYWdlOwogICAgdHVybi50dXJuKCd1cGRhdGUnKTsKCiAgfSwKCiAgLy8gVGhpcyBldmVudCBpcyBjYWxsZWQgaW4gY29udGV4dCBvZiBmbGlwCgogIF9zdGFydDogZnVuY3Rpb24oZSwgb3B0cywgY29ybmVyKSB7CgogICAgdmFyIGRhdGEgPSBvcHRzLnR1cm4uZGF0YSgpOwoKICAgIGlmIChlLmlzRGVmYXVsdFByZXZlbnRlZCgpKSB7CiAgICAgIHR1cm5NZXRob2RzLl91cGRhdGVTaGFkb3cuY2FsbChvcHRzLnR1cm4pOwogICAgICByZXR1cm47CiAgICB9CgogICAgaWYgKGRhdGEuZGlzcGxheT09J3NpbmdsZScgJiYgY29ybmVyKSB7CgogICAgICBpZiAoKGNvcm5lcj09J2wnICYmIGRhdGEuZGlyZWN0aW9uPT0nbHRyJykKICAgICAgICB8fAogICAgICAgIChjb3JuZXI9PSdyJyAmJiBkYXRhLmRpcmVjdGlvbj09J3J0bCcpKQogICAgICB7CiAgICAgICAgCiAgICAgICAgb3B0cy5uZXh0ID0gKG9wdHMubmV4dDxvcHRzLnBhZ2UpID8gb3B0cy5uZXh0IDogb3B0cy5wYWdlLTE7CiAgICAgICAgb3B0cy5mb3JjZSA9IHRydWU7CgogICAgICB9IGVsc2UgewoKICAgICAgICBvcHRzLm5leHQgPSAob3B0cy5uZXh0Pm9wdHMucGFnZSkgPyBvcHRzLm5leHQgOiBvcHRzLnBhZ2UrMTsKCiAgICAgIH0KCiAgICB9CgogICAgdHVybk1ldGhvZHMuX2FkZE1vdGlvblBhZ2UuY2FsbChlLnRhcmdldCk7CiAgICB0dXJuTWV0aG9kcy5fdXBkYXRlU2hhZG93LmNhbGwob3B0cy50dXJuKTsKICB9LAoKICAvLyBUaGlzIGV2ZW50IGlzIGNhbGxlZCBpbiBjb250ZXh0IG9mIGZsaXAKCiAgX2VuZDogZnVuY3Rpb24oZSwgb3B0cywgdHVybmVkKSB7CgogICAgdmFyIHRoYXQgPSAkKGUudGFyZ2V0KSwKICAgICAgZGF0YSA9IHRoYXQuZGF0YSgpLmYsCiAgICAgIHR1cm4gPSBvcHRzLnR1cm4sCiAgICAgIGRkID0gdHVybi5kYXRhKCk7CgogICAgaWYgKHR1cm5lZCB8fCBkZC50cGFnZSkgewoKICAgICAgaWYgKGRkLnRwYWdlPT1vcHRzLm5leHQgfHwgZGQudHBhZ2U9PW9wdHMucGFnZSkgewogICAgICAgIGRlbGV0ZSBkZFsndHBhZ2UnXTsKICAgICAgICB0dXJuTWV0aG9kcy5fZml0UGFnZS5jYWxsKHR1cm4sIGRkLnRwYWdlIHx8IG9wdHMubmV4dCwgdHJ1ZSk7CiAgICAgIH0KCiAgICB9IGVsc2UgewoKICAgICAgdHVybk1ldGhvZHMuX3JlbW92ZU12LmNhbGwodHVybiwgb3B0cy5wYWdlKTsKICAgICAgdHVybk1ldGhvZHMuX3VwZGF0ZVNoYWRvdy5jYWxsKHR1cm4pOwogICAgICB0dXJuLnR1cm4oJ3VwZGF0ZScpOwoKICAgIH0KICAgIAogIH0sCiAgCiAgLy8gVGhpcyBldmVudCBpcyBjYWxsZWQgaW4gY29udGV4dCBvZiBmbGlwCgogIF9wcmVzc2VkOiBmdW5jdGlvbihlKSB7CgogICAgZS5zdG9wUHJvcGFnYXRpb24oKTsKCiAgICB2YXIgcGFnZSwKICAgICAgZGF0YSA9ICQoZS50YXJnZXQpLmRhdGEoKS5mLAogICAgICBwYWdlcyA9IGRhdGEub3B0cy50dXJuLmRhdGEoKS5wYWdlczsKCiAgICBmb3IgKHBhZ2UgaW4gcGFnZXMpCiAgICAgIGlmIChwYWdlIT1kYXRhLm9wdHMucGFnZSkKICAgICAgICBwYWdlc1twYWdlXS5mbGlwKCdkaXNhYmxlJywgdHJ1ZSk7CgogICAgcmV0dXJuIGRhdGEudGltZSA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpOwoKICB9LAoKICAvLyBUaGlzIGV2ZW50IGlzIGNhbGxlZCBpbiBjb250ZXh0IG9mIGZsaXAKCiAgX3JlbGVhc2VkOiBmdW5jdGlvbihlLCBwb2ludCkgewoKICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7CgogICAgdmFyIG91dEFyZWEsCiAgICAgIHBhZ2UgPSAkKGUudGFyZ2V0KSwKICAgICAgZGF0YSA9IHBhZ2UuZGF0YSgpLmYsCiAgICAgIHR1cm4gPSBkYXRhLm9wdHMudHVybiwKICAgICAgdHVybkRhdGEgPSB0dXJuLmRhdGEoKTsKICAgIAogICAgaWYgKHR1cm5EYXRhLmRpc3BsYXk9PSdzaW5nbGUnKSB7CiAgICAgIG91dEFyZWEgPSAocG9pbnQuY29ybmVyPT0ncicpID8KICAgICAgICBwb2ludC54PHBhZ2Uud2lkdGgoKS8yOgogICAgICAgIHBvaW50Lng+cGFnZS53aWR0aCgpLzI7CiAgICB9IGVsc2UgewogICAgICBvdXRBcmVhID0gcG9pbnQueDwwIHx8IHBvaW50Lng+cGFnZS53aWR0aCgpOwogICAgfQoKICAgIGlmICgobmV3IERhdGUoKSkuZ2V0VGltZSgpLWRhdGEudGltZTwyMDAgfHwgb3V0QXJlYSkgewoKICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwoKICAgICAgdHVybk1ldGhvZHMuX3R1cm5QYWdlLmNhbGwoCiAgICAgICAgdHVybiwKICAgICAgICBkYXRhLm9wdHMubmV4dCwKICAgICAgICBmbGlwTWV0aG9kcy5fY29ybmVyQWN0aXZhdGVkLmNhbGwocGFnZSwgcG9pbnQsIDEpID09PSBmYWxzZQogICAgICApOwoKICAgIH0KCiAgICB0dXJuRGF0YS5tb3VzZUFjdGlvbiA9IGZhbHNlOwoKICB9LAoKICAvLyBUaGlzIGV2ZW50IGlzIGNhbGxlZCBpbiBjb250ZXh0IG9mIGZsaXAKICAKICBfZmxpcDogZnVuY3Rpb24oZSkgewoKICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7CgogICAgdmFyIG9wdHMgPSAkKGUudGFyZ2V0KS5kYXRhKCkuZi5vcHRzOwoKICAgIG9wdHMudHVybi50cmlnZ2VyKCd0dXJuJywgW29wdHMubmV4dF0pOwoKICAgIGlmIChvcHRzLnR1cm4uZGF0YSgpLm9wdHMuYXV0b0NlbnRlcikKICAgICAgb3B0cy50dXJuLnR1cm4oJ2NlbnRlcicsIG9wdHMubmV4dCk7CgogIH0sCgogIC8vIENhbGN1bGF0ZSB0aGUgei1pbmRleCB2YWx1ZSBmb3IgcGFnZXMgZHVyaW5nIHRoZSBhbmltYXRpb24KCiAgY2FsY3VsYXRlWjogZnVuY3Rpb24obXYpIHsKCiAgICB2YXIgaSwgcGFnZSwgbmV4dFBhZ2UsIHBsYWNlUGFnZSwgZHBhZ2UsCiAgICAgIHRoYXQgPSB0aGlzLAogICAgICBkYXRhID0gdGhpcy5kYXRhKCksCiAgICAgIHZpZXcgPSB0aGlzLnR1cm4oJ3ZpZXcnKSwKICAgICAgY3VycmVudFBhZ2UgPSB2aWV3WzBdIHx8IHZpZXdbMV0sCiAgICAgIHIgPSB7cGFnZVo6IHt9LCBwYXJ0Wjoge30sIHBhZ2VWOiB7fX0sCgogICAgICBhZGRWaWV3ID0gZnVuY3Rpb24ocGFnZSkgewogICAgICAgIHZhciB2aWV3ID0gdGhhdC50dXJuKCd2aWV3JywgcGFnZSk7CiAgICAgICAgaWYgKHZpZXdbMF0pIHIucGFnZVZbdmlld1swXV0gPSB0cnVlOwogICAgICAgIGlmICh2aWV3WzFdKSByLnBhZ2VWW3ZpZXdbMV1dID0gdHJ1ZTsKICAgICAgfTsKICAgIAogICAgZm9yIChpID0gMDsgaTxtdi5sZW5ndGg7IGkrKykgewogICAgICBwYWdlID0gbXZbaV07CiAgICAgIG5leHRQYWdlID0gZGF0YS5wYWdlc1twYWdlXS5kYXRhKCkuZi5vcHRzLm5leHQ7CiAgICAgIHBsYWNlUGFnZSA9IGRhdGEucGFnZVBsYWNlW3BhZ2VdOwogICAgICBhZGRWaWV3KHBhZ2UpOwogICAgICBhZGRWaWV3KG5leHRQYWdlKTsKICAgICAgZHBhZ2UgPSAoZGF0YS5wYWdlUGxhY2VbbmV4dFBhZ2VdPT1uZXh0UGFnZSkgPyBuZXh0UGFnZSA6IHBhZ2U7CiAgICAgIHIucGFnZVpbZHBhZ2VdID0gZGF0YS50b3RhbFBhZ2VzIC0gTWF0aC5hYnMoY3VycmVudFBhZ2UtZHBhZ2UpOwogICAgICByLnBhcnRaW3BsYWNlUGFnZV0gPSBkYXRhLnRvdGFsUGFnZXMqMiArIE1hdGguYWJzKGN1cnJlbnRQYWdlLWRwYWdlKTsKICAgIH0KCiAgICByZXR1cm4gcjsKICB9LAoKICAvLyBVcGRhdGVzIHRoZSB6LWluZGV4IGFuZCBkaXNwbGF5IHByb3BlcnR5IG9mIGV2ZXJ5IHBhZ2UKCiAgdXBkYXRlOiBmdW5jdGlvbigpIHsKCiAgICB2YXIgcGFnZSwKICAgICAgZGF0YSA9IHRoaXMuZGF0YSgpOwoKICAgIGlmIChkYXRhLnBhZ2VNdi5sZW5ndGggJiYgZGF0YS5wYWdlTXZbMF0hPT0wKSB7CgogICAgICAvLyBVcGRhdGUgbW90aW9uCgogICAgICB2YXIgcCwKICAgICAgICBmaXhlZCwKICAgICAgICBwb3MgPSB0aGlzLnR1cm4oJ2NhbGN1bGF0ZVonLCBkYXRhLnBhZ2VNdiksCiAgICAgICAgdmlldyA9IHRoaXMudHVybigndmlldycsIGRhdGEudHBhZ2UpOwogICAgCiAgICAgIGZvciAocGFnZSBpbiBkYXRhLnBhZ2VXcmFwKSB7CgogICAgICAgIGlmICghaGFzKHBhZ2UsIGRhdGEucGFnZVdyYXApKQogICAgICAgICAgY29udGludWU7CgogICAgICAgIGZpeGVkID0gZGF0YS5wYWdlT2Jqc1twYWdlXS5oYXNDbGFzcygnZml4ZWQnKTsKCiAgICAgICAgZGF0YS5wYWdlV3JhcFtwYWdlXS5jc3MoewogICAgICAgICAgZGlzcGxheTogKHBvcy5wYWdlVltwYWdlXSB8fCBmaXhlZCkgPyAnJyA6ICdub25lJywKICAgICAgICAgICd6LWluZGV4JzogcG9zLnBhZ2VaW3BhZ2VdIHx8ICgoZml4ZWQpID8gLTEgOiAwKQogICAgICAgIH0pOwoKICAgICAgICBpZiAoKHAgPSBkYXRhLnBhZ2VzW3BhZ2VdKSkgewogICAgICAgICAgcC5mbGlwKCd6JywgcG9zLnBhcnRaW3BhZ2VdIHx8IG51bGwpOwoKICAgICAgICAgIGlmIChwb3MucGFnZVZbcGFnZV0pCiAgICAgICAgICAgIHAuZmxpcCgncmVzaXplJyk7CgogICAgICAgICAgaWYgKGRhdGEudHBhZ2UpCiAgICAgICAgICAgIHAuZmxpcCgnZGlzYWJsZScsIHRydWUpOyAvLyBkYXRhLmRpc2FibGVkIHx8IHBhZ2UhPWFwYWdlCiAgICAgICAgfQogICAgICB9CiAgCiAgICB9IGVsc2UgewoKICAgICAgLy8gVXBkYXRlIHN0YXRpYyBwYWdlcwoKICAgICAgZm9yIChwYWdlIGluIGRhdGEucGFnZVdyYXApIHsKCiAgICAgICAgaWYgKCFoYXMocGFnZSwgZGF0YS5wYWdlV3JhcCkpCiAgICAgICAgICBjb250aW51ZTsKCiAgICAgICAgdmFyIHBhZ2VMb2NhdGlvbiA9IHR1cm5NZXRob2RzLl9zZXRQYWdlTG9jLmNhbGwodGhpcywgcGFnZSk7CgogICAgICAgIGlmIChkYXRhLnBhZ2VzW3BhZ2VdKQogICAgICAgICAgZGF0YS5wYWdlc1twYWdlXS5mbGlwKCdkaXNhYmxlJywKICAgICAgICAgICAgZGF0YS5kaXNhYmxlZCB8fCBwYWdlTG9jYXRpb24hPTEpLmZsaXAoJ3onLCBudWxsKTsKCiAgICAgIH0KICAgIH0KICB9LAoKICAvLyBVcGRhdGVzIHRoZSBwb3NpdGlvbiBhbmQgc2l6ZSBvZiB0aGUgZmxpcGJvb2sncyBzaGFkb3cKCiAgX3VwZGF0ZVNoYWRvdzogZnVuY3Rpb24oKSB7CiAgICAKICAgIHZhciB2aWV3LCB2aWV3Miwgc2hhZG93LAogICAgICBkYXRhID0gdGhpcy5kYXRhKCksCiAgICAgIHdpZHRoID0gdGhpcy53aWR0aCgpLAogICAgICBoZWlnaHQgPSB0aGlzLmhlaWdodCgpLAogICAgICBwYWdlV2lkdGggPSAoZGF0YS5kaXNwbGF5PT0nc2luZ2xlJykgPyB3aWR0aCA6IHdpZHRoLzI7CgogICAgdmlldyA9IHRoaXMudHVybigndmlldycpOwoKICAgIGlmICghZGF0YS5zaGFkb3cpIHsKICAgICAgZGF0YS5zaGFkb3cgPSAkKCc8ZGl2IC8+JywKICAgICAgewogICAgICAgICdjbGFzcyc6ICdzaGFkb3cnLAogICAgICAgICdjc3MnOiBkaXZBdHQoMCwgMCwgMCkuY3NzCiAgICAgIH0pLgogICAgICBhcHBlbmRUbyh0aGlzKTsKICAgIH0KCiAgICBmb3IgKHZhciBpID0gMDsgaTxkYXRhLnBhZ2VNdi5sZW5ndGg7IGkrKykgewogICAgICBpZiAoIXZpZXdbMF0gfHwgIXZpZXdbMV0pCiAgICAgICAgYnJlYWs7CiAgICAKICAgICAgdmlldyA9IHRoaXMudHVybigndmlldycsIGRhdGEucGFnZXNbZGF0YS5wYWdlTXZbaV1dLmRhdGEoKS5mLm9wdHMubmV4dCk7CiAgICAgIHZpZXcyID0gdGhpcy50dXJuKCd2aWV3JywgZGF0YS5wYWdlTXZbaV0pOwoKICAgICAgdmlld1swXSA9IHZpZXdbMF0gJiYgdmlldzJbMF07CiAgICAgIHZpZXdbMV0gPSB2aWV3WzFdICYmIHZpZXcyWzFdOwogICAgfQoKICAgIGlmICghdmlld1swXSkgc2hhZG93ID0gKGRhdGEuZGlyZWN0aW9uPT0nbHRyJykgPyAxIDogMjsKICAgIGVsc2UgaWYgKCF2aWV3WzFdKSBzaGFkb3cgPSAoZGF0YS5kaXJlY3Rpb249PSdsdHInKSA/IDIgOiAxOwogICAgZWxzZSBzaGFkb3cgPSAzOwoKICAgIHN3aXRjaCAoc2hhZG93KSB7CiAgICAgIGNhc2UgMToKICAgICAgICBkYXRhLnNoYWRvdy5jc3MoewogICAgICAgICAgd2lkdGg6IHBhZ2VXaWR0aCwKICAgICAgICAgIGhlaWdodDogaGVpZ2h0LAogICAgICAgICAgdG9wOiAwLAogICAgICAgICAgbGVmdDogcGFnZVdpZHRoCiAgICAgICAgfSk7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgMjoKICAgICAgICBkYXRhLnNoYWRvdy5jc3MoewogICAgICAgICAgd2lkdGg6IHBhZ2VXaWR0aCwKICAgICAgICAgIGhlaWdodDogaGVpZ2h0LAogICAgICAgICAgdG9wOiAwLAogICAgICAgICAgbGVmdDogMAogICAgICAgIH0pOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlIDM6CiAgICAgICAgZGF0YS5zaGFkb3cuY3NzKHsKICAgICAgICAgIHdpZHRoOiB3aWR0aCwKICAgICAgICAgIGhlaWdodDogaGVpZ2h0LAogICAgICAgICAgdG9wOiAwLAogICAgICAgICAgbGVmdDogMAogICAgICAgIH0pOwogICAgICAgIGJyZWFrOwogICAgfQoKICB9LAoKICAvLyBTZXRzIHRoZSB6LWluZGV4IGFuZCBkaXNwbGF5IHByb3BlcnR5IG9mIGEgcGFnZQogIC8vIEl0IGRlcGVuZHMgb24gdGhlIGN1cnJlbnQgdmlldwoKICBfc2V0UGFnZUxvYzogZnVuY3Rpb24ocGFnZSkgewoKICAgIHZhciBkYXRhID0gdGhpcy5kYXRhKCksCiAgICAgIHZpZXcgPSB0aGlzLnR1cm4oJ3ZpZXcnKTsKCiAgICBpZiAocGFnZT09dmlld1swXSB8fCBwYWdlPT12aWV3WzFdKSB7CiAgICAgIAogICAgICBkYXRhLnBhZ2VXcmFwW3BhZ2VdLmNzcyh7ekluZGV4OiBkYXRhLnRvdGFsUGFnZXMsIGRpc3BsYXk6ICcnfSk7CiAgICAgIHJldHVybiAxOwoKICAgIH0gZWxzZSBpZiAoKGRhdGEuZGlzcGxheT09J3NpbmdsZScgJiYgcGFnZT09dmlld1swXSsxKSB8fAogICAgICAoZGF0YS5kaXNwbGF5PT0nZG91YmxlJyAmJiBwYWdlPT12aWV3WzBdLTIgfHwKICAgICAgcGFnZT09dmlld1sxXSsyKSkgewogICAgICAKICAgICAgZGF0YS5wYWdlV3JhcFtwYWdlXS5jc3Moe3pJbmRleDogZGF0YS50b3RhbFBhZ2VzLTEsIGRpc3BsYXk6ICcnfSk7CiAgICAgIHJldHVybiAyOwoKICAgIH0gZWxzZSB7CiAgICAgIAogICAgICBkYXRhLnBhZ2VXcmFwW3BhZ2VdLmNzcyh7ekluZGV4OiAwLAogICAgICAgIGRpc3BsYXk6IChkYXRhLnBhZ2VPYmpzW3BhZ2VdLmhhc0NsYXNzKCdmaXhlZCcpKSA/ICcnIDogJ25vbmUnfQogICAgICApOwoKICAgICAgcmV0dXJuIDA7CiAgICB9CiAgfSwKCiAgLy8gR2V0cyBhbmQgc2V0cyB0aGUgb3B0aW9ucwoKICBvcHRpb25zOiBmdW5jdGlvbihvcHRpb25zKSB7CiAgICAKICAgIGlmIChvcHRpb25zPT09dW5kZWZpbmVkKSB7CiAgICAgIAogICAgICByZXR1cm4gdGhpcy5kYXRhKCkub3B0czsKCiAgICB9IGVsc2UgewoKICAgICAgdmFyIGRhdGEgPSB0aGlzLmRhdGEoKTsKCiAgICAgIC8vIFNldCBuZXcgdmFsdWVzCgogICAgICAkLmV4dGVuZChkYXRhLm9wdHMsIG9wdGlvbnMpOwogICAgICAKICAgICAgLy8gU2V0IHBhZ2VzCgogICAgICBpZiAob3B0aW9ucy5wYWdlcykKICAgICAgICB0aGlzLnR1cm4oJ3BhZ2VzJywgb3B0aW9ucy5wYWdlcyk7CgogICAgICAvLyBTZXQgcGFnZQoKICAgICAgaWYgKG9wdGlvbnMucGFnZSkKICAgICAgICB0aGlzLnR1cm4oJ3BhZ2UnLCBvcHRpb25zLnBhZ2UpOwoKICAgICAgLy8gU2V0IGRpc3BsYXkKCiAgICAgIGlmIChvcHRpb25zLmRpc3BsYXkpCiAgICAgICAgdGhpcy50dXJuKCdkaXNwbGF5Jywgb3B0aW9ucy5kaXNwbGF5KTsKICAgICAgCiAgICAgIC8vIFNldCBkaXJlY3Rpb24KCiAgICAgIGlmIChvcHRpb25zLmRpcmVjdGlvbikKICAgICAgICB0aGlzLnR1cm4oJ2RpcmVjdGlvbicsIG9wdGlvbnMuZGlyZWN0aW9uKTsKCiAgICAgIC8vIFNldCBzaXplCgogICAgICBpZiAob3B0aW9ucy53aWR0aCAmJiBvcHRpb25zLmhlaWdodCkKICAgICAgICB0aGlzLnR1cm4oJ3NpemUnLCBvcHRpb25zLndpZHRoLCBvcHRpb25zLmhlaWdodCk7CiAgICAgIAogICAgICAvLyBBZGQgZXZlbnQgbGlzdGVuZXJzCgogICAgICBpZiAob3B0aW9ucy53aGVuKQogICAgICAgIGZvciAodmFyIGV2ZW50TmFtZSBpbiBvcHRpb25zLndoZW4pCiAgICAgICAgICBpZiAoaGFzKGV2ZW50TmFtZSwgb3B0aW9ucy53aGVuKSkgewogICAgICAgICAgICB0aGlzLnVuYmluZChldmVudE5hbWUpLgogICAgICAgICAgICAgIGJpbmQoZXZlbnROYW1lLCBvcHRpb25zLndoZW5bZXZlbnROYW1lXSk7CiAgICAgICAgICB9CgogICAgICByZXR1cm4gdGhpczsKICAgIH0KCiAgfSwKCiAgLy8gR2V0cyB0aGUgY3VycmVudCB2ZXJzaW9uCgogIHZlcnNpb246IGZ1bmN0aW9uKCkgewoKICAgIHJldHVybiB2ZXJzaW9uOwoKICB9Cn0sCgovLyBNZXRob2RzIGFuZCBwcm9wZXJ0aWVzIGZvciB0aGUgZmxpcCBwYWdlIGVmZmVjdAoKZmxpcE1ldGhvZHMgPSB7CgogIC8vIENvbnN0cnVjdG9yCgogIGluaXQ6IGZ1bmN0aW9uKG9wdHMpIHsKCiAgICB0aGlzLmRhdGEoe2Y6CiAgICAgIHtlZmZlY3Q6IChvcHRzLmNvcm5lcnM9PSdyJyB8fCBvcHRzLmNvcm5lcnM9PSdsJykgPyAnaGFyZCcgOiAnc2hlZXQnfX0KICAgICk7CgogICAgdGhpcy5mbGlwKCdvcHRpb25zJywgb3B0cyk7CgogICAgZmxpcE1ldGhvZHMuX2FkZFBhZ2VXcmFwcGVyLmNhbGwodGhpcyk7CgogICAgcmV0dXJuIHRoaXM7CiAgfSwKCiAgc2V0RGF0YTogZnVuY3Rpb24oZCkgewogICAgCiAgICB2YXIgZGF0YSA9IHRoaXMuZGF0YSgpOwoKICAgIGRhdGEuZiA9ICQuZXh0ZW5kKGRhdGEuZiwgZCk7CgogICAgcmV0dXJuIHRoaXM7CiAgfSwKCiAgb3B0aW9uczogZnVuY3Rpb24ob3B0cykgewogICAgCiAgICB2YXIgZGF0YSA9IHRoaXMuZGF0YSgpLmY7CgogICAgaWYgKG9wdHMpIHsKICAgICAgZmxpcE1ldGhvZHMuc2V0RGF0YS5jYWxsKHRoaXMsCiAgICAgICAge29wdHM6ICQuZXh0ZW5kKHt9LCBkYXRhLm9wdHMgfHwgZmxpcE9wdGlvbnMsIG9wdHMpfSk7CiAgICAgIHJldHVybiB0aGlzOwogICAgfSBlbHNlCiAgICAgIHJldHVybiBkYXRhLm9wdHM7CgogIH0sCgogIHo6IGZ1bmN0aW9uKHopIHsKCiAgICB2YXIgZGF0YSA9IHRoaXMuZGF0YSgpLmY7CgogICAgaWYgKGRhdGEuZndyYXBwZXIpIHsKICAgICAgZGF0YS5vcHRzWyd6LWluZGV4J10gPSB6OwogICAgICBkYXRhLmZ3cmFwcGVyLmNzcygKICAgICAgICB7J3otaW5kZXgnOiB6IHx8IHBhcnNlSW50KGRhdGEucGFyZW50LmNzcygnei1pbmRleCcpLCAxMCkgfHwgMH0KICAgICAgKTsKICAgIH0KCiAgICByZXR1cm4gdGhpczsKICB9LAoKICBfY0FsbG93ZWQ6IGZ1bmN0aW9uKCkgewogICAgCiAgICB2YXIgZGF0YSA9IHRoaXMuZGF0YSgpLmYsCiAgICB0dXJuRGF0YSA9IGRhdGEub3B0cy50dXJuLmRhdGEoKSwKICAgIHBhZ2UgPSBkYXRhLm9wdHMucGFnZSwKICAgIG9kZCA9IHBhZ2UlMjsKCiAgICBpZiAodHVybkRhdGEuZGlzcGxheT09J3NpbmdsZScpIHsKICAgICAgaWYgKHBhZ2U9PTEpCiAgICAgICAgcmV0dXJuICh0dXJuRGF0YS5kaXJlY3Rpb249PSdsdHInKSA/CiAgICAgICAgICBjb3JuZXJzWydmb3J3YXJkJ10gOiBjb3JuZXJzWydiYWNrd2FyZCddOwogICAgICBlbHNlIGlmIChwYWdlPT10dXJuRGF0YS50b3RhbFBhZ2VzKQogICAgICAgIHJldHVybiAodHVybkRhdGEuZGlyZWN0aW9uPT0nbHRyJykgPwogICAgICAgICAgY29ybmVyc1snYmFja3dhcmQnXSA6IGNvcm5lcnNbJ2ZvcndhcmQnXTsKICAgICAgZWxzZQogICAgICAgIHJldHVybiBjb3JuZXJzWydhbGwnXTsKICAgIH0gZWxzZSB7CgogICAgICByZXR1cm4gKHR1cm5EYXRhLmRpcmVjdGlvbj09J2x0cicpID8KICAgICAgICBjb3JuZXJzWyhvZGQpID8gJ2ZvcndhcmQnIDogJ2JhY2t3YXJkJ10KICAgICAgICA6CiAgICAgICAgY29ybmVyc1sob2RkKSA/ICdiYWNrd2FyZCcgOiAnZm9yd2FyZCddOwoKICAgIH0KCiAgfSwKCiAgX2Nvcm5lckFjdGl2YXRlZDogZnVuY3Rpb24oZSkgewogIAogIAogICAgdmFyIGRhdGEgPSB0aGlzLmRhdGEoKS5mLAogICAgICBwb3MgPSBkYXRhLnBhcmVudC5vZmZzZXQoKSwKICAgICAgd2lkdGggPSB0aGlzLndpZHRoKCksCiAgICAgIGhlaWdodCA9IHRoaXMuaGVpZ2h0KCksCiAgICAgIGMgPSB7eDogTWF0aC5tYXgoMCwgZS5wYWdlWC1wb3MubGVmdCksIHk6IE1hdGgubWF4KDAsIGUucGFnZVktcG9zLnRvcCl9LAogICAgICBjc3ogPSBkYXRhLm9wdHMuY29ybmVyU2l6ZTsKCiAgICBpZiAoYy54PD0wIHx8IGMueTw9MCB8fCBjLng+PXdpZHRoIHx8IGMueT49aGVpZ2h0KQogICAgICByZXR1cm4gZmFsc2U7CgogICAgdmFyIGFsbG93ZWRDb3JuZXJzID0gZmxpcE1ldGhvZHMuX2NBbGxvd2VkLmNhbGwodGhpcyk7CgogICAgaWYgKGMueD53aWR0aC1jc3opCiAgICAgIGMuY29ybmVyID0gJ3InOwogICAgZWxzZSBpZiAoYy54PGNzeikKICAgICAgYy5jb3JuZXIgPSAnbCc7CiAgICBlbHNlCiAgICAgIHJldHVybiBmYWxzZTsKCgogICAgcmV0dXJuICgkLmluQXJyYXkoYy5jb3JuZXIsIGFsbG93ZWRDb3JuZXJzKT09LTEpID8gZmFsc2UgOiBjOwoKICB9LAoKICBfYzogZnVuY3Rpb24oY29ybmVyLCBvcHRzKSB7CgogICAgb3B0cyA9IG9wdHMgfHwgMDsKCiAgICBzd2l0Y2ggKGNvcm5lcikgewogICAgICBjYXNlICdsJzoKICAgICAgICByZXR1cm4gcG9pbnQyRChvcHRzLCAwKTsKICAgICAgY2FzZSAncic6CiAgICAgICAgcmV0dXJuIHBvaW50MkQodGhpcy53aWR0aCgpLW9wdHMsIDApOwogICAgfQoKICB9LAoKICBfYzI6IGZ1bmN0aW9uKGNvcm5lcikgewoKICAgIHN3aXRjaCAoY29ybmVyKSB7CiAgICAgIGNhc2UgJ2wnOgogICAgICAgIHJldHVybiBwb2ludDJEKHRoaXMud2lkdGgoKSoyLCAwKTsKICAgICAgY2FzZSAncic6CiAgICAgICAgcmV0dXJuIHBvaW50MkQoLXRoaXMud2lkdGgoKSwgMCk7CiAgICB9CgogIH0sCgogIF9mb2xkaW5nUGFnZTogZnVuY3Rpb24oY29ybmVyKSB7CgogICAgdmFyIGRhdGEgPSB0aGlzLmRhdGEoKS5mLAogICAgICBvcHRzID0gZGF0YS5vcHRzOwoKICAgIGlmIChkYXRhLmZvbGRpbmcpIHJldHVybiBkYXRhLmZvbGRpbmc7CiAgICBlbHNlIGlmKG9wdHMudHVybikgewoKICAgICAgZGF0YSA9IG9wdHMudHVybi5kYXRhKCk7CiAgICAgIGlmIChkYXRhLmRpc3BsYXkgPT0gJ3NpbmdsZScpCiAgICAgICAgcmV0dXJuIChkYXRhLnBhZ2VPYmpzW29wdHMubmV4dF0pID8gZGF0YS5wYWdlT2Jqc1swXSA6IG51bGw7CiAgICAgIGVsc2UKICAgICAgICByZXR1cm4gZGF0YS5wYWdlT2Jqc1tvcHRzLm5leHRdOwogICAgfQoKICB9LAoKICBfYmFja0dyYWRpZW50OiBmdW5jdGlvbigpIHsKCiAgICB2YXIgZGF0YSA9IHRoaXMuZGF0YSgpLmYsCiAgICAgIHR1cm4gPSBkYXRhLm9wdHMudHVybiwKICAgICAgZ3JhZGllbnQgPSBkYXRhLm9wdHMuZ3JhZGllbnRzICYmCiAgICAgICAgKCF0dXJuIHx8CiAgICAgICAgdHVybi5kYXRhKCkuZGlzcGxheT09J3NpbmdsZScgfHwKICAgICAgICAoZGF0YS5vcHRzLnBhZ2UhPTIgJiYgZGF0YS5vcHRzLnBhZ2UhPXR1cm4uZGF0YSgpLnRvdGFsUGFnZXMtMSkpOwoKCiAgICByZXR1cm4gZ3JhZGllbnQ7CgogIH0sCgogIHJlc2l6ZTogZnVuY3Rpb24oZnVsbCkgewogICAgCiAgICB2YXIgZGF0YSA9IHRoaXMuZGF0YSgpLmYsCiAgICAgIHdpZHRoID0gdGhpcy53aWR0aCgpLAogICAgICBoZWlnaHQgPSB0aGlzLmhlaWdodCgpOwoKCiAgICBpZiAoZnVsbCkgewogICAgICBkYXRhLndyYXBwZXIuY3NzKHt3aWR0aDogd2lkdGgsIGhlaWdodDogaGVpZ2h0fSk7CiAgICAgIGRhdGEuZnBhZ2UuY3NzKHt3aWR0aDogd2lkdGgsIGhlaWdodDogaGVpZ2h0fSk7CiAgICB9CgogIH0sCgogIC8vIFByZXBhcmVzIHRoZSBwYWdlIGJ5IGFkZGluZyBhIGdlbmVyYWwgd3JhcHBlciBhbmQgYW5vdGhlciBvYmplY3RzCgogIF9hZGRQYWdlV3JhcHBlcjogZnVuY3Rpb24oKSB7CgogICAgdmFyIGF0dCwKICAgICAgZGF0YSA9IHRoaXMuZGF0YSgpLmYsCiAgICAgIHBhcmVudCA9IHRoaXMucGFyZW50KCk7CgogICAgZGF0YS5wYXJlbnQgPSBwYXJlbnQ7CgogICAgaWYgKCFkYXRhLndyYXBwZXIpIHsKICAgICAgICAKICAgICAgdmFyIGNzc1Byb3BlcnRpZXMgPSB7fTsKCiAgICAgIGRhdGEud3JhcHBlciA9ICQoJzxkaXYvPicsIGRpdkF0dCgwLCAwLCAyKSkuCiAgICAgICAgY3NzKGNzc1Byb3BlcnRpZXMpLgogICAgICAgIGFwcGVuZFRvKHBhcmVudCkuCiAgICAgICAgcHJlcGVuZCh0aGlzKTsKCiAgICAgIGRhdGEuZnBhZ2UgPSAkKCc8ZGl2Lz4nLCBkaXZBdHQoMCwgMCwgMSkpLgogICAgICAgIGNzcyhjc3NQcm9wZXJ0aWVzKS4KICAgICAgICBhcHBlbmRUbyhwYXJlbnQpOwoKICAgIH0KCiAgICAvLyBTZXQgc2l6ZQogICAgZmxpcE1ldGhvZHMucmVzaXplLmNhbGwodGhpcywgdHJ1ZSk7CgogIH0sCgogIC8vIFRha2VzIGEgMlAgcG9pbnQgZnJvbSB0aGUgc2NyZWVuIGFuZCBhcHBsaWVzIHRoZSB0cmFuc2Zvcm1hdGlvbgoKICBfZm9sZDogZnVuY3Rpb24ocG9pbnQpIHsKCiAgICB2YXIgZGF0YSA9IHRoaXMuZGF0YSgpLmYsCiAgICAgIG8gPSBmbGlwTWV0aG9kcy5fYy5jYWxsKHRoaXMsIHBvaW50LmNvcm5lciksCiAgICAgIHJlbFggPSAoby54KSA/IG8ueCAtIHBvaW50LnggOiAgcG9pbnQueCwKICAgICAgd2lkdGggPSB0aGlzLndpZHRoKCksCiAgICAgIGhlaWdodCA9IHRoaXMuaGVpZ2h0KCk7CgogICAgICByZWxYID0gTWF0aC5taW4od2lkdGgqMiwgTWF0aC5tYXgoMCwgcmVsWCkpOwoKCiAgICAgIHN3aXRjaChwb2ludC5jb3JuZXIpIHsKICAgICAgICBjYXNlICdyJyA6CiAgICAgICAgICBkYXRhLndyYXBwZXIuY3NzKHsKICAgICAgICAgICAgd2lkdGg6IE1hdGgubWF4KDAsIHdpZHRoLXJlbFgpCiAgICAgICAgICB9KTsKICAgICAgICAgIHRoaXMuY3NzKHsKICAgICAgICAgICAgcG9zaXRpb246ICdyZWxhdGl2ZScsCiAgICAgICAgICAgIGxlZnQ6IC1yZWxYCiAgICAgICAgICB9KTsKCiAgICAgICAgICBkYXRhLmZwYWdlLmNzcyh7CiAgICAgICAgICAgIGxlZnQ6IC1yZWxYICsgd2lkdGgsCiAgICAgICAgICAgIHdpZHRoOiBNYXRoLm1heCgwLCByZWxYLXdpZHRoKQogICAgICAgICAgfSk7CiAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAnbCcgOgoKICAgICAgICAgIGRhdGEud3JhcHBlci5jc3MoewogICAgICAgICAgICB3aWR0aDogd2lkdGgKICAgICAgICAgIH0pOwogICAgICAgICAgdGhpcy5jc3MoewogICAgICAgICAgICBwb3NpdGlvbjogJ3JlbGF0aXZlJywKICAgICAgICAgICAgbGVmdDogcmVsWAogICAgICAgICAgfSk7CgogICAgICAgICAgZGF0YS5mcGFnZS5jc3MoewogICAgICAgICAgICBsZWZ0OiB3aWR0aCwKICAgICAgICAgICAgd2lkdGg6IE1hdGgubWF4KDAsIHJlbFgtd2lkdGgpCiAgICAgICAgICB9KTsKCiAgICAgICAgICBpZiAoZGF0YS5mb2xkaW5nKQogICAgICAgICAgICBkYXRhLmZvbGRpbmcuY3NzKHsKICAgICAgICAgICAgICBwb3NpdGlvbjogJ3JlbGF0aXZlJywKICAgICAgICAgICAgICBsZWZ0OiAtd2lkdGgqMiArIHJlbFgKICAgICAgICAgICAgfSk7CiAgICAgICAgCiAgICAgICAgYnJlYWs7CiAgICAgIH0KCiAgICAgIGRhdGEucGFyZW50LmNzcyh7J292ZXJmbG93JzogJ3Zpc2libGUnfSk7CgogICAgZGF0YS5wb2ludCA9IHBvaW50OwogIAogIH0sCgogIF9tb3ZlRm9sZGluZ1BhZ2U6IGZ1bmN0aW9uKGJvb2wpIHsKCiAgICB2YXIgZGF0YSA9IHRoaXMuZGF0YSgpLmY7CiAgICAgIAogICAgaWYgKGJvb2wpIHsKICAgICAgCiAgICAgIHZhciBmb2xkaW5nID0gZmxpcE1ldGhvZHMuX2ZvbGRpbmdQYWdlLmNhbGwodGhpcyksCiAgICAgICAgdHVybiA9IGRhdGEub3B0cy50dXJuOwogICAgICAKICAgICAgaWYgKGZvbGRpbmcpIHsKCiAgICAgICAgaWYgKGRhdGEuZm9sZGluZykgewogICAgICAgICAgaWYgKGRhdGEuZm9sZGluZz09PWZvbGRpbmcpCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgIGZsaXBNZXRob2RzLl9tb3ZlRm9sZGluZ1BhZ2UuY2FsbCh0aGlzLCBmYWxzZSk7CiAgICAgICAgfQogICAgICAKICAgICAgICBmbGlwTWV0aG9kcy5zZXREYXRhLmNhbGwodGhpcywKICAgICAgICAgIHtiYWNrUGFyZW50OiBmb2xkaW5nLnBhcmVudCgpLAogICAgICAgICAgZm9sZGluZzogZm9sZGluZ30pOwoKICAgICAgICBkYXRhLmZwYWdlLnByZXBlbmQoZm9sZGluZyk7CgogICAgICB9CgogICAgICB0dXJuLnR1cm4oJ3VwZGF0ZScpOwoKICAgIH0gZWxzZSB7CiAgICAgIGlmIChkYXRhLmJhY2tQYXJlbnQpIHsKICAgICAgICBkYXRhLmJhY2tQYXJlbnQucHJlcGVuZChkYXRhLmZvbGRpbmcpOwogICAgICAgIGRlbGV0ZSBkYXRhLmJhY2tQYXJlbnQ7CiAgICAgICAgZGVsZXRlIGRhdGEuZm9sZGluZzsKICAgICAgfQogICAgfQogIH0sCgogIF9zaG93Rm9sZGVkUGFnZTogZnVuY3Rpb24oYywgYW5pbWF0ZSkgewoKICAgIHZhciBmb2xkaW5nID0gZmxpcE1ldGhvZHMuX2ZvbGRpbmdQYWdlLmNhbGwodGhpcyksCiAgICAgIGRkID0gdGhpcy5kYXRhKCksCiAgICAgIGRhdGEgPSBkZC5mLAogICAgICB2aXNpYmxlID0gZGF0YS52aXNpYmxlOwoKICAgIGlmICghdmlzaWJsZSB8fCAhZGF0YS5wb2ludCB8fCBkYXRhLnBvaW50LmNvcm5lciE9Yy5jb3JuZXIpIHsKICAgICAgCiAgICAgIHZhciBtQWN0aW9uID0gZGF0YS5vcHRzLnR1cm4uZGF0YSgpLm1vdXNlQWN0aW9uOwoKICAgICAgdmFyIGV2ZW50ID0gJC5FdmVudCgnc3RhcnQnKTsKICAgICAgdGhpcy50cmlnZ2VyKGV2ZW50LCBbZGF0YS5vcHRzLCBjLmNvcm5lcl0pOwogICAgICB2aXNpYmxlID0gZmFsc2U7CgogICAgICBpZiAoZXZlbnQuaXNEZWZhdWx0UHJldmVudGVkKCkpCiAgICAgICAgcmV0dXJuIGZhbHNlOwoKICAgIH0KCiAgICBpZiAoZm9sZGluZykgewoKICAgICAgaWYgKGFuaW1hdGUpIHsKICAgICAgICAKICAgICAgICB2YXIgdGhhdCA9IHRoaXMsCiAgICAgICAgICBwb2ludCA9IChkYXRhLnBvaW50ICYmIGRhdGEucG9pbnQuY29ybmVyPT1jLmNvcm5lcikgPwogICAgICAgICAgZGF0YS5wb2ludCA6IGZsaXBNZXRob2RzLl9jLmNhbGwodGhpcywgYy5jb3JuZXIsIDEpOwogICAgICAKICAgICAgICB0aGlzLmFuaW1hdGVmKHtmcm9tOiBbcG9pbnQueCwgcG9pbnQueV0sCiAgICAgICAgICB0bzogW2MueCwgYy55XSwKICAgICAgICAgIGR1cmF0aW9uOiA1MDAsCiAgICAgICAgICBmcmFtZTogZnVuY3Rpb24odikgewogICAgICAgICAgICBjLnggPSBNYXRoLnJvdW5kKHZbMF0pOwogICAgICAgICAgICBjLnkgPSBNYXRoLnJvdW5kKHZbMV0pOwogICAgICAgICAgICBmbGlwTWV0aG9kcy5fZm9sZC5jYWxsKHRoYXQsIGMpOwogICAgICAgICAgfX0pOwoKICAgICAgfSBlbHNlICB7CgogICAgICAgIGZsaXBNZXRob2RzLl9mb2xkLmNhbGwodGhpcywgYyk7CiAgICAgICAgaWYgKGRkLmVmZmVjdCAmJiAhZGQuZWZmZWN0LnR1cm5pbmcpCiAgICAgICAgICB0aGlzLmFuaW1hdGVmKGZhbHNlKTsKCiAgICAgIH0KCiAgICAgIGlmICghdmlzaWJsZSkgewoKICAgICAgICBkYXRhLnZpc2libGUgPSB0cnVlOwogICAgICAgIGZsaXBNZXRob2RzLl9tb3ZlRm9sZGluZ1BhZ2UuY2FsbCh0aGlzLCB0cnVlKTsKICAgICAgICBkYXRhLmZwYWdlLnNob3coKTsKICAgICAgfQoKICAgICAgcmV0dXJuIHRydWU7CiAgICB9CgogICAgcmV0dXJuIGZhbHNlOwogIH0sCgogIGhpZGU6IGZ1bmN0aW9uKCkgewoKICAgIHZhciBkYXRhID0gdGhpcy5kYXRhKCkuZiwKICAgICAgZm9sZGluZyA9IGZsaXBNZXRob2RzLl9mb2xkaW5nUGFnZS5jYWxsKHRoaXMpOwoKICAgIHRoaXMuY3NzKHsKICAgICAgcG9zaXRpb246ICcnLAogICAgICBsZWZ0OiAnYXV0bycKICAgIH0pOwoKICAgIGRhdGEud3JhcHBlci5jc3MoewogICAgICB3aWR0aDogdGhpcy53aWR0aCgpCiAgICB9KTsKCiAgICBkYXRhLmZwYWdlLmNzcyh7CiAgICAgIHdpZHRoOiB0aGlzLndpZHRoKCkKICAgIH0pOwoKICAgIGlmIChkYXRhLmZvbGRpbmcpCiAgICAgIGRhdGEuZm9sZGluZy5jc3MoewogICAgICAgIHBvc2l0aW9uOiAnJywKICAgICAgICBsZWZ0OiAnYXV0bycKICAgICAgfSk7CgogICAgZGF0YS5mcGFnZS5oaWRlKCk7CgogICAgZGF0YS52aXNpYmxlID0gZmFsc2U7CgogICAgcmV0dXJuIHRoaXM7CiAgfSwKCiAgaGlkZUZvbGRlZFBhZ2U6IGZ1bmN0aW9uKGFuaW1hdGUpIHsKCiAgICB2YXIgZGF0YSA9IHRoaXMuZGF0YSgpLmY7CgogICAgaWYgKCFkYXRhLnBvaW50KSByZXR1cm47CgogICAgdmFyIHRoYXQgPSB0aGlzLAogICAgICBwMSA9IGRhdGEucG9pbnQsCiAgICAgIGhpZGUgPSBmdW5jdGlvbigpIHsKICAgICAgICBkYXRhLnBvaW50ID0gbnVsbDsKICAgICAgICB0aGF0LmZsaXAoJ2hpZGUnKTsKICAgICAgICB0aGF0LnRyaWdnZXIoJ2VuZCcsIFtkYXRhLm9wdHMsIGZhbHNlXSk7CiAgICAgIH07CgogICAgaWYgKGFuaW1hdGUpIHsKICAgICAgdmFyIHA0ID0gZmxpcE1ldGhvZHMuX2MuY2FsbCh0aGlzLCBwMS5jb3JuZXIpLAogICAgICAgIHRvcCA9IChwMS5jb3JuZXIuc3Vic3RyKDAsMSk9PSd0JyksCiAgICAgICAgZGVsdGEgPSAodG9wKSA/IE1hdGgubWluKDAsIHAxLnktcDQueSkvMiA6IE1hdGgubWF4KDAsIHAxLnktcDQueSkvMiwKICAgICAgICBwMiA9IHBvaW50MkQocDEueCwgcDEueStkZWx0YSksCiAgICAgICAgcDMgPSBwb2ludDJEKHA0LngsIHA0LnktZGVsdGEpOwogICAgCiAgICAgIHRoaXMuYW5pbWF0ZWYoewogICAgICAgIGZyb206IDAsCiAgICAgICAgdG86IDEsCiAgICAgICAgZnJhbWU6IGZ1bmN0aW9uKHYpIHsKICAgICAgICAgIHZhciBucCA9IGJlemllcihwMSwgcDIsIHAzLCBwNCwgdik7CiAgICAgICAgICBwMS54ID0gbnAueDsKICAgICAgICAgIHAxLnkgPSBucC55OwogICAgICAgICAgZmxpcE1ldGhvZHMuX2ZvbGQuY2FsbCh0aGF0LCBwMSk7CiAgICAgICAgfSwKICAgICAgICBjb21wbGV0ZTogaGlkZSwKICAgICAgICBkdXJhdGlvbjogODAwLAogICAgICAgIGhpZGluZzogdHJ1ZQogICAgICAgIH0pOwoKICAgIH0gZWxzZSB7CiAgICAgIHRoaXMuYW5pbWF0ZWYoZmFsc2UpOwogICAgICBoaWRlKCk7CiAgICB9CiAgfSwKCiAgdHVyblBhZ2U6IGZ1bmN0aW9uKGNvcm5lcikgewoKICAgIHZhciB0aGF0ID0gdGhpcywKICAgICAgZGF0YSA9IHRoaXMuZGF0YSgpLmY7CgogICAgY29ybmVyID0ge2Nvcm5lcjogKGRhdGEuY29ybmVyKSA/CiAgICAgIGRhdGEuY29ybmVyLmNvcm5lciA6CiAgICAgIGNvcm5lciB8fCBmbGlwTWV0aG9kcy5fY0FsbG93ZWQuY2FsbCh0aGlzKVswXX07CgogICAgdmFyIHAxID0gZGF0YS5wb2ludCB8fAogICAgICBmbGlwTWV0aG9kcy5fYy5jYWxsKHRoaXMsCiAgICAgICAgY29ybmVyLmNvcm5lciwKICAgICAgICAoZGF0YS5vcHRzLnR1cm4pID8gZGF0YS5vcHRzLnR1cm4uZGF0YSgpLm9wdHMuZWxldmF0aW9uIDogMCksCiAgICAgIHA0ID0gZmxpcE1ldGhvZHMuX2MyLmNhbGwodGhpcywgY29ybmVyLmNvcm5lcik7CgogICAgICB0aGlzLnRyaWdnZXIoJ2ZsaXAnKS4KICAgICAgICBhbmltYXRlZih7CiAgICAgICAgICBmcm9tOiAwLAogICAgICAgICAgdG86IDEsCiAgICAgICAgICBmcmFtZTogZnVuY3Rpb24odikgewogICAgICAgICAgICB2YXIgbnAgPSBiZXppZXIocDEsIHAxLCBwNCwgcDQsIHYpOwogICAgICAgICAgICBjb3JuZXIueCA9IG5wLng7CiAgICAgICAgICAgIGNvcm5lci55ID0gbnAueTsKCiAgICAgICAgICAgIGZsaXBNZXRob2RzLl9zaG93Rm9sZGVkUGFnZS5jYWxsKHRoYXQsIGNvcm5lcik7CiAgICAgICAgICB9LAogICAgICAgICAgCiAgICAgICAgICBjb21wbGV0ZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHRoYXQudHJpZ2dlcignZW5kJywgW2RhdGEub3B0cywgdHJ1ZV0pOwogICAgICAgICAgfSwKICAgICAgICAgIGR1cmF0aW9uOiBkYXRhLm9wdHMuZHVyYXRpb24sCiAgICAgICAgICB0dXJuaW5nOiB0cnVlCiAgICAgICAgfSk7CgogICAgICBkYXRhLmNvcm5lciA9IG51bGw7CiAgfSwKCiAgbW92aW5nOiBmdW5jdGlvbigpIHsKCiAgICByZXR1cm4gJ2VmZmVjdCcgaW4gdGhpcy5kYXRhKCk7CiAgCiAgfSwKCiAgaXNUdXJuaW5nOiBmdW5jdGlvbigpIHsKCiAgICByZXR1cm4gdGhpcy5mbGlwKCdtb3ZpbmcnKSAmJiB0aGlzLmRhdGEoKS5lZmZlY3QudHVybmluZzsKICAKICB9LAoKICBfZXZlbnRTdGFydDogZnVuY3Rpb24oZSkgewoKICAgIHZhciBkYXRhID0gdGhpcy5kYXRhKCkuZjsKCiAgICBpZiAoIWRhdGEuZGlzYWJsZWQgJiYgIXRoaXMuZmxpcCgnaXNUdXJuaW5nJykpIHsKCiAgICAgIGRhdGEuY29ybmVyID0gZmxpcE1ldGhvZHMuX2Nvcm5lckFjdGl2YXRlZC5jYWxsKHRoaXMsIGUpOwogICAgCiAgICAgIGlmIChkYXRhLmNvcm5lciAmJiBmbGlwTWV0aG9kcy5fZm9sZGluZ1BhZ2UuY2FsbCh0aGlzLCBkYXRhLmNvcm5lcikpIHsKICAgICAgCiAgICAgICAgaWYgKGZsaXBNZXRob2RzLl9zaG93Rm9sZGVkUGFnZS5jYWxsKHRoaXMsIGRhdGEuY29ybmVyKSkKICAgICAgICAgIHRoaXMudHJpZ2dlcigncHJlc3NlZCcsIFtkYXRhLnBvaW50XSk7CgogICAgICAgIHJldHVybiBmYWxzZTsKCiAgICAgIH0gZWxzZQogICAgICAgIGRhdGEuY29ybmVyID0gbnVsbDsKCiAgICB9CgogIH0sCgogIF9ldmVudE1vdmU6IGZ1bmN0aW9uKGUpIHsKCiAgICB2YXIgZGF0YSA9IHRoaXMuZGF0YSgpLmY7CgogICAgaWYgKCFkYXRhLmRpc2FibGVkKSB7CgogICAgICBlID0gKGlzVG91Y2gpID8gZS5vcmlnaW5hbEV2ZW50LnRvdWNoZXMgOiBbZV07CiAgICAKICAgICAgaWYgKGRhdGEuY29ybmVyKSB7CgogICAgICAgIHZhciBwb3MgPSBkYXRhLnBhcmVudC5vZmZzZXQoKTsKICAgICAgICBkYXRhLmNvcm5lci54ID0gZVswXS5wYWdlWC1wb3MubGVmdDsKICAgICAgICBkYXRhLmNvcm5lci55ID0gZVswXS5wYWdlWS1wb3MudG9wOwogICAgICAgIGZsaXBNZXRob2RzLl9zaG93Rm9sZGVkUGFnZS5jYWxsKHRoaXMsIGRhdGEuY29ybmVyKTsKCiAgICAgIH0gZWxzZSBpZiAoIXRoaXMuZGF0YSgpLmVmZmVjdCAmJiB0aGlzLmlzKCc6dmlzaWJsZScpKSB7CiAgICAKCiAgICAgICAgdmFyIGNvcm5lciA9IGZsaXBNZXRob2RzLl9jb3JuZXJBY3RpdmF0ZWQuY2FsbCh0aGlzLCBlWzBdKTsKCiAgICAgICAgaWYgKGNvcm5lcikgewogICAgICAgICAgdmFyIG9yaWdpbiA9IGZsaXBNZXRob2RzLl9jLmNhbGwodGhpcywgY29ybmVyLmNvcm5lciwgZGF0YS5vcHRzLmNvcm5lclNpemUvMik7CiAgICAgICAgICBjb3JuZXIueCA9IG9yaWdpbi54OwogICAgICAgICAgY29ybmVyLnkgPSBvcmlnaW4ueTsKICAgICAgICAgIGZsaXBNZXRob2RzLl9zaG93Rm9sZGVkUGFnZS5jYWxsKHRoaXMsIGNvcm5lciwgdHJ1ZSk7CiAgICAgICAgfSBlbHNlCiAgICAgICAgICBmbGlwTWV0aG9kcy5oaWRlRm9sZGVkUGFnZS5jYWxsKHRoaXMsIHRydWUpOwogICAgICAgICAgICAgICAKCiAgICAgIH0KICAgIH0KICB9LAoKICBfZXZlbnRFbmQ6IGZ1bmN0aW9uKCkgewoKICAgIHZhciBkYXRhID0gdGhpcy5kYXRhKCkuZjsKCiAgICBpZiAoIWRhdGEuZGlzYWJsZWQgJiYgZGF0YS5wb2ludCkgewogICAgICB2YXIgZXZlbnQgPSAkLkV2ZW50KCdyZWxlYXNlZCcpOwogICAgICB0aGlzLnRyaWdnZXIoZXZlbnQsIFtkYXRhLnBvaW50XSk7CiAgICAgIGlmICghZXZlbnQuaXNEZWZhdWx0UHJldmVudGVkKCkpCiAgICAgICAgZmxpcE1ldGhvZHMuaGlkZUZvbGRlZFBhZ2UuY2FsbCh0aGlzLCB0cnVlKTsKICAgIH0KCiAgICBkYXRhLmNvcm5lciA9IG51bGw7CgogIH0sCgogIGRpc2FibGU6IGZ1bmN0aW9uKGRpc2FibGUpIHsKCiAgICBmbGlwTWV0aG9kcy5zZXREYXRhLmNhbGwodGhpcywgeydkaXNhYmxlZCc6IGRpc2FibGV9KTsKICAgIHJldHVybiB0aGlzOwoKICB9Cn07CgoKCi8vIFByb2Nlc3NlcyBjbGFzc2VzCgpmdW5jdGlvbiBkZWNvcmF0b3IodGhhdCwgbWV0aG9kcywgYXJncykgewoKICBpZiAoIWFyZ3NbMF0gfHwgdHlwZW9mKGFyZ3NbMF0pPT0nb2JqZWN0JykKICAgIHJldHVybiBtZXRob2RzLmluaXQuYXBwbHkodGhhdCwgYXJncyk7CgogIGVsc2UgaWYgKG1ldGhvZHNbYXJnc1swXV0pCiAgICByZXR1cm4gbWV0aG9kc1thcmdzWzBdXS5hcHBseSh0aGF0LCBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmdzLCAxKSk7CgogIGVsc2UKICAgIHRocm93IHR1cm5FcnJvcihhcmdzWzBdICsgJyBpcyBhbiBpbnZhbGlkIHZhbHVlJyk7Cn0KCgovLyBBdHRyaWJ1dGVzIGZvciBhIGxheWVyCgpmdW5jdGlvbiBkaXZBdHQodG9wLCBsZWZ0LCB6SW5kZXgsIG92ZXJmKSB7CiAgICAKICByZXR1cm4geydjc3MnOiB7CiAgICAgICAgcG9zaXRpb246ICdhYnNvbHV0ZScsCiAgICAgICAgdG9wOiB0b3AsCiAgICAgICAgbGVmdDogbGVmdCwKICAgICAgICAnb3ZlcmZsb3cnOiBvdmVyZiB8fCAnaGlkZGVuJywKICAgICAgICAnei1pbmRleCc6IHpJbmRleCB8fCAnYXV0bycKICAgICAgICB9CiAgICB9OwogICAgICAKfQoKLy8gR2V0cyBhIDJEIHBvaW50IGZyb20gYSBiZXppZXIgY3VydmUgb2YgZm91ciBwb2ludHMKCmZ1bmN0aW9uIGJlemllcihwMSwgcDIsIHAzLCBwNCwgdCkgewoKICB2YXIgYSA9IDEgLSB0LAogICAgYiA9IGEgKiBhICogYSwKICAgIGMgPSB0ICogdCAqIHQ7CiAgICAKICByZXR1cm4gcG9pbnQyRChNYXRoLnJvdW5kKGIqcDEueCArIDMqdCphKmEqcDIueCArIDMqdCp0KmEqcDMueCArIGMqcDQueCksCiAgICBNYXRoLnJvdW5kKGIqcDEueSArIDMqdCphKmEqcDIueSArIDMqdCp0KmEqcDMueSArIGMqcDQueSkpOwoKfQoKLy8gR2V0cyBhIDJEIHBvaW50CgpmdW5jdGlvbiBwb2ludDJEKHgsIHkpIHsKICAKICByZXR1cm4ge3g6IHgsIHk6IHl9OwoKfQoKLy8gQ2hlY2tzIGlmIGEgcHJvcGVydHkgYmVsb25ncyB0byBhbiBvYmplY3QKCmZ1bmN0aW9uIGhhcyhwcm9wZXJ0eSwgb2JqZWN0KSB7CiAgCiAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIHByb3BlcnR5KTsKCn0KCi8vIEdldHMgdGhlIENTUzMgdmVuZG9yIHByZWZpeAoKZnVuY3Rpb24gZ2V0UHJlZml4KCkgewoKICB2YXIgdmVuZG9yUHJlZml4ZXMgPSBbJ01veicsJ1dlYmtpdCcsJ0todG1sJywnTycsJ21zJ10sCiAgbGVuID0gdmVuZG9yUHJlZml4ZXMubGVuZ3RoLAogIHZlbmRvciA9ICcnOwoKICB3aGlsZSAobGVuLS0pCiAgICBpZiAoKHZlbmRvclByZWZpeGVzW2xlbl0gKyAnVHJhbnNmb3JtJykgaW4gZG9jdW1lbnQuYm9keS5zdHlsZSkKICAgICAgdmVuZG9yPSctJyt2ZW5kb3JQcmVmaXhlc1tsZW5dLnRvTG93ZXJDYXNlKCkrJy0nOwoKICByZXR1cm4gdmVuZG9yOwoKfQoKLy8gSlMgRXJyb3JzCgpmdW5jdGlvbiB0dXJuRXJyb3IobWVzc2FnZSkgewoKICBmdW5jdGlvbiBUdXJuSnNFcnJvcihtZXNzYWdlKSB7CiAgICB0aGlzLm5hbWUgPSAiVHVybkpzRXJyb3IiOwogICAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZTsKICB9CgogIFR1cm5Kc0Vycm9yLnByb3RvdHlwZSA9IG5ldyBFcnJvcigpOwogIFR1cm5Kc0Vycm9yLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFR1cm5Kc0Vycm9yOwoKICByZXR1cm4gbmV3IFR1cm5Kc0Vycm9yKG1lc3NhZ2UpOwp9CgovLyBGaW5kIHRoZSBvZmZzZXQgb2YgYW4gZWxlbWVudCBkaXNjYXJkaW5nIGl0cyB0cmFuc2Zvcm1hdGlvbgoKZnVuY3Rpb24gZmluZFBvcyhvYmopIHsKICB2YXIgb2Zmc2V0ID0ge3RvcDogMCwgbGVmdDogMH07CgogIGRvewogICAgb2Zmc2V0LmxlZnQgKz0gb2JqLm9mZnNldExlZnQ7CiAgICBvZmZzZXQudG9wICs9IG9iai5vZmZzZXRUb3A7CiAgfSB3aGlsZSAoKG9iaiA9IG9iai5vZmZzZXRQYXJlbnQpKTsKCiAgcmV0dXJuIG9mZnNldDsKfQoKCi8vIFJlcXVlc3QgYW4gYW5pbWF0aW9uCgp3aW5kb3cucmVxdWVzdEFuaW0gPSBmdW5jdGlvbihjYWxsYmFjaykgewogIHdpbmRvdy5zZXRUaW1lb3V0KGNhbGxiYWNrLCAxMDAwIC8gNjApOwp9CgoKZnVuY3Rpb24gZW1wdHlGdW5jdGlvbigpIHsKICByZXR1cm4gJyc7Cn0KCgovLyBFeHRlbmQgJC5mbgoKJC5leHRlbmQoJC5mbiwgewoKICBmbGlwOiBmdW5jdGlvbihyZXEsIG9wdHMpIHsKICAgIHJldHVybiBkZWNvcmF0b3IodGhpcywgZmxpcE1ldGhvZHMsIGFyZ3VtZW50cyk7CiAgfSwKCiAgdHVybjogZnVuY3Rpb24ocmVxKSB7CiAgICByZXR1cm4gZGVjb3JhdG9yKHRoaXMsIHR1cm5NZXRob2RzLCBhcmd1bWVudHMpOwogIH0sCgogIHRyYW5zZm9ybTogZnVuY3Rpb24odHJhbnNmb3JtLCBvcmlnaW4pIHsKCiAgICB2YXIgcHJvcGVydGllcyA9IHt9OwogICAgCiAgICBpZiAob3JpZ2luKQogICAgICBwcm9wZXJ0aWVzW3ZlbmRvcisndHJhbnNmb3JtLW9yaWdpbiddID0gb3JpZ2luOwogICAgCiAgICBwcm9wZXJ0aWVzW3ZlbmRvcisndHJhbnNmb3JtJ10gPSB0cmFuc2Zvcm07CiAgCiAgICByZXR1cm4gdGhpcy5jc3MocHJvcGVydGllcyk7CgogIH0sCgogIGFuaW1hdGVmOiBmdW5jdGlvbihwb2ludCkgewoKICAgIHZhciBkYXRhID0gdGhpcy5kYXRhKCk7CgogICAgaWYgKGRhdGEuZWZmZWN0KQogICAgICBkYXRhLmVmZmVjdC5zdG9wKCk7CgogICAgaWYgKHBvaW50KSB7CgogICAgICBpZiAoIXBvaW50LnRvLmxlbmd0aCkgcG9pbnQudG8gPSBbcG9pbnQudG9dOwogICAgICBpZiAoIXBvaW50LmZyb20ubGVuZ3RoKSBwb2ludC5mcm9tID0gW3BvaW50LmZyb21dOwoKICAgICAgdmFyIGRpZmYgPSBbXSwKICAgICAgICBsZW4gPSBwb2ludC50by5sZW5ndGgsCiAgICAgICAgYW5pbWF0aW5nID0gdHJ1ZSwKICAgICAgICB0aGF0ID0gdGhpcywKICAgICAgICB0aW1lID0gKG5ldyBEYXRlKCkpLmdldFRpbWUoKSwKICAgICAgICBmcmFtZSA9IGZ1bmN0aW9uKCkgewoKICAgICAgICAgIGlmICghZGF0YS5lZmZlY3QgfHwgIWFuaW1hdGluZykKICAgICAgICAgICAgcmV0dXJuOwoKICAgICAgICAgIHZhciB2ID0gW10sCiAgICAgICAgICAgIHRpbWVEaWZmID0gTWF0aC5taW4ocG9pbnQuZHVyYXRpb24sIChuZXcgRGF0ZSgpKS5nZXRUaW1lKCkgLSB0aW1lKTsKCiAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKQogICAgICAgICAgICB2LnB1c2goZGF0YS5lZmZlY3QuZWFzaW5nKDEsIHRpbWVEaWZmLCBwb2ludC5mcm9tW2ldLCBkaWZmW2ldLCBwb2ludC5kdXJhdGlvbikpOwoKICAgICAgICAgIHBvaW50LmZyYW1lKChsZW49PTEpID8gdlswXSA6IHYpOwoKICAgICAgICAgIGlmICh0aW1lRGlmZj09cG9pbnQuZHVyYXRpb24pIHsKICAgICAgICAgICAgZGVsZXRlIGRhdGFbJ2VmZmVjdCddOwogICAgICAgICAgICB0aGF0LmRhdGEoZGF0YSk7CiAgICAgICAgICAgIGlmIChwb2ludC5jb21wbGV0ZSkKICAgICAgICAgICAgICBwb2ludC5jb21wbGV0ZSgpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgd2luZG93LnJlcXVlc3RBbmltKGZyYW1lKTsKICAgICAgICAgIH0KICAgICAgICB9OwoKICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykKICAgICAgICBkaWZmLnB1c2gocG9pbnQudG9baV0gLSBwb2ludC5mcm9tW2ldKTsKCiAgICAgIGRhdGEuZWZmZWN0ID0gJC5leHRlbmQoewogICAgICAgIHN0b3A6IGZ1bmN0aW9uKCkgewogICAgICAgICAgYW5pbWF0aW5nID0gZmFsc2U7CiAgICAgICAgfSwKICAgICAgICBlYXNpbmc6IGZ1bmN0aW9uICh4LCB0LCBiLCBjLCBkYXRhKSB7CiAgICAgICAgICByZXR1cm4gYyAqIE1hdGguc3FydCgxIC0gKHQ9dC9kYXRhLTEpKnQpICsgYjsKICAgICAgICB9CiAgICAgIH0sIHBvaW50KTsKCiAgICAgIHRoaXMuZGF0YShkYXRhKTsKCiAgICAgIGZyYW1lKCk7CgogICAgfSBlbHNlIHsKICAgICAgCiAgICAgIGRlbGV0ZSBkYXRhWydlZmZlY3QnXTsKCiAgICB9CiAgfQp9KTsKCi8vIEV4cG9ydCBzb21lIGdsb2JhbHMKCiQuaXNUb3VjaCA9IGlzVG91Y2g7CiQubW91c2VFdmVudHMgPSBtb3VzZUV2ZW50czsKJC5jc3NQcmVmaXggPSBlbXB0eUZ1bmN0aW9uOwokLmNzc1RyYW5zaXRpb25FbmQgPSBlbXB0eUZ1bmN0aW9uOwokLmZpbmRQb3MgPSBmaW5kUG9zOwoKfSkoalF1ZXJ5KTs='></script>
	<script id="fb_lib_zoom_js" src='data:/text/plain;base64,LyoqCiAqIHpvb20uanMKICogd3d3LnR1cm5qcy5jb20KICogdHVybmpzLmNvbS9saWNlbnNlLnR4dAogKgogKiBDb3B5cmlnaHQgKEMpIDIwMTIgRW1tYW51ZWwgR2FyY2lhCiAqKi8KCihmdW5jdGlvbigkKSB7CgondXNlIHN0cmljdCc7Cgp2YXIgaGFzM2QsCgp6b29tT3B0aW9ucyA9IHsKICBtYXg6IDIsCiAgZmxpcGJvb2s6IG51bGwsCiAgZWFzZUZ1bmN0aW9uOiAnZWFzZS1pbi1vdXQnLAogIGR1cmF0aW9uOiA1MDAsCiAgd2hlbjoge30KfSwKCnpvb21NZXRob2RzID0gewogIGluaXQ6IGZ1bmN0aW9uKG9wdHMpIHsKCiAgICB2YXIgdGhhdCA9IHRoaXMsCiAgICBkYXRhID0gdGhpcy5kYXRhKCksCiAgICBvcHRpb25zID0gJC5leHRlbmQoe30sIHpvb21PcHRpb25zLCBvcHRzKTsKCiAgICBpZiAoIW9wdGlvbnMuZmxpcGJvb2sgfHwgIW9wdGlvbnMuZmxpcGJvb2sudHVybignaXMnKSkgewogICAgICB0aHJvdyBlcnJvcignb3B0aW9ucy5mbGlwYm9vayBpcyByZXF1aXJlZCcpOwogICAgfQoKICAgIGhhczNkID0gJ1dlYktpdENTU01hdHJpeCcgaW4gd2luZG93IHx8ICdNb3pQZXJzcGVjdGl2ZScgaW4gZG9jdW1lbnQuYm9keS5zdHlsZTsKCiAgICBpZiAodHlwZW9mKG9wdGlvbnMubWF4KSE9J2Z1bmN0aW9uJykgewogICAgICB2YXIgbWF4ID0gb3B0aW9ucy5tYXg7CiAgICAgIG9wdGlvbnMubWF4ID0gZnVuY3Rpb24oKSB7IHJldHVybiBtYXg7IH07CiAgICB9CgogICAgZGF0YS56b29tID0gewogICAgICBvcHRzOiBvcHRpb25zLAogICAgICBheGlzOiBwb2ludDJEKDAsIDApLAogICAgICBzY3JvbGxQb3M6IHBvaW50MkQoMCwgMCksCiAgICAgIGV2ZW50UXVldWU6IFtdLAogICAgICBtb3VzZXVwRXZlbnQ6IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiB6b29tTWV0aG9kcy5fZU1vdXNlVXAuYXBwbHkodGhhdCwgYXJndW1lbnRzKTsKICAgICAgfSwKICAgICAgZXZlbnRUb3VjaFN0YXJ0OiBiaW5kKHpvb21NZXRob2RzLl9lVG91Y2hTdGFydCwgdGhhdCksCiAgICAgIGV2ZW50VG91Y2hNb3ZlOiBiaW5kKHpvb21NZXRob2RzLl9lVG91Y2hNb3ZlLCB0aGF0KSwKICAgICAgZXZlbnRUb3VjaEVuZDogYmluZCh6b29tTWV0aG9kcy5fZVRvdWNoRW5kLCB0aGF0KSwKICAgICAgZmxpcGJvb2tFdmVudHM6IHsKICAgICAgICB6b29taW5nOiBiaW5kKHpvb21NZXRob2RzLl9lWm9vbSwgdGhhdCksCiAgICAgICAgcHJlc3NlZDogYmluZCh6b29tTWV0aG9kcy5fZVByZXNzZWQsIHRoYXQpLAogICAgICAgIHJlbGVhc2VkOiBiaW5kKHpvb21NZXRob2RzLl9lUmVsZWFzZWQsIHRoYXQpLAogICAgICAgIHN0YXJ0OiBiaW5kKHpvb21NZXRob2RzLl9lU3RhcnQsIHRoYXQpLAogICAgICAgIHR1cm5pbmc6IGJpbmQoem9vbU1ldGhvZHMuX2VUdXJuaW5nLCB0aGF0KSwKICAgICAgICB0dXJuZWQ6IGJpbmQoem9vbU1ldGhvZHMuX2VUdXJuZWQsIHRoYXQpLAogICAgICAgIGRlc3Ryb3lpbmc6IGJpbmQoem9vbU1ldGhvZHMuX2VEZXN0cm95aW5nLCB0aGF0KQogICAgICB9CiAgICB9OwoKICAgIGZvciAodmFyIGV2ZW50TmFtZSBpbiBvcHRpb25zLndoZW4pIHsKICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvcHRpb25zLndoZW4sIGV2ZW50TmFtZSkpIHsKICAgICAgICB0aGlzLmJpbmQoJ3pvb20uJytldmVudE5hbWUsIG9wdGlvbnMud2hlbltldmVudE5hbWVdKTsKICAgICAgfQogICAgfQoKICAgIGZvciAoZXZlbnROYW1lIGluIGRhdGEuem9vbS5mbGlwYm9va0V2ZW50cykgewogICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGRhdGEuem9vbS5mbGlwYm9va0V2ZW50cywgZXZlbnROYW1lKSkgewogICAgICAgIG9wdGlvbnMuZmxpcGJvb2suYmluZChldmVudE5hbWUsIGRhdGEuem9vbS5mbGlwYm9va0V2ZW50c1tldmVudE5hbWVdKTsKICAgICAgfQogICAgfQoKICAgIHRoaXMuY3NzKHsKICAgICAgcG9zaXRpb246ICdyZWxhdGl2ZScsCiAgICAgIG92ZXJmbG93IDogJ2hpZGRlbicKICAgIH0pOwoKICAgIGlmICgkLmlzVG91Y2gpIHsKCiAgICAgIG9wdGlvbnMuZmxpcGJvb2suCiAgICAgICAgYmluZCgndG91Y2hzdGFydCcsIGRhdGEuem9vbS5ldmVudFRvdWNoU3RhcnQgKS4KICAgICAgICBiaW5kKCd0b3VjaG1vdmUnLCBkYXRhLnpvb20uZXZlbnRUb3VjaE1vdmUpLgogICAgICAgIGJpbmQoJ3RvdWNoZW5kJywgZGF0YS56b29tLmV2ZW50VG91Y2hFbmQpOwoKICAgICAgdGhpcy5iaW5kKCd0b3VjaHN0YXJ0Jywgem9vbU1ldGhvZHMuX3RhcCk7CgogICAgfSBlbHNlIHsKICAgICAgdGhpcy5tb3VzZWRvd24oem9vbU1ldGhvZHMuX21vdXNlZG93bikuCiAgICAgICAgY2xpY2soem9vbU1ldGhvZHMuX3RhcCk7CiAgICB9CiAgfSwKCiAgX3RhcDogZnVuY3Rpb24oZXZlbnQpIHsKICAgIAogICAgdmFyIHRoYXQgPSAkKHRoaXMpLAogICAgICBkYXRhID0gdGhhdC5kYXRhKCkuem9vbSwKICAgICAgZmxpcCA9IGRhdGEub3B0cy5mbGlwYm9vazsKCiAgICBpZiAoZGF0YS5kcmFnZ2luZ0Nvcm5lciB8fCBkYXRhLmRyYWdnaW5nKSB7CiAgICAgIHJldHVybjsKICAgIH0KCiAgICBpZiAoaXNQYWdlKCQoZXZlbnQudGFyZ2V0KSwgdGhhdCkpIHsKCiAgICAgIHpvb21NZXRob2RzLl9hZGRFdmVudC5jYWxsKHRoYXQsICd0YXAnLCBldmVudCk7CiAgICAgIAogICAgICB2YXIgc2VjdWVuY2UgPSB6b29tTWV0aG9kcy5fZXZlbnRTZXEuY2FsbCh0aGF0KTsKCiAgICAgIGlmIChzZWN1ZW5jZSkKICAgICAgICB0aGF0LnRyaWdnZXIoc2VjdWVuY2UpOwoKICAgIH0KCiAgfSwKCiAgX2FkZEV2ZW50OiBmdW5jdGlvbihldmVudE5hbWUsIGV2ZW50KSB7CiAgICAKICAgIHZhciBkYXRhID0gdGhpcy5kYXRhKCkuem9vbSwKICAgICAgdGltZSA9IChuZXcgRGF0ZSgpKS5nZXRUaW1lKCksCiAgICAgIGV2ZW50T2JqZWN0ID0ge25hbWU6IGV2ZW50TmFtZSwgdGltZXN0YW1wOiB0aW1lLCBldmVudDogZXZlbnR9OwoKICAgIGRhdGEuZXZlbnRRdWV1ZS5wdXNoKGV2ZW50T2JqZWN0KTsKCiAgICBpZiAoZGF0YS5ldmVudFF1ZXVlLmxlbmd0aD4xMCkKICAgICAgZGF0YS5ldmVudFF1ZXVlLnNwbGljZSgwLCAxKTsKCiAgfSwKCiAgX2V2ZW50U2VxOiBmdW5jdGlvbigpIHsKCiAgICB2YXIgZGF0YSA9IHRoaXMuZGF0YSgpLnpvb20sCiAgICAgIGxpc3QgPSBkYXRhLmV2ZW50UXVldWUsCiAgICAgIGxhc3RFdmVudCA9IGxpc3QubGVuZ3RoLTE7CgogICAgaWYgKGxhc3RFdmVudD4wICYmCiAgICAgIGxpc3RbbGFzdEV2ZW50XS5uYW1lPT0ndGFwJyAmJgogICAgICBsaXN0W2xhc3RFdmVudC0xXS5uYW1lPT0ndGFwJyAmJgogICAgICBsaXN0W2xhc3RFdmVudF0uZXZlbnQucGFnZVggPT0gbGlzdFtsYXN0RXZlbnQtMV0uZXZlbnQucGFnZVggJiYKICAgICAgbGlzdFtsYXN0RXZlbnRdLmV2ZW50LnBhZ2VZID09IGxpc3RbbGFzdEV2ZW50LTFdLmV2ZW50LnBhZ2VZICYmCiAgICAgIGxpc3RbbGFzdEV2ZW50XS50aW1lc3RhbXAtbGlzdFtsYXN0RXZlbnQtMV0udGltZXN0YW1wIDwgMjAwICYmCiAgICAgIGxpc3RbbGFzdEV2ZW50XS50aW1lc3RhbXAtbGlzdFtsYXN0RXZlbnQtMV0udGltZXN0YW1wID4gNTApCiAgICB7CiAgCiAgICAgIHJldHVybiAkLmV4dGVuZChsaXN0W2xhc3RFdmVudF0uZXZlbnQsIHt0eXBlOiAnem9vbS5kb3VibGVUYXAnfSk7CgogICAgfSBlbHNlIGlmIChsaXN0W2xhc3RFdmVudF0ubmFtZT09J3RhcCcpIHsKICAgICAgCiAgICAgIHJldHVybiAkLmV4dGVuZChsaXN0W2xhc3RFdmVudF0uZXZlbnQsIHt0eXBlOiAnem9vbS50YXAnfSk7CgogICAgfQogICAgICAKICB9LAoKICBfcHJlcGFyZVpvb206IGZ1bmN0aW9uICgpIHsKICAgIAogICAgdmFyIGZsaXBQb3MsIG9mZnNldExlZnQgPSAwLAogICAgICBkYXRhID0gdGhpcy5kYXRhKCkuem9vbSwKICAgICAgaW52eiA9IDEvdGhpcy56b29tKCd2YWx1ZScpLAogICAgICBmbGlwID0gZGF0YS5vcHRzLmZsaXBib29rLAogICAgICBkaXIgPSBmbGlwLnR1cm4oJ2RpcmVjdGlvbicpLAogICAgICBmbGlwRGF0YSA9IGZsaXAuZGF0YSgpLAogICAgICBmbGlwT2Zmc2V0ID0gZmxpcC5vZmZzZXQoKSwKICAgICAgdGhpc09mZnNldCA9IHRoaXMub2Zmc2V0KCksCiAgICAgIGZsaXBTaXplID0ge2hlaWdodDogZmxpcC5oZWlnaHQoKX0sCiAgICAgIHZpZXcgPSBmbGlwLnR1cm4oJ3ZpZXcnKTsKCiAgICAgIGlmIChmbGlwLnR1cm4oJ2Rpc3BsYXknKT09J2RvdWJsZScgJiYgZmxpcC5kYXRhKCkub3B0cy5hdXRvQ2VudGVyKSB7CiAgICAgICAgaWYgKCF2aWV3WzBdKSB7CiAgICAgICAgICBmbGlwU2l6ZS53aWR0aCA9IGZsaXAud2lkdGgoKS8yOwogICAgICAgICAgb2Zmc2V0TGVmdCA9IChkaXI9PSdsdHInKSA/IGZsaXBTaXplLndpZHRoIDogMDsKICAgICAgICAgIGZsaXBQb3MgPSBwb2ludDJEKAogICAgICAgICAgICAoZGlyPT0nbHRyJykgPyBmbGlwT2Zmc2V0LmxlZnQtdGhpc09mZnNldC5sZWZ0K2ZsaXBTaXplLndpZHRoIDogZmxpcE9mZnNldC5sZWZ0LXRoaXNPZmZzZXQubGVmdCwKICAgICAgICAgICAgZmxpcE9mZnNldC50b3AtdGhpc09mZnNldC50b3AKICAgICAgICAgICk7CgogICAgICAgIH0gZWxzZSBpZiAoIXZpZXdbMV0pIHsKICAgICAgICAgIGZsaXBTaXplLndpZHRoID0gZmxpcC53aWR0aCgpLzI7CiAgICAgICAgICBvZmZzZXRMZWZ0ID0gKGRpcj09J2x0cicpID8gMCA6IGZsaXBTaXplLndpZHRoOwogICAgICAgICAgZmxpcFBvcyA9IHBvaW50MkQoCiAgICAgICAgICAgIChkaXI9PSdsdHInKSA/IGZsaXBPZmZzZXQubGVmdC10aGlzT2Zmc2V0LmxlZnQgOiBmbGlwT2Zmc2V0LmxlZnQtdGhpc09mZnNldC5sZWZ0K2ZsaXBTaXplLndpZHRoLAogICAgICAgICAgICBmbGlwT2Zmc2V0LnRvcC10aGlzT2Zmc2V0LnRvcAogICAgICAgICAgKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgZmxpcFNpemUud2lkdGggPSBmbGlwLndpZHRoKCk7CiAgICAgICAgICBmbGlwUG9zID0gcG9pbnQyRCgKICAgICAgICAgICAgZmxpcE9mZnNldC5sZWZ0LXRoaXNPZmZzZXQubGVmdCwKICAgICAgICAgICAgZmxpcE9mZnNldC50b3AtdGhpc09mZnNldC50b3AKICAgICAgICAgICk7CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIGZsaXBTaXplLndpZHRoID0gZmxpcC53aWR0aCgpOwogICAgICAgIGZsaXBQb3MgPSBwb2ludDJEKAogICAgICAgICAgZmxpcE9mZnNldC5sZWZ0LXRoaXNPZmZzZXQubGVmdCwKICAgICAgICAgIGZsaXBPZmZzZXQudG9wLXRoaXNPZmZzZXQudG9wCiAgICAgICAgKTsKICAgICAgfQoKICAgIGlmICghZGF0YS56b29tZXIpIHsKICAgICAgZGF0YS56b29tZXIgPSAkKCc8ZGl2IC8+JywKICAgICAgICB7J2NsYXNzJzogJ3pvb21lcicsCiAgICAgICAgICBjc3M6IHsKICAgICAgICAgICAgb3ZlcmZsb3c6J2hpZGRlbicsCiAgICAgICAgICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLAogICAgICAgICAgICB6SW5kZXg6ICcxMDAwMDAwJwogICAgICAgICAgfQogICAgICAgIH0pLgogICAgICBtb3VzZWRvd24oZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9KS5hcHBlbmRUbyh0aGlzKTsKICAgIH0KCgogICAgZGF0YS56b29tZXIuY3NzKHsKICAgICAgdG9wOiBmbGlwUG9zLnksCiAgICAgIGxlZnQ6IGZsaXBQb3MueCwKICAgICAgd2lkdGg6IGZsaXBTaXplLndpZHRoLAogICAgICBoZWlnaHQ6IGZsaXBTaXplLmhlaWdodAogICAgfSk7CiAgICAKICAgIHZhciB6b29tZXJWaWV3ID0gdmlldy5qb2luKCcsJyk7CgogICAgaWYgKHpvb21lclZpZXchPWRhdGEuem9vbWVyVmlldykgewoKICAgICAgZGF0YS56b29tZXJWaWV3ID0gem9vbWVyVmlldzsKICAgICAgZGF0YS56b29tZXIuZmluZCgnKicpLnJlbW92ZSgpOwoKICAgICAgZm9yICh2YXIgcCA9IDA7IHA8dmlldy5sZW5ndGg7IHArKykgewoKICAgICAgICBpZiAoIXZpZXdbcF0pCiAgICAgICAgICBjb250aW51ZTsKCiAgICAgICAgdmFyIHBvcyA9IGZsaXBEYXRhLnBhZ2VPYmpzW3ZpZXdbcF1dLm9mZnNldCgpLAogICAgICAgICAgcGFnZUVsZW1lbnQgPSAkKGZsaXBEYXRhLnBhZ2VPYmpzW3ZpZXdbcF1dKTsKICAgICAgICAgIAogICAgICAgIHBhZ2VFbGVtZW50LgogICAgICAgICAgY2xvbmUoKS4KICAgICAgICAgIHRyYW5zZm9ybSgnJykuCiAgICAgICAgICBjc3MoewogICAgICAgICAgICB3aWR0aDogcGFnZUVsZW1lbnQud2lkdGgoKSppbnZ6LAogICAgICAgICAgICBoZWlnaHQ6IHBhZ2VFbGVtZW50LmhlaWdodCgpKmludnosCiAgICAgICAgICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLAogICAgICAgICAgICBkaXNwbGF5OiAnJywKICAgICAgICAgICAgdG9wOiAocG9zLnRvcCAtIGZsaXBPZmZzZXQudG9wKSppbnZ6LAogICAgICAgICAgICBsZWZ0OiAocG9zLmxlZnQgLSBmbGlwT2Zmc2V0LmxlZnQgLSBvZmZzZXRMZWZ0KSppbnZ6CiAgICAgICAgICB9KS4KICAgICAgICAgIGFwcGVuZFRvKGRhdGEuem9vbWVyKTsKICAgICAgfQogICAgfQogICAgCiAgICAKICAgIHJldHVybiB7cG9zOiBmbGlwUG9zLCBzaXplOiBmbGlwU2l6ZX07CgogIH0sCgogIHZhbHVlOiBmdW5jdGlvbigpIHsKCiAgICB2YXIgZGF0YSA9IHRoaXMuZGF0YSgpLnpvb207CgogICAgcmV0dXJuIGRhdGEub3B0cy5mbGlwYm9vay50dXJuKCd6b29tJyk7CiAgfSwKCiAgem9vbUluOiBmdW5jdGlvbihldmVudCkgewoKICAgIHZhciBwb3MsCiAgICAgIHRoYXQgPSB0aGlzLAogICAgICBkYXRhID0gdGhpcy5kYXRhKCkuem9vbSwKICAgICAgZmxpcCA9IGRhdGEub3B0cy5mbGlwYm9vaywKICAgICAgem9vbSA9IGRhdGEub3B0cy5tYXgoKSwKICAgICAgZmxpcE9mZnNldCA9IGZsaXAub2Zmc2V0KCksCiAgICAgIHRoaXNPZmZzZXQgPSB0aGlzLm9mZnNldCgpOwoKICAgIGlmIChkYXRhLnpvb21JbikKICAgICAgcmV0dXJuIHRoaXM7CgogICAgZmxpcC50dXJuKCdzdG9wJyk7CiAgICAKICAgIHZhciBldiA9ICQuRXZlbnQoJ3pvb20uY2hhbmdlJyk7CiAgICB0aGlzLnRyaWdnZXIoZXYsIFt6b29tXSk7CgogICAgaWYgKGV2LmlzRGVmYXVsdFByZXZlbnRlZCgpKQogICAgICByZXR1cm4gdGhpczsKCiAgICB2YXIgYm91bmQgPSB6b29tTWV0aG9kcy5fcHJlcGFyZVpvb20uY2FsbCh0aGlzKSwKICAgICAgZmxpcFBvcyA9IGJvdW5kLnBvcywKICAgICAgY2VudGVyID0gcG9pbnQyRChib3VuZC5zaXplLndpZHRoLzIsIGJvdW5kLnNpemUuaGVpZ2h0LzIpLAogICAgICBwcmVmaXggPSAkLmNzc1ByZWZpeCgpLAogICAgICB0cmFuc2l0aW9uRW5kID0gJC5jc3NUcmFuc2l0aW9uRW5kKCksCiAgICAgIGF1dG9DZW50ZXIgPSBmbGlwLmRhdGEoKS5vcHRzLmF1dG9DZW50ZXI7CgogICAgZGF0YS5zY2FsZSA9IHpvb207CiAgICBmbGlwLmRhdGEoKS5ub0NlbnRlciA9IHRydWU7CgogICAgaWYgKHR5cGVvZihldmVudCkhPSd1bmRlZmluZWQnKSB7CgogICAgICBpZiAoJ3gnIGluIGV2ZW50ICYmICd5JyBpbiBldmVudCkgewogICAgICAgIAogICAgICAgIHBvcyA9IHBvaW50MkQoZXZlbnQueC1mbGlwUG9zLngsIGV2ZW50LnktZmxpcFBvcy55KTsKICAgICAgCiAgICAgIH0gZWxzZSB7CgogICAgICAgIHBvcyA9ICgkLmlzVG91Y2gpID8KICAgICAgICAgIHBvaW50MkQoCiAgICAgICAgICAgIGV2ZW50Lm9yaWdpbmFsRXZlbnQudG91Y2hlc1swXS5wYWdlWC1mbGlwUG9zLngtdGhpc09mZnNldC5sZWZ0LAogICAgICAgICAgICBldmVudC5vcmlnaW5hbEV2ZW50LnRvdWNoZXNbMF0ucGFnZVktZmxpcFBvcy55LXRoaXNPZmZzZXQudG9wCiAgICAgICAgICApCiAgICAgICAgICA6CiAgICAgICAgICBwb2ludDJEKAogICAgICAgICAgICBldmVudC5wYWdlWC1mbGlwUG9zLngtdGhpc09mZnNldC5sZWZ0LAogICAgICAgICAgICBldmVudC5wYWdlWS1mbGlwUG9zLnktdGhpc09mZnNldC50b3AKICAgICAgICAgICk7CgogICAgICB9CgogICAgfSBlbHNlIHsKICAgICAgcG9zID0gcG9pbnQyRChjZW50ZXIueCwgY2VudGVyLnkpOwogICAgfQoKCgogICAgaWYgKHBvcy54PDAgfHwgcG9zLnk8MCB8fCBwb3MueD5ib3VuZC53aWR0aCB8fCBwb3MueT5ib3VuZC5oZWlnaHQpIHsKICAgICAgcG9zLnggPSBjZW50ZXIueDsKICAgICAgcG9zLnkgPSBjZW50ZXIueTsKICAgIH0KCgogICAgdmFyIGNvbXBvc2UgPSBwb2ludDJEKAogICAgICAgIChwb3MueC1jZW50ZXIueCkqem9vbSArIGNlbnRlci54LAogICAgICAgIChwb3MueS1jZW50ZXIueSkqem9vbSArIGNlbnRlci55CiAgICAgICksCiAgICAgIG1vdmUgPSBwb2ludDJEKAogICAgICAgIChib3VuZC5zaXplLndpZHRoKnpvb20+dGhpcy53aWR0aCgpKSA/IHBvcy54LWNvbXBvc2UueCA6IDAsCiAgICAgICAgKGJvdW5kLnNpemUuaGVpZ2h0Knpvb20+dGhpcy5oZWlnaHQoKSkgPyBwb3MueS1jb21wb3NlLnkgOiAwCiAgICAgICksCiAgICAgIG1heE1vdmUgPSBwb2ludDJEKAogICAgICAgIE1hdGguYWJzKGJvdW5kLnNpemUud2lkdGgqem9vbS10aGlzLndpZHRoKCkpLAogICAgICAgIE1hdGguYWJzKGJvdW5kLnNpemUuaGVpZ2h0Knpvb20tdGhpcy5oZWlnaHQoKSkKICAgICAgKSwKICAgICAgbWluTW92ZSA9IHBvaW50MkQoCiAgICAgICAgTWF0aC5taW4oMCwgYm91bmQuc2l6ZS53aWR0aCp6b29tLXRoaXMud2lkdGgoKSksCiAgICAgICAgTWF0aC5taW4oMCwgYm91bmQuc2l6ZS5oZWlnaHQqem9vbS10aGlzLmhlaWdodCgpKQogICAgICApLAogICAgICByZWFsUG9zID0gcG9pbnQyRCgKICAgICAgICBjZW50ZXIueCp6b29tIC0gY2VudGVyLnggLSBmbGlwUG9zLnggLSBtb3ZlLngsCiAgICAgICAgY2VudGVyLnkqem9vbSAtIGNlbnRlci55IC0gZmxpcFBvcy55IC0gbW92ZS55CiAgICAgICk7CgogICAgaWYgKHJlYWxQb3MueT5tYXhNb3ZlLnkpCiAgICAgIG1vdmUueSA9IHJlYWxQb3MueSAtIG1heE1vdmUueSArICBtb3ZlLnk7CiAgICBlbHNlIGlmIChyZWFsUG9zLnk8bWluTW92ZS55KQogICAgICBtb3ZlLnkgPSByZWFsUG9zLnkgLSBtaW5Nb3ZlLnkgKyAgbW92ZS55OwoKICAgIGlmIChyZWFsUG9zLng+bWF4TW92ZS54KQogICAgICBtb3ZlLnggPSByZWFsUG9zLnggLSBtYXhNb3ZlLnggKyAgbW92ZS54OwogICAgZWxzZSBpZiAocmVhbFBvcy54PG1pbk1vdmUueCkKICAgICAgbW92ZS54ID0gcmVhbFBvcy54IC0gbWluTW92ZS54ICsgIG1vdmUueDsKCiAgICByZWFsUG9zID0gcG9pbnQyRCgKICAgICAgY2VudGVyLngqem9vbSAtIGNlbnRlci54IC0gZmxpcFBvcy54IC0gbW92ZS54LAogICAgICBjZW50ZXIueSp6b29tIC0gY2VudGVyLnkgLSBmbGlwUG9zLnkgLSBtb3ZlLnkKICAgICk7CgogICAgdmFyIGNzcyA9IHt9OwoKICAgIGNzc1twcmVmaXgrJ3RyYW5zaXRpb24nXSA9IHByZWZpeCArCiAgICAgICd0cmFuc2Zvcm0gJyArCiAgICAgIGRhdGEub3B0cy5lYXNlRnVuY3Rpb24gKwogICAgICAnICcgKwogICAgICBkYXRhLm9wdHMuZHVyYXRpb24gKwogICAgICAnbXMnOwoKICAgIHZhciB0cmFuc2l0aW9uRW5kQ2FsbGJhY2sgPSBmdW5jdGlvbigpIHsKCiAgICAgIHRoYXQudHJpZ2dlcignem9vbS56b29tSW4nKTsKCiAgICAgIGRhdGEuem9vbUluID0gdHJ1ZTsKCiAgICAgIGRhdGEuZmxpcFBvc2l0aW9uID0gcG9pbnQyRChmbGlwLmNzcygnbGVmdCcpLCBmbGlwLmNzcygndG9wJykpOwoKICAgICAgZmxpcC50dXJuKCd6b29tJywgem9vbSkuY3NzKHsKICAgICAgICBwb3NpdGlvbjogJ2Fic29sdXRlJywKICAgICAgICBtYXJnaW46ICcnLAogICAgICAgIHRvcDowLAogICAgICAgIGxlZnQ6MAogICAgICB9KTsKCiAgICAgIHZhciBmbGlwT2Zmc2V0ID0gZmxpcC5vZmZzZXQoKTsKICAgICAgCiAgICAgIGRhdGEuYXhpcyA9IHBvaW50MkQoCiAgICAgICAgZmxpcE9mZnNldC5sZWZ0IC0gdGhpc09mZnNldC5sZWZ0LAogICAgICAgIGZsaXBPZmZzZXQudG9wIC0gdGhpc09mZnNldC50b3AKICAgICAgKTsKCgogICAgICBpZiAoYXV0b0NlbnRlciAmJiBmbGlwLnR1cm4oJ2Rpc3BsYXknKT09J2RvdWJsZScpCiAgICAgICAgaWYgKChmbGlwLnR1cm4oJ2RpcmVjdGlvbicpPT0nbHRyJyAmJiAhZmxpcC50dXJuKCd2aWV3JylbMF0pIHx8CiAgICAgICAgICAoZmxpcC50dXJuKCdkaXJlY3Rpb24nKT09J3J0bCcgJiYgIWZsaXAudHVybigndmlldycpWzFdKQogICAgICAgICkKICAgICAgICAgIGRhdGEuYXhpcy54ID0gZGF0YS5heGlzLnggKyBmbGlwLndpZHRoKCkvMjsKCiAgICAgIHRoYXQuem9vbSgnc2Nyb2xsJywgcmVhbFBvcyk7CiAgICAgIHRoYXQuYmluZCgkLm1vdXNlRXZlbnRzLmRvd24sIHpvb21NZXRob2RzLl9lTW91c2VEb3duKTsKICAgICAgdGhhdC5iaW5kKCQubW91c2VFdmVudHMubW92ZSwgem9vbU1ldGhvZHMuX2VNb3VzZU1vdmUpOwogICAgICAkKGRvY3VtZW50KS5iaW5kKCQubW91c2VFdmVudHMudXAsIGRhdGEubW91c2V1cEV2ZW50KTsKICAgICAgdGhhdC5iaW5kKCdtb3VzZXdoZWVsJywgem9vbU1ldGhvZHMuX2VNb3VzZVdoZWVsKTsKCiAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CiAgICAgICAgZGF0YS56b29tZXIuaGlkZSgpOwogICAgICAgIGRhdGEuem9vbWVyLnJlbW92ZSgpOwogICAgICAgIGRhdGEuem9vbWVyID0gbnVsbDsKICAgICAgICBkYXRhLnpvb21lclZpZXcgPSBudWxsOwogICAgICB9LCA1MCk7CgogICAgfTsKCiAgICBkYXRhLnpvb21lci5jc3MoY3NzKS5zaG93KCk7CgogICAgaWYgKHRyYW5zaXRpb25FbmQpCiAgICAgIGRhdGEuem9vbWVyLmJpbmQodHJhbnNpdGlvbkVuZCwgZnVuY3Rpb24oKSB7CiAgICAgICAgJCh0aGlzKS51bmJpbmQodHJhbnNpdGlvbkVuZCk7CiAgICAgICAgdHJhbnNpdGlvbkVuZENhbGxiYWNrKCk7CiAgICAgIH0pOwogICAgZWxzZQogICAgICBzZXRUaW1lb3V0KHRyYW5zaXRpb25FbmRDYWxsYmFjaywgZGF0YS5vcHRzLmR1cmF0aW9uKTsKCiAgICBkYXRhLnpvb21lci50cmFuc2Zvcm0odHJhbnNsYXRlKG1vdmUueCwgbW92ZS55LCB0cnVlKSArIHNjYWxlKHpvb20sIHRydWUpKTsKICAgIAogICAgcmV0dXJuIHRoaXM7CiAgfSwKCiAgem9vbU91dDogZnVuY3Rpb24oZHVyYXRpb24pIHsKCiAgICB2YXIgcG9zLCBtb3ZlLAogICAgICB0aGF0ID0gdGhpcywKICAgICAgZGF0YSA9IHRoaXMuZGF0YSgpLnpvb20sCiAgICAgIGZsaXAgPSBkYXRhLm9wdHMuZmxpcGJvb2ssCiAgICAgIHpvb20gPSAxLAogICAgICBzY2FsaW5nID0gem9vbS9kYXRhLnNjYWxlLAogICAgICBwcmVmaXggPSAkLmNzc1ByZWZpeCgpLAogICAgICB0cmFuc2l0aW9uRW5kID0gJC5jc3NUcmFuc2l0aW9uRW5kKCksCiAgICAgIHRoaXNPZmZzZXQgPSB0aGlzLm9mZnNldCgpOwoKICAgIGR1cmF0aW9uID0gKHR5cGVvZihkdXJhdGlvbikhPSd1bmRlZmluZWQnKSA/IGR1cmF0aW9uIDogZGF0YS5vcHRzLmR1cmF0aW9uOwoKICAgIGlmICghZGF0YS56b29tSW4pCiAgICAgIHJldHVybjsKICAgICAgCiAgICB2YXIgZXYgPSAkLkV2ZW50KCd6b29tLmNoYW5nZScpOwogICAgdGhpcy50cmlnZ2VyKGV2LCBbem9vbV0pOwoKICAgIGlmIChldi5pc0RlZmF1bHRQcmV2ZW50ZWQoKSkKICAgICAgcmV0dXJuIHRoaXM7CgogICAgZGF0YS56b29tSW4gPSBmYWxzZTsKICAgIGRhdGEuc2NhbGUgPSB6b29tOwoKICAgIGZsaXAuZGF0YSgpLm5vQ2VudGVyID0gZmFsc2U7CgogICAgdGhhdC51bmJpbmQoJC5tb3VzZUV2ZW50cy5kb3duLCB6b29tTWV0aG9kcy5fZU1vdXNlRG93bik7CiAgICB0aGF0LnVuYmluZCgkLm1vdXNlRXZlbnRzLm1vdmUsIHpvb21NZXRob2RzLl9lTW91c2VNb3ZlKTsKICAgICQoZG9jdW1lbnQpLnVuYmluZCgkLm1vdXNlRXZlbnRzLnVwLCBkYXRhLm1vdXNldXBFdmVudCk7CiAgICB0aGF0LnVuYmluZCgnbW91c2V3aGVlbCcsIHpvb21NZXRob2RzLl9lTW91c2VXaGVlbCk7CgogICAgdmFyIGNzcyA9IHt9OwoKICAgIGNzc1twcmVmaXgrJ3RyYW5zaXRpb24nXSA9IHByZWZpeCArCiAgICAgICd0cmFuc2Zvcm0gJyArCiAgICAgIGRhdGEub3B0cy5lYXNlRnVuY3Rpb24gKwogICAgICAnICcgKwogICAgICBkdXJhdGlvbiArCiAgICAgICdtcyc7CgogICAgZmxpcC5jc3MoY3NzKTsKCiAgICB2YXIgZmxpcERlc1BvcywKICAgICAgdG1wID0gJCgnPGRpdiAvPicsIHsKICAgICAgICBjc3M6IHsKICAgICAgICAgIHBvc2l0aW9uOiAncmVsYXRpdmUnLAogICAgICAgICAgdG9wOiBkYXRhLmZsaXBQb3NpdGlvbi55LAogICAgICAgICAgbGVmdDogZGF0YS5mbGlwUG9zaXRpb24ueCwKICAgICAgICAgIHdpZHRoOiBmbGlwLndpZHRoKCkqc2NhbGluZywKICAgICAgICAgIGhlaWdodDogZmxpcC5oZWlnaHQoKSpzY2FsaW5nLAogICAgICAgICAgYmFja2dyb3VuZDogJ2JsdWUnCiAgICAgICAgfQogICAgICB9KS5hcHBlbmRUbyhmbGlwLnBhcmVudCgpKTsKCiAgICBmbGlwRGVzUG9zID0gcG9pbnQyRCgKICAgICAgdG1wLm9mZnNldCgpLmxlZnQtdGhpc09mZnNldC5sZWZ0LAogICAgICB0bXAub2Zmc2V0KCkudG9wLXRoaXNPZmZzZXQudG9wCiAgICApOwogICAgCgogICAgdG1wLnJlbW92ZSgpOwoKICAgIHZhciBhdXRvQ2VudGVyID0gZmxpcC5kYXRhKCkub3B0cy5hdXRvQ2VudGVyOwoKICAgIGlmIChhdXRvQ2VudGVyICYmIGZsaXAudHVybignZGlzcGxheScpPT0nZG91YmxlJykgewoKICAgICAgaWYgKCFmbGlwLnR1cm4oJ3ZpZXcnKVswXSkKICAgICAgICBmbGlwRGVzUG9zLnggPSAoZmxpcC50dXJuKCdkaXJlY3Rpb24nKT09J2x0cicpID8KICAgICAgICAgIGZsaXBEZXNQb3MueC10bXAud2lkdGgoKS80IDoKICAgICAgICAgIGZsaXBEZXNQb3MueCt0bXAud2lkdGgoKS80OwogICAgICBlbHNlIGlmICghZmxpcC50dXJuKCd2aWV3JylbMV0pCiAgICAgICAgZmxpcERlc1Bvcy54ID0gKGZsaXAudHVybignZGlyZWN0aW9uJyk9PSdsdHInKSA/CiAgICAgICAgICBmbGlwRGVzUG9zLngrdG1wLndpZHRoKCkvNCA6CiAgICAgICAgICBmbGlwRGVzUG9zLngtdG1wLndpZHRoKCkvNDsKICAgIH0KCiAgICB2YXIgZmxpcFJlYWxQb3MgPSAkLmZpbmRQb3MoZmxpcFswXSk7CiAgICAgIAogICAgbW92ZSA9IHBvaW50MkQoCiAgICAgIC1mbGlwLndpZHRoKCkvMiAtIGZsaXBSZWFsUG9zLmxlZnQgKyB0bXAud2lkdGgoKS8yICsgZmxpcERlc1Bvcy54ICsgdGhpc09mZnNldC5sZWZ0LAogICAgICAtZmxpcC5oZWlnaHQoKS8yIC0gZmxpcFJlYWxQb3MudG9wICsgdG1wLmhlaWdodCgpLzIgKyBmbGlwRGVzUG9zLnkgKyB0aGlzT2Zmc2V0LnRvcCk7CgogICAgdmFyIHRyYW5zaXRpb25FbmRDYWxsYmFjayA9IGZ1bmN0aW9uKCkgewogICAgCiAgICAgIGlmIChmbGlwWzBdLnN0eWxlLnJlbW92ZVByb3BlcnR5KSB7CiAgICAgICAgCiAgICAgICAgZmxpcFswXS5zdHlsZS5yZW1vdmVQcm9wZXJ0eShwcmVmaXgrJ3RyYW5zaXRpb24nKTsKICAgICAgICBmbGlwLnRyYW5zZm9ybSgKICAgICAgICAgIChmbGlwLnR1cm4oJ29wdGlvbnMnKS5hY2NlbGVyYXRpb24pID8gdHJhbnNsYXRlKDAsIDAsIHRydWUpIDogJycpLnR1cm4oJ3pvb20nLCAxKTsKICAgICAgICBmbGlwWzBdLnN0eWxlLnJlbW92ZVByb3BlcnR5KCdtYXJnaW4nKTsKICAgICAgICBmbGlwLmNzcyh7CiAgICAgICAgICBwb3NpdGlvbjogJ3JlbGF0aXZlJywKICAgICAgICAgIHRvcDogZGF0YS5mbGlwUG9zaXRpb24ueSwKICAgICAgICAgIGxlZnQ6IGRhdGEuZmxpcFBvc2l0aW9uLngKICAgICAgICB9KTsKCiAgICAgIH0gZWxzZSB7CiAgICAgICAgCiAgICAgICAgZmxpcC50cmFuc2Zvcm0oJ25vbmUnKS4KICAgICAgICAgIHR1cm4oJ3pvb20nLCAxKS4KICAgICAgICAgIGNzcyh7CiAgICAgICAgICAgIG1hcmdpbjogJycsCiAgICAgICAgICAgIHRvcDogZGF0YS5mbGlwUG9zaXRpb24ueSwKICAgICAgICAgICAgbGVmdDogZGF0YS5mbGlwUG9zaXRpb24ueCwKICAgICAgICAgICAgcG9zaXRpb246ICdyZWxhdGl2ZScKICAgICAgICB9KTsKCiAgICAgIH0KCiAgICAgIGlmIChhdXRvQ2VudGVyKQogICAgICAgIGZsaXAudHVybignY2VudGVyJyk7CgogICAgICB0aGF0LnRyaWdnZXIoJ3pvb20uem9vbU91dCcpOwoKICAgIH07CgogICAgaWYgKGR1cmF0aW9uPT09MCkgewogIAogICAgICB0cmFuc2l0aW9uRW5kQ2FsbGJhY2soKTsKCiAgICB9IGVsc2UgaWYgKHRyYW5zaXRpb25FbmQpIHsKCiAgICAgIGZsaXAuYmluZCh0cmFuc2l0aW9uRW5kLCBmdW5jdGlvbigpIHsKCiAgICAgICAgJCh0aGlzKS51bmJpbmQodHJhbnNpdGlvbkVuZCk7CiAgICAgICAgdHJhbnNpdGlvbkVuZENhbGxiYWNrKCk7CgogICAgICB9KTsKCiAgICAgIGZsaXAudHJhbnNmb3JtKHRyYW5zbGF0ZShtb3ZlLngsIG1vdmUueSwgdHJ1ZSkgKyBzY2FsZShzY2FsaW5nLCB0cnVlKSk7CgogICAgfSBlbHNlIHsKCiAgICAgIHNldFRpbWVvdXQodHJhbnNpdGlvbkVuZENhbGxiYWNrLCBkdXJhdGlvbik7CiAgICAgIGZsaXAudHJhbnNmb3JtKHRyYW5zbGF0ZShtb3ZlLngsIG1vdmUueSwgdHJ1ZSkgKyBzY2FsZShzY2FsaW5nLCB0cnVlKSk7CgogICAgfQoKICAgIHJldHVybiB0aGlzOwogIH0sCgogIGZsaXBib29rV2lkdGg6IGZ1bmN0aW9uKCkgewogICAgCiAgICB2YXIgZGF0YSA9IHRoaXMuZGF0YSgpLnpvb20sCiAgICAgIGZsaXBib29rID0gZGF0YS5vcHRzLmZsaXBib29rLAogICAgICB2aWV3ID0gZmxpcGJvb2sudHVybigndmlldycpOwoKICAgIHJldHVybiAoZmxpcGJvb2sudHVybignZGlzcGxheScpPT0nZG91YmxlJyAmJiAoIXZpZXdbMF0gfHwgIXZpZXdbMV0pKSA/CiAgICAgIGZsaXBib29rLndpZHRoKCkvMgogICAgICA6CiAgICAgIGZsaXBib29rLndpZHRoKCk7CgogIH0sCgogIHNjcm9sbDogZnVuY3Rpb24odG8sIHVubGltaXRlZCwgYW5pbWF0ZSkgewogICAgCiAgICB2YXIgZGF0YSA9IHRoaXMuZGF0YSgpLnpvb20sCiAgICAgIGZsaXAgPSBkYXRhLm9wdHMuZmxpcGJvb2ssCiAgICAgIGZsaXBXaWR0aCA9IHRoaXMuem9vbSgnZmxpcGJvb2tXaWR0aCcpLAogICAgICBwcmVmaXggPSAkLmNzc1ByZWZpeCgpOwogICAgCiAgICBpZiAoaGFzM2QpIHsKCiAgICAgIHZhciBjc3MgPSB7fTsKCiAgICAgIGlmIChhbmltYXRlKSB7CiAgICAgICAgY3NzW3ByZWZpeCsndHJhbnNpdGlvbiddID0gcHJlZml4ICsgJ3RyYW5zZm9ybSAyMDBtcyc7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgY3NzW3ByZWZpeCsndHJhbnNpdGlvbiddID0gJ25vbmUnOwogICAgICB9CgogICAgICBmbGlwLmNzcyhjc3MpOwogICAgICBmbGlwLnRyYW5zZm9ybSh0cmFuc2xhdGUoLWRhdGEuYXhpcy54IC0gdG8ueCwgLWRhdGEuYXhpcy55IC0gdG8ueSwgdHJ1ZSkpOwoKICAgIH0gZWxzZSB7CiAgICAgIAogICAgICBmbGlwLmNzcyh7dG9wOiAtZGF0YS5heGlzLnkgLSB0by55LCBsZWZ0OiAtZGF0YS5heGlzLnggLSB0by54fSk7CgogICAgfQoKICAgIGlmICghdW5saW1pdGVkKSB7CgogICAgICB2YXIgb3V0LAogICAgICAgIG1pbkJvdW5kID0gcG9pbnQyRCgKICAgICAgICAgIE1hdGgubWluKDAsIChmbGlwV2lkdGgtdGhpcy53aWR0aCgpKS8yKSwKICAgICAgICAgIE1hdGgubWluKDAsIChmbGlwLmhlaWdodCgpLXRoaXMuaGVpZ2h0KCkpLzIpKSwKICAgICAgICBtYXhCb3VuZCA9IHBvaW50MkQoCiAgICAgICAgICAoZmxpcFdpZHRoPnRoaXMud2lkdGgoKSkgPyBmbGlwV2lkdGgtdGhpcy53aWR0aCgpIDogKGZsaXBXaWR0aC10aGlzLndpZHRoKCkpLzIsCiAgICAgICAgICAoZmxpcC5oZWlnaHQoKT50aGlzLmhlaWdodCgpKSA/IGZsaXAuaGVpZ2h0KCktdGhpcy5oZWlnaHQoKSA6IChmbGlwLmhlaWdodCgpLXRoaXMuaGVpZ2h0KCkpLzIKICAgICAgICApOwoKICAgICAgaWYgKHRvLnk8bWluQm91bmQueSkgewogICAgICAgIHRvLnkgPSBtaW5Cb3VuZC55OwogICAgICAgIG91dCA9IHRydWU7CiAgICAgIH0gZWxzZSBpZiAodG8ueT5tYXhCb3VuZC55KSB7CiAgICAgICAgdG8ueSA9IG1heEJvdW5kLnk7CiAgICAgICAgb3V0ID0gdHJ1ZTsKICAgICAgfQoKICAgICAgaWYgKHRvLng8bWluQm91bmQueCkgewogICAgICAgIHRvLnggPSBtaW5Cb3VuZC54OwogICAgICAgIG91dCA9IHRydWU7CiAgICAgIH0gZWxzZSBpZiAodG8ueD5tYXhCb3VuZC54KSB7CiAgICAgICAgdG8ueCA9IG1heEJvdW5kLng7CiAgICAgICAgb3V0ID0gdHJ1ZTsKICAgICAgfQoKICAgICAgaWYgKG91dCkgewogICAgICAgIHRoaXMuem9vbSgnc2Nyb2xsJywgdG8sIHRydWUsIHRydWUpOwogICAgICB9CgogICAgfQoKICAgIGRhdGEuc2Nyb2xsUG9zID0gcG9pbnQyRCh0by54LCB0by55KTsKCiAgfSwKCiAgcmVzaXplOiBmdW5jdGlvbigpIHsKCiAgICB2YXIgZGF0YSA9IHRoaXMuZGF0YSgpLnpvb20sCiAgICAgIGZsaXAgPSBkYXRhLm9wdHMuZmxpcGJvb2s7CiAgICAKICAgIGlmICh0aGlzLnpvb20oJ3ZhbHVlJyk+MSkgewoKICAgICAgdmFyICBmbGlwT2Zmc2V0ID0gZmxpcC5vZmZzZXQoKSwKICAgICAgICB0aGlzT2Zmc2V0ID0gdGhpcy5vZmZzZXQoKTsKCiAgICAgIGRhdGEuYXhpcyA9ICBwb2ludDJEKAogICAgICAgIChmbGlwT2Zmc2V0LmxlZnQgLSB0aGlzT2Zmc2V0LmxlZnQpICsgKGRhdGEuYXhpcy54ICsgZGF0YS5zY3JvbGxQb3MueCksCiAgICAgICAgKGZsaXBPZmZzZXQudG9wIC0gdGhpc09mZnNldC50b3ApICsgKGRhdGEuYXhpcy55ICsgZGF0YS5zY3JvbGxQb3MueSkKICAgICAgKTsKCiAgICAgIGlmIChmbGlwLnR1cm4oJ2Rpc3BsYXknKT09J2RvdWJsZScgJiYKICAgICAgICBmbGlwLnR1cm4oJ2RpcmVjdGlvbicpPT0nbHRyJyAmJgogICAgICAgICFmbGlwLnR1cm4oJ3ZpZXcnKVswXSkKICAgICAgICAgIGRhdGEuYXhpcy54ID0gZGF0YS5heGlzLnggKyBmbGlwLndpZHRoKCkvMjsKCiAgICAgIHRoaXMuem9vbSgnc2Nyb2xsJywgZGF0YS5zY3JvbGxQb3MpOwogICAgfQoKICB9LAoKICBfZVpvb206IGZ1bmN0aW9uKCkgewogICAgCiAgICB2YXIgZmxpcFBvcywKICAgICAgZGF0YSA9IHRoaXMuZGF0YSgpLnpvb20sCiAgICAgIGZsaXAgPSBkYXRhLm9wdHMuZmxpcGJvb2ssCiAgICAgIHZpZXcgPSBmbGlwLnR1cm4oJ3ZpZXcnKTsKCiAgICBmb3IgKHZhciBwID0gMDsgcDx2aWV3Lmxlbmd0aDsgcCsrKSB7CiAgICAgIGlmICh2aWV3W3BdKQogICAgICAgIHRoaXMudHJpZ2dlcignem9vbS5yZXNpemUnLAogICAgICAgICAgW2RhdGEuc2NhbGUsIHZpZXdbcF0sIGZsaXAuZGF0YSgpLnBhZ2VPYmpzW3ZpZXdbcF1dXQogICAgICAgICk7CiAgICB9CiAgfSwKCiAgX2VTdGFydDogZnVuY3Rpb24oZXZlbnQsIHBhZ2VPYmopIHsKCiAgICBpZiAodGhpcy56b29tKCd2YWx1ZScpIT0xKSB7CiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7CiAgICB9CgoKICB9LAoKICBfZVR1cm5pbmc6IGZ1bmN0aW9uKGV2ZW50LCBwYWdlLCB2aWV3KSB7CgogICAgdmFyIHRoYXQgPSB0aGlzLAogICAgICB6b29tID0gdGhpcy56b29tKCd2YWx1ZScpLAogICAgICBkYXRhID0gdGhpcy5kYXRhKCkuem9vbSwKICAgICAgZmxpcCA9IGRhdGEub3B0cy5mbGlwYm9vazsKCiAgICBkYXRhLnBhZ2UgPSBmbGlwLnR1cm4oJ3BhZ2UnKTsKCiAgICBpZiAoem9vbSE9MSkgewogICAgICBmb3IgKHZhciBwID0gMDsgcDx2aWV3Lmxlbmd0aDsgcCsrKSB7CiAgICAgICAgaWYgKHZpZXdbcF0pCiAgICAgICAgICB0aGlzLnRyaWdnZXIoJ3pvb20ucmVzaXplJywKICAgICAgICAgICAgW3pvb20sIHZpZXdbcF0sIGZsaXAuZGF0YSgpLnBhZ2VPYmpzW3ZpZXdbcF1dXQogICAgICAgICAgKTsKICAgICAgfQoKICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpIHsKICAgICAgICB0aGF0Lnpvb20oJ3Jlc2l6ZScpOwogICAgICB9LCAwKTsKICAgIH0KCiAgfSwKCiAgX2VUdXJuZWQ6IGZ1bmN0aW9uIChldmVudCwgcGFnZSkgewogICAgCiAgICBpZiAodGhpcy56b29tKCd2YWx1ZScpIT0xKSB7CiAgICAgIHZhciB0aGF0ID0gdGhpcywKICAgICAgICBkYXRhID0gdGhpcy5kYXRhKCkuem9vbSwKICAgICAgICBmbGlwID0gZGF0YS5vcHRzLmZsaXBib29rOwoKICAgICAgaWYgKHBhZ2U+ZGF0YS5wYWdlKQogICAgICAgIHRoaXMuem9vbSgnc2Nyb2xsJywKICAgICAgICAgIHBvaW50MkQoMCwgZGF0YS5zY3JvbGxQb3MueSksIGZhbHNlLCB0cnVlKTsKICAgICAgICAKICAgICAgZWxzZSBpZiAocGFnZTxkYXRhLnBhZ2UpCiAgICAgICAgdGhpcy56b29tKCdzY3JvbGwnLAogICAgICAgICAgcG9pbnQyRChmbGlwLndpZHRoKCksIGRhdGEuc2Nyb2xsUG9zLnkpLCBmYWxzZSwgdHJ1ZSk7CiAgICAKICAgIH0KICB9LAoKICBfZVByZXNzZWQ6IGZ1bmN0aW9uKCkgewogICAgCiAgICB2YXIgZGF0YSA9ICQodGhpcykuZGF0YSgpLnpvb207CiAgICBkYXRhLmRyYWdnaW5nQ29ybmVyID0gdHJ1ZTsKCiAgfSwKCiAgX2VSZWxlYXNlZDogZnVuY3Rpb24oKSB7CgogICAgdmFyIGRhdGEgPSAkKHRoaXMpLmRhdGEoKS56b29tOwoKICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CiAgICAgIGRhdGEuZHJhZ2dpbmdDb3JuZXIgPSBmYWxzZTsKICAgIH0sIDEpOwoKICB9LAoKICBfZU1vdXNlRG93bjogZnVuY3Rpb24oZXZlbnQpIHsKICAgIAogICAgdmFyIGRhdGEgPSAkKHRoaXMpLmRhdGEoKS56b29tOwoKICAgIGRhdGEuZHJhZ2dpbmdDdXIgPSAoJC5pc1RvdWNoKSA/CiAgICAgIHBvaW50MkQoCiAgICAgICAgZXZlbnQub3JpZ2luYWxFdmVudC50b3VjaGVzWzBdLnBhZ2VYLAogICAgICAgIGV2ZW50Lm9yaWdpbmFsRXZlbnQudG91Y2hlc1swXS5wYWdlWQogICAgICApCiAgICAgIDoKICAgICAgcG9pbnQyRChldmVudC5wYWdlWCwgZXZlbnQucGFnZVkpOwogICAgCiAgICByZXR1cm4gZmFsc2U7CiAgfSwKCiAgX2VNb3VzZU1vdmU6IGZ1bmN0aW9uKGV2ZW50KSB7CgogICAgdmFyIGRhdGEgPSAkKHRoaXMpLmRhdGEoKS56b29tOwogICAgICAgIAogICAgaWYgKGRhdGEuZHJhZ2dpbmdDdXIpIHsKCiAgICAgIGRhdGEuZHJhZ2dpbmcgPSB0cnVlOwoKICAgICAgdmFyIGN1ciA9ICgkLmlzVG91Y2gpID8KICAgICAgICBwb2ludDJEKAogICAgICAgICAgZXZlbnQub3JpZ2luYWxFdmVudC50b3VjaGVzWzBdLnBhZ2VYLAogICAgICAgICAgZXZlbnQub3JpZ2luYWxFdmVudC50b3VjaGVzWzBdLnBhZ2VZCiAgICAgICAgKQogICAgICAgIDoKICAgICAgICBwb2ludDJEKGV2ZW50LnBhZ2VYLCBldmVudC5wYWdlWSksCiAgICAgICAgbW90aW9uID0gcG9pbnQyRCgKICAgICAgICAgIGN1ci54LSBkYXRhLmRyYWdnaW5nQ3VyLngsCiAgICAgICAgICBjdXIueS1kYXRhLmRyYWdnaW5nQ3VyLnkKICAgICAgICApOwoKICAgICAgJCh0aGlzKS56b29tKCdzY3JvbGwnLAogICAgICAgIHBvaW50MkQoCiAgICAgICAgICBkYXRhLnNjcm9sbFBvcy54LW1vdGlvbi54LAogICAgICAgICAgZGF0YS5zY3JvbGxQb3MueS1tb3Rpb24ueQogICAgICAgICksIHRydWUKICAgICAgKTsKCiAgICAgIGRhdGEuZHJhZ2dpbmdDdXIgPSBjdXI7CgogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CgogIH0sCgogIF9lTW91c2VVcDogZnVuY3Rpb24oZXZlbnQpIHsKCiAgICB2YXIgZGF0YSA9ICQodGhpcykuZGF0YSgpLnpvb207CgogICAgaWYgKGRhdGEuZHJhZ2dpbmcpIHsKICAgICAgJCh0aGlzKS56b29tKCdzY3JvbGwnLCBkYXRhLnNjcm9sbFBvcyk7CiAgICB9CgogICAgZGF0YS5kcmFnZ2luZ0N1ciA9IG51bGw7CgogICAgc2V0VGltZW91dChmdW5jdGlvbigpIHsKICAgICAgZGF0YS5kcmFnZ2luZyA9IGZhbHNlOwogICAgfSwgMSk7CgogIH0sCgogIF9lTW91c2VXaGVlbDogZnVuY3Rpb24oZXZlbnQsIGRlbHRhLCBkZWx0YVgsIGRlbHRhWSkgewogICAgCiAgICB2YXIgZGF0YSA9ICQodGhpcykuZGF0YSgpLnpvb20sCiAgICAgIGN1ciA9IHBvaW50MkQoCiAgICAgICAgZGF0YS5zY3JvbGxQb3MueCArIGRlbHRhWCoxMCwKICAgICAgICBkYXRhLnNjcm9sbFBvcy55IC0gZGVsdGFZKjEwCiAgICAgICk7CiAgICAKICAgICQodGhpcykuem9vbSgnc2Nyb2xsJywgY3VyLCBmYWxzZSwgdHJ1ZSk7CiAgICAKICB9LAoKICBfZVRvdWNoU3RhcnQ6IGZ1bmN0aW9uKGV2ZW50LCBwYWdlKSB7CgogICAgdmFyIGRhdGEgPSAkKHRoaXMpLmRhdGEoKS56b29tLAogICAgICBmbGlwID0gZGF0YS5vcHRzLmZsaXBib29rLAogICAgICBmaW5nZXIgPSBwb2ludDJEKAogICAgICAgIGV2ZW50Lm9yaWdpbmFsRXZlbnQudG91Y2hlc1swXS5wYWdlWCwKICAgICAgICBldmVudC5vcmlnaW5hbEV2ZW50LnRvdWNoZXNbMF0ucGFnZVkKICAgICAgKTsKCiAgICBkYXRhLnRvdWNoID0ge307CiAgICBkYXRhLnRvdWNoLmluaXRpYWwgPSBmaW5nZXI7CiAgICBkYXRhLnRvdWNoLmxhc3QgPSBmaW5nZXI7CiAgICBkYXRhLnRvdWNoLnRpbWVzdGFtcCA9IChuZXcgRGF0ZSgpKS5nZXRUaW1lKCk7CiAgICBkYXRhLnRvdWNoLnNwZWVkID0gcG9pbnQyRCgwLCAwKTsKCiAgfSwKCiAgX2VUb3VjaE1vdmU6IGZ1bmN0aW9uKGV2ZW50KSB7CiAgICAKICAgIHZhciBkYXRhID0gJCh0aGlzKS5kYXRhKCkuem9vbSwKICAgICAgem9vbSA9ICQodGhpcykuem9vbSgndmFsdWUnKSwKICAgICAgZmxpcCA9IGRhdGEub3B0cy5mbGlwYm9vaywKICAgICAgdGltZSA9IChuZXcgRGF0ZSgpKS5nZXRUaW1lKCksCiAgICAgIGZpbmdlciA9IHBvaW50MkQoCiAgICAgICAgZXZlbnQub3JpZ2luYWxFdmVudC50b3VjaGVzWzBdLnBhZ2VYLAogICAgICAgIGV2ZW50Lm9yaWdpbmFsRXZlbnQudG91Y2hlc1swXS5wYWdlWQogICAgICApOwogICAgCiAgICBpZiAoZGF0YS50b3VjaCAmJiB6b29tPT0xICYmICFmbGlwLmRhdGEoKS5tb3VzZUFjdGlvbikgewogICAgICBkYXRhLnRvdWNoLm1vdGlvbiA9IHBvaW50MkQoCiAgICAgICAgZmluZ2VyLngtZGF0YS50b3VjaC5sYXN0LngsCiAgICAgICAgZmluZ2VyLnktZGF0YS50b3VjaC5sYXN0LnkpOwoKICAgIAogICAgICBkYXRhLnRvdWNoLnNwZWVkLnggPSAoZGF0YS50b3VjaC5zcGVlZC54PT09MCkgPwogICAgICAgIGRhdGEudG91Y2gubW90aW9uLnggLyAodGltZS1kYXRhLnRvdWNoLnRpbWVzdGFtcCkgOgogICAgICAgIChkYXRhLnRvdWNoLnNwZWVkLnggKyAoZGF0YS50b3VjaC5tb3Rpb24ueCAvICh0aW1lLWRhdGEudG91Y2gudGltZXN0YW1wKSkpLzI7CgogICAgICBkYXRhLnRvdWNoLmxhc3QgPSBmaW5nZXI7CiAgICAgIGRhdGEudG91Y2gudGltZXN0YW1wID0gdGltZTsKICAgIH0KCiAgfSwKCiAgX2VUb3VjaEVuZDogZnVuY3Rpb24oZXZlbnQpIHsKCiAgICB2YXIgZGF0YSA9ICQodGhpcykuZGF0YSgpLnpvb207CgogICAgaWYgKGRhdGEudG91Y2ggJiYgJCh0aGlzKS56b29tKCd2YWx1ZScpPT0xKSB7CgogICAgICB2YXIgeSA9IE1hdGguYWJzKGRhdGEudG91Y2guaW5pdGlhbC55IC0gZGF0YS50b3VjaC5sYXN0LnkpOwoKICAgICAgaWYgKHk8NTAgJiYgKGRhdGEudG91Y2guc3BlZWQueDwtMSB8fCBkYXRhLnRvdWNoLmxhc3QueC1kYXRhLnRvdWNoLmluaXRpYWwueDwtMTAwKSkgewogICAgICAgIAogICAgICAgIHRoaXMudHJpZ2dlcignem9vbS5zd2lwZUxlZnQnKTsKCiAgICAgIH0gZWxzZSBpZih5PDUwICYmIChkYXRhLnRvdWNoLnNwZWVkLng+MSB8fCBkYXRhLnRvdWNoLmxhc3QueC1kYXRhLnRvdWNoLmluaXRpYWwueD4xMDApKXsKICAgICAgICAKICAgICAgICB0aGlzLnRyaWdnZXIoJ3pvb20uc3dpcGVSaWdodCcpOwoKICAgICAgfQoKICAgIH0KICB9LAoKICBfZURlc3Ryb3lpbmc6IGZ1bmN0aW9uKCkgewoKICAgIHZhciB0aGF0ID0gdGhpcywKICAgICAgZGF0YSA9IHRoaXMuZGF0YSgpLnpvb20sCiAgICAgIGZsaXAgPSBkYXRhLm9wdHMuZmxpcGJvb2ssCiAgICAgIGV2ZW50cyA9IFsKICAgICAgICAndGFwJywKICAgICAgICAnZG91YmxlVGFwJywKICAgICAgICAncmVzaXplJywKICAgICAgICAnem9vbUluJywKICAgICAgICAnem9vbU91dCcsCiAgICAgICAgJ3N3aXBlTGVmdCcsCiAgICAgICAgJ3N3aXBlUmlnaHQnCiAgICAgIF07CgogICAgdGhpcy56b29tKCd6b29tT3V0JywgMCk7CgogICAgJC5lYWNoKGV2ZW50cywgZnVuY3Rpb24oaW5kZXgsIGV2ZW50TmFtZSkgewogICAgICB0aGF0LnVuYmluZCgnem9vbS4nICsgZXZlbnROYW1lKTsKICAgIH0pOwogICAgCiAgICBmb3IgKHZhciBldmVudE5hbWUgaW4gZGF0YS5mbGlwYm9va0V2ZW50cykgewogICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGRhdGEuZmxpcGJvb2tFdmVudHMsIGV2ZW50TmFtZSkpIHsKICAgICAgICBmbGlwLnVuYmluZChldmVudE5hbWUsIGRhdGEuZmxpcGJvb2tFdmVudHNbZXZlbnROYW1lXSk7CiAgICAgIH0KICAgIH0KCiAgICBmbGlwLnVuYmluZCgndG91Y2hzdGFydCcsIGRhdGEuZXZlbnRUb3VjaFN0YXJ0ICkuCiAgICAgIHVuYmluZCgndG91Y2htb3ZlJywgZGF0YS5ldmVudFRvdWNoTW92ZSkuCiAgICAgIHVuYmluZCgndG91Y2hlbmQnLCBkYXRhLmV2ZW50VG91Y2hFbmQpOwogICAgICAgIAogICAgdGhpcy51bmJpbmQoJ3RvdWNoc3RhcnQnLCB6b29tTWV0aG9kcy5fdGFwKS4KICAgICAgdW5iaW5kKCdjbGljaycsIHpvb21NZXRob2RzLl90YXApOwoKICAgIGRhdGEgPSBudWxsOwogICAgdGhpcy5kYXRhKCkuem9vbSA9IG51bGw7CgogIH0KfTsKCmZ1bmN0aW9uIGlzUGFnZShlbGVtZW50LCBsYXN0KSB7CgogIGlmIChlbGVtZW50WzBdPT1sYXN0WzBdKQogICAgcmV0dXJuIGZhbHNlOwoKICBpZiAoZWxlbWVudC5hdHRyKCdwYWdlJykpCiAgICByZXR1cm4gdHJ1ZTsKICAKICByZXR1cm4gKGVsZW1lbnQucGFyZW50KClbMF0pID8KICAgIGlzUGFnZShlbGVtZW50LnBhcmVudCgpLCBsYXN0KQogICAgOgogIGZhbHNlOwoKfQoKZnVuY3Rpb24gZXJyb3IobWVzc2FnZSkgewoKICBmdW5jdGlvbiBUdXJuSnNFcnJvcihtZXNzYWdlKSB7CiAgICB0aGlzLm5hbWUgPSAiVHVybkpzRXJyb3IiOwogICAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZTsKICB9CgogIFR1cm5Kc0Vycm9yLnByb3RvdHlwZSA9IG5ldyBFcnJvcigpOwogIFR1cm5Kc0Vycm9yLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFR1cm5Kc0Vycm9yOwogIHJldHVybiBuZXcgVHVybkpzRXJyb3IobWVzc2FnZSk7Cgp9CgpmdW5jdGlvbiB0cmFuc2xhdGUoeCwgeSwgdXNlM2QpIHsKICAKICByZXR1cm4gKGhhczNkICYmIHVzZTNkKSA/ICcgdHJhbnNsYXRlM2QoJyArIHggKyAncHgsJyArIHkgKyAncHgsIDBweCkgJwogIDogJyB0cmFuc2xhdGUoJyArIHggKyAncHgsICcgKyB5ICsgJ3B4KSAnOwoKfQoKZnVuY3Rpb24gc2NhbGUodiwgdXNlM2QpIHsKICAKICByZXR1cm4gKGhhczNkICYmIHVzZTNkKSA/ICcgc2NhbGUzZCgnICsgdiArICcsICcgKyB2ICsgJywgMSkgJwogIDogJyBzY2FsZSgnICsgdiArICcpICc7Cgp9CgpmdW5jdGlvbiBwb2ludDJEKHgsIHkpIHsKICAKICByZXR1cm4ge3g6IHgsIHk6IHl9OwoKfQoKZnVuY3Rpb24gYmluZChmdW5jLCBjb250ZXh0KSB7CgogIHJldHVybiBmdW5jdGlvbigpIHsKICAgIHJldHVybiBmdW5jLmFwcGx5KGNvbnRleHQsIGFyZ3VtZW50cyk7CiAgfTsKCn0KCiQuZXh0ZW5kKCQuZm4sIHsKICB6b29tOiBmdW5jdGlvbigpIHsKICAgIAogICAgdmFyIGFyZ3MgPSBhcmd1bWVudHM7CgogICAgaWYgKCFhcmdzWzBdIHx8IHR5cGVvZihhcmdzWzBdKT09J29iamVjdCcpCiAgICAgIHJldHVybiB6b29tTWV0aG9kcy5pbml0LmFwcGx5KCQodGhpc1swXSksIGFyZ3MpOwogICAgZWxzZSBpZiAoem9vbU1ldGhvZHNbYXJnc1swXV0pCiAgICAgIHJldHVybiB6b29tTWV0aG9kc1thcmdzWzBdXS5hcHBseSgkKHRoaXNbMF0pLCBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmdzLCAxKSk7CiAgICBlbHNlCiAgICAgIHRocm93IGVycm9yKGFyZ3NbMF0gKyAnIGlzIG5vdCBhIG1ldGhvZCcpOwoKICB9Cn0pOwoKfSkoalF1ZXJ5KTsK'></script>
	<script id="fb_html_magazine_js_magazine_js" src='data:/text/plain;base64,LyohCiAqIFZ1ZS5qcyB2Mi41LjE3CiAqIChjKSAyMDE0LTIwMTggRXZhbiBZb3UKICogUmVsZWFzZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLgogKi8KIWZ1bmN0aW9uKGUsdCl7Im9iamVjdCI9PXR5cGVvZiBleHBvcnRzJiYidW5kZWZpbmVkIiE9dHlwZW9mIG1vZHVsZT9tb2R1bGUuZXhwb3J0cz10KCk6ImZ1bmN0aW9uIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZD9kZWZpbmUodCk6ZS5WdWU9dCgpfSh0aGlzLGZ1bmN0aW9uKCl7InVzZSBzdHJpY3QiO3ZhciB5PU9iamVjdC5mcmVlemUoe30pO2Z1bmN0aW9uIE0oZSl7cmV0dXJuIG51bGw9PWV9ZnVuY3Rpb24gRChlKXtyZXR1cm4gbnVsbCE9ZX1mdW5jdGlvbiBTKGUpe3JldHVybiEwPT09ZX1mdW5jdGlvbiBUKGUpe3JldHVybiJzdHJpbmciPT10eXBlb2YgZXx8Im51bWJlciI9PXR5cGVvZiBlfHwic3ltYm9sIj09dHlwZW9mIGV8fCJib29sZWFuIj09dHlwZW9mIGV9ZnVuY3Rpb24gUChlKXtyZXR1cm4gbnVsbCE9PWUmJiJvYmplY3QiPT10eXBlb2YgZX12YXIgcj1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nO2Z1bmN0aW9uIGwoZSl7cmV0dXJuIltvYmplY3QgT2JqZWN0XSI9PT1yLmNhbGwoZSl9ZnVuY3Rpb24gaShlKXt2YXIgdD1wYXJzZUZsb2F0KFN0cmluZyhlKSk7cmV0dXJuIDA8PXQmJk1hdGguZmxvb3IodCk9PT10JiZpc0Zpbml0ZShlKX1mdW5jdGlvbiB0KGUpe3JldHVybiBudWxsPT1lPyIiOiJvYmplY3QiPT10eXBlb2YgZT9KU09OLnN0cmluZ2lmeShlLG51bGwsMik6U3RyaW5nKGUpfWZ1bmN0aW9uIEYoZSl7dmFyIHQ9cGFyc2VGbG9hdChlKTtyZXR1cm4gaXNOYU4odCk/ZTp0fWZ1bmN0aW9uIHMoZSx0KXtmb3IodmFyIG49T2JqZWN0LmNyZWF0ZShudWxsKSxyPWUuc3BsaXQoIiwiKSxpPTA7aTxyLmxlbmd0aDtpKyspbltyW2ldXT0hMDtyZXR1cm4gdD9mdW5jdGlvbihlKXtyZXR1cm4gbltlLnRvTG93ZXJDYXNlKCldfTpmdW5jdGlvbihlKXtyZXR1cm4gbltlXX19dmFyIGM9cygic2xvdCxjb21wb25lbnQiLCEwKSx1PXMoImtleSxyZWYsc2xvdCxzbG90LXNjb3BlLGlzIik7ZnVuY3Rpb24gZihlLHQpe2lmKGUubGVuZ3RoKXt2YXIgbj1lLmluZGV4T2YodCk7aWYoLTE8bilyZXR1cm4gZS5zcGxpY2UobiwxKX19dmFyIG49T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtmdW5jdGlvbiBwKGUsdCl7cmV0dXJuIG4uY2FsbChlLHQpfWZ1bmN0aW9uIGUodCl7dmFyIG49T2JqZWN0LmNyZWF0ZShudWxsKTtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIG5bZV18fChuW2VdPXQoZSkpfX12YXIgbz0vLShcdykvZyxnPWUoZnVuY3Rpb24oZSl7cmV0dXJuIGUucmVwbGFjZShvLGZ1bmN0aW9uKGUsdCl7cmV0dXJuIHQ/dC50b1VwcGVyQ2FzZSgpOiIifSl9KSxkPWUoZnVuY3Rpb24oZSl7cmV0dXJuIGUuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkrZS5zbGljZSgxKX0pLGE9L1xCKFtBLVpdKS9nLF89ZShmdW5jdGlvbihlKXtyZXR1cm4gZS5yZXBsYWNlKGEsIi0kMSIpLnRvTG93ZXJDYXNlKCl9KTt2YXIgdj1GdW5jdGlvbi5wcm90b3R5cGUuYmluZD9mdW5jdGlvbihlLHQpe3JldHVybiBlLmJpbmQodCl9OmZ1bmN0aW9uKG4scil7ZnVuY3Rpb24gZShlKXt2YXIgdD1hcmd1bWVudHMubGVuZ3RoO3JldHVybiB0PzE8dD9uLmFwcGx5KHIsYXJndW1lbnRzKTpuLmNhbGwocixlKTpuLmNhbGwocil9cmV0dXJuIGUuX2xlbmd0aD1uLmxlbmd0aCxlfTtmdW5jdGlvbiBoKGUsdCl7dD10fHwwO2Zvcih2YXIgbj1lLmxlbmd0aC10LHI9bmV3IEFycmF5KG4pO24tLTspcltuXT1lW24rdF07cmV0dXJuIHJ9ZnVuY3Rpb24gbShlLHQpe2Zvcih2YXIgbiBpbiB0KWVbbl09dFtuXTtyZXR1cm4gZX1mdW5jdGlvbiBiKGUpe2Zvcih2YXIgdD17fSxuPTA7bjxlLmxlbmd0aDtuKyspZVtuXSYmbSh0LGVbbl0pO3JldHVybiB0fWZ1bmN0aW9uICQoZSx0LG4pe312YXIgTz1mdW5jdGlvbihlLHQsbil7cmV0dXJuITF9LHc9ZnVuY3Rpb24oZSl7cmV0dXJuIGV9O2Z1bmN0aW9uIEModCxuKXtpZih0PT09bilyZXR1cm4hMDt2YXIgZT1QKHQpLHI9UChuKTtpZighZXx8IXIpcmV0dXJuIWUmJiFyJiZTdHJpbmcodCk9PT1TdHJpbmcobik7dHJ5e3ZhciBpPUFycmF5LmlzQXJyYXkodCksbz1BcnJheS5pc0FycmF5KG4pO2lmKGkmJm8pcmV0dXJuIHQubGVuZ3RoPT09bi5sZW5ndGgmJnQuZXZlcnkoZnVuY3Rpb24oZSx0KXtyZXR1cm4gQyhlLG5bdF0pfSk7aWYoaXx8bylyZXR1cm4hMTt2YXIgYT1PYmplY3Qua2V5cyh0KSxzPU9iamVjdC5rZXlzKG4pO3JldHVybiBhLmxlbmd0aD09PXMubGVuZ3RoJiZhLmV2ZXJ5KGZ1bmN0aW9uKGUpe3JldHVybiBDKHRbZV0sbltlXSl9KX1jYXRjaChlKXtyZXR1cm4hMX19ZnVuY3Rpb24geChlLHQpe2Zvcih2YXIgbj0wO248ZS5sZW5ndGg7bisrKWlmKEMoZVtuXSx0KSlyZXR1cm4gbjtyZXR1cm4tMX1mdW5jdGlvbiBSKGUpe3ZhciB0PSExO3JldHVybiBmdW5jdGlvbigpe3R8fCh0PSEwLGUuYXBwbHkodGhpcyxhcmd1bWVudHMpKX19dmFyIEU9ImRhdGEtc2VydmVyLXJlbmRlcmVkIixrPVsiY29tcG9uZW50IiwiZGlyZWN0aXZlIiwiZmlsdGVyIl0sQT1bImJlZm9yZUNyZWF0ZSIsImNyZWF0ZWQiLCJiZWZvcmVNb3VudCIsIm1vdW50ZWQiLCJiZWZvcmVVcGRhdGUiLCJ1cGRhdGVkIiwiYmVmb3JlRGVzdHJveSIsImRlc3Ryb3llZCIsImFjdGl2YXRlZCIsImRlYWN0aXZhdGVkIiwiZXJyb3JDYXB0dXJlZCJdLGo9e29wdGlvbk1lcmdlU3RyYXRlZ2llczpPYmplY3QuY3JlYXRlKG51bGwpLHNpbGVudDohMSxwcm9kdWN0aW9uVGlwOiExLGRldnRvb2xzOiExLHBlcmZvcm1hbmNlOiExLGVycm9ySGFuZGxlcjpudWxsLHdhcm5IYW5kbGVyOm51bGwsaWdub3JlZEVsZW1lbnRzOltdLGtleUNvZGVzOk9iamVjdC5jcmVhdGUobnVsbCksaXNSZXNlcnZlZFRhZzpPLGlzUmVzZXJ2ZWRBdHRyOk8saXNVbmtub3duRWxlbWVudDpPLGdldFRhZ05hbWVzcGFjZTokLHBhcnNlUGxhdGZvcm1UYWdOYW1lOncsbXVzdFVzZVByb3A6TyxfbGlmZWN5Y2xlSG9va3M6QX07ZnVuY3Rpb24gTihlLHQsbixyKXtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSx0LHt2YWx1ZTpuLGVudW1lcmFibGU6ISFyLHdyaXRhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pfXZhciBMPS9bXlx3LiRdLzt2YXIgSSxIPSJfX3Byb3RvX18iaW57fSxCPSJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93LFU9InVuZGVmaW5lZCIhPXR5cGVvZiBXWEVudmlyb25tZW50JiYhIVdYRW52aXJvbm1lbnQucGxhdGZvcm0sVj1VJiZXWEVudmlyb25tZW50LnBsYXRmb3JtLnRvTG93ZXJDYXNlKCksej1CJiZ3aW5kb3cubmF2aWdhdG9yLnVzZXJBZ2VudC50b0xvd2VyQ2FzZSgpLEs9eiYmL21zaWV8dHJpZGVudC8udGVzdCh6KSxKPXomJjA8ei5pbmRleE9mKCJtc2llIDkuMCIpLHE9eiYmMDx6LmluZGV4T2YoImVkZ2UvIiksVz0oeiYmei5pbmRleE9mKCJhbmRyb2lkIikseiYmL2lwaG9uZXxpcGFkfGlwb2R8aW9zLy50ZXN0KHopfHwiaW9zIj09PVYpLEc9KHomJi9jaHJvbWVcL1xkKy8udGVzdCh6KSx7fS53YXRjaCksWj0hMTtpZihCKXRyeXt2YXIgWD17fTtPYmplY3QuZGVmaW5lUHJvcGVydHkoWCwicGFzc2l2ZSIse2dldDpmdW5jdGlvbigpe1o9ITB9fSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInRlc3QtcGFzc2l2ZSIsbnVsbCxYKX1jYXRjaChlKXt9dmFyIFk9ZnVuY3Rpb24oKXtyZXR1cm4gdm9pZCAwPT09SSYmKEk9IUImJiFVJiYidW5kZWZpbmVkIiE9dHlwZW9mIGdsb2JhbCYmInNlcnZlciI9PT1nbG9iYWwucHJvY2Vzcy5lbnYuVlVFX0VOViksSX0sUT1CJiZ3aW5kb3cuX19WVUVfREVWVE9PTFNfR0xPQkFMX0hPT0tfXztmdW5jdGlvbiBlZShlKXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgZSYmL25hdGl2ZSBjb2RlLy50ZXN0KGUudG9TdHJpbmcoKSl9dmFyIHRlLG5lPSJ1bmRlZmluZWQiIT10eXBlb2YgU3ltYm9sJiZlZShTeW1ib2wpJiYidW5kZWZpbmVkIiE9dHlwZW9mIFJlZmxlY3QmJmVlKFJlZmxlY3Qub3duS2V5cyk7dGU9InVuZGVmaW5lZCIhPXR5cGVvZiBTZXQmJmVlKFNldCk/U2V0OmZ1bmN0aW9uKCl7ZnVuY3Rpb24gZSgpe3RoaXMuc2V0PU9iamVjdC5jcmVhdGUobnVsbCl9cmV0dXJuIGUucHJvdG90eXBlLmhhcz1mdW5jdGlvbihlKXtyZXR1cm4hMD09PXRoaXMuc2V0W2VdfSxlLnByb3RvdHlwZS5hZGQ9ZnVuY3Rpb24oZSl7dGhpcy5zZXRbZV09ITB9LGUucHJvdG90eXBlLmNsZWFyPWZ1bmN0aW9uKCl7dGhpcy5zZXQ9T2JqZWN0LmNyZWF0ZShudWxsKX0sZX0oKTt2YXIgcmU9JCxpZT0wLG9lPWZ1bmN0aW9uKCl7dGhpcy5pZD1pZSsrLHRoaXMuc3Vicz1bXX07b2UucHJvdG90eXBlLmFkZFN1Yj1mdW5jdGlvbihlKXt0aGlzLnN1YnMucHVzaChlKX0sb2UucHJvdG90eXBlLnJlbW92ZVN1Yj1mdW5jdGlvbihlKXtmKHRoaXMuc3VicyxlKX0sb2UucHJvdG90eXBlLmRlcGVuZD1mdW5jdGlvbigpe29lLnRhcmdldCYmb2UudGFyZ2V0LmFkZERlcCh0aGlzKX0sb2UucHJvdG90eXBlLm5vdGlmeT1mdW5jdGlvbigpe2Zvcih2YXIgZT10aGlzLnN1YnMuc2xpY2UoKSx0PTAsbj1lLmxlbmd0aDt0PG47dCsrKWVbdF0udXBkYXRlKCl9LG9lLnRhcmdldD1udWxsO3ZhciBhZT1bXTtmdW5jdGlvbiBzZShlKXtvZS50YXJnZXQmJmFlLnB1c2gob2UudGFyZ2V0KSxvZS50YXJnZXQ9ZX1mdW5jdGlvbiBjZSgpe29lLnRhcmdldD1hZS5wb3AoKX12YXIgbGU9ZnVuY3Rpb24oZSx0LG4scixpLG8sYSxzKXt0aGlzLnRhZz1lLHRoaXMuZGF0YT10LHRoaXMuY2hpbGRyZW49bix0aGlzLnRleHQ9cix0aGlzLmVsbT1pLHRoaXMubnM9dm9pZCAwLHRoaXMuY29udGV4dD1vLHRoaXMuZm5Db250ZXh0PXZvaWQgMCx0aGlzLmZuT3B0aW9ucz12b2lkIDAsdGhpcy5mblNjb3BlSWQ9dm9pZCAwLHRoaXMua2V5PXQmJnQua2V5LHRoaXMuY29tcG9uZW50T3B0aW9ucz1hLHRoaXMuY29tcG9uZW50SW5zdGFuY2U9dm9pZCAwLHRoaXMucGFyZW50PXZvaWQgMCx0aGlzLnJhdz0hMSx0aGlzLmlzU3RhdGljPSExLHRoaXMuaXNSb290SW5zZXJ0PSEwLHRoaXMuaXNDb21tZW50PSExLHRoaXMuaXNDbG9uZWQ9ITEsdGhpcy5pc09uY2U9ITEsdGhpcy5hc3luY0ZhY3Rvcnk9cyx0aGlzLmFzeW5jTWV0YT12b2lkIDAsdGhpcy5pc0FzeW5jUGxhY2Vob2xkZXI9ITF9LHVlPXtjaGlsZDp7Y29uZmlndXJhYmxlOiEwfX07dWUuY2hpbGQuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY29tcG9uZW50SW5zdGFuY2V9LE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGxlLnByb3RvdHlwZSx1ZSk7dmFyIGZlPWZ1bmN0aW9uKGUpe3ZvaWQgMD09PWUmJihlPSIiKTt2YXIgdD1uZXcgbGU7cmV0dXJuIHQudGV4dD1lLHQuaXNDb21tZW50PSEwLHR9O2Z1bmN0aW9uIHBlKGUpe3JldHVybiBuZXcgbGUodm9pZCAwLHZvaWQgMCx2b2lkIDAsU3RyaW5nKGUpKX1mdW5jdGlvbiBkZShlKXt2YXIgdD1uZXcgbGUoZS50YWcsZS5kYXRhLGUuY2hpbGRyZW4sZS50ZXh0LGUuZWxtLGUuY29udGV4dCxlLmNvbXBvbmVudE9wdGlvbnMsZS5hc3luY0ZhY3RvcnkpO3JldHVybiB0Lm5zPWUubnMsdC5pc1N0YXRpYz1lLmlzU3RhdGljLHQua2V5PWUua2V5LHQuaXNDb21tZW50PWUuaXNDb21tZW50LHQuZm5Db250ZXh0PWUuZm5Db250ZXh0LHQuZm5PcHRpb25zPWUuZm5PcHRpb25zLHQuZm5TY29wZUlkPWUuZm5TY29wZUlkLHQuaXNDbG9uZWQ9ITAsdH12YXIgdmU9QXJyYXkucHJvdG90eXBlLGhlPU9iamVjdC5jcmVhdGUodmUpO1sicHVzaCIsInBvcCIsInNoaWZ0IiwidW5zaGlmdCIsInNwbGljZSIsInNvcnQiLCJyZXZlcnNlIl0uZm9yRWFjaChmdW5jdGlvbihvKXt2YXIgYT12ZVtvXTtOKGhlLG8sZnVuY3Rpb24oKXtmb3IodmFyIGU9W10sdD1hcmd1bWVudHMubGVuZ3RoO3QtLTspZVt0XT1hcmd1bWVudHNbdF07dmFyIG4scj1hLmFwcGx5KHRoaXMsZSksaT10aGlzLl9fb2JfXztzd2l0Y2gobyl7Y2FzZSJwdXNoIjpjYXNlInVuc2hpZnQiOm49ZTticmVhaztjYXNlInNwbGljZSI6bj1lLnNsaWNlKDIpfXJldHVybiBuJiZpLm9ic2VydmVBcnJheShuKSxpLmRlcC5ub3RpZnkoKSxyfSl9KTt2YXIgbWU9T2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoaGUpLHllPSEwO2Z1bmN0aW9uIGdlKGUpe3llPWV9dmFyIF9lPWZ1bmN0aW9uKGUpeyh0aGlzLnZhbHVlPWUsdGhpcy5kZXA9bmV3IG9lLHRoaXMudm1Db3VudD0wLE4oZSwiX19vYl9fIix0aGlzKSxBcnJheS5pc0FycmF5KGUpKT8oKEg/YmU6JGUpKGUsaGUsbWUpLHRoaXMub2JzZXJ2ZUFycmF5KGUpKTp0aGlzLndhbGsoZSl9O2Z1bmN0aW9uIGJlKGUsdCxuKXtlLl9fcHJvdG9fXz10fWZ1bmN0aW9uICRlKGUsdCxuKXtmb3IodmFyIHI9MCxpPW4ubGVuZ3RoO3I8aTtyKyspe3ZhciBvPW5bcl07TihlLG8sdFtvXSl9fWZ1bmN0aW9uIHdlKGUsdCl7dmFyIG47aWYoUChlKSYmIShlIGluc3RhbmNlb2YgbGUpKXJldHVybiBwKGUsIl9fb2JfXyIpJiZlLl9fb2JfXyBpbnN0YW5jZW9mIF9lP249ZS5fX29iX186eWUmJiFZKCkmJihBcnJheS5pc0FycmF5KGUpfHxsKGUpKSYmT2JqZWN0LmlzRXh0ZW5zaWJsZShlKSYmIWUuX2lzVnVlJiYobj1uZXcgX2UoZSkpLHQmJm4mJm4udm1Db3VudCsrLG59ZnVuY3Rpb24gQ2UobixlLHIsdCxpKXt2YXIgbz1uZXcgb2UsYT1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG4sZSk7aWYoIWF8fCExIT09YS5jb25maWd1cmFibGUpe3ZhciBzPWEmJmEuZ2V0O3N8fDIhPT1hcmd1bWVudHMubGVuZ3RofHwocj1uW2VdKTt2YXIgYz1hJiZhLnNldCxsPSFpJiZ3ZShyKTtPYmplY3QuZGVmaW5lUHJvcGVydHkobixlLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXt2YXIgZT1zP3MuY2FsbChuKTpyO3JldHVybiBvZS50YXJnZXQmJihvLmRlcGVuZCgpLGwmJihsLmRlcC5kZXBlbmQoKSxBcnJheS5pc0FycmF5KGUpJiZmdW5jdGlvbiBlKHQpe2Zvcih2YXIgbj12b2lkIDAscj0wLGk9dC5sZW5ndGg7cjxpO3IrKykobj10W3JdKSYmbi5fX29iX18mJm4uX19vYl9fLmRlcC5kZXBlbmQoKSxBcnJheS5pc0FycmF5KG4pJiZlKG4pfShlKSkpLGV9LHNldDpmdW5jdGlvbihlKXt2YXIgdD1zP3MuY2FsbChuKTpyO2U9PT10fHxlIT1lJiZ0IT10fHwoYz9jLmNhbGwobixlKTpyPWUsbD0haSYmd2UoZSksby5ub3RpZnkoKSl9fSl9fWZ1bmN0aW9uIHhlKGUsdCxuKXtpZihBcnJheS5pc0FycmF5KGUpJiZpKHQpKXJldHVybiBlLmxlbmd0aD1NYXRoLm1heChlLmxlbmd0aCx0KSxlLnNwbGljZSh0LDEsbiksbjtpZih0IGluIGUmJiEodCBpbiBPYmplY3QucHJvdG90eXBlKSlyZXR1cm4gZVt0XT1uO3ZhciByPWUuX19vYl9fO3JldHVybiBlLl9pc1Z1ZXx8ciYmci52bUNvdW50P246cj8oQ2Uoci52YWx1ZSx0LG4pLHIuZGVwLm5vdGlmeSgpLG4pOmVbdF09bn1mdW5jdGlvbiBrZShlLHQpe2lmKEFycmF5LmlzQXJyYXkoZSkmJmkodCkpZS5zcGxpY2UodCwxKTtlbHNle3ZhciBuPWUuX19vYl9fO2UuX2lzVnVlfHxuJiZuLnZtQ291bnR8fHAoZSx0KSYmKGRlbGV0ZSBlW3RdLG4mJm4uZGVwLm5vdGlmeSgpKX19X2UucHJvdG90eXBlLndhbGs9ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PU9iamVjdC5rZXlzKGUpLG49MDtuPHQubGVuZ3RoO24rKylDZShlLHRbbl0pfSxfZS5wcm90b3R5cGUub2JzZXJ2ZUFycmF5PWZ1bmN0aW9uKGUpe2Zvcih2YXIgdD0wLG49ZS5sZW5ndGg7dDxuO3QrKyl3ZShlW3RdKX07dmFyIEFlPWoub3B0aW9uTWVyZ2VTdHJhdGVnaWVzO2Z1bmN0aW9uIE9lKGUsdCl7aWYoIXQpcmV0dXJuIGU7Zm9yKHZhciBuLHIsaSxvPU9iamVjdC5rZXlzKHQpLGE9MDthPG8ubGVuZ3RoO2ErKylyPWVbbj1vW2FdXSxpPXRbbl0scChlLG4pP2wocikmJmwoaSkmJk9lKHIsaSk6eGUoZSxuLGkpO3JldHVybiBlfWZ1bmN0aW9uIFNlKG4scixpKXtyZXR1cm4gaT9mdW5jdGlvbigpe3ZhciBlPSJmdW5jdGlvbiI9PXR5cGVvZiByP3IuY2FsbChpLGkpOnIsdD0iZnVuY3Rpb24iPT10eXBlb2Ygbj9uLmNhbGwoaSxpKTpuO3JldHVybiBlP09lKGUsdCk6dH06cj9uP2Z1bmN0aW9uKCl7cmV0dXJuIE9lKCJmdW5jdGlvbiI9PXR5cGVvZiByP3IuY2FsbCh0aGlzLHRoaXMpOnIsImZ1bmN0aW9uIj09dHlwZW9mIG4/bi5jYWxsKHRoaXMsdGhpcyk6bil9OnI6bn1mdW5jdGlvbiBUZShlLHQpe3JldHVybiB0P2U/ZS5jb25jYXQodCk6QXJyYXkuaXNBcnJheSh0KT90Olt0XTplfWZ1bmN0aW9uIEVlKGUsdCxuLHIpe3ZhciBpPU9iamVjdC5jcmVhdGUoZXx8bnVsbCk7cmV0dXJuIHQ/bShpLHQpOml9QWUuZGF0YT1mdW5jdGlvbihlLHQsbil7cmV0dXJuIG4/U2UoZSx0LG4pOnQmJiJmdW5jdGlvbiIhPXR5cGVvZiB0P2U6U2UoZSx0KX0sQS5mb3JFYWNoKGZ1bmN0aW9uKGUpe0FlW2VdPVRlfSksay5mb3JFYWNoKGZ1bmN0aW9uKGUpe0FlW2UrInMiXT1FZX0pLEFlLndhdGNoPWZ1bmN0aW9uKGUsdCxuLHIpe2lmKGU9PT1HJiYoZT12b2lkIDApLHQ9PT1HJiYodD12b2lkIDApLCF0KXJldHVybiBPYmplY3QuY3JlYXRlKGV8fG51bGwpO2lmKCFlKXJldHVybiB0O3ZhciBpPXt9O2Zvcih2YXIgbyBpbiBtKGksZSksdCl7dmFyIGE9aVtvXSxzPXRbb107YSYmIUFycmF5LmlzQXJyYXkoYSkmJihhPVthXSksaVtvXT1hP2EuY29uY2F0KHMpOkFycmF5LmlzQXJyYXkocyk/czpbc119cmV0dXJuIGl9LEFlLnByb3BzPUFlLm1ldGhvZHM9QWUuaW5qZWN0PUFlLmNvbXB1dGVkPWZ1bmN0aW9uKGUsdCxuLHIpe2lmKCFlKXJldHVybiB0O3ZhciBpPU9iamVjdC5jcmVhdGUobnVsbCk7cmV0dXJuIG0oaSxlKSx0JiZtKGksdCksaX0sQWUucHJvdmlkZT1TZTt2YXIgamU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdm9pZCAwPT09dD9lOnR9O2Z1bmN0aW9uIE5lKG4scixpKXsiZnVuY3Rpb24iPT10eXBlb2YgciYmKHI9ci5vcHRpb25zKSxmdW5jdGlvbihlLHQpe3ZhciBuPWUucHJvcHM7aWYobil7dmFyIHIsaSxvPXt9O2lmKEFycmF5LmlzQXJyYXkobikpZm9yKHI9bi5sZW5ndGg7ci0tOykic3RyaW5nIj09dHlwZW9mKGk9bltyXSkmJihvW2coaSldPXt0eXBlOm51bGx9KTtlbHNlIGlmKGwobikpZm9yKHZhciBhIGluIG4paT1uW2FdLG9bZyhhKV09bChpKT9pOnt0eXBlOml9O2UucHJvcHM9b319KHIpLGZ1bmN0aW9uKGUsdCl7dmFyIG49ZS5pbmplY3Q7aWYobil7dmFyIHI9ZS5pbmplY3Q9e307aWYoQXJyYXkuaXNBcnJheShuKSlmb3IodmFyIGk9MDtpPG4ubGVuZ3RoO2krKylyW25baV1dPXtmcm9tOm5baV19O2Vsc2UgaWYobChuKSlmb3IodmFyIG8gaW4gbil7dmFyIGE9bltvXTtyW29dPWwoYSk/bSh7ZnJvbTpvfSxhKTp7ZnJvbTphfX19fShyKSxmdW5jdGlvbihlKXt2YXIgdD1lLmRpcmVjdGl2ZXM7aWYodClmb3IodmFyIG4gaW4gdCl7dmFyIHI9dFtuXTsiZnVuY3Rpb24iPT10eXBlb2YgciYmKHRbbl09e2JpbmQ6cix1cGRhdGU6cn0pfX0ocik7dmFyIGU9ci5leHRlbmRzO2lmKGUmJihuPU5lKG4sZSxpKSksci5taXhpbnMpZm9yKHZhciB0PTAsbz1yLm1peGlucy5sZW5ndGg7dDxvO3QrKyluPU5lKG4sci5taXhpbnNbdF0saSk7dmFyIGEscz17fTtmb3IoYSBpbiBuKWMoYSk7Zm9yKGEgaW4gcilwKG4sYSl8fGMoYSk7ZnVuY3Rpb24gYyhlKXt2YXIgdD1BZVtlXXx8amU7c1tlXT10KG5bZV0scltlXSxpLGUpfXJldHVybiBzfWZ1bmN0aW9uIExlKGUsdCxuLHIpe2lmKCJzdHJpbmciPT10eXBlb2Ygbil7dmFyIGk9ZVt0XTtpZihwKGksbikpcmV0dXJuIGlbbl07dmFyIG89ZyhuKTtpZihwKGksbykpcmV0dXJuIGlbb107dmFyIGE9ZChvKTtyZXR1cm4gcChpLGEpP2lbYV06aVtuXXx8aVtvXXx8aVthXX19ZnVuY3Rpb24gSWUoZSx0LG4scil7dmFyIGk9dFtlXSxvPSFwKG4sZSksYT1uW2VdLHM9UGUoQm9vbGVhbixpLnR5cGUpO2lmKC0xPHMpaWYobyYmIXAoaSwiZGVmYXVsdCIpKWE9ITE7ZWxzZSBpZigiIj09PWF8fGE9PT1fKGUpKXt2YXIgYz1QZShTdHJpbmcsaS50eXBlKTsoYzwwfHxzPGMpJiYoYT0hMCl9aWYodm9pZCAwPT09YSl7YT1mdW5jdGlvbihlLHQsbil7aWYoIXAodCwiZGVmYXVsdCIpKXJldHVybjt2YXIgcj10LmRlZmF1bHQ7aWYoZSYmZS4kb3B0aW9ucy5wcm9wc0RhdGEmJnZvaWQgMD09PWUuJG9wdGlvbnMucHJvcHNEYXRhW25dJiZ2b2lkIDAhPT1lLl9wcm9wc1tuXSlyZXR1cm4gZS5fcHJvcHNbbl07cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIHImJiJGdW5jdGlvbiIhPT1NZSh0LnR5cGUpP3IuY2FsbChlKTpyfShyLGksZSk7dmFyIGw9eWU7Z2UoITApLHdlKGEpLGdlKGwpfXJldHVybiBhfWZ1bmN0aW9uIE1lKGUpe3ZhciB0PWUmJmUudG9TdHJpbmcoKS5tYXRjaCgvXlxzKmZ1bmN0aW9uIChcdyspLyk7cmV0dXJuIHQ/dFsxXToiIn1mdW5jdGlvbiBEZShlLHQpe3JldHVybiBNZShlKT09PU1lKHQpfWZ1bmN0aW9uIFBlKGUsdCl7aWYoIUFycmF5LmlzQXJyYXkodCkpcmV0dXJuIERlKHQsZSk/MDotMTtmb3IodmFyIG49MCxyPXQubGVuZ3RoO248cjtuKyspaWYoRGUodFtuXSxlKSlyZXR1cm4gbjtyZXR1cm4tMX1mdW5jdGlvbiBGZShlLHQsbil7aWYodClmb3IodmFyIHI9dDtyPXIuJHBhcmVudDspe3ZhciBpPXIuJG9wdGlvbnMuZXJyb3JDYXB0dXJlZDtpZihpKWZvcih2YXIgbz0wO288aS5sZW5ndGg7bysrKXRyeXtpZighMT09PWlbb10uY2FsbChyLGUsdCxuKSlyZXR1cm59Y2F0Y2goZSl7UmUoZSxyLCJlcnJvckNhcHR1cmVkIGhvb2siKX19UmUoZSx0LG4pfWZ1bmN0aW9uIFJlKGUsdCxuKXtpZihqLmVycm9ySGFuZGxlcil0cnl7cmV0dXJuIGouZXJyb3JIYW5kbGVyLmNhbGwobnVsbCxlLHQsbil9Y2F0Y2goZSl7SGUoZSxudWxsLCJjb25maWcuZXJyb3JIYW5kbGVyIil9SGUoZSx0LG4pfWZ1bmN0aW9uIEhlKGUsdCxuKXtpZighQiYmIVV8fCJ1bmRlZmluZWQiPT10eXBlb2YgY29uc29sZSl0aHJvdyBlO2NvbnNvbGUuZXJyb3IoZSl9dmFyIEJlLFVlLFZlPVtdLHplPSExO2Z1bmN0aW9uIEtlKCl7emU9ITE7Zm9yKHZhciBlPVZlLnNsaWNlKDApLHQ9VmUubGVuZ3RoPTA7dDxlLmxlbmd0aDt0KyspZVt0XSgpfXZhciBKZT0hMTtpZigidW5kZWZpbmVkIiE9dHlwZW9mIHNldEltbWVkaWF0ZSYmZWUoc2V0SW1tZWRpYXRlKSlVZT1mdW5jdGlvbigpe3NldEltbWVkaWF0ZShLZSl9O2Vsc2UgaWYoInVuZGVmaW5lZCI9PXR5cGVvZiBNZXNzYWdlQ2hhbm5lbHx8IWVlKE1lc3NhZ2VDaGFubmVsKSYmIltvYmplY3QgTWVzc2FnZUNoYW5uZWxDb25zdHJ1Y3Rvcl0iIT09TWVzc2FnZUNoYW5uZWwudG9TdHJpbmcoKSlVZT1mdW5jdGlvbigpe3NldFRpbWVvdXQoS2UsMCl9O2Vsc2V7dmFyIHFlPW5ldyBNZXNzYWdlQ2hhbm5lbCxXZT1xZS5wb3J0MjtxZS5wb3J0MS5vbm1lc3NhZ2U9S2UsVWU9ZnVuY3Rpb24oKXtXZS5wb3N0TWVzc2FnZSgxKX19aWYoInVuZGVmaW5lZCIhPXR5cGVvZiBQcm9taXNlJiZlZShQcm9taXNlKSl7dmFyIEdlPVByb21pc2UucmVzb2x2ZSgpO0JlPWZ1bmN0aW9uKCl7R2UudGhlbihLZSksVyYmc2V0VGltZW91dCgkKX19ZWxzZSBCZT1VZTtmdW5jdGlvbiBaZShlLHQpe3ZhciBuO2lmKFZlLnB1c2goZnVuY3Rpb24oKXtpZihlKXRyeXtlLmNhbGwodCl9Y2F0Y2goZSl7RmUoZSx0LCJuZXh0VGljayIpfWVsc2UgbiYmbih0KX0pLHplfHwoemU9ITAsSmU/VWUoKTpCZSgpKSwhZSYmInVuZGVmaW5lZCIhPXR5cGVvZiBQcm9taXNlKXJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihlKXtuPWV9KX12YXIgWGU9bmV3IHRlO2Z1bmN0aW9uIFllKGUpeyFmdW5jdGlvbiBlKHQsbil7dmFyIHIsaTt2YXIgbz1BcnJheS5pc0FycmF5KHQpO2lmKCFvJiYhUCh0KXx8T2JqZWN0LmlzRnJvemVuKHQpfHx0IGluc3RhbmNlb2YgbGUpcmV0dXJuO2lmKHQuX19vYl9fKXt2YXIgYT10Ll9fb2JfXy5kZXAuaWQ7aWYobi5oYXMoYSkpcmV0dXJuO24uYWRkKGEpfWlmKG8pZm9yKHI9dC5sZW5ndGg7ci0tOyllKHRbcl0sbik7ZWxzZSBmb3IoaT1PYmplY3Qua2V5cyh0KSxyPWkubGVuZ3RoO3ItLTspZSh0W2lbcl1dLG4pfShlLFhlKSxYZS5jbGVhcigpfXZhciBRZSxldD1lKGZ1bmN0aW9uKGUpe3ZhciB0PSImIj09PWUuY2hhckF0KDApLG49In4iPT09KGU9dD9lLnNsaWNlKDEpOmUpLmNoYXJBdCgwKSxyPSIhIj09PShlPW4/ZS5zbGljZSgxKTplKS5jaGFyQXQoMCk7cmV0dXJue25hbWU6ZT1yP2Uuc2xpY2UoMSk6ZSxvbmNlOm4sY2FwdHVyZTpyLHBhc3NpdmU6dH19KTtmdW5jdGlvbiB0dChlKXtmdW5jdGlvbiBpKCl7dmFyIGU9YXJndW1lbnRzLHQ9aS5mbnM7aWYoIUFycmF5LmlzQXJyYXkodCkpcmV0dXJuIHQuYXBwbHkobnVsbCxhcmd1bWVudHMpO2Zvcih2YXIgbj10LnNsaWNlKCkscj0wO3I8bi5sZW5ndGg7cisrKW5bcl0uYXBwbHkobnVsbCxlKX1yZXR1cm4gaS5mbnM9ZSxpfWZ1bmN0aW9uIG50KGUsdCxuLHIsaSl7dmFyIG8sYSxzLGM7Zm9yKG8gaW4gZSlhPWVbb10scz10W29dLGM9ZXQobyksTShhKXx8KE0ocyk/KE0oYS5mbnMpJiYoYT1lW29dPXR0KGEpKSxuKGMubmFtZSxhLGMub25jZSxjLmNhcHR1cmUsYy5wYXNzaXZlLGMucGFyYW1zKSk6YSE9PXMmJihzLmZucz1hLGVbb109cykpO2ZvcihvIGluIHQpTShlW29dKSYmcigoYz1ldChvKSkubmFtZSx0W29dLGMuY2FwdHVyZSl9ZnVuY3Rpb24gcnQoZSx0LG4pe3ZhciByO2UgaW5zdGFuY2VvZiBsZSYmKGU9ZS5kYXRhLmhvb2t8fChlLmRhdGEuaG9vaz17fSkpO3ZhciBpPWVbdF07ZnVuY3Rpb24gbygpe24uYXBwbHkodGhpcyxhcmd1bWVudHMpLGYoci5mbnMsbyl9TShpKT9yPXR0KFtvXSk6RChpLmZucykmJlMoaS5tZXJnZWQpPyhyPWkpLmZucy5wdXNoKG8pOnI9dHQoW2ksb10pLHIubWVyZ2VkPSEwLGVbdF09cn1mdW5jdGlvbiBpdChlLHQsbixyLGkpe2lmKEQodCkpe2lmKHAodCxuKSlyZXR1cm4gZVtuXT10W25dLGl8fGRlbGV0ZSB0W25dLCEwO2lmKHAodCxyKSlyZXR1cm4gZVtuXT10W3JdLGl8fGRlbGV0ZSB0W3JdLCEwfXJldHVybiExfWZ1bmN0aW9uIG90KGUpe3JldHVybiBUKGUpP1twZShlKV06QXJyYXkuaXNBcnJheShlKT9mdW5jdGlvbiBlKHQsbil7dmFyIHI9W107dmFyIGksbyxhLHM7Zm9yKGk9MDtpPHQubGVuZ3RoO2krKylNKG89dFtpXSl8fCJib29sZWFuIj09dHlwZW9mIG98fChhPXIubGVuZ3RoLTEscz1yW2FdLEFycmF5LmlzQXJyYXkobyk/MDxvLmxlbmd0aCYmKGF0KChvPWUobywobnx8IiIpKyJfIitpKSlbMF0pJiZhdChzKSYmKHJbYV09cGUocy50ZXh0K29bMF0udGV4dCksby5zaGlmdCgpKSxyLnB1c2guYXBwbHkocixvKSk6VChvKT9hdChzKT9yW2FdPXBlKHMudGV4dCtvKToiIiE9PW8mJnIucHVzaChwZShvKSk6YXQobykmJmF0KHMpP3JbYV09cGUocy50ZXh0K28udGV4dCk6KFModC5faXNWTGlzdCkmJkQoby50YWcpJiZNKG8ua2V5KSYmRChuKSYmKG8ua2V5PSJfX3ZsaXN0IituKyJfIitpKyJfXyIpLHIucHVzaChvKSkpO3JldHVybiByfShlKTp2b2lkIDB9ZnVuY3Rpb24gYXQoZSl7cmV0dXJuIEQoZSkmJkQoZS50ZXh0KSYmITE9PT1lLmlzQ29tbWVudH1mdW5jdGlvbiBzdChlLHQpe3JldHVybihlLl9fZXNNb2R1bGV8fG5lJiYiTW9kdWxlIj09PWVbU3ltYm9sLnRvU3RyaW5nVGFnXSkmJihlPWUuZGVmYXVsdCksUChlKT90LmV4dGVuZChlKTplfWZ1bmN0aW9uIGN0KGUpe3JldHVybiBlLmlzQ29tbWVudCYmZS5hc3luY0ZhY3Rvcnl9ZnVuY3Rpb24gbHQoZSl7aWYoQXJyYXkuaXNBcnJheShlKSlmb3IodmFyIHQ9MDt0PGUubGVuZ3RoO3QrKyl7dmFyIG49ZVt0XTtpZihEKG4pJiYoRChuLmNvbXBvbmVudE9wdGlvbnMpfHxjdChuKSkpcmV0dXJuIG59fWZ1bmN0aW9uIHV0KGUsdCxuKXtuP1FlLiRvbmNlKGUsdCk6UWUuJG9uKGUsdCl9ZnVuY3Rpb24gZnQoZSx0KXtRZS4kb2ZmKGUsdCl9ZnVuY3Rpb24gcHQoZSx0LG4pe1FlPWUsbnQodCxufHx7fSx1dCxmdCksUWU9dm9pZCAwfWZ1bmN0aW9uIGR0KGUsdCl7dmFyIG49e307aWYoIWUpcmV0dXJuIG47Zm9yKHZhciByPTAsaT1lLmxlbmd0aDtyPGk7cisrKXt2YXIgbz1lW3JdLGE9by5kYXRhO2lmKGEmJmEuYXR0cnMmJmEuYXR0cnMuc2xvdCYmZGVsZXRlIGEuYXR0cnMuc2xvdCxvLmNvbnRleHQhPT10JiZvLmZuQ29udGV4dCE9PXR8fCFhfHxudWxsPT1hLnNsb3QpKG4uZGVmYXVsdHx8KG4uZGVmYXVsdD1bXSkpLnB1c2gobyk7ZWxzZXt2YXIgcz1hLnNsb3QsYz1uW3NdfHwobltzXT1bXSk7InRlbXBsYXRlIj09PW8udGFnP2MucHVzaC5hcHBseShjLG8uY2hpbGRyZW58fFtdKTpjLnB1c2gobyl9fWZvcih2YXIgbCBpbiBuKW5bbF0uZXZlcnkodnQpJiZkZWxldGUgbltsXTtyZXR1cm4gbn1mdW5jdGlvbiB2dChlKXtyZXR1cm4gZS5pc0NvbW1lbnQmJiFlLmFzeW5jRmFjdG9yeXx8IiAiPT09ZS50ZXh0fWZ1bmN0aW9uIGh0KGUsdCl7dD10fHx7fTtmb3IodmFyIG49MDtuPGUubGVuZ3RoO24rKylBcnJheS5pc0FycmF5KGVbbl0pP2h0KGVbbl0sdCk6dFtlW25dLmtleV09ZVtuXS5mbjtyZXR1cm4gdH12YXIgbXQ9bnVsbDtmdW5jdGlvbiB5dChlKXtmb3IoO2UmJihlPWUuJHBhcmVudCk7KWlmKGUuX2luYWN0aXZlKXJldHVybiEwO3JldHVybiExfWZ1bmN0aW9uIGd0KGUsdCl7aWYodCl7aWYoZS5fZGlyZWN0SW5hY3RpdmU9ITEseXQoZSkpcmV0dXJufWVsc2UgaWYoZS5fZGlyZWN0SW5hY3RpdmUpcmV0dXJuO2lmKGUuX2luYWN0aXZlfHxudWxsPT09ZS5faW5hY3RpdmUpe2UuX2luYWN0aXZlPSExO2Zvcih2YXIgbj0wO248ZS4kY2hpbGRyZW4ubGVuZ3RoO24rKylndChlLiRjaGlsZHJlbltuXSk7X3QoZSwiYWN0aXZhdGVkIil9fWZ1bmN0aW9uIF90KHQsbil7c2UoKTt2YXIgZT10LiRvcHRpb25zW25dO2lmKGUpZm9yKHZhciByPTAsaT1lLmxlbmd0aDtyPGk7cisrKXRyeXtlW3JdLmNhbGwodCl9Y2F0Y2goZSl7RmUoZSx0LG4rIiBob29rIil9dC5faGFzSG9va0V2ZW50JiZ0LiRlbWl0KCJob29rOiIrbiksY2UoKX12YXIgYnQ9W10sJHQ9W10sd3Q9e30sQ3Q9ITEseHQ9ITEsa3Q9MDtmdW5jdGlvbiBBdCgpe3ZhciBlLHQ7Zm9yKHh0PSEwLGJ0LnNvcnQoZnVuY3Rpb24oZSx0KXtyZXR1cm4gZS5pZC10LmlkfSksa3Q9MDtrdDxidC5sZW5ndGg7a3QrKyl0PShlPWJ0W2t0XSkuaWQsd3RbdF09bnVsbCxlLnJ1bigpO3ZhciBuPSR0LnNsaWNlKCkscj1idC5zbGljZSgpO2t0PWJ0Lmxlbmd0aD0kdC5sZW5ndGg9MCx3dD17fSxDdD14dD0hMSxmdW5jdGlvbihlKXtmb3IodmFyIHQ9MDt0PGUubGVuZ3RoO3QrKyllW3RdLl9pbmFjdGl2ZT0hMCxndChlW3RdLCEwKX0obiksZnVuY3Rpb24oZSl7dmFyIHQ9ZS5sZW5ndGg7Zm9yKDt0LS07KXt2YXIgbj1lW3RdLHI9bi52bTtyLl93YXRjaGVyPT09biYmci5faXNNb3VudGVkJiZfdChyLCJ1cGRhdGVkIil9fShyKSxRJiZqLmRldnRvb2xzJiZRLmVtaXQoImZsdXNoIil9dmFyIE90PTAsU3Q9ZnVuY3Rpb24oZSx0LG4scixpKXt0aGlzLnZtPWUsaSYmKGUuX3dhdGNoZXI9dGhpcyksZS5fd2F0Y2hlcnMucHVzaCh0aGlzKSxyPyh0aGlzLmRlZXA9ISFyLmRlZXAsdGhpcy51c2VyPSEhci51c2VyLHRoaXMubGF6eT0hIXIubGF6eSx0aGlzLnN5bmM9ISFyLnN5bmMpOnRoaXMuZGVlcD10aGlzLnVzZXI9dGhpcy5sYXp5PXRoaXMuc3luYz0hMSx0aGlzLmNiPW4sdGhpcy5pZD0rK090LHRoaXMuYWN0aXZlPSEwLHRoaXMuZGlydHk9dGhpcy5sYXp5LHRoaXMuZGVwcz1bXSx0aGlzLm5ld0RlcHM9W10sdGhpcy5kZXBJZHM9bmV3IHRlLHRoaXMubmV3RGVwSWRzPW5ldyB0ZSx0aGlzLmV4cHJlc3Npb249IiIsImZ1bmN0aW9uIj09dHlwZW9mIHQ/dGhpcy5nZXR0ZXI9dDoodGhpcy5nZXR0ZXI9ZnVuY3Rpb24oZSl7aWYoIUwudGVzdChlKSl7dmFyIG49ZS5zcGxpdCgiLiIpO3JldHVybiBmdW5jdGlvbihlKXtmb3IodmFyIHQ9MDt0PG4ubGVuZ3RoO3QrKyl7aWYoIWUpcmV0dXJuO2U9ZVtuW3RdXX1yZXR1cm4gZX19fSh0KSx0aGlzLmdldHRlcnx8KHRoaXMuZ2V0dGVyPWZ1bmN0aW9uKCl7fSkpLHRoaXMudmFsdWU9dGhpcy5sYXp5P3ZvaWQgMDp0aGlzLmdldCgpfTtTdC5wcm90b3R5cGUuZ2V0PWZ1bmN0aW9uKCl7dmFyIGU7c2UodGhpcyk7dmFyIHQ9dGhpcy52bTt0cnl7ZT10aGlzLmdldHRlci5jYWxsKHQsdCl9Y2F0Y2goZSl7aWYoIXRoaXMudXNlcil0aHJvdyBlO0ZlKGUsdCwnZ2V0dGVyIGZvciB3YXRjaGVyICInK3RoaXMuZXhwcmVzc2lvbisnIicpfWZpbmFsbHl7dGhpcy5kZWVwJiZZZShlKSxjZSgpLHRoaXMuY2xlYW51cERlcHMoKX1yZXR1cm4gZX0sU3QucHJvdG90eXBlLmFkZERlcD1mdW5jdGlvbihlKXt2YXIgdD1lLmlkO3RoaXMubmV3RGVwSWRzLmhhcyh0KXx8KHRoaXMubmV3RGVwSWRzLmFkZCh0KSx0aGlzLm5ld0RlcHMucHVzaChlKSx0aGlzLmRlcElkcy5oYXModCl8fGUuYWRkU3ViKHRoaXMpKX0sU3QucHJvdG90eXBlLmNsZWFudXBEZXBzPWZ1bmN0aW9uKCl7Zm9yKHZhciBlPXRoaXMuZGVwcy5sZW5ndGg7ZS0tOyl7dmFyIHQ9dGhpcy5kZXBzW2VdO3RoaXMubmV3RGVwSWRzLmhhcyh0LmlkKXx8dC5yZW1vdmVTdWIodGhpcyl9dmFyIG49dGhpcy5kZXBJZHM7dGhpcy5kZXBJZHM9dGhpcy5uZXdEZXBJZHMsdGhpcy5uZXdEZXBJZHM9bix0aGlzLm5ld0RlcElkcy5jbGVhcigpLG49dGhpcy5kZXBzLHRoaXMuZGVwcz10aGlzLm5ld0RlcHMsdGhpcy5uZXdEZXBzPW4sdGhpcy5uZXdEZXBzLmxlbmd0aD0wfSxTdC5wcm90b3R5cGUudXBkYXRlPWZ1bmN0aW9uKCl7dGhpcy5sYXp5P3RoaXMuZGlydHk9ITA6dGhpcy5zeW5jP3RoaXMucnVuKCk6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5pZDtpZihudWxsPT13dFt0XSl7aWYod3RbdF09ITAseHQpe2Zvcih2YXIgbj1idC5sZW5ndGgtMTtrdDxuJiZidFtuXS5pZD5lLmlkOyluLS07YnQuc3BsaWNlKG4rMSwwLGUpfWVsc2UgYnQucHVzaChlKTtDdHx8KEN0PSEwLFplKEF0KSl9fSh0aGlzKX0sU3QucHJvdG90eXBlLnJ1bj1mdW5jdGlvbigpe2lmKHRoaXMuYWN0aXZlKXt2YXIgZT10aGlzLmdldCgpO2lmKGUhPT10aGlzLnZhbHVlfHxQKGUpfHx0aGlzLmRlZXApe3ZhciB0PXRoaXMudmFsdWU7aWYodGhpcy52YWx1ZT1lLHRoaXMudXNlcil0cnl7dGhpcy5jYi5jYWxsKHRoaXMudm0sZSx0KX1jYXRjaChlKXtGZShlLHRoaXMudm0sJ2NhbGxiYWNrIGZvciB3YXRjaGVyICInK3RoaXMuZXhwcmVzc2lvbisnIicpfWVsc2UgdGhpcy5jYi5jYWxsKHRoaXMudm0sZSx0KX19fSxTdC5wcm90b3R5cGUuZXZhbHVhdGU9ZnVuY3Rpb24oKXt0aGlzLnZhbHVlPXRoaXMuZ2V0KCksdGhpcy5kaXJ0eT0hMX0sU3QucHJvdG90eXBlLmRlcGVuZD1mdW5jdGlvbigpe2Zvcih2YXIgZT10aGlzLmRlcHMubGVuZ3RoO2UtLTspdGhpcy5kZXBzW2VdLmRlcGVuZCgpfSxTdC5wcm90b3R5cGUudGVhcmRvd249ZnVuY3Rpb24oKXtpZih0aGlzLmFjdGl2ZSl7dGhpcy52bS5faXNCZWluZ0Rlc3Ryb3llZHx8Zih0aGlzLnZtLl93YXRjaGVycyx0aGlzKTtmb3IodmFyIGU9dGhpcy5kZXBzLmxlbmd0aDtlLS07KXRoaXMuZGVwc1tlXS5yZW1vdmVTdWIodGhpcyk7dGhpcy5hY3RpdmU9ITF9fTt2YXIgVHQ9e2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLGdldDokLHNldDokfTtmdW5jdGlvbiBFdChlLHQsbil7VHQuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXNbdF1bbl19LFR0LnNldD1mdW5jdGlvbihlKXt0aGlzW3RdW25dPWV9LE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLG4sVHQpfWZ1bmN0aW9uIGp0KGUpe2UuX3dhdGNoZXJzPVtdO3ZhciB0PWUuJG9wdGlvbnM7dC5wcm9wcyYmZnVuY3Rpb24obixyKXt2YXIgaT1uLiRvcHRpb25zLnByb3BzRGF0YXx8e30sbz1uLl9wcm9wcz17fSxhPW4uJG9wdGlvbnMuX3Byb3BLZXlzPVtdO24uJHBhcmVudCYmZ2UoITEpO3ZhciBlPWZ1bmN0aW9uKGUpe2EucHVzaChlKTt2YXIgdD1JZShlLHIsaSxuKTtDZShvLGUsdCksZSBpbiBufHxFdChuLCJfcHJvcHMiLGUpfTtmb3IodmFyIHQgaW4gcillKHQpO2dlKCEwKX0oZSx0LnByb3BzKSx0Lm1ldGhvZHMmJmZ1bmN0aW9uKGUsdCl7ZS4kb3B0aW9ucy5wcm9wcztmb3IodmFyIG4gaW4gdCllW25dPW51bGw9PXRbbl0/JDp2KHRbbl0sZSl9KGUsdC5tZXRob2RzKSx0LmRhdGE/ZnVuY3Rpb24oZSl7dmFyIHQ9ZS4kb3B0aW9ucy5kYXRhO2wodD1lLl9kYXRhPSJmdW5jdGlvbiI9PXR5cGVvZiB0P2Z1bmN0aW9uKGUsdCl7c2UoKTt0cnl7cmV0dXJuIGUuY2FsbCh0LHQpfWNhdGNoKGUpe3JldHVybiBGZShlLHQsImRhdGEoKSIpLHt9fWZpbmFsbHl7Y2UoKX19KHQsZSk6dHx8e30pfHwodD17fSk7dmFyIG49T2JqZWN0LmtleXModCkscj1lLiRvcHRpb25zLnByb3BzLGk9KGUuJG9wdGlvbnMubWV0aG9kcyxuLmxlbmd0aCk7Zm9yKDtpLS07KXt2YXIgbz1uW2ldO3ImJnAocixvKXx8KHZvaWQgMCwzNiE9PShhPShvKyIiKS5jaGFyQ29kZUF0KDApKSYmOTUhPT1hJiZFdChlLCJfZGF0YSIsbykpfXZhciBhO3dlKHQsITApfShlKTp3ZShlLl9kYXRhPXt9LCEwKSx0LmNvbXB1dGVkJiZmdW5jdGlvbihlLHQpe3ZhciBuPWUuX2NvbXB1dGVkV2F0Y2hlcnM9T2JqZWN0LmNyZWF0ZShudWxsKSxyPVkoKTtmb3IodmFyIGkgaW4gdCl7dmFyIG89dFtpXSxhPSJmdW5jdGlvbiI9PXR5cGVvZiBvP286by5nZXQ7cnx8KG5baV09bmV3IFN0KGUsYXx8JCwkLE50KSksaSBpbiBlfHxMdChlLGksbyl9fShlLHQuY29tcHV0ZWQpLHQud2F0Y2gmJnQud2F0Y2ghPT1HJiZmdW5jdGlvbihlLHQpe2Zvcih2YXIgbiBpbiB0KXt2YXIgcj10W25dO2lmKEFycmF5LmlzQXJyYXkocikpZm9yKHZhciBpPTA7aTxyLmxlbmd0aDtpKyspTXQoZSxuLHJbaV0pO2Vsc2UgTXQoZSxuLHIpfX0oZSx0LndhdGNoKX12YXIgTnQ9e2xhenk6ITB9O2Z1bmN0aW9uIEx0KGUsdCxuKXt2YXIgcj0hWSgpOyJmdW5jdGlvbiI9PXR5cGVvZiBuPyhUdC5nZXQ9cj9JdCh0KTpuLFR0LnNldD0kKTooVHQuZ2V0PW4uZ2V0P3ImJiExIT09bi5jYWNoZT9JdCh0KTpuLmdldDokLFR0LnNldD1uLnNldD9uLnNldDokKSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSx0LFR0KX1mdW5jdGlvbiBJdCh0KXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgZT10aGlzLl9jb21wdXRlZFdhdGNoZXJzJiZ0aGlzLl9jb21wdXRlZFdhdGNoZXJzW3RdO2lmKGUpcmV0dXJuIGUuZGlydHkmJmUuZXZhbHVhdGUoKSxvZS50YXJnZXQmJmUuZGVwZW5kKCksZS52YWx1ZX19ZnVuY3Rpb24gTXQoZSx0LG4scil7cmV0dXJuIGwobikmJihuPShyPW4pLmhhbmRsZXIpLCJzdHJpbmciPT10eXBlb2YgbiYmKG49ZVtuXSksZS4kd2F0Y2godCxuLHIpfWZ1bmN0aW9uIER0KHQsZSl7aWYodCl7Zm9yKHZhciBuPU9iamVjdC5jcmVhdGUobnVsbCkscj1uZT9SZWZsZWN0Lm93bktleXModCkuZmlsdGVyKGZ1bmN0aW9uKGUpe3JldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHQsZSkuZW51bWVyYWJsZX0pOk9iamVjdC5rZXlzKHQpLGk9MDtpPHIubGVuZ3RoO2krKyl7Zm9yKHZhciBvPXJbaV0sYT10W29dLmZyb20scz1lO3M7KXtpZihzLl9wcm92aWRlZCYmcChzLl9wcm92aWRlZCxhKSl7bltvXT1zLl9wcm92aWRlZFthXTticmVha31zPXMuJHBhcmVudH1pZighcyYmImRlZmF1bHQiaW4gdFtvXSl7dmFyIGM9dFtvXS5kZWZhdWx0O25bb109ImZ1bmN0aW9uIj09dHlwZW9mIGM/Yy5jYWxsKGUpOmN9fXJldHVybiBufX1mdW5jdGlvbiBQdChlLHQpe3ZhciBuLHIsaSxvLGE7aWYoQXJyYXkuaXNBcnJheShlKXx8InN0cmluZyI9PXR5cGVvZiBlKWZvcihuPW5ldyBBcnJheShlLmxlbmd0aCkscj0wLGk9ZS5sZW5ndGg7cjxpO3IrKyluW3JdPXQoZVtyXSxyKTtlbHNlIGlmKCJudW1iZXIiPT10eXBlb2YgZSlmb3Iobj1uZXcgQXJyYXkoZSkscj0wO3I8ZTtyKyspbltyXT10KHIrMSxyKTtlbHNlIGlmKFAoZSkpZm9yKG89T2JqZWN0LmtleXMoZSksbj1uZXcgQXJyYXkoby5sZW5ndGgpLHI9MCxpPW8ubGVuZ3RoO3I8aTtyKyspYT1vW3JdLG5bcl09dChlW2FdLGEscik7cmV0dXJuIEQobikmJihuLl9pc1ZMaXN0PSEwKSxufWZ1bmN0aW9uIEZ0KGUsdCxuLHIpe3ZhciBpLG89dGhpcy4kc2NvcGVkU2xvdHNbZV07aWYobyluPW58fHt9LHImJihuPW0obSh7fSxyKSxuKSksaT1vKG4pfHx0O2Vsc2V7dmFyIGE9dGhpcy4kc2xvdHNbZV07YSYmKGEuX3JlbmRlcmVkPSEwKSxpPWF8fHR9dmFyIHM9biYmbi5zbG90O3JldHVybiBzP3RoaXMuJGNyZWF0ZUVsZW1lbnQoInRlbXBsYXRlIix7c2xvdDpzfSxpKTppfWZ1bmN0aW9uIFJ0KGUpe3JldHVybiBMZSh0aGlzLiRvcHRpb25zLCJmaWx0ZXJzIixlKXx8d31mdW5jdGlvbiBIdChlLHQpe3JldHVybiBBcnJheS5pc0FycmF5KGUpPy0xPT09ZS5pbmRleE9mKHQpOmUhPT10fWZ1bmN0aW9uIEJ0KGUsdCxuLHIsaSl7dmFyIG89ai5rZXlDb2Rlc1t0XXx8bjtyZXR1cm4gaSYmciYmIWoua2V5Q29kZXNbdF0/SHQoaSxyKTpvP0h0KG8sZSk6cj9fKHIpIT09dDp2b2lkIDB9ZnVuY3Rpb24gVXQobixyLGksbyxhKXtpZihpKWlmKFAoaSkpe3ZhciBzO0FycmF5LmlzQXJyYXkoaSkmJihpPWIoaSkpO3ZhciBlPWZ1bmN0aW9uKHQpe2lmKCJjbGFzcyI9PT10fHwic3R5bGUiPT09dHx8dSh0KSlzPW47ZWxzZXt2YXIgZT1uLmF0dHJzJiZuLmF0dHJzLnR5cGU7cz1vfHxqLm11c3RVc2VQcm9wKHIsZSx0KT9uLmRvbVByb3BzfHwobi5kb21Qcm9wcz17fSk6bi5hdHRyc3x8KG4uYXR0cnM9e30pfXQgaW4gc3x8KHNbdF09aVt0XSxhJiYoKG4ub258fChuLm9uPXt9KSlbInVwZGF0ZToiK3RdPWZ1bmN0aW9uKGUpe2lbdF09ZX0pKX07Zm9yKHZhciB0IGluIGkpZSh0KX1lbHNlO3JldHVybiBufWZ1bmN0aW9uIFZ0KGUsdCl7dmFyIG49dGhpcy5fc3RhdGljVHJlZXN8fCh0aGlzLl9zdGF0aWNUcmVlcz1bXSkscj1uW2VdO3JldHVybiByJiYhdHx8S3Qocj1uW2VdPXRoaXMuJG9wdGlvbnMuc3RhdGljUmVuZGVyRm5zW2VdLmNhbGwodGhpcy5fcmVuZGVyUHJveHksbnVsbCx0aGlzKSwiX19zdGF0aWNfXyIrZSwhMSkscn1mdW5jdGlvbiB6dChlLHQsbil7cmV0dXJuIEt0KGUsIl9fb25jZV9fIit0KyhuPyJfIituOiIiKSwhMCksZX1mdW5jdGlvbiBLdChlLHQsbil7aWYoQXJyYXkuaXNBcnJheShlKSlmb3IodmFyIHI9MDtyPGUubGVuZ3RoO3IrKyllW3JdJiYic3RyaW5nIiE9dHlwZW9mIGVbcl0mJkp0KGVbcl0sdCsiXyIrcixuKTtlbHNlIEp0KGUsdCxuKX1mdW5jdGlvbiBKdChlLHQsbil7ZS5pc1N0YXRpYz0hMCxlLmtleT10LGUuaXNPbmNlPW59ZnVuY3Rpb24gcXQoZSx0KXtpZih0KWlmKGwodCkpe3ZhciBuPWUub249ZS5vbj9tKHt9LGUub24pOnt9O2Zvcih2YXIgciBpbiB0KXt2YXIgaT1uW3JdLG89dFtyXTtuW3JdPWk/W10uY29uY2F0KGksbyk6b319ZWxzZTtyZXR1cm4gZX1mdW5jdGlvbiBXdChlKXtlLl9vPXp0LGUuX249RixlLl9zPXQsZS5fbD1QdCxlLl90PUZ0LGUuX3E9QyxlLl9pPXgsZS5fbT1WdCxlLl9mPVJ0LGUuX2s9QnQsZS5fYj1VdCxlLl92PXBlLGUuX2U9ZmUsZS5fdT1odCxlLl9nPXF0fWZ1bmN0aW9uIEd0KGUsdCxuLG8scil7dmFyIGEscz1yLm9wdGlvbnM7cChvLCJfdWlkIik/KGE9T2JqZWN0LmNyZWF0ZShvKSkuX29yaWdpbmFsPW86bz0oYT1vKS5fb3JpZ2luYWw7dmFyIGk9UyhzLl9jb21waWxlZCksYz0haTt0aGlzLmRhdGE9ZSx0aGlzLnByb3BzPXQsdGhpcy5jaGlsZHJlbj1uLHRoaXMucGFyZW50PW8sdGhpcy5saXN0ZW5lcnM9ZS5vbnx8eSx0aGlzLmluamVjdGlvbnM9RHQocy5pbmplY3QsbyksdGhpcy5zbG90cz1mdW5jdGlvbigpe3JldHVybiBkdChuLG8pfSxpJiYodGhpcy4kb3B0aW9ucz1zLHRoaXMuJHNsb3RzPXRoaXMuc2xvdHMoKSx0aGlzLiRzY29wZWRTbG90cz1lLnNjb3BlZFNsb3RzfHx5KSxzLl9zY29wZUlkP3RoaXMuX2M9ZnVuY3Rpb24oZSx0LG4scil7dmFyIGk9cm4oYSxlLHQsbixyLGMpO3JldHVybiBpJiYhQXJyYXkuaXNBcnJheShpKSYmKGkuZm5TY29wZUlkPXMuX3Njb3BlSWQsaS5mbkNvbnRleHQ9byksaX06dGhpcy5fYz1mdW5jdGlvbihlLHQsbixyKXtyZXR1cm4gcm4oYSxlLHQsbixyLGMpfX1mdW5jdGlvbiBadChlLHQsbixyKXt2YXIgaT1kZShlKTtyZXR1cm4gaS5mbkNvbnRleHQ9bixpLmZuT3B0aW9ucz1yLHQuc2xvdCYmKChpLmRhdGF8fChpLmRhdGE9e30pKS5zbG90PXQuc2xvdCksaX1mdW5jdGlvbiBYdChlLHQpe2Zvcih2YXIgbiBpbiB0KWVbZyhuKV09dFtuXX1XdChHdC5wcm90b3R5cGUpO3ZhciBZdD17aW5pdDpmdW5jdGlvbihlLHQsbixyKXtpZihlLmNvbXBvbmVudEluc3RhbmNlJiYhZS5jb21wb25lbnRJbnN0YW5jZS5faXNEZXN0cm95ZWQmJmUuZGF0YS5rZWVwQWxpdmUpe3ZhciBpPWU7WXQucHJlcGF0Y2goaSxpKX1lbHNleyhlLmNvbXBvbmVudEluc3RhbmNlPWZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBpPXtfaXNDb21wb25lbnQ6ITAscGFyZW50OnQsX3BhcmVudFZub2RlOmUsX3BhcmVudEVsbTpufHxudWxsLF9yZWZFbG06cnx8bnVsbH0sbz1lLmRhdGEuaW5saW5lVGVtcGxhdGU7RChvKSYmKGkucmVuZGVyPW8ucmVuZGVyLGkuc3RhdGljUmVuZGVyRm5zPW8uc3RhdGljUmVuZGVyRm5zKTtyZXR1cm4gbmV3IGUuY29tcG9uZW50T3B0aW9ucy5DdG9yKGkpfShlLG10LG4scikpLiRtb3VudCh0P2UuZWxtOnZvaWQgMCx0KX19LHByZXBhdGNoOmZ1bmN0aW9uKGUsdCl7dmFyIG49dC5jb21wb25lbnRPcHRpb25zOyFmdW5jdGlvbihlLHQsbixyLGkpe3ZhciBvPSEhKGl8fGUuJG9wdGlvbnMuX3JlbmRlckNoaWxkcmVufHxyLmRhdGEuc2NvcGVkU2xvdHN8fGUuJHNjb3BlZFNsb3RzIT09eSk7aWYoZS4kb3B0aW9ucy5fcGFyZW50Vm5vZGU9cixlLiR2bm9kZT1yLGUuX3Zub2RlJiYoZS5fdm5vZGUucGFyZW50PXIpLGUuJG9wdGlvbnMuX3JlbmRlckNoaWxkcmVuPWksZS4kYXR0cnM9ci5kYXRhLmF0dHJzfHx5LGUuJGxpc3RlbmVycz1ufHx5LHQmJmUuJG9wdGlvbnMucHJvcHMpe2dlKCExKTtmb3IodmFyIGE9ZS5fcHJvcHMscz1lLiRvcHRpb25zLl9wcm9wS2V5c3x8W10sYz0wO2M8cy5sZW5ndGg7YysrKXt2YXIgbD1zW2NdLHU9ZS4kb3B0aW9ucy5wcm9wczthW2xdPUllKGwsdSx0LGUpfWdlKCEwKSxlLiRvcHRpb25zLnByb3BzRGF0YT10fW49bnx8eTt2YXIgZj1lLiRvcHRpb25zLl9wYXJlbnRMaXN0ZW5lcnM7ZS4kb3B0aW9ucy5fcGFyZW50TGlzdGVuZXJzPW4scHQoZSxuLGYpLG8mJihlLiRzbG90cz1kdChpLHIuY29udGV4dCksZS4kZm9yY2VVcGRhdGUoKSl9KHQuY29tcG9uZW50SW5zdGFuY2U9ZS5jb21wb25lbnRJbnN0YW5jZSxuLnByb3BzRGF0YSxuLmxpc3RlbmVycyx0LG4uY2hpbGRyZW4pfSxpbnNlcnQ6ZnVuY3Rpb24oZSl7dmFyIHQsbj1lLmNvbnRleHQscj1lLmNvbXBvbmVudEluc3RhbmNlO3IuX2lzTW91bnRlZHx8KHIuX2lzTW91bnRlZD0hMCxfdChyLCJtb3VudGVkIikpLGUuZGF0YS5rZWVwQWxpdmUmJihuLl9pc01vdW50ZWQ/KCh0PXIpLl9pbmFjdGl2ZT0hMSwkdC5wdXNoKHQpKTpndChyLCEwKSl9LGRlc3Ryb3k6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5jb21wb25lbnRJbnN0YW5jZTt0Ll9pc0Rlc3Ryb3llZHx8KGUuZGF0YS5rZWVwQWxpdmU/ZnVuY3Rpb24gZSh0LG4pe2lmKCEobiYmKHQuX2RpcmVjdEluYWN0aXZlPSEwLHl0KHQpKXx8dC5faW5hY3RpdmUpKXt0Ll9pbmFjdGl2ZT0hMDtmb3IodmFyIHI9MDtyPHQuJGNoaWxkcmVuLmxlbmd0aDtyKyspZSh0LiRjaGlsZHJlbltyXSk7X3QodCwiZGVhY3RpdmF0ZWQiKX19KHQsITApOnQuJGRlc3Ryb3koKSl9fSxRdD1PYmplY3Qua2V5cyhZdCk7ZnVuY3Rpb24gZW4oZSx0LG4scixpKXtpZighTShlKSl7dmFyIG89bi4kb3B0aW9ucy5fYmFzZTtpZihQKGUpJiYoZT1vLmV4dGVuZChlKSksImZ1bmN0aW9uIj09dHlwZW9mIGUpe3ZhciBhLHMsYyxsLHUsZixwO2lmKE0oZS5jaWQpJiZ2b2lkIDA9PT0oZT1mdW5jdGlvbih0LG4sZSl7aWYoUyh0LmVycm9yKSYmRCh0LmVycm9yQ29tcCkpcmV0dXJuIHQuZXJyb3JDb21wO2lmKEQodC5yZXNvbHZlZCkpcmV0dXJuIHQucmVzb2x2ZWQ7aWYoUyh0LmxvYWRpbmcpJiZEKHQubG9hZGluZ0NvbXApKXJldHVybiB0LmxvYWRpbmdDb21wO2lmKCFEKHQuY29udGV4dHMpKXt2YXIgcj10LmNvbnRleHRzPVtlXSxpPSEwLG89ZnVuY3Rpb24oKXtmb3IodmFyIGU9MCx0PXIubGVuZ3RoO2U8dDtlKyspcltlXS4kZm9yY2VVcGRhdGUoKX0sYT1SKGZ1bmN0aW9uKGUpe3QucmVzb2x2ZWQ9c3QoZSxuKSxpfHxvKCl9KSxzPVIoZnVuY3Rpb24oZSl7RCh0LmVycm9yQ29tcCkmJih0LmVycm9yPSEwLG8oKSl9KSxjPXQoYSxzKTtyZXR1cm4gUChjKSYmKCJmdW5jdGlvbiI9PXR5cGVvZiBjLnRoZW4/TSh0LnJlc29sdmVkKSYmYy50aGVuKGEscyk6RChjLmNvbXBvbmVudCkmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmNvbXBvbmVudC50aGVuJiYoYy5jb21wb25lbnQudGhlbihhLHMpLEQoYy5lcnJvcikmJih0LmVycm9yQ29tcD1zdChjLmVycm9yLG4pKSxEKGMubG9hZGluZykmJih0LmxvYWRpbmdDb21wPXN0KGMubG9hZGluZyxuKSwwPT09Yy5kZWxheT90LmxvYWRpbmc9ITA6c2V0VGltZW91dChmdW5jdGlvbigpe00odC5yZXNvbHZlZCkmJk0odC5lcnJvcikmJih0LmxvYWRpbmc9ITAsbygpKX0sYy5kZWxheXx8MjAwKSksRChjLnRpbWVvdXQpJiZzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7TSh0LnJlc29sdmVkKSYmcyhudWxsKX0sYy50aW1lb3V0KSkpLGk9ITEsdC5sb2FkaW5nP3QubG9hZGluZ0NvbXA6dC5yZXNvbHZlZH10LmNvbnRleHRzLnB1c2goZSl9KGE9ZSxvLG4pKSlyZXR1cm4gcz1hLGM9dCxsPW4sdT1yLGY9aSwocD1mZSgpKS5hc3luY0ZhY3Rvcnk9cyxwLmFzeW5jTWV0YT17ZGF0YTpjLGNvbnRleHQ6bCxjaGlsZHJlbjp1LHRhZzpmfSxwO3Q9dHx8e30sZG4oZSksRCh0Lm1vZGVsKSYmZnVuY3Rpb24oZSx0KXt2YXIgbj1lLm1vZGVsJiZlLm1vZGVsLnByb3B8fCJ2YWx1ZSIscj1lLm1vZGVsJiZlLm1vZGVsLmV2ZW50fHwiaW5wdXQiOyh0LnByb3BzfHwodC5wcm9wcz17fSkpW25dPXQubW9kZWwudmFsdWU7dmFyIGk9dC5vbnx8KHQub249e30pO0QoaVtyXSk/aVtyXT1bdC5tb2RlbC5jYWxsYmFja10uY29uY2F0KGlbcl0pOmlbcl09dC5tb2RlbC5jYWxsYmFja30oZS5vcHRpb25zLHQpO3ZhciBkPWZ1bmN0aW9uKGUsdCxuKXt2YXIgcj10Lm9wdGlvbnMucHJvcHM7aWYoIU0ocikpe3ZhciBpPXt9LG89ZS5hdHRycyxhPWUucHJvcHM7aWYoRChvKXx8RChhKSlmb3IodmFyIHMgaW4gcil7dmFyIGM9XyhzKTtpdChpLGEscyxjLCEwKXx8aXQoaSxvLHMsYywhMSl9cmV0dXJuIGl9fSh0LGUpO2lmKFMoZS5vcHRpb25zLmZ1bmN0aW9uYWwpKXJldHVybiBmdW5jdGlvbihlLHQsbixyLGkpe3ZhciBvPWUub3B0aW9ucyxhPXt9LHM9by5wcm9wcztpZihEKHMpKWZvcih2YXIgYyBpbiBzKWFbY109SWUoYyxzLHR8fHkpO2Vsc2UgRChuLmF0dHJzKSYmWHQoYSxuLmF0dHJzKSxEKG4ucHJvcHMpJiZYdChhLG4ucHJvcHMpO3ZhciBsPW5ldyBHdChuLGEsaSxyLGUpLHU9by5yZW5kZXIuY2FsbChudWxsLGwuX2MsbCk7aWYodSBpbnN0YW5jZW9mIGxlKXJldHVybiBadCh1LG4sbC5wYXJlbnQsbyk7aWYoQXJyYXkuaXNBcnJheSh1KSl7Zm9yKHZhciBmPW90KHUpfHxbXSxwPW5ldyBBcnJheShmLmxlbmd0aCksZD0wO2Q8Zi5sZW5ndGg7ZCsrKXBbZF09WnQoZltkXSxuLGwucGFyZW50LG8pO3JldHVybiBwfX0oZSxkLHQsbixyKTt2YXIgdj10Lm9uO2lmKHQub249dC5uYXRpdmVPbixTKGUub3B0aW9ucy5hYnN0cmFjdCkpe3ZhciBoPXQuc2xvdDt0PXt9LGgmJih0LnNsb3Q9aCl9IWZ1bmN0aW9uKGUpe2Zvcih2YXIgdD1lLmhvb2t8fChlLmhvb2s9e30pLG49MDtuPFF0Lmxlbmd0aDtuKyspe3ZhciByPVF0W25dO3Rbcl09WXRbcl19fSh0KTt2YXIgbT1lLm9wdGlvbnMubmFtZXx8aTtyZXR1cm4gbmV3IGxlKCJ2dWUtY29tcG9uZW50LSIrZS5jaWQrKG0/Ii0iK206IiIpLHQsdm9pZCAwLHZvaWQgMCx2b2lkIDAsbix7Q3RvcjplLHByb3BzRGF0YTpkLGxpc3RlbmVyczp2LHRhZzppLGNoaWxkcmVuOnJ9LGEpfX19dmFyIHRuPTEsbm49MjtmdW5jdGlvbiBybihlLHQsbixyLGksbyl7cmV0dXJuKEFycmF5LmlzQXJyYXkobil8fFQobikpJiYoaT1yLHI9bixuPXZvaWQgMCksUyhvKSYmKGk9bm4pLGZ1bmN0aW9uKGUsdCxuLHIsaSl7aWYoRChuKSYmRChuLl9fb2JfXykpcmV0dXJuIGZlKCk7RChuKSYmRChuLmlzKSYmKHQ9bi5pcyk7aWYoIXQpcmV0dXJuIGZlKCk7QXJyYXkuaXNBcnJheShyKSYmImZ1bmN0aW9uIj09dHlwZW9mIHJbMF0mJigobj1ufHx7fSkuc2NvcGVkU2xvdHM9e2RlZmF1bHQ6clswXX0sci5sZW5ndGg9MCk7aT09PW5uP3I9b3Qocik6aT09PXRuJiYocj1mdW5jdGlvbihlKXtmb3IodmFyIHQ9MDt0PGUubGVuZ3RoO3QrKylpZihBcnJheS5pc0FycmF5KGVbdF0pKXJldHVybiBBcnJheS5wcm90b3R5cGUuY29uY2F0LmFwcGx5KFtdLGUpO3JldHVybiBlfShyKSk7dmFyIG8sYTtpZigic3RyaW5nIj09dHlwZW9mIHQpe3ZhciBzO2E9ZS4kdm5vZGUmJmUuJHZub2RlLm5zfHxqLmdldFRhZ05hbWVzcGFjZSh0KSxvPWouaXNSZXNlcnZlZFRhZyh0KT9uZXcgbGUoai5wYXJzZVBsYXRmb3JtVGFnTmFtZSh0KSxuLHIsdm9pZCAwLHZvaWQgMCxlKTpEKHM9TGUoZS4kb3B0aW9ucywiY29tcG9uZW50cyIsdCkpP2VuKHMsbixlLHIsdCk6bmV3IGxlKHQsbixyLHZvaWQgMCx2b2lkIDAsZSl9ZWxzZSBvPWVuKHQsbixlLHIpO3JldHVybiBBcnJheS5pc0FycmF5KG8pP286RChvKT8oRChhKSYmZnVuY3Rpb24gZSh0LG4scil7dC5ucz1uOyJmb3JlaWduT2JqZWN0Ij09PXQudGFnJiYobj12b2lkIDAscj0hMCk7aWYoRCh0LmNoaWxkcmVuKSlmb3IodmFyIGk9MCxvPXQuY2hpbGRyZW4ubGVuZ3RoO2k8bztpKyspe3ZhciBhPXQuY2hpbGRyZW5baV07RChhLnRhZykmJihNKGEubnMpfHxTKHIpJiYic3ZnIiE9PWEudGFnKSYmZShhLG4scil9fShvLGEpLEQobikmJmZ1bmN0aW9uKGUpe1AoZS5zdHlsZSkmJlllKGUuc3R5bGUpO1AoZS5jbGFzcykmJlllKGUuY2xhc3MpfShuKSxvKTpmZSgpfShlLHQsbixyLGkpfXZhciBvbixhbixzbixjbixsbix1bixmbixwbj0wO2Z1bmN0aW9uIGRuKGUpe3ZhciB0PWUub3B0aW9ucztpZihlLnN1cGVyKXt2YXIgbj1kbihlLnN1cGVyKTtpZihuIT09ZS5zdXBlck9wdGlvbnMpe2Uuc3VwZXJPcHRpb25zPW47dmFyIHI9ZnVuY3Rpb24oZSl7dmFyIHQsbj1lLm9wdGlvbnMscj1lLmV4dGVuZE9wdGlvbnMsaT1lLnNlYWxlZE9wdGlvbnM7Zm9yKHZhciBvIGluIG4pbltvXSE9PWlbb10mJih0fHwodD17fSksdFtvXT12bihuW29dLHJbb10saVtvXSkpO3JldHVybiB0fShlKTtyJiZtKGUuZXh0ZW5kT3B0aW9ucyxyKSwodD1lLm9wdGlvbnM9TmUobixlLmV4dGVuZE9wdGlvbnMpKS5uYW1lJiYodC5jb21wb25lbnRzW3QubmFtZV09ZSl9fXJldHVybiB0fWZ1bmN0aW9uIHZuKGUsdCxuKXtpZihBcnJheS5pc0FycmF5KGUpKXt2YXIgcj1bXTtuPUFycmF5LmlzQXJyYXkobik/bjpbbl0sdD1BcnJheS5pc0FycmF5KHQpP3Q6W3RdO2Zvcih2YXIgaT0wO2k8ZS5sZW5ndGg7aSsrKSgwPD10LmluZGV4T2YoZVtpXSl8fG4uaW5kZXhPZihlW2ldKTwwKSYmci5wdXNoKGVbaV0pO3JldHVybiByfXJldHVybiBlfWZ1bmN0aW9uIGhuKGUpe3RoaXMuX2luaXQoZSl9ZnVuY3Rpb24gbW4oZSl7ZS5jaWQ9MDt2YXIgYT0xO2UuZXh0ZW5kPWZ1bmN0aW9uKGUpe2U9ZXx8e307dmFyIHQ9dGhpcyxuPXQuY2lkLHI9ZS5fQ3Rvcnx8KGUuX0N0b3I9e30pO2lmKHJbbl0pcmV0dXJuIHJbbl07dmFyIGk9ZS5uYW1lfHx0Lm9wdGlvbnMubmFtZSxvPWZ1bmN0aW9uKGUpe3RoaXMuX2luaXQoZSl9O3JldHVybigoby5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0LnByb3RvdHlwZSkpLmNvbnN0cnVjdG9yPW8pLmNpZD1hKyssby5vcHRpb25zPU5lKHQub3B0aW9ucyxlKSxvLnN1cGVyPXQsby5vcHRpb25zLnByb3BzJiZmdW5jdGlvbihlKXt2YXIgdD1lLm9wdGlvbnMucHJvcHM7Zm9yKHZhciBuIGluIHQpRXQoZS5wcm90b3R5cGUsIl9wcm9wcyIsbil9KG8pLG8ub3B0aW9ucy5jb21wdXRlZCYmZnVuY3Rpb24oZSl7dmFyIHQ9ZS5vcHRpb25zLmNvbXB1dGVkO2Zvcih2YXIgbiBpbiB0KUx0KGUucHJvdG90eXBlLG4sdFtuXSl9KG8pLG8uZXh0ZW5kPXQuZXh0ZW5kLG8ubWl4aW49dC5taXhpbixvLnVzZT10LnVzZSxrLmZvckVhY2goZnVuY3Rpb24oZSl7b1tlXT10W2VdfSksaSYmKG8ub3B0aW9ucy5jb21wb25lbnRzW2ldPW8pLG8uc3VwZXJPcHRpb25zPXQub3B0aW9ucyxvLmV4dGVuZE9wdGlvbnM9ZSxvLnNlYWxlZE9wdGlvbnM9bSh7fSxvLm9wdGlvbnMpLHJbbl09b319ZnVuY3Rpb24geW4oZSl7cmV0dXJuIGUmJihlLkN0b3Iub3B0aW9ucy5uYW1lfHxlLnRhZyl9ZnVuY3Rpb24gZ24oZSx0KXtyZXR1cm4gQXJyYXkuaXNBcnJheShlKT8tMTxlLmluZGV4T2YodCk6InN0cmluZyI9PXR5cGVvZiBlPy0xPGUuc3BsaXQoIiwiKS5pbmRleE9mKHQpOihuPWUsIltvYmplY3QgUmVnRXhwXSI9PT1yLmNhbGwobikmJmUudGVzdCh0KSk7dmFyIG59ZnVuY3Rpb24gX24oZSx0KXt2YXIgbj1lLmNhY2hlLHI9ZS5rZXlzLGk9ZS5fdm5vZGU7Zm9yKHZhciBvIGluIG4pe3ZhciBhPW5bb107aWYoYSl7dmFyIHM9eW4oYS5jb21wb25lbnRPcHRpb25zKTtzJiYhdChzKSYmYm4obixvLHIsaSl9fX1mdW5jdGlvbiBibihlLHQsbixyKXt2YXIgaT1lW3RdOyFpfHxyJiZpLnRhZz09PXIudGFnfHxpLmNvbXBvbmVudEluc3RhbmNlLiRkZXN0cm95KCksZVt0XT1udWxsLGYobix0KX1obi5wcm90b3R5cGUuX2luaXQ9ZnVuY3Rpb24oZSl7dmFyIHQsbixyLGksbz10aGlzO28uX3VpZD1wbisrLG8uX2lzVnVlPSEwLGUmJmUuX2lzQ29tcG9uZW50P2Z1bmN0aW9uKGUsdCl7dmFyIG49ZS4kb3B0aW9ucz1PYmplY3QuY3JlYXRlKGUuY29uc3RydWN0b3Iub3B0aW9ucykscj10Ll9wYXJlbnRWbm9kZTtuLnBhcmVudD10LnBhcmVudCxuLl9wYXJlbnRWbm9kZT1yLG4uX3BhcmVudEVsbT10Ll9wYXJlbnRFbG0sbi5fcmVmRWxtPXQuX3JlZkVsbTt2YXIgaT1yLmNvbXBvbmVudE9wdGlvbnM7bi5wcm9wc0RhdGE9aS5wcm9wc0RhdGEsbi5fcGFyZW50TGlzdGVuZXJzPWkubGlzdGVuZXJzLG4uX3JlbmRlckNoaWxkcmVuPWkuY2hpbGRyZW4sbi5fY29tcG9uZW50VGFnPWkudGFnLHQucmVuZGVyJiYobi5yZW5kZXI9dC5yZW5kZXIsbi5zdGF0aWNSZW5kZXJGbnM9dC5zdGF0aWNSZW5kZXJGbnMpfShvLGUpOm8uJG9wdGlvbnM9TmUoZG4oby5jb25zdHJ1Y3RvciksZXx8e30sbyksZnVuY3Rpb24oZSl7dmFyIHQ9ZS4kb3B0aW9ucyxuPXQucGFyZW50O2lmKG4mJiF0LmFic3RyYWN0KXtmb3IoO24uJG9wdGlvbnMuYWJzdHJhY3QmJm4uJHBhcmVudDspbj1uLiRwYXJlbnQ7bi4kY2hpbGRyZW4ucHVzaChlKX1lLiRwYXJlbnQ9bixlLiRyb290PW4/bi4kcm9vdDplLGUuJGNoaWxkcmVuPVtdLGUuJHJlZnM9e30sZS5fd2F0Y2hlcj1udWxsLGUuX2luYWN0aXZlPW51bGwsZS5fZGlyZWN0SW5hY3RpdmU9ITEsZS5faXNNb3VudGVkPSExLGUuX2lzRGVzdHJveWVkPSExLGUuX2lzQmVpbmdEZXN0cm95ZWQ9ITF9KChvLl9yZW5kZXJQcm94eT1vKS5fc2VsZj1vKSxmdW5jdGlvbihlKXtlLl9ldmVudHM9T2JqZWN0LmNyZWF0ZShudWxsKSxlLl9oYXNIb29rRXZlbnQ9ITE7dmFyIHQ9ZS4kb3B0aW9ucy5fcGFyZW50TGlzdGVuZXJzO3QmJnB0KGUsdCl9KG8pLGZ1bmN0aW9uKGkpe2kuX3Zub2RlPW51bGwsaS5fc3RhdGljVHJlZXM9bnVsbDt2YXIgZT1pLiRvcHRpb25zLHQ9aS4kdm5vZGU9ZS5fcGFyZW50Vm5vZGUsbj10JiZ0LmNvbnRleHQ7aS4kc2xvdHM9ZHQoZS5fcmVuZGVyQ2hpbGRyZW4sbiksaS4kc2NvcGVkU2xvdHM9eSxpLl9jPWZ1bmN0aW9uKGUsdCxuLHIpe3JldHVybiBybihpLGUsdCxuLHIsITEpfSxpLiRjcmVhdGVFbGVtZW50PWZ1bmN0aW9uKGUsdCxuLHIpe3JldHVybiBybihpLGUsdCxuLHIsITApfTt2YXIgcj10JiZ0LmRhdGE7Q2UoaSwiJGF0dHJzIixyJiZyLmF0dHJzfHx5LG51bGwsITApLENlKGksIiRsaXN0ZW5lcnMiLGUuX3BhcmVudExpc3RlbmVyc3x8eSxudWxsLCEwKX0obyksX3QobywiYmVmb3JlQ3JlYXRlIiksKG49RHQoKHQ9bykuJG9wdGlvbnMuaW5qZWN0LHQpKSYmKGdlKCExKSxPYmplY3Qua2V5cyhuKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe0NlKHQsZSxuW2VdKX0pLGdlKCEwKSksanQobyksKGk9KHI9bykuJG9wdGlvbnMucHJvdmlkZSkmJihyLl9wcm92aWRlZD0iZnVuY3Rpb24iPT10eXBlb2YgaT9pLmNhbGwocik6aSksX3QobywiY3JlYXRlZCIpLG8uJG9wdGlvbnMuZWwmJm8uJG1vdW50KG8uJG9wdGlvbnMuZWwpfSxvbj1obixhbj17Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2RhdGF9fSxzbj17Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3Byb3BzfX0sT2JqZWN0LmRlZmluZVByb3BlcnR5KG9uLnByb3RvdHlwZSwiJGRhdGEiLGFuKSxPYmplY3QuZGVmaW5lUHJvcGVydHkob24ucHJvdG90eXBlLCIkcHJvcHMiLHNuKSxvbi5wcm90b3R5cGUuJHNldD14ZSxvbi5wcm90b3R5cGUuJGRlbGV0ZT1rZSxvbi5wcm90b3R5cGUuJHdhdGNoPWZ1bmN0aW9uKGUsdCxuKXtpZihsKHQpKXJldHVybiBNdCh0aGlzLGUsdCxuKTsobj1ufHx7fSkudXNlcj0hMDt2YXIgcj1uZXcgU3QodGhpcyxlLHQsbik7cmV0dXJuIG4uaW1tZWRpYXRlJiZ0LmNhbGwodGhpcyxyLnZhbHVlKSxmdW5jdGlvbigpe3IudGVhcmRvd24oKX19LGxuPS9eaG9vazovLChjbj1obikucHJvdG90eXBlLiRvbj1mdW5jdGlvbihlLHQpe2lmKEFycmF5LmlzQXJyYXkoZSkpZm9yKHZhciBuPTAscj1lLmxlbmd0aDtuPHI7bisrKXRoaXMuJG9uKGVbbl0sdCk7ZWxzZSh0aGlzLl9ldmVudHNbZV18fCh0aGlzLl9ldmVudHNbZV09W10pKS5wdXNoKHQpLGxuLnRlc3QoZSkmJih0aGlzLl9oYXNIb29rRXZlbnQ9ITApO3JldHVybiB0aGlzfSxjbi5wcm90b3R5cGUuJG9uY2U9ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzO2Z1bmN0aW9uIHIoKXtuLiRvZmYoZSxyKSx0LmFwcGx5KG4sYXJndW1lbnRzKX1yZXR1cm4gci5mbj10LG4uJG9uKGUsciksbn0sY24ucHJvdG90eXBlLiRvZmY9ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzO2lmKCFhcmd1bWVudHMubGVuZ3RoKXJldHVybiBuLl9ldmVudHM9T2JqZWN0LmNyZWF0ZShudWxsKSxuO2lmKEFycmF5LmlzQXJyYXkoZSkpe2Zvcih2YXIgcj0wLGk9ZS5sZW5ndGg7cjxpO3IrKyl0aGlzLiRvZmYoZVtyXSx0KTtyZXR1cm4gbn12YXIgbz1uLl9ldmVudHNbZV07aWYoIW8pcmV0dXJuIG47aWYoIXQpcmV0dXJuIG4uX2V2ZW50c1tlXT1udWxsLG47aWYodClmb3IodmFyIGEscz1vLmxlbmd0aDtzLS07KWlmKChhPW9bc10pPT09dHx8YS5mbj09PXQpe28uc3BsaWNlKHMsMSk7YnJlYWt9cmV0dXJuIG59LGNuLnByb3RvdHlwZS4kZW1pdD1mdW5jdGlvbih0KXt2YXIgbj10aGlzLGU9bi5fZXZlbnRzW3RdO2lmKGUpe2U9MTxlLmxlbmd0aD9oKGUpOmU7Zm9yKHZhciByPWgoYXJndW1lbnRzLDEpLGk9MCxvPWUubGVuZ3RoO2k8bztpKyspdHJ5e2VbaV0uYXBwbHkobixyKX1jYXRjaChlKXtGZShlLG4sJ2V2ZW50IGhhbmRsZXIgZm9yICInK3QrJyInKX19cmV0dXJuIG59LCh1bj1obikucHJvdG90eXBlLl91cGRhdGU9ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzO24uX2lzTW91bnRlZCYmX3QobiwiYmVmb3JlVXBkYXRlIik7dmFyIHI9bi4kZWwsaT1uLl92bm9kZSxvPW10OyhtdD1uKS5fdm5vZGU9ZSxpP24uJGVsPW4uX19wYXRjaF9fKGksZSk6KG4uJGVsPW4uX19wYXRjaF9fKG4uJGVsLGUsdCwhMSxuLiRvcHRpb25zLl9wYXJlbnRFbG0sbi4kb3B0aW9ucy5fcmVmRWxtKSxuLiRvcHRpb25zLl9wYXJlbnRFbG09bi4kb3B0aW9ucy5fcmVmRWxtPW51bGwpLG10PW8sciYmKHIuX192dWVfXz1udWxsKSxuLiRlbCYmKG4uJGVsLl9fdnVlX189biksbi4kdm5vZGUmJm4uJHBhcmVudCYmbi4kdm5vZGU9PT1uLiRwYXJlbnQuX3Zub2RlJiYobi4kcGFyZW50LiRlbD1uLiRlbCl9LHVuLnByb3RvdHlwZS4kZm9yY2VVcGRhdGU9ZnVuY3Rpb24oKXt0aGlzLl93YXRjaGVyJiZ0aGlzLl93YXRjaGVyLnVwZGF0ZSgpfSx1bi5wcm90b3R5cGUuJGRlc3Ryb3k9ZnVuY3Rpb24oKXt2YXIgZT10aGlzO2lmKCFlLl9pc0JlaW5nRGVzdHJveWVkKXtfdChlLCJiZWZvcmVEZXN0cm95IiksZS5faXNCZWluZ0Rlc3Ryb3llZD0hMDt2YXIgdD1lLiRwYXJlbnQ7IXR8fHQuX2lzQmVpbmdEZXN0cm95ZWR8fGUuJG9wdGlvbnMuYWJzdHJhY3R8fGYodC4kY2hpbGRyZW4sZSksZS5fd2F0Y2hlciYmZS5fd2F0Y2hlci50ZWFyZG93bigpO2Zvcih2YXIgbj1lLl93YXRjaGVycy5sZW5ndGg7bi0tOyllLl93YXRjaGVyc1tuXS50ZWFyZG93bigpO2UuX2RhdGEuX19vYl9fJiZlLl9kYXRhLl9fb2JfXy52bUNvdW50LS0sZS5faXNEZXN0cm95ZWQ9ITAsZS5fX3BhdGNoX18oZS5fdm5vZGUsbnVsbCksX3QoZSwiZGVzdHJveWVkIiksZS4kb2ZmKCksZS4kZWwmJihlLiRlbC5fX3Z1ZV9fPW51bGwpLGUuJHZub2RlJiYoZS4kdm5vZGUucGFyZW50PW51bGwpfX0sV3QoKGZuPWhuKS5wcm90b3R5cGUpLGZuLnByb3RvdHlwZS4kbmV4dFRpY2s9ZnVuY3Rpb24oZSl7cmV0dXJuIFplKGUsdGhpcyl9LGZuLnByb3RvdHlwZS5fcmVuZGVyPWZ1bmN0aW9uKCl7dmFyIHQsbj10aGlzLGU9bi4kb3B0aW9ucyxyPWUucmVuZGVyLGk9ZS5fcGFyZW50Vm5vZGU7aSYmKG4uJHNjb3BlZFNsb3RzPWkuZGF0YS5zY29wZWRTbG90c3x8eSksbi4kdm5vZGU9aTt0cnl7dD1yLmNhbGwobi5fcmVuZGVyUHJveHksbi4kY3JlYXRlRWxlbWVudCl9Y2F0Y2goZSl7RmUoZSxuLCJyZW5kZXIiKSx0PW4uX3Zub2RlfXJldHVybiB0IGluc3RhbmNlb2YgbGV8fCh0PWZlKCkpLHQucGFyZW50PWksdH07dmFyICRuLHduLENuLHhuPVtTdHJpbmcsUmVnRXhwLEFycmF5XSxrbj17S2VlcEFsaXZlOntuYW1lOiJrZWVwLWFsaXZlIixhYnN0cmFjdDohMCxwcm9wczp7aW5jbHVkZTp4bixleGNsdWRlOnhuLG1heDpbU3RyaW5nLE51bWJlcl19LGNyZWF0ZWQ6ZnVuY3Rpb24oKXt0aGlzLmNhY2hlPU9iamVjdC5jcmVhdGUobnVsbCksdGhpcy5rZXlzPVtdfSxkZXN0cm95ZWQ6ZnVuY3Rpb24oKXtmb3IodmFyIGUgaW4gdGhpcy5jYWNoZSlibih0aGlzLmNhY2hlLGUsdGhpcy5rZXlzKX0sbW91bnRlZDpmdW5jdGlvbigpe3ZhciBlPXRoaXM7dGhpcy4kd2F0Y2goImluY2x1ZGUiLGZ1bmN0aW9uKHQpe19uKGUsZnVuY3Rpb24oZSl7cmV0dXJuIGduKHQsZSl9KX0pLHRoaXMuJHdhdGNoKCJleGNsdWRlIixmdW5jdGlvbih0KXtfbihlLGZ1bmN0aW9uKGUpe3JldHVybiFnbih0LGUpfSl9KX0scmVuZGVyOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy4kc2xvdHMuZGVmYXVsdCx0PWx0KGUpLG49dCYmdC5jb21wb25lbnRPcHRpb25zO2lmKG4pe3ZhciByPXluKG4pLGk9dGhpcy5pbmNsdWRlLG89dGhpcy5leGNsdWRlO2lmKGkmJighcnx8IWduKGkscikpfHxvJiZyJiZnbihvLHIpKXJldHVybiB0O3ZhciBhPXRoaXMuY2FjaGUscz10aGlzLmtleXMsYz1udWxsPT10LmtleT9uLkN0b3IuY2lkKyhuLnRhZz8iOjoiK24udGFnOiIiKTp0LmtleTthW2NdPyh0LmNvbXBvbmVudEluc3RhbmNlPWFbY10uY29tcG9uZW50SW5zdGFuY2UsZihzLGMpLHMucHVzaChjKSk6KGFbY109dCxzLnB1c2goYyksdGhpcy5tYXgmJnMubGVuZ3RoPnBhcnNlSW50KHRoaXMubWF4KSYmYm4oYSxzWzBdLHMsdGhpcy5fdm5vZGUpKSx0LmRhdGEua2VlcEFsaXZlPSEwfXJldHVybiB0fHxlJiZlWzBdfX19OyRuPWhuLENuPXtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gan19LE9iamVjdC5kZWZpbmVQcm9wZXJ0eSgkbiwiY29uZmlnIixDbiksJG4udXRpbD17d2FybjpyZSxleHRlbmQ6bSxtZXJnZU9wdGlvbnM6TmUsZGVmaW5lUmVhY3RpdmU6Q2V9LCRuLnNldD14ZSwkbi5kZWxldGU9a2UsJG4ubmV4dFRpY2s9WmUsJG4ub3B0aW9ucz1PYmplY3QuY3JlYXRlKG51bGwpLGsuZm9yRWFjaChmdW5jdGlvbihlKXskbi5vcHRpb25zW2UrInMiXT1PYmplY3QuY3JlYXRlKG51bGwpfSksbSgoJG4ub3B0aW9ucy5fYmFzZT0kbikub3B0aW9ucy5jb21wb25lbnRzLGtuKSwkbi51c2U9ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5faW5zdGFsbGVkUGx1Z2luc3x8KHRoaXMuX2luc3RhbGxlZFBsdWdpbnM9W10pO2lmKC0xPHQuaW5kZXhPZihlKSlyZXR1cm4gdGhpczt2YXIgbj1oKGFyZ3VtZW50cywxKTtyZXR1cm4gbi51bnNoaWZ0KHRoaXMpLCJmdW5jdGlvbiI9PXR5cGVvZiBlLmluc3RhbGw/ZS5pbnN0YWxsLmFwcGx5KGUsbik6ImZ1bmN0aW9uIj09dHlwZW9mIGUmJmUuYXBwbHkobnVsbCxuKSx0LnB1c2goZSksdGhpc30sJG4ubWl4aW49ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMub3B0aW9ucz1OZSh0aGlzLm9wdGlvbnMsZSksdGhpc30sbW4oJG4pLHduPSRuLGsuZm9yRWFjaChmdW5jdGlvbihuKXt3bltuXT1mdW5jdGlvbihlLHQpe3JldHVybiB0PygiY29tcG9uZW50Ij09PW4mJmwodCkmJih0Lm5hbWU9dC5uYW1lfHxlLHQ9dGhpcy5vcHRpb25zLl9iYXNlLmV4dGVuZCh0KSksImRpcmVjdGl2ZSI9PT1uJiYiZnVuY3Rpb24iPT10eXBlb2YgdCYmKHQ9e2JpbmQ6dCx1cGRhdGU6dH0pLHRoaXMub3B0aW9uc1tuKyJzIl1bZV09dCk6dGhpcy5vcHRpb25zW24rInMiXVtlXX19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoaG4ucHJvdG90eXBlLCIkaXNTZXJ2ZXIiLHtnZXQ6WX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShobi5wcm90b3R5cGUsIiRzc3JDb250ZXh0Iix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJHZub2RlJiZ0aGlzLiR2bm9kZS5zc3JDb250ZXh0fX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShobiwiRnVuY3Rpb25hbFJlbmRlckNvbnRleHQiLHt2YWx1ZTpHdH0pLGhuLnZlcnNpb249IjIuNS4xNyI7dmFyIEFuPXMoInN0eWxlLGNsYXNzIiksT249cygiaW5wdXQsdGV4dGFyZWEsb3B0aW9uLHNlbGVjdCxwcm9ncmVzcyIpLFNuPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4idmFsdWUiPT09biYmT24oZSkmJiJidXR0b24iIT09dHx8InNlbGVjdGVkIj09PW4mJiJvcHRpb24iPT09ZXx8ImNoZWNrZWQiPT09biYmImlucHV0Ij09PWV8fCJtdXRlZCI9PT1uJiYidmlkZW8iPT09ZX0sVG49cygiY29udGVudGVkaXRhYmxlLGRyYWdnYWJsZSxzcGVsbGNoZWNrIiksRW49cygiYWxsb3dmdWxsc2NyZWVuLGFzeW5jLGF1dG9mb2N1cyxhdXRvcGxheSxjaGVja2VkLGNvbXBhY3QsY29udHJvbHMsZGVjbGFyZSxkZWZhdWx0LGRlZmF1bHRjaGVja2VkLGRlZmF1bHRtdXRlZCxkZWZhdWx0c2VsZWN0ZWQsZGVmZXIsZGlzYWJsZWQsZW5hYmxlZCxmb3Jtbm92YWxpZGF0ZSxoaWRkZW4saW5kZXRlcm1pbmF0ZSxpbmVydCxpc21hcCxpdGVtc2NvcGUsbG9vcCxtdWx0aXBsZSxtdXRlZCxub2hyZWYsbm9yZXNpemUsbm9zaGFkZSxub3ZhbGlkYXRlLG5vd3JhcCxvcGVuLHBhdXNlb25leGl0LHJlYWRvbmx5LHJlcXVpcmVkLHJldmVyc2VkLHNjb3BlZCxzZWFtbGVzcyxzZWxlY3RlZCxzb3J0YWJsZSx0cmFuc2xhdGUsdHJ1ZXNwZWVkLHR5cGVtdXN0bWF0Y2gsdmlzaWJsZSIpLGpuPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIixObj1mdW5jdGlvbihlKXtyZXR1cm4iOiI9PT1lLmNoYXJBdCg1KSYmInhsaW5rIj09PWUuc2xpY2UoMCw1KX0sTG49ZnVuY3Rpb24oZSl7cmV0dXJuIE5uKGUpP2Uuc2xpY2UoNixlLmxlbmd0aCk6IiJ9LEluPWZ1bmN0aW9uKGUpe3JldHVybiBudWxsPT1lfHwhMT09PWV9O2Z1bmN0aW9uIE1uKGUpe2Zvcih2YXIgdD1lLmRhdGEsbj1lLHI9ZTtEKHIuY29tcG9uZW50SW5zdGFuY2UpOykocj1yLmNvbXBvbmVudEluc3RhbmNlLl92bm9kZSkmJnIuZGF0YSYmKHQ9RG4oci5kYXRhLHQpKTtmb3IoO0Qobj1uLnBhcmVudCk7KW4mJm4uZGF0YSYmKHQ9RG4odCxuLmRhdGEpKTtyZXR1cm4gZnVuY3Rpb24oZSx0KXtpZihEKGUpfHxEKHQpKXJldHVybiBQbihlLEZuKHQpKTtyZXR1cm4iIn0odC5zdGF0aWNDbGFzcyx0LmNsYXNzKX1mdW5jdGlvbiBEbihlLHQpe3JldHVybntzdGF0aWNDbGFzczpQbihlLnN0YXRpY0NsYXNzLHQuc3RhdGljQ2xhc3MpLGNsYXNzOkQoZS5jbGFzcyk/W2UuY2xhc3MsdC5jbGFzc106dC5jbGFzc319ZnVuY3Rpb24gUG4oZSx0KXtyZXR1cm4gZT90P2UrIiAiK3Q6ZTp0fHwiIn1mdW5jdGlvbiBGbihlKXtyZXR1cm4gQXJyYXkuaXNBcnJheShlKT9mdW5jdGlvbihlKXtmb3IodmFyIHQsbj0iIixyPTAsaT1lLmxlbmd0aDtyPGk7cisrKUQodD1GbihlW3JdKSkmJiIiIT09dCYmKG4mJihuKz0iICIpLG4rPXQpO3JldHVybiBufShlKTpQKGUpP2Z1bmN0aW9uKGUpe3ZhciB0PSIiO2Zvcih2YXIgbiBpbiBlKWVbbl0mJih0JiYodCs9IiAiKSx0Kz1uKTtyZXR1cm4gdH0oZSk6InN0cmluZyI9PXR5cGVvZiBlP2U6IiJ9dmFyIFJuPXtzdmc6Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIixtYXRoOiJodHRwOi8vd3d3LnczLm9yZy8xOTk4L01hdGgvTWF0aE1MIn0sSG49cygiaHRtbCxib2R5LGJhc2UsaGVhZCxsaW5rLG1ldGEsc3R5bGUsdGl0bGUsYWRkcmVzcyxhcnRpY2xlLGFzaWRlLGZvb3RlcixoZWFkZXIsaDEsaDIsaDMsaDQsaDUsaDYsaGdyb3VwLG5hdixzZWN0aW9uLGRpdixkZCxkbCxkdCxmaWdjYXB0aW9uLGZpZ3VyZSxwaWN0dXJlLGhyLGltZyxsaSxtYWluLG9sLHAscHJlLHVsLGEsYixhYmJyLGJkaSxiZG8sYnIsY2l0ZSxjb2RlLGRhdGEsZGZuLGVtLGksa2JkLG1hcmsscSxycCxydCxydGMscnVieSxzLHNhbXAsc21hbGwsc3BhbixzdHJvbmcsc3ViLHN1cCx0aW1lLHUsdmFyLHdicixhcmVhLGF1ZGlvLG1hcCx0cmFjayx2aWRlbyxlbWJlZCxvYmplY3QscGFyYW0sc291cmNlLGNhbnZhcyxzY3JpcHQsbm9zY3JpcHQsZGVsLGlucyxjYXB0aW9uLGNvbCxjb2xncm91cCx0YWJsZSx0aGVhZCx0Ym9keSx0ZCx0aCx0cixidXR0b24sZGF0YWxpc3QsZmllbGRzZXQsZm9ybSxpbnB1dCxsYWJlbCxsZWdlbmQsbWV0ZXIsb3B0Z3JvdXAsb3B0aW9uLG91dHB1dCxwcm9ncmVzcyxzZWxlY3QsdGV4dGFyZWEsZGV0YWlscyxkaWFsb2csbWVudSxtZW51aXRlbSxzdW1tYXJ5LGNvbnRlbnQsZWxlbWVudCxzaGFkb3csdGVtcGxhdGUsYmxvY2txdW90ZSxpZnJhbWUsdGZvb3QiKSxCbj1zKCJzdmcsYW5pbWF0ZSxjaXJjbGUsY2xpcHBhdGgsY3Vyc29yLGRlZnMsZGVzYyxlbGxpcHNlLGZpbHRlcixmb250LWZhY2UsZm9yZWlnbk9iamVjdCxnLGdseXBoLGltYWdlLGxpbmUsbWFya2VyLG1hc2ssbWlzc2luZy1nbHlwaCxwYXRoLHBhdHRlcm4scG9seWdvbixwb2x5bGluZSxyZWN0LHN3aXRjaCxzeW1ib2wsdGV4dCx0ZXh0cGF0aCx0c3Bhbix1c2UsdmlldyIsITApLFVuPWZ1bmN0aW9uKGUpe3JldHVybiBIbihlKXx8Qm4oZSl9O2Z1bmN0aW9uIFZuKGUpe3JldHVybiBCbihlKT8ic3ZnIjoibWF0aCI9PT1lPyJtYXRoIjp2b2lkIDB9dmFyIHpuPU9iamVjdC5jcmVhdGUobnVsbCk7dmFyIEtuPXMoInRleHQsbnVtYmVyLHBhc3N3b3JkLHNlYXJjaCxlbWFpbCx0ZWwsdXJsIik7ZnVuY3Rpb24gSm4oZSl7aWYoInN0cmluZyI9PXR5cGVvZiBlKXt2YXIgdD1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKGUpO3JldHVybiB0fHxkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKX1yZXR1cm4gZX12YXIgcW49T2JqZWN0LmZyZWV6ZSh7Y3JlYXRlRWxlbWVudDpmdW5jdGlvbihlLHQpe3ZhciBuPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoZSk7cmV0dXJuInNlbGVjdCIhPT1lfHx0LmRhdGEmJnQuZGF0YS5hdHRycyYmdm9pZCAwIT09dC5kYXRhLmF0dHJzLm11bHRpcGxlJiZuLnNldEF0dHJpYnV0ZSgibXVsdGlwbGUiLCJtdWx0aXBsZSIpLG59LGNyZWF0ZUVsZW1lbnROUzpmdW5jdGlvbihlLHQpe3JldHVybiBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoUm5bZV0sdCl9LGNyZWF0ZVRleHROb2RlOmZ1bmN0aW9uKGUpe3JldHVybiBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShlKX0sY3JlYXRlQ29tbWVudDpmdW5jdGlvbihlKXtyZXR1cm4gZG9jdW1lbnQuY3JlYXRlQ29tbWVudChlKX0saW5zZXJ0QmVmb3JlOmZ1bmN0aW9uKGUsdCxuKXtlLmluc2VydEJlZm9yZSh0LG4pfSxyZW1vdmVDaGlsZDpmdW5jdGlvbihlLHQpe2UucmVtb3ZlQ2hpbGQodCl9LGFwcGVuZENoaWxkOmZ1bmN0aW9uKGUsdCl7ZS5hcHBlbmRDaGlsZCh0KX0scGFyZW50Tm9kZTpmdW5jdGlvbihlKXtyZXR1cm4gZS5wYXJlbnROb2RlfSxuZXh0U2libGluZzpmdW5jdGlvbihlKXtyZXR1cm4gZS5uZXh0U2libGluZ30sdGFnTmFtZTpmdW5jdGlvbihlKXtyZXR1cm4gZS50YWdOYW1lfSxzZXRUZXh0Q29udGVudDpmdW5jdGlvbihlLHQpe2UudGV4dENvbnRlbnQ9dH0sc2V0U3R5bGVTY29wZTpmdW5jdGlvbihlLHQpe2Uuc2V0QXR0cmlidXRlKHQsIiIpfX0pLFduPXtjcmVhdGU6ZnVuY3Rpb24oZSx0KXtHbih0KX0sdXBkYXRlOmZ1bmN0aW9uKGUsdCl7ZS5kYXRhLnJlZiE9PXQuZGF0YS5yZWYmJihHbihlLCEwKSxHbih0KSl9LGRlc3Ryb3k6ZnVuY3Rpb24oZSl7R24oZSwhMCl9fTtmdW5jdGlvbiBHbihlLHQpe3ZhciBuPWUuZGF0YS5yZWY7aWYoRChuKSl7dmFyIHI9ZS5jb250ZXh0LGk9ZS5jb21wb25lbnRJbnN0YW5jZXx8ZS5lbG0sbz1yLiRyZWZzO3Q/QXJyYXkuaXNBcnJheShvW25dKT9mKG9bbl0saSk6b1tuXT09PWkmJihvW25dPXZvaWQgMCk6ZS5kYXRhLnJlZkluRm9yP0FycmF5LmlzQXJyYXkob1tuXSk/b1tuXS5pbmRleE9mKGkpPDAmJm9bbl0ucHVzaChpKTpvW25dPVtpXTpvW25dPWl9fXZhciBabj1uZXcgbGUoIiIse30sW10pLFhuPVsiY3JlYXRlIiwiYWN0aXZhdGUiLCJ1cGRhdGUiLCJyZW1vdmUiLCJkZXN0cm95Il07ZnVuY3Rpb24gWW4oZSx0KXtyZXR1cm4gZS5rZXk9PT10LmtleSYmKGUudGFnPT09dC50YWcmJmUuaXNDb21tZW50PT09dC5pc0NvbW1lbnQmJkQoZS5kYXRhKT09PUQodC5kYXRhKSYmZnVuY3Rpb24oZSx0KXtpZigiaW5wdXQiIT09ZS50YWcpcmV0dXJuITA7dmFyIG4scj1EKG49ZS5kYXRhKSYmRChuPW4uYXR0cnMpJiZuLnR5cGUsaT1EKG49dC5kYXRhKSYmRChuPW4uYXR0cnMpJiZuLnR5cGU7cmV0dXJuIHI9PT1pfHxLbihyKSYmS24oaSl9KGUsdCl8fFMoZS5pc0FzeW5jUGxhY2Vob2xkZXIpJiZlLmFzeW5jRmFjdG9yeT09PXQuYXN5bmNGYWN0b3J5JiZNKHQuYXN5bmNGYWN0b3J5LmVycm9yKSl9ZnVuY3Rpb24gUW4oZSx0LG4pe3ZhciByLGksbz17fTtmb3Iocj10O3I8PW47KytyKUQoaT1lW3JdLmtleSkmJihvW2ldPXIpO3JldHVybiBvfXZhciBlcj17Y3JlYXRlOnRyLHVwZGF0ZTp0cixkZXN0cm95OmZ1bmN0aW9uKGUpe3RyKGUsWm4pfX07ZnVuY3Rpb24gdHIoZSx0KXsoZS5kYXRhLmRpcmVjdGl2ZXN8fHQuZGF0YS5kaXJlY3RpdmVzKSYmZnVuY3Rpb24odCxuKXt2YXIgZSxyLGksbz10PT09Wm4sYT1uPT09Wm4scz1ycih0LmRhdGEuZGlyZWN0aXZlcyx0LmNvbnRleHQpLGM9cnIobi5kYXRhLmRpcmVjdGl2ZXMsbi5jb250ZXh0KSxsPVtdLHU9W107Zm9yKGUgaW4gYylyPXNbZV0saT1jW2VdLHI/KGkub2xkVmFsdWU9ci52YWx1ZSxpcihpLCJ1cGRhdGUiLG4sdCksaS5kZWYmJmkuZGVmLmNvbXBvbmVudFVwZGF0ZWQmJnUucHVzaChpKSk6KGlyKGksImJpbmQiLG4sdCksaS5kZWYmJmkuZGVmLmluc2VydGVkJiZsLnB1c2goaSkpO2lmKGwubGVuZ3RoKXt2YXIgZj1mdW5jdGlvbigpe2Zvcih2YXIgZT0wO2U8bC5sZW5ndGg7ZSsrKWlyKGxbZV0sImluc2VydGVkIixuLHQpfTtvP3J0KG4sImluc2VydCIsZik6ZigpfXUubGVuZ3RoJiZydChuLCJwb3N0cGF0Y2giLGZ1bmN0aW9uKCl7Zm9yKHZhciBlPTA7ZTx1Lmxlbmd0aDtlKyspaXIodVtlXSwiY29tcG9uZW50VXBkYXRlZCIsbix0KX0pO2lmKCFvKWZvcihlIGluIHMpY1tlXXx8aXIoc1tlXSwidW5iaW5kIix0LHQsYSl9KGUsdCl9dmFyIG5yPU9iamVjdC5jcmVhdGUobnVsbCk7ZnVuY3Rpb24gcnIoZSx0KXt2YXIgbixyLGksbz1PYmplY3QuY3JlYXRlKG51bGwpO2lmKCFlKXJldHVybiBvO2ZvcihuPTA7bjxlLmxlbmd0aDtuKyspKHI9ZVtuXSkubW9kaWZpZXJzfHwoci5tb2RpZmllcnM9bnIpLChvWyhpPXIsaS5yYXdOYW1lfHxpLm5hbWUrIi4iK09iamVjdC5rZXlzKGkubW9kaWZpZXJzfHx7fSkuam9pbigiLiIpKV09cikuZGVmPUxlKHQuJG9wdGlvbnMsImRpcmVjdGl2ZXMiLHIubmFtZSk7cmV0dXJuIG99ZnVuY3Rpb24gaXIodCxuLHIsZSxpKXt2YXIgbz10LmRlZiYmdC5kZWZbbl07aWYobyl0cnl7byhyLmVsbSx0LHIsZSxpKX1jYXRjaChlKXtGZShlLHIuY29udGV4dCwiZGlyZWN0aXZlICIrdC5uYW1lKyIgIituKyIgaG9vayIpfX12YXIgb3I9W1duLGVyXTtmdW5jdGlvbiBhcihlLHQpe3ZhciBuPXQuY29tcG9uZW50T3B0aW9ucztpZighKEQobikmJiExPT09bi5DdG9yLm9wdGlvbnMuaW5oZXJpdEF0dHJzfHxNKGUuZGF0YS5hdHRycykmJk0odC5kYXRhLmF0dHJzKSkpe3ZhciByLGksbz10LmVsbSxhPWUuZGF0YS5hdHRyc3x8e30scz10LmRhdGEuYXR0cnN8fHt9O2ZvcihyIGluIEQocy5fX29iX18pJiYocz10LmRhdGEuYXR0cnM9bSh7fSxzKSkscylpPXNbcl0sYVtyXSE9PWkmJnNyKG8scixpKTtmb3IociBpbihLfHxxKSYmcy52YWx1ZSE9PWEudmFsdWUmJnNyKG8sInZhbHVlIixzLnZhbHVlKSxhKU0oc1tyXSkmJihObihyKT9vLnJlbW92ZUF0dHJpYnV0ZU5TKGpuLExuKHIpKTpUbihyKXx8by5yZW1vdmVBdHRyaWJ1dGUocikpfX1mdW5jdGlvbiBzcihlLHQsbil7LTE8ZS50YWdOYW1lLmluZGV4T2YoIi0iKT9jcihlLHQsbik6RW4odCk/SW4obik/ZS5yZW1vdmVBdHRyaWJ1dGUodCk6KG49ImFsbG93ZnVsbHNjcmVlbiI9PT10JiYiRU1CRUQiPT09ZS50YWdOYW1lPyJ0cnVlIjp0LGUuc2V0QXR0cmlidXRlKHQsbikpOlRuKHQpP2Uuc2V0QXR0cmlidXRlKHQsSW4obil8fCJmYWxzZSI9PT1uPyJmYWxzZSI6InRydWUiKTpObih0KT9JbihuKT9lLnJlbW92ZUF0dHJpYnV0ZU5TKGpuLExuKHQpKTplLnNldEF0dHJpYnV0ZU5TKGpuLHQsbik6Y3IoZSx0LG4pfWZ1bmN0aW9uIGNyKHQsZSxuKXtpZihJbihuKSl0LnJlbW92ZUF0dHJpYnV0ZShlKTtlbHNle2lmKEsmJiFKJiYiVEVYVEFSRUEiPT09dC50YWdOYW1lJiYicGxhY2Vob2xkZXIiPT09ZSYmIXQuX19pZXBoKXt2YXIgcj1mdW5jdGlvbihlKXtlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpLHQucmVtb3ZlRXZlbnRMaXN0ZW5lcigiaW5wdXQiLHIpfTt0LmFkZEV2ZW50TGlzdGVuZXIoImlucHV0IixyKSx0Ll9faWVwaD0hMH10LnNldEF0dHJpYnV0ZShlLG4pfX12YXIgbHI9e2NyZWF0ZTphcix1cGRhdGU6YXJ9O2Z1bmN0aW9uIHVyKGUsdCl7dmFyIG49dC5lbG0scj10LmRhdGEsaT1lLmRhdGE7aWYoIShNKHIuc3RhdGljQ2xhc3MpJiZNKHIuY2xhc3MpJiYoTShpKXx8TShpLnN0YXRpY0NsYXNzKSYmTShpLmNsYXNzKSkpKXt2YXIgbz1Nbih0KSxhPW4uX3RyYW5zaXRpb25DbGFzc2VzO0QoYSkmJihvPVBuKG8sRm4oYSkpKSxvIT09bi5fcHJldkNsYXNzJiYobi5zZXRBdHRyaWJ1dGUoImNsYXNzIixvKSxuLl9wcmV2Q2xhc3M9byl9fXZhciBmcixwcixkcix2cixocixtcix5cj17Y3JlYXRlOnVyLHVwZGF0ZTp1cn0sZ3I9L1tcdykuK1wtXyRcXV0vO2Z1bmN0aW9uIF9yKGUpe3ZhciB0LG4scixpLG8sYT0hMSxzPSExLGM9ITEsbD0hMSx1PTAsZj0wLHA9MCxkPTA7Zm9yKHI9MDtyPGUubGVuZ3RoO3IrKylpZihuPXQsdD1lLmNoYXJDb2RlQXQociksYSkzOT09PXQmJjkyIT09biYmKGE9ITEpO2Vsc2UgaWYocykzND09PXQmJjkyIT09biYmKHM9ITEpO2Vsc2UgaWYoYyk5Nj09PXQmJjkyIT09biYmKGM9ITEpO2Vsc2UgaWYobCk0Nz09PXQmJjkyIT09biYmKGw9ITEpO2Vsc2UgaWYoMTI0IT09dHx8MTI0PT09ZS5jaGFyQ29kZUF0KHIrMSl8fDEyND09PWUuY2hhckNvZGVBdChyLTEpfHx1fHxmfHxwKXtzd2l0Y2godCl7Y2FzZSAzNDpzPSEwO2JyZWFrO2Nhc2UgMzk6YT0hMDticmVhaztjYXNlIDk2OmM9ITA7YnJlYWs7Y2FzZSA0MDpwKys7YnJlYWs7Y2FzZSA0MTpwLS07YnJlYWs7Y2FzZSA5MTpmKys7YnJlYWs7Y2FzZSA5MzpmLS07YnJlYWs7Y2FzZSAxMjM6dSsrO2JyZWFrO2Nhc2UgMTI1OnUtLX1pZig0Nz09PXQpe2Zvcih2YXIgdj1yLTEsaD12b2lkIDA7MDw9diYmIiAiPT09KGg9ZS5jaGFyQXQodikpO3YtLSk7aCYmZ3IudGVzdChoKXx8KGw9ITApfX1lbHNlIHZvaWQgMD09PWk/KGQ9cisxLGk9ZS5zbGljZSgwLHIpLnRyaW0oKSk6bSgpO2Z1bmN0aW9uIG0oKXsob3x8KG89W10pKS5wdXNoKGUuc2xpY2UoZCxyKS50cmltKCkpLGQ9cisxfWlmKHZvaWQgMD09PWk/aT1lLnNsaWNlKDAscikudHJpbSgpOjAhPT1kJiZtKCksbylmb3Iocj0wO3I8by5sZW5ndGg7cisrKWk9YnIoaSxvW3JdKTtyZXR1cm4gaX1mdW5jdGlvbiBicihlLHQpe3ZhciBuPXQuaW5kZXhPZigiKCIpO2lmKG48MClyZXR1cm4nX2YoIicrdCsnIikoJytlKyIpIjt2YXIgcj10LnNsaWNlKDAsbiksaT10LnNsaWNlKG4rMSk7cmV0dXJuJ19mKCInK3IrJyIpKCcrZSsoIikiIT09aT8iLCIraTppKX1mdW5jdGlvbiAkcihlKXtjb25zb2xlLmVycm9yKCJbVnVlIGNvbXBpbGVyXTogIitlKX1mdW5jdGlvbiB3cihlLHQpe3JldHVybiBlP2UubWFwKGZ1bmN0aW9uKGUpe3JldHVybiBlW3RdfSkuZmlsdGVyKGZ1bmN0aW9uKGUpe3JldHVybiBlfSk6W119ZnVuY3Rpb24gQ3IoZSx0LG4peyhlLnByb3BzfHwoZS5wcm9wcz1bXSkpLnB1c2goe25hbWU6dCx2YWx1ZTpufSksZS5wbGFpbj0hMX1mdW5jdGlvbiB4cihlLHQsbil7KGUuYXR0cnN8fChlLmF0dHJzPVtdKSkucHVzaCh7bmFtZTp0LHZhbHVlOm59KSxlLnBsYWluPSExfWZ1bmN0aW9uIGtyKGUsdCxuKXtlLmF0dHJzTWFwW3RdPW4sZS5hdHRyc0xpc3QucHVzaCh7bmFtZTp0LHZhbHVlOm59KX1mdW5jdGlvbiBBcihlLHQsbixyLGksbyl7dmFyIGE7KHI9cnx8eSkuY2FwdHVyZSYmKGRlbGV0ZSByLmNhcHR1cmUsdD0iISIrdCksci5vbmNlJiYoZGVsZXRlIHIub25jZSx0PSJ+Iit0KSxyLnBhc3NpdmUmJihkZWxldGUgci5wYXNzaXZlLHQ9IiYiK3QpLCJjbGljayI9PT10JiYoci5yaWdodD8odD0iY29udGV4dG1lbnUiLGRlbGV0ZSByLnJpZ2h0KTpyLm1pZGRsZSYmKHQ9Im1vdXNldXAiKSksci5uYXRpdmU/KGRlbGV0ZSByLm5hdGl2ZSxhPWUubmF0aXZlRXZlbnRzfHwoZS5uYXRpdmVFdmVudHM9e30pKTphPWUuZXZlbnRzfHwoZS5ldmVudHM9e30pO3ZhciBzPXt2YWx1ZTpuLnRyaW0oKX07ciE9PXkmJihzLm1vZGlmaWVycz1yKTt2YXIgYz1hW3RdO0FycmF5LmlzQXJyYXkoYyk/aT9jLnVuc2hpZnQocyk6Yy5wdXNoKHMpOmFbdF09Yz9pP1tzLGNdOltjLHNdOnMsZS5wbGFpbj0hMX1mdW5jdGlvbiBPcihlLHQsbil7dmFyIHI9U3IoZSwiOiIrdCl8fFNyKGUsInYtYmluZDoiK3QpO2lmKG51bGwhPXIpcmV0dXJuIF9yKHIpO2lmKCExIT09bil7dmFyIGk9U3IoZSx0KTtpZihudWxsIT1pKXJldHVybiBKU09OLnN0cmluZ2lmeShpKX19ZnVuY3Rpb24gU3IoZSx0LG4pe3ZhciByO2lmKG51bGwhPShyPWUuYXR0cnNNYXBbdF0pKWZvcih2YXIgaT1lLmF0dHJzTGlzdCxvPTAsYT1pLmxlbmd0aDtvPGE7bysrKWlmKGlbb10ubmFtZT09PXQpe2kuc3BsaWNlKG8sMSk7YnJlYWt9cmV0dXJuIG4mJmRlbGV0ZSBlLmF0dHJzTWFwW3RdLHJ9ZnVuY3Rpb24gVHIoZSx0LG4pe3ZhciByPW58fHt9LGk9ci5udW1iZXIsbz0iJCR2IixhPW87ci50cmltJiYoYT0iKHR5cGVvZiAkJHYgPT09ICdzdHJpbmcnPyAkJHYudHJpbSgpOiAkJHYpIiksaSYmKGE9Il9uKCIrYSsiKSIpO3ZhciBzPUVyKHQsYSk7ZS5tb2RlbD17dmFsdWU6IigiK3QrIikiLGV4cHJlc3Npb246JyInK3QrJyInLGNhbGxiYWNrOiJmdW5jdGlvbiAoJCR2KSB7IitzKyJ9In19ZnVuY3Rpb24gRXIoZSx0KXt2YXIgbj1mdW5jdGlvbihlKXtpZihlPWUudHJpbSgpLGZyPWUubGVuZ3RoLGUuaW5kZXhPZigiWyIpPDB8fGUubGFzdEluZGV4T2YoIl0iKTxmci0xKXJldHVybi0xPCh2cj1lLmxhc3RJbmRleE9mKCIuIikpP3tleHA6ZS5zbGljZSgwLHZyKSxrZXk6JyInK2Uuc2xpY2UodnIrMSkrJyInfTp7ZXhwOmUsa2V5Om51bGx9O3ByPWUsdnI9aHI9bXI9MDtmb3IoOyFOcigpOylMcihkcj1qcigpKT9Ncihkcik6OTE9PT1kciYmSXIoZHIpO3JldHVybntleHA6ZS5zbGljZSgwLGhyKSxrZXk6ZS5zbGljZShocisxLG1yKX19KGUpO3JldHVybiBudWxsPT09bi5rZXk/ZSsiPSIrdDoiJHNldCgiK24uZXhwKyIsICIrbi5rZXkrIiwgIit0KyIpIn1mdW5jdGlvbiBqcigpe3JldHVybiBwci5jaGFyQ29kZUF0KCsrdnIpfWZ1bmN0aW9uIE5yKCl7cmV0dXJuIGZyPD12cn1mdW5jdGlvbiBMcihlKXtyZXR1cm4gMzQ9PT1lfHwzOT09PWV9ZnVuY3Rpb24gSXIoZSl7dmFyIHQ9MTtmb3IoaHI9dnI7IU5yKCk7KWlmKExyKGU9anIoKSkpTXIoZSk7ZWxzZSBpZig5MT09PWUmJnQrKyw5Mz09PWUmJnQtLSwwPT09dCl7bXI9dnI7YnJlYWt9fWZ1bmN0aW9uIE1yKGUpe2Zvcih2YXIgdD1lOyFOcigpJiYoZT1qcigpKSE9PXQ7KTt9dmFyIERyLFByPSJfX3IiLEZyPSJfX2MiO2Z1bmN0aW9uIFJyKGUsdCxuLHIsaSl7dmFyIG8sYSxzLGMsbDt0PShvPXQpLl93aXRoVGFza3x8KG8uX3dpdGhUYXNrPWZ1bmN0aW9uKCl7SmU9ITA7dmFyIGU9by5hcHBseShudWxsLGFyZ3VtZW50cyk7cmV0dXJuIEplPSExLGV9KSxuJiYoYT10LHM9ZSxjPXIsbD1Ecix0PWZ1bmN0aW9uIGUoKXtudWxsIT09YS5hcHBseShudWxsLGFyZ3VtZW50cykmJkhyKHMsZSxjLGwpfSksRHIuYWRkRXZlbnRMaXN0ZW5lcihlLHQsWj97Y2FwdHVyZTpyLHBhc3NpdmU6aX06cil9ZnVuY3Rpb24gSHIoZSx0LG4scil7KHJ8fERyKS5yZW1vdmVFdmVudExpc3RlbmVyKGUsdC5fd2l0aFRhc2t8fHQsbil9ZnVuY3Rpb24gQnIoZSx0KXtpZighTShlLmRhdGEub24pfHwhTSh0LmRhdGEub24pKXt2YXIgbj10LmRhdGEub258fHt9LHI9ZS5kYXRhLm9ufHx7fTtEcj10LmVsbSxmdW5jdGlvbihlKXtpZihEKGVbUHJdKSl7dmFyIHQ9Sz8iY2hhbmdlIjoiaW5wdXQiO2VbdF09W10uY29uY2F0KGVbUHJdLGVbdF18fFtdKSxkZWxldGUgZVtQcl19RChlW0ZyXSkmJihlLmNoYW5nZT1bXS5jb25jYXQoZVtGcl0sZS5jaGFuZ2V8fFtdKSxkZWxldGUgZVtGcl0pfShuKSxudChuLHIsUnIsSHIsdC5jb250ZXh0KSxEcj12b2lkIDB9fXZhciBVcj17Y3JlYXRlOkJyLHVwZGF0ZTpCcn07ZnVuY3Rpb24gVnIoZSx0KXtpZighTShlLmRhdGEuZG9tUHJvcHMpfHwhTSh0LmRhdGEuZG9tUHJvcHMpKXt2YXIgbixyLGksbyxhPXQuZWxtLHM9ZS5kYXRhLmRvbVByb3BzfHx7fSxjPXQuZGF0YS5kb21Qcm9wc3x8e307Zm9yKG4gaW4gRChjLl9fb2JfXykmJihjPXQuZGF0YS5kb21Qcm9wcz1tKHt9LGMpKSxzKU0oY1tuXSkmJihhW25dPSIiKTtmb3IobiBpbiBjKXtpZihyPWNbbl0sInRleHRDb250ZW50Ij09PW58fCJpbm5lckhUTUwiPT09bil7aWYodC5jaGlsZHJlbiYmKHQuY2hpbGRyZW4ubGVuZ3RoPTApLHI9PT1zW25dKWNvbnRpbnVlOzE9PT1hLmNoaWxkTm9kZXMubGVuZ3RoJiZhLnJlbW92ZUNoaWxkKGEuY2hpbGROb2Rlc1swXSl9aWYoInZhbHVlIj09PW4pe3ZhciBsPU0oYS5fdmFsdWU9cik/IiI6U3RyaW5nKHIpO289bCwoaT1hKS5jb21wb3Npbmd8fCJPUFRJT04iIT09aS50YWdOYW1lJiYhZnVuY3Rpb24oZSx0KXt2YXIgbj0hMDt0cnl7bj1kb2N1bWVudC5hY3RpdmVFbGVtZW50IT09ZX1jYXRjaChlKXt9cmV0dXJuIG4mJmUudmFsdWUhPT10fShpLG8pJiYhZnVuY3Rpb24oZSx0KXt2YXIgbj1lLnZhbHVlLHI9ZS5fdk1vZGlmaWVycztpZihEKHIpKXtpZihyLmxhenkpcmV0dXJuITE7aWYoci5udW1iZXIpcmV0dXJuIEYobikhPT1GKHQpO2lmKHIudHJpbSlyZXR1cm4gbi50cmltKCkhPT10LnRyaW0oKX1yZXR1cm4gbiE9PXR9KGksbyl8fChhLnZhbHVlPWwpfWVsc2UgYVtuXT1yfX19dmFyIHpyPXtjcmVhdGU6VnIsdXBkYXRlOlZyfSxLcj1lKGZ1bmN0aW9uKGUpe3ZhciBuPXt9LHI9LzooLispLztyZXR1cm4gZS5zcGxpdCgvOyg/IVteKF0qXCkpL2cpLmZvckVhY2goZnVuY3Rpb24oZSl7aWYoZSl7dmFyIHQ9ZS5zcGxpdChyKTsxPHQubGVuZ3RoJiYoblt0WzBdLnRyaW0oKV09dFsxXS50cmltKCkpfX0pLG59KTtmdW5jdGlvbiBKcihlKXt2YXIgdD1xcihlLnN0eWxlKTtyZXR1cm4gZS5zdGF0aWNTdHlsZT9tKGUuc3RhdGljU3R5bGUsdCk6dH1mdW5jdGlvbiBxcihlKXtyZXR1cm4gQXJyYXkuaXNBcnJheShlKT9iKGUpOiJzdHJpbmciPT10eXBlb2YgZT9LcihlKTplfXZhciBXcixHcj0vXi0tLyxacj0vXHMqIWltcG9ydGFudCQvLFhyPWZ1bmN0aW9uKGUsdCxuKXtpZihHci50ZXN0KHQpKWUuc3R5bGUuc2V0UHJvcGVydHkodCxuKTtlbHNlIGlmKFpyLnRlc3QobikpZS5zdHlsZS5zZXRQcm9wZXJ0eSh0LG4ucmVwbGFjZShaciwiIiksImltcG9ydGFudCIpO2Vsc2V7dmFyIHI9UXIodCk7aWYoQXJyYXkuaXNBcnJheShuKSlmb3IodmFyIGk9MCxvPW4ubGVuZ3RoO2k8bztpKyspZS5zdHlsZVtyXT1uW2ldO2Vsc2UgZS5zdHlsZVtyXT1ufX0sWXI9WyJXZWJraXQiLCJNb3oiLCJtcyJdLFFyPWUoZnVuY3Rpb24oZSl7aWYoV3I9V3J8fGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLnN0eWxlLCJmaWx0ZXIiIT09KGU9ZyhlKSkmJmUgaW4gV3IpcmV0dXJuIGU7Zm9yKHZhciB0PWUuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkrZS5zbGljZSgxKSxuPTA7bjxZci5sZW5ndGg7bisrKXt2YXIgcj1ZcltuXSt0O2lmKHIgaW4gV3IpcmV0dXJuIHJ9fSk7ZnVuY3Rpb24gZWkoZSx0KXt2YXIgbj10LmRhdGEscj1lLmRhdGE7aWYoIShNKG4uc3RhdGljU3R5bGUpJiZNKG4uc3R5bGUpJiZNKHIuc3RhdGljU3R5bGUpJiZNKHIuc3R5bGUpKSl7dmFyIGksbyxhPXQuZWxtLHM9ci5zdGF0aWNTdHlsZSxjPXIubm9ybWFsaXplZFN0eWxlfHxyLnN0eWxlfHx7fSxsPXN8fGMsdT1xcih0LmRhdGEuc3R5bGUpfHx7fTt0LmRhdGEubm9ybWFsaXplZFN0eWxlPUQodS5fX29iX18pP20oe30sdSk6dTt2YXIgZj1mdW5jdGlvbihlLHQpe3ZhciBuLHI9e307aWYodClmb3IodmFyIGk9ZTtpLmNvbXBvbmVudEluc3RhbmNlOykoaT1pLmNvbXBvbmVudEluc3RhbmNlLl92bm9kZSkmJmkuZGF0YSYmKG49SnIoaS5kYXRhKSkmJm0ocixuKTsobj1KcihlLmRhdGEpKSYmbShyLG4pO2Zvcih2YXIgbz1lO289by5wYXJlbnQ7KW8uZGF0YSYmKG49SnIoby5kYXRhKSkmJm0ocixuKTtyZXR1cm4gcn0odCwhMCk7Zm9yKG8gaW4gbClNKGZbb10pJiZYcihhLG8sIiIpO2ZvcihvIGluIGYpKGk9ZltvXSkhPT1sW29dJiZYcihhLG8sbnVsbD09aT8iIjppKX19dmFyIHRpPXtjcmVhdGU6ZWksdXBkYXRlOmVpfTtmdW5jdGlvbiBuaSh0LGUpe2lmKGUmJihlPWUudHJpbSgpKSlpZih0LmNsYXNzTGlzdCktMTxlLmluZGV4T2YoIiAiKT9lLnNwbGl0KC9ccysvKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3JldHVybiB0LmNsYXNzTGlzdC5hZGQoZSl9KTp0LmNsYXNzTGlzdC5hZGQoZSk7ZWxzZXt2YXIgbj0iICIrKHQuZ2V0QXR0cmlidXRlKCJjbGFzcyIpfHwiIikrIiAiO24uaW5kZXhPZigiICIrZSsiICIpPDAmJnQuc2V0QXR0cmlidXRlKCJjbGFzcyIsKG4rZSkudHJpbSgpKX19ZnVuY3Rpb24gcmkodCxlKXtpZihlJiYoZT1lLnRyaW0oKSkpaWYodC5jbGFzc0xpc3QpLTE8ZS5pbmRleE9mKCIgIik/ZS5zcGxpdCgvXHMrLykuZm9yRWFjaChmdW5jdGlvbihlKXtyZXR1cm4gdC5jbGFzc0xpc3QucmVtb3ZlKGUpfSk6dC5jbGFzc0xpc3QucmVtb3ZlKGUpLHQuY2xhc3NMaXN0Lmxlbmd0aHx8dC5yZW1vdmVBdHRyaWJ1dGUoImNsYXNzIik7ZWxzZXtmb3IodmFyIG49IiAiKyh0LmdldEF0dHJpYnV0ZSgiY2xhc3MiKXx8IiIpKyIgIixyPSIgIitlKyIgIjswPD1uLmluZGV4T2Yocik7KW49bi5yZXBsYWNlKHIsIiAiKTsobj1uLnRyaW0oKSk/dC5zZXRBdHRyaWJ1dGUoImNsYXNzIixuKTp0LnJlbW92ZUF0dHJpYnV0ZSgiY2xhc3MiKX19ZnVuY3Rpb24gaWkoZSl7aWYoZSl7aWYoIm9iamVjdCI9PXR5cGVvZiBlKXt2YXIgdD17fTtyZXR1cm4hMSE9PWUuY3NzJiZtKHQsb2koZS5uYW1lfHwidiIpKSxtKHQsZSksdH1yZXR1cm4ic3RyaW5nIj09dHlwZW9mIGU/b2koZSk6dm9pZCAwfX12YXIgb2k9ZShmdW5jdGlvbihlKXtyZXR1cm57ZW50ZXJDbGFzczplKyItZW50ZXIiLGVudGVyVG9DbGFzczplKyItZW50ZXItdG8iLGVudGVyQWN0aXZlQ2xhc3M6ZSsiLWVudGVyLWFjdGl2ZSIsbGVhdmVDbGFzczplKyItbGVhdmUiLGxlYXZlVG9DbGFzczplKyItbGVhdmUtdG8iLGxlYXZlQWN0aXZlQ2xhc3M6ZSsiLWxlYXZlLWFjdGl2ZSJ9fSksYWk9QiYmIUosc2k9InRyYW5zaXRpb24iLGNpPSJhbmltYXRpb24iLGxpPSJ0cmFuc2l0aW9uIix1aT0idHJhbnNpdGlvbmVuZCIsZmk9ImFuaW1hdGlvbiIscGk9ImFuaW1hdGlvbmVuZCI7YWkmJih2b2lkIDA9PT13aW5kb3cub250cmFuc2l0aW9uZW5kJiZ2b2lkIDAhPT13aW5kb3cub253ZWJraXR0cmFuc2l0aW9uZW5kJiYobGk9IldlYmtpdFRyYW5zaXRpb24iLHVpPSJ3ZWJraXRUcmFuc2l0aW9uRW5kIiksdm9pZCAwPT09d2luZG93Lm9uYW5pbWF0aW9uZW5kJiZ2b2lkIDAhPT13aW5kb3cub253ZWJraXRhbmltYXRpb25lbmQmJihmaT0iV2Via2l0QW5pbWF0aW9uIixwaT0id2Via2l0QW5pbWF0aW9uRW5kIikpO3ZhciBkaT1CP3dpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWU/d2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZS5iaW5kKHdpbmRvdyk6c2V0VGltZW91dDpmdW5jdGlvbihlKXtyZXR1cm4gZSgpfTtmdW5jdGlvbiB2aShlKXtkaShmdW5jdGlvbigpe2RpKGUpfSl9ZnVuY3Rpb24gaGkoZSx0KXt2YXIgbj1lLl90cmFuc2l0aW9uQ2xhc3Nlc3x8KGUuX3RyYW5zaXRpb25DbGFzc2VzPVtdKTtuLmluZGV4T2YodCk8MCYmKG4ucHVzaCh0KSxuaShlLHQpKX1mdW5jdGlvbiBtaShlLHQpe2UuX3RyYW5zaXRpb25DbGFzc2VzJiZmKGUuX3RyYW5zaXRpb25DbGFzc2VzLHQpLHJpKGUsdCl9ZnVuY3Rpb24geWkodCxlLG4pe3ZhciByPV9pKHQsZSksaT1yLnR5cGUsbz1yLnRpbWVvdXQsYT1yLnByb3BDb3VudDtpZighaSlyZXR1cm4gbigpO3ZhciBzPWk9PT1zaT91aTpwaSxjPTAsbD1mdW5jdGlvbigpe3QucmVtb3ZlRXZlbnRMaXN0ZW5lcihzLHUpLG4oKX0sdT1mdW5jdGlvbihlKXtlLnRhcmdldD09PXQmJisrYz49YSYmbCgpfTtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7YzxhJiZsKCl9LG8rMSksdC5hZGRFdmVudExpc3RlbmVyKHMsdSl9dmFyIGdpPS9cYih0cmFuc2Zvcm18YWxsKSgsfCQpLztmdW5jdGlvbiBfaShlLHQpe3ZhciBuLHI9d2luZG93LmdldENvbXB1dGVkU3R5bGUoZSksaT1yW2xpKyJEZWxheSJdLnNwbGl0KCIsICIpLG89cltsaSsiRHVyYXRpb24iXS5zcGxpdCgiLCAiKSxhPWJpKGksbykscz1yW2ZpKyJEZWxheSJdLnNwbGl0KCIsICIpLGM9cltmaSsiRHVyYXRpb24iXS5zcGxpdCgiLCAiKSxsPWJpKHMsYyksdT0wLGY9MDtyZXR1cm4gdD09PXNpPzA8YSYmKG49c2ksdT1hLGY9by5sZW5ndGgpOnQ9PT1jaT8wPGwmJihuPWNpLHU9bCxmPWMubGVuZ3RoKTpmPShuPTA8KHU9TWF0aC5tYXgoYSxsKSk/bDxhP3NpOmNpOm51bGwpP249PT1zaT9vLmxlbmd0aDpjLmxlbmd0aDowLHt0eXBlOm4sdGltZW91dDp1LHByb3BDb3VudDpmLGhhc1RyYW5zZm9ybTpuPT09c2kmJmdpLnRlc3QocltsaSsiUHJvcGVydHkiXSl9fWZ1bmN0aW9uIGJpKG4sZSl7Zm9yKDtuLmxlbmd0aDxlLmxlbmd0aDspbj1uLmNvbmNhdChuKTtyZXR1cm4gTWF0aC5tYXguYXBwbHkobnVsbCxlLm1hcChmdW5jdGlvbihlLHQpe3JldHVybiAkaShlKSskaShuW3RdKX0pKX1mdW5jdGlvbiAkaShlKXtyZXR1cm4gMWUzKk51bWJlcihlLnNsaWNlKDAsLTEpKX1mdW5jdGlvbiB3aShuLGUpe3ZhciByPW4uZWxtO0Qoci5fbGVhdmVDYikmJihyLl9sZWF2ZUNiLmNhbmNlbGxlZD0hMCxyLl9sZWF2ZUNiKCkpO3ZhciB0PWlpKG4uZGF0YS50cmFuc2l0aW9uKTtpZighTSh0KSYmIUQoci5fZW50ZXJDYikmJjE9PT1yLm5vZGVUeXBlKXtmb3IodmFyIGk9dC5jc3Msbz10LnR5cGUsYT10LmVudGVyQ2xhc3Mscz10LmVudGVyVG9DbGFzcyxjPXQuZW50ZXJBY3RpdmVDbGFzcyxsPXQuYXBwZWFyQ2xhc3MsdT10LmFwcGVhclRvQ2xhc3MsZj10LmFwcGVhckFjdGl2ZUNsYXNzLHA9dC5iZWZvcmVFbnRlcixkPXQuZW50ZXIsdj10LmFmdGVyRW50ZXIsaD10LmVudGVyQ2FuY2VsbGVkLG09dC5iZWZvcmVBcHBlYXIseT10LmFwcGVhcixnPXQuYWZ0ZXJBcHBlYXIsXz10LmFwcGVhckNhbmNlbGxlZCxiPXQuZHVyYXRpb24sJD1tdCx3PW10LiR2bm9kZTt3JiZ3LnBhcmVudDspJD0odz13LnBhcmVudCkuY29udGV4dDt2YXIgQz0hJC5faXNNb3VudGVkfHwhbi5pc1Jvb3RJbnNlcnQ7aWYoIUN8fHl8fCIiPT09eSl7dmFyIHg9QyYmbD9sOmEsaz1DJiZmP2Y6YyxBPUMmJnU/dTpzLE89QyYmbXx8cCxTPUMmJiJmdW5jdGlvbiI9PXR5cGVvZiB5P3k6ZCxUPUMmJmd8fHYsRT1DJiZffHxoLGo9RihQKGIpP2IuZW50ZXI6YiksTj0hMSE9PWkmJiFKLEw9a2koUyksST1yLl9lbnRlckNiPVIoZnVuY3Rpb24oKXtOJiYobWkocixBKSxtaShyLGspKSxJLmNhbmNlbGxlZD8oTiYmbWkocix4KSxFJiZFKHIpKTpUJiZUKHIpLHIuX2VudGVyQ2I9bnVsbH0pO24uZGF0YS5zaG93fHxydChuLCJpbnNlcnQiLGZ1bmN0aW9uKCl7dmFyIGU9ci5wYXJlbnROb2RlLHQ9ZSYmZS5fcGVuZGluZyYmZS5fcGVuZGluZ1tuLmtleV07dCYmdC50YWc9PT1uLnRhZyYmdC5lbG0uX2xlYXZlQ2ImJnQuZWxtLl9sZWF2ZUNiKCksUyYmUyhyLEkpfSksTyYmTyhyKSxOJiYoaGkocix4KSxoaShyLGspLHZpKGZ1bmN0aW9uKCl7bWkocix4KSxJLmNhbmNlbGxlZHx8KGhpKHIsQSksTHx8KHhpKGopP3NldFRpbWVvdXQoSSxqKTp5aShyLG8sSSkpKX0pKSxuLmRhdGEuc2hvdyYmKGUmJmUoKSxTJiZTKHIsSSkpLE58fEx8fEkoKX19fWZ1bmN0aW9uIENpKGUsdCl7dmFyIG49ZS5lbG07RChuLl9lbnRlckNiKSYmKG4uX2VudGVyQ2IuY2FuY2VsbGVkPSEwLG4uX2VudGVyQ2IoKSk7dmFyIHI9aWkoZS5kYXRhLnRyYW5zaXRpb24pO2lmKE0ocil8fDEhPT1uLm5vZGVUeXBlKXJldHVybiB0KCk7aWYoIUQobi5fbGVhdmVDYikpe3ZhciBpPXIuY3NzLG89ci50eXBlLGE9ci5sZWF2ZUNsYXNzLHM9ci5sZWF2ZVRvQ2xhc3MsYz1yLmxlYXZlQWN0aXZlQ2xhc3MsbD1yLmJlZm9yZUxlYXZlLHU9ci5sZWF2ZSxmPXIuYWZ0ZXJMZWF2ZSxwPXIubGVhdmVDYW5jZWxsZWQsZD1yLmRlbGF5TGVhdmUsdj1yLmR1cmF0aW9uLGg9ITEhPT1pJiYhSixtPWtpKHUpLHk9RihQKHYpP3YubGVhdmU6diksZz1uLl9sZWF2ZUNiPVIoZnVuY3Rpb24oKXtuLnBhcmVudE5vZGUmJm4ucGFyZW50Tm9kZS5fcGVuZGluZyYmKG4ucGFyZW50Tm9kZS5fcGVuZGluZ1tlLmtleV09bnVsbCksaCYmKG1pKG4scyksbWkobixjKSksZy5jYW5jZWxsZWQ/KGgmJm1pKG4sYSkscCYmcChuKSk6KHQoKSxmJiZmKG4pKSxuLl9sZWF2ZUNiPW51bGx9KTtkP2QoXyk6XygpfWZ1bmN0aW9uIF8oKXtnLmNhbmNlbGxlZHx8KGUuZGF0YS5zaG93fHwoKG4ucGFyZW50Tm9kZS5fcGVuZGluZ3x8KG4ucGFyZW50Tm9kZS5fcGVuZGluZz17fSkpW2Uua2V5XT1lKSxsJiZsKG4pLGgmJihoaShuLGEpLGhpKG4sYyksdmkoZnVuY3Rpb24oKXttaShuLGEpLGcuY2FuY2VsbGVkfHwoaGkobixzKSxtfHwoeGkoeSk/c2V0VGltZW91dChnLHkpOnlpKG4sbyxnKSkpfSkpLHUmJnUobixnKSxofHxtfHxnKCkpfX1mdW5jdGlvbiB4aShlKXtyZXR1cm4ibnVtYmVyIj09dHlwZW9mIGUmJiFpc05hTihlKX1mdW5jdGlvbiBraShlKXtpZihNKGUpKXJldHVybiExO3ZhciB0PWUuZm5zO3JldHVybiBEKHQpP2tpKEFycmF5LmlzQXJyYXkodCk/dFswXTp0KToxPChlLl9sZW5ndGh8fGUubGVuZ3RoKX1mdW5jdGlvbiBBaShlLHQpeyEwIT09dC5kYXRhLnNob3cmJndpKHQpfXZhciBPaT1mdW5jdGlvbihlKXt2YXIgcix0LGc9e30sbj1lLm1vZHVsZXMsXz1lLm5vZGVPcHM7Zm9yKHI9MDtyPFhuLmxlbmd0aDsrK3IpZm9yKGdbWG5bcl1dPVtdLHQ9MDt0PG4ubGVuZ3RoOysrdClEKG5bdF1bWG5bcl1dKSYmZ1tYbltyXV0ucHVzaChuW3RdW1huW3JdXSk7ZnVuY3Rpb24gbyhlKXt2YXIgdD1fLnBhcmVudE5vZGUoZSk7RCh0KSYmXy5yZW1vdmVDaGlsZCh0LGUpfWZ1bmN0aW9uIGIoZSx0LG4scixpLG8sYSl7aWYoRChlLmVsbSkmJkQobykmJihlPW9bYV09ZGUoZSkpLGUuaXNSb290SW5zZXJ0PSFpLCFmdW5jdGlvbihlLHQsbixyKXt2YXIgaT1lLmRhdGE7aWYoRChpKSl7dmFyIG89RChlLmNvbXBvbmVudEluc3RhbmNlKSYmaS5rZWVwQWxpdmU7aWYoRChpPWkuaG9vaykmJkQoaT1pLmluaXQpJiZpKGUsITEsbixyKSxEKGUuY29tcG9uZW50SW5zdGFuY2UpKXJldHVybiBkKGUsdCksUyhvKSYmZnVuY3Rpb24oZSx0LG4scil7Zm9yKHZhciBpLG89ZTtvLmNvbXBvbmVudEluc3RhbmNlOylpZihvPW8uY29tcG9uZW50SW5zdGFuY2UuX3Zub2RlLEQoaT1vLmRhdGEpJiZEKGk9aS50cmFuc2l0aW9uKSl7Zm9yKGk9MDtpPGcuYWN0aXZhdGUubGVuZ3RoOysraSlnLmFjdGl2YXRlW2ldKFpuLG8pO3QucHVzaChvKTticmVha311KG4sZS5lbG0scil9KGUsdCxuLHIpLCEwfX0oZSx0LG4scikpe3ZhciBzPWUuZGF0YSxjPWUuY2hpbGRyZW4sbD1lLnRhZztEKGwpPyhlLmVsbT1lLm5zP18uY3JlYXRlRWxlbWVudE5TKGUubnMsbCk6Xy5jcmVhdGVFbGVtZW50KGwsZSksZihlKSx2KGUsYyx0KSxEKHMpJiZoKGUsdCkpOlMoZS5pc0NvbW1lbnQpP2UuZWxtPV8uY3JlYXRlQ29tbWVudChlLnRleHQpOmUuZWxtPV8uY3JlYXRlVGV4dE5vZGUoZS50ZXh0KSx1KG4sZS5lbG0scil9fWZ1bmN0aW9uIGQoZSx0KXtEKGUuZGF0YS5wZW5kaW5nSW5zZXJ0KSYmKHQucHVzaC5hcHBseSh0LGUuZGF0YS5wZW5kaW5nSW5zZXJ0KSxlLmRhdGEucGVuZGluZ0luc2VydD1udWxsKSxlLmVsbT1lLmNvbXBvbmVudEluc3RhbmNlLiRlbCwkKGUpPyhoKGUsdCksZihlKSk6KEduKGUpLHQucHVzaChlKSl9ZnVuY3Rpb24gdShlLHQsbil7RChlKSYmKEQobik/bi5wYXJlbnROb2RlPT09ZSYmXy5pbnNlcnRCZWZvcmUoZSx0LG4pOl8uYXBwZW5kQ2hpbGQoZSx0KSl9ZnVuY3Rpb24gdihlLHQsbil7aWYoQXJyYXkuaXNBcnJheSh0KSlmb3IodmFyIHI9MDtyPHQubGVuZ3RoOysrciliKHRbcl0sbixlLmVsbSxudWxsLCEwLHQscik7ZWxzZSBUKGUudGV4dCkmJl8uYXBwZW5kQ2hpbGQoZS5lbG0sXy5jcmVhdGVUZXh0Tm9kZShTdHJpbmcoZS50ZXh0KSkpfWZ1bmN0aW9uICQoZSl7Zm9yKDtlLmNvbXBvbmVudEluc3RhbmNlOyllPWUuY29tcG9uZW50SW5zdGFuY2UuX3Zub2RlO3JldHVybiBEKGUudGFnKX1mdW5jdGlvbiBoKGUsdCl7Zm9yKHZhciBuPTA7bjxnLmNyZWF0ZS5sZW5ndGg7KytuKWcuY3JlYXRlW25dKFpuLGUpO0Qocj1lLmRhdGEuaG9vaykmJihEKHIuY3JlYXRlKSYmci5jcmVhdGUoWm4sZSksRChyLmluc2VydCkmJnQucHVzaChlKSl9ZnVuY3Rpb24gZihlKXt2YXIgdDtpZihEKHQ9ZS5mblNjb3BlSWQpKV8uc2V0U3R5bGVTY29wZShlLmVsbSx0KTtlbHNlIGZvcih2YXIgbj1lO247KUQodD1uLmNvbnRleHQpJiZEKHQ9dC4kb3B0aW9ucy5fc2NvcGVJZCkmJl8uc2V0U3R5bGVTY29wZShlLmVsbSx0KSxuPW4ucGFyZW50O0QodD1tdCkmJnQhPT1lLmNvbnRleHQmJnQhPT1lLmZuQ29udGV4dCYmRCh0PXQuJG9wdGlvbnMuX3Njb3BlSWQpJiZfLnNldFN0eWxlU2NvcGUoZS5lbG0sdCl9ZnVuY3Rpb24geShlLHQsbixyLGksbyl7Zm9yKDtyPD1pOysrciliKG5bcl0sbyxlLHQsITEsbixyKX1mdW5jdGlvbiB3KGUpe3ZhciB0LG4scj1lLmRhdGE7aWYoRChyKSlmb3IoRCh0PXIuaG9vaykmJkQodD10LmRlc3Ryb3kpJiZ0KGUpLHQ9MDt0PGcuZGVzdHJveS5sZW5ndGg7Kyt0KWcuZGVzdHJveVt0XShlKTtpZihEKHQ9ZS5jaGlsZHJlbikpZm9yKG49MDtuPGUuY2hpbGRyZW4ubGVuZ3RoOysrbil3KGUuY2hpbGRyZW5bbl0pfWZ1bmN0aW9uIEMoZSx0LG4scil7Zm9yKDtuPD1yOysrbil7dmFyIGk9dFtuXTtEKGkpJiYoRChpLnRhZyk/KGEoaSksdyhpKSk6byhpLmVsbSkpfX1mdW5jdGlvbiBhKGUsdCl7aWYoRCh0KXx8RChlLmRhdGEpKXt2YXIgbixyPWcucmVtb3ZlLmxlbmd0aCsxO2ZvcihEKHQpP3QubGlzdGVuZXJzKz1yOnQ9ZnVuY3Rpb24oZSx0KXtmdW5jdGlvbiBuKCl7MD09LS1uLmxpc3RlbmVycyYmbyhlKX1yZXR1cm4gbi5saXN0ZW5lcnM9dCxufShlLmVsbSxyKSxEKG49ZS5jb21wb25lbnRJbnN0YW5jZSkmJkQobj1uLl92bm9kZSkmJkQobi5kYXRhKSYmYShuLHQpLG49MDtuPGcucmVtb3ZlLmxlbmd0aDsrK24pZy5yZW1vdmVbbl0oZSx0KTtEKG49ZS5kYXRhLmhvb2spJiZEKG49bi5yZW1vdmUpP24oZSx0KTp0KCl9ZWxzZSBvKGUuZWxtKX1mdW5jdGlvbiB4KGUsdCxuLHIpe2Zvcih2YXIgaT1uO2k8cjtpKyspe3ZhciBvPXRbaV07aWYoRChvKSYmWW4oZSxvKSlyZXR1cm4gaX19ZnVuY3Rpb24gayhlLHQsbixyKXtpZihlIT09dCl7dmFyIGk9dC5lbG09ZS5lbG07aWYoUyhlLmlzQXN5bmNQbGFjZWhvbGRlcikpRCh0LmFzeW5jRmFjdG9yeS5yZXNvbHZlZCk/TyhlLmVsbSx0LG4pOnQuaXNBc3luY1BsYWNlaG9sZGVyPSEwO2Vsc2UgaWYoUyh0LmlzU3RhdGljKSYmUyhlLmlzU3RhdGljKSYmdC5rZXk9PT1lLmtleSYmKFModC5pc0Nsb25lZCl8fFModC5pc09uY2UpKSl0LmNvbXBvbmVudEluc3RhbmNlPWUuY29tcG9uZW50SW5zdGFuY2U7ZWxzZXt2YXIgbyxhPXQuZGF0YTtEKGEpJiZEKG89YS5ob29rKSYmRChvPW8ucHJlcGF0Y2gpJiZvKGUsdCk7dmFyIHM9ZS5jaGlsZHJlbixjPXQuY2hpbGRyZW47aWYoRChhKSYmJCh0KSl7Zm9yKG89MDtvPGcudXBkYXRlLmxlbmd0aDsrK28pZy51cGRhdGVbb10oZSx0KTtEKG89YS5ob29rKSYmRChvPW8udXBkYXRlKSYmbyhlLHQpfU0odC50ZXh0KT9EKHMpJiZEKGMpP3MhPT1jJiZmdW5jdGlvbihlLHQsbixyLGkpe2Zvcih2YXIgbyxhLHMsYz0wLGw9MCx1PXQubGVuZ3RoLTEsZj10WzBdLHA9dFt1XSxkPW4ubGVuZ3RoLTEsdj1uWzBdLGg9bltkXSxtPSFpO2M8PXUmJmw8PWQ7KU0oZik/Zj10WysrY106TShwKT9wPXRbLS11XTpZbihmLHYpPyhrKGYsdixyKSxmPXRbKytjXSx2PW5bKytsXSk6WW4ocCxoKT8oayhwLGgscikscD10Wy0tdV0saD1uWy0tZF0pOlluKGYsaCk/KGsoZixoLHIpLG0mJl8uaW5zZXJ0QmVmb3JlKGUsZi5lbG0sXy5uZXh0U2libGluZyhwLmVsbSkpLGY9dFsrK2NdLGg9blstLWRdKTooWW4ocCx2KT8oayhwLHYsciksbSYmXy5pbnNlcnRCZWZvcmUoZSxwLmVsbSxmLmVsbSkscD10Wy0tdV0pOihNKG8pJiYobz1Rbih0LGMsdSkpLE0oYT1EKHYua2V5KT9vW3Yua2V5XTp4KHYsdCxjLHUpKT9iKHYscixlLGYuZWxtLCExLG4sbCk6WW4ocz10W2FdLHYpPyhrKHMsdixyKSx0W2FdPXZvaWQgMCxtJiZfLmluc2VydEJlZm9yZShlLHMuZWxtLGYuZWxtKSk6Yih2LHIsZSxmLmVsbSwhMSxuLGwpKSx2PW5bKytsXSk7dTxjP3koZSxNKG5bZCsxXSk/bnVsbDpuW2QrMV0uZWxtLG4sbCxkLHIpOmQ8bCYmQygwLHQsYyx1KX0oaSxzLGMsbixyKTpEKGMpPyhEKGUudGV4dCkmJl8uc2V0VGV4dENvbnRlbnQoaSwiIikseShpLG51bGwsYywwLGMubGVuZ3RoLTEsbikpOkQocyk/QygwLHMsMCxzLmxlbmd0aC0xKTpEKGUudGV4dCkmJl8uc2V0VGV4dENvbnRlbnQoaSwiIik6ZS50ZXh0IT09dC50ZXh0JiZfLnNldFRleHRDb250ZW50KGksdC50ZXh0KSxEKGEpJiZEKG89YS5ob29rKSYmRChvPW8ucG9zdHBhdGNoKSYmbyhlLHQpfX19ZnVuY3Rpb24gQShlLHQsbil7aWYoUyhuKSYmRChlLnBhcmVudCkpZS5wYXJlbnQuZGF0YS5wZW5kaW5nSW5zZXJ0PXQ7ZWxzZSBmb3IodmFyIHI9MDtyPHQubGVuZ3RoOysrcil0W3JdLmRhdGEuaG9vay5pbnNlcnQodFtyXSl9dmFyIG09cygiYXR0cnMsY2xhc3Msc3RhdGljQ2xhc3Msc3RhdGljU3R5bGUsa2V5Iik7ZnVuY3Rpb24gTyhlLHQsbixyKXt2YXIgaSxvPXQudGFnLGE9dC5kYXRhLHM9dC5jaGlsZHJlbjtpZihyPXJ8fGEmJmEucHJlLHQuZWxtPWUsUyh0LmlzQ29tbWVudCkmJkQodC5hc3luY0ZhY3RvcnkpKXJldHVybiB0LmlzQXN5bmNQbGFjZWhvbGRlcj0hMDtpZihEKGEpJiYoRChpPWEuaG9vaykmJkQoaT1pLmluaXQpJiZpKHQsITApLEQoaT10LmNvbXBvbmVudEluc3RhbmNlKSkpcmV0dXJuIGQodCxuKSwhMDtpZihEKG8pKXtpZihEKHMpKWlmKGUuaGFzQ2hpbGROb2RlcygpKWlmKEQoaT1hKSYmRChpPWkuZG9tUHJvcHMpJiZEKGk9aS5pbm5lckhUTUwpKXtpZihpIT09ZS5pbm5lckhUTUwpcmV0dXJuITF9ZWxzZXtmb3IodmFyIGM9ITAsbD1lLmZpcnN0Q2hpbGQsdT0wO3U8cy5sZW5ndGg7dSsrKXtpZighbHx8IU8obCxzW3VdLG4scikpe2M9ITE7YnJlYWt9bD1sLm5leHRTaWJsaW5nfWlmKCFjfHxsKXJldHVybiExfWVsc2Ugdih0LHMsbik7aWYoRChhKSl7dmFyIGY9ITE7Zm9yKHZhciBwIGluIGEpaWYoIW0ocCkpe2Y9ITAsaCh0LG4pO2JyZWFrfSFmJiZhLmNsYXNzJiZZZShhLmNsYXNzKX19ZWxzZSBlLmRhdGEhPT10LnRleHQmJihlLmRhdGE9dC50ZXh0KTtyZXR1cm4hMH1yZXR1cm4gZnVuY3Rpb24oZSx0LG4scixpLG8pe2lmKCFNKHQpKXt2YXIgYSxzPSExLGM9W107aWYoTShlKSlzPSEwLGIodCxjLGksbyk7ZWxzZXt2YXIgbD1EKGUubm9kZVR5cGUpO2lmKCFsJiZZbihlLHQpKWsoZSx0LGMscik7ZWxzZXtpZihsKXtpZigxPT09ZS5ub2RlVHlwZSYmZS5oYXNBdHRyaWJ1dGUoRSkmJihlLnJlbW92ZUF0dHJpYnV0ZShFKSxuPSEwKSxTKG4pJiZPKGUsdCxjKSlyZXR1cm4gQSh0LGMsITApLGU7YT1lLGU9bmV3IGxlKF8udGFnTmFtZShhKS50b0xvd2VyQ2FzZSgpLHt9LFtdLHZvaWQgMCxhKX12YXIgdT1lLmVsbSxmPV8ucGFyZW50Tm9kZSh1KTtpZihiKHQsYyx1Ll9sZWF2ZUNiP251bGw6ZixfLm5leHRTaWJsaW5nKHUpKSxEKHQucGFyZW50KSlmb3IodmFyIHA9dC5wYXJlbnQsZD0kKHQpO3A7KXtmb3IodmFyIHY9MDt2PGcuZGVzdHJveS5sZW5ndGg7Kyt2KWcuZGVzdHJveVt2XShwKTtpZihwLmVsbT10LmVsbSxkKXtmb3IodmFyIGg9MDtoPGcuY3JlYXRlLmxlbmd0aDsrK2gpZy5jcmVhdGVbaF0oWm4scCk7dmFyIG09cC5kYXRhLmhvb2suaW5zZXJ0O2lmKG0ubWVyZ2VkKWZvcih2YXIgeT0xO3k8bS5mbnMubGVuZ3RoO3krKyltLmZuc1t5XSgpfWVsc2UgR24ocCk7cD1wLnBhcmVudH1EKGYpP0MoMCxbZV0sMCwwKTpEKGUudGFnKSYmdyhlKX19cmV0dXJuIEEodCxjLHMpLHQuZWxtfUQoZSkmJncoZSl9fSh7bm9kZU9wczpxbixtb2R1bGVzOltscix5cixVcix6cix0aSxCP3tjcmVhdGU6QWksYWN0aXZhdGU6QWkscmVtb3ZlOmZ1bmN0aW9uKGUsdCl7ITAhPT1lLmRhdGEuc2hvdz9DaShlLHQpOnQoKX19Ont9XS5jb25jYXQob3IpfSk7SiYmZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigic2VsZWN0aW9uY2hhbmdlIixmdW5jdGlvbigpe3ZhciBlPWRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7ZSYmZS52bW9kZWwmJk1pKGUsImlucHV0Iil9KTt2YXIgU2k9e2luc2VydGVkOmZ1bmN0aW9uKGUsdCxuLHIpeyJzZWxlY3QiPT09bi50YWc/KHIuZWxtJiYhci5lbG0uX3ZPcHRpb25zP3J0KG4sInBvc3RwYXRjaCIsZnVuY3Rpb24oKXtTaS5jb21wb25lbnRVcGRhdGVkKGUsdCxuKX0pOlRpKGUsdCxuLmNvbnRleHQpLGUuX3ZPcHRpb25zPVtdLm1hcC5jYWxsKGUub3B0aW9ucyxOaSkpOigidGV4dGFyZWEiPT09bi50YWd8fEtuKGUudHlwZSkpJiYoZS5fdk1vZGlmaWVycz10Lm1vZGlmaWVycyx0Lm1vZGlmaWVycy5sYXp5fHwoZS5hZGRFdmVudExpc3RlbmVyKCJjb21wb3NpdGlvbnN0YXJ0IixMaSksZS5hZGRFdmVudExpc3RlbmVyKCJjb21wb3NpdGlvbmVuZCIsSWkpLGUuYWRkRXZlbnRMaXN0ZW5lcigiY2hhbmdlIixJaSksSiYmKGUudm1vZGVsPSEwKSkpfSxjb21wb25lbnRVcGRhdGVkOmZ1bmN0aW9uKGUsdCxuKXtpZigic2VsZWN0Ij09PW4udGFnKXtUaShlLHQsbi5jb250ZXh0KTt2YXIgcj1lLl92T3B0aW9ucyxpPWUuX3ZPcHRpb25zPVtdLm1hcC5jYWxsKGUub3B0aW9ucyxOaSk7aWYoaS5zb21lKGZ1bmN0aW9uKGUsdCl7cmV0dXJuIUMoZSxyW3RdKX0pKShlLm11bHRpcGxlP3QudmFsdWUuc29tZShmdW5jdGlvbihlKXtyZXR1cm4gamkoZSxpKX0pOnQudmFsdWUhPT10Lm9sZFZhbHVlJiZqaSh0LnZhbHVlLGkpKSYmTWkoZSwiY2hhbmdlIil9fX07ZnVuY3Rpb24gVGkoZSx0LG4pe0VpKGUsdCxuKSwoS3x8cSkmJnNldFRpbWVvdXQoZnVuY3Rpb24oKXtFaShlLHQsbil9LDApfWZ1bmN0aW9uIEVpKGUsdCxuKXt2YXIgcj10LnZhbHVlLGk9ZS5tdWx0aXBsZTtpZighaXx8QXJyYXkuaXNBcnJheShyKSl7Zm9yKHZhciBvLGEscz0wLGM9ZS5vcHRpb25zLmxlbmd0aDtzPGM7cysrKWlmKGE9ZS5vcHRpb25zW3NdLGkpbz0tMTx4KHIsTmkoYSkpLGEuc2VsZWN0ZWQhPT1vJiYoYS5zZWxlY3RlZD1vKTtlbHNlIGlmKEMoTmkoYSkscikpcmV0dXJuIHZvaWQoZS5zZWxlY3RlZEluZGV4IT09cyYmKGUuc2VsZWN0ZWRJbmRleD1zKSk7aXx8KGUuc2VsZWN0ZWRJbmRleD0tMSl9fWZ1bmN0aW9uIGppKHQsZSl7cmV0dXJuIGUuZXZlcnkoZnVuY3Rpb24oZSl7cmV0dXJuIUMoZSx0KX0pfWZ1bmN0aW9uIE5pKGUpe3JldHVybiJfdmFsdWUiaW4gZT9lLl92YWx1ZTplLnZhbHVlfWZ1bmN0aW9uIExpKGUpe2UudGFyZ2V0LmNvbXBvc2luZz0hMH1mdW5jdGlvbiBJaShlKXtlLnRhcmdldC5jb21wb3NpbmcmJihlLnRhcmdldC5jb21wb3Npbmc9ITEsTWkoZS50YXJnZXQsImlucHV0IikpfWZ1bmN0aW9uIE1pKGUsdCl7dmFyIG49ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkhUTUxFdmVudHMiKTtuLmluaXRFdmVudCh0LCEwLCEwKSxlLmRpc3BhdGNoRXZlbnQobil9ZnVuY3Rpb24gRGkoZSl7cmV0dXJuIWUuY29tcG9uZW50SW5zdGFuY2V8fGUuZGF0YSYmZS5kYXRhLnRyYW5zaXRpb24/ZTpEaShlLmNvbXBvbmVudEluc3RhbmNlLl92bm9kZSl9dmFyIFBpPXttb2RlbDpTaSxzaG93OntiaW5kOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcj10LnZhbHVlLGk9KG49RGkobikpLmRhdGEmJm4uZGF0YS50cmFuc2l0aW9uLG89ZS5fX3ZPcmlnaW5hbERpc3BsYXk9Im5vbmUiPT09ZS5zdHlsZS5kaXNwbGF5PyIiOmUuc3R5bGUuZGlzcGxheTtyJiZpPyhuLmRhdGEuc2hvdz0hMCx3aShuLGZ1bmN0aW9uKCl7ZS5zdHlsZS5kaXNwbGF5PW99KSk6ZS5zdHlsZS5kaXNwbGF5PXI/bzoibm9uZSJ9LHVwZGF0ZTpmdW5jdGlvbihlLHQsbil7dmFyIHI9dC52YWx1ZTshciE9IXQub2xkVmFsdWUmJigobj1EaShuKSkuZGF0YSYmbi5kYXRhLnRyYW5zaXRpb24/KG4uZGF0YS5zaG93PSEwLHI/d2kobixmdW5jdGlvbigpe2Uuc3R5bGUuZGlzcGxheT1lLl9fdk9yaWdpbmFsRGlzcGxheX0pOkNpKG4sZnVuY3Rpb24oKXtlLnN0eWxlLmRpc3BsYXk9Im5vbmUifSkpOmUuc3R5bGUuZGlzcGxheT1yP2UuX192T3JpZ2luYWxEaXNwbGF5OiJub25lIil9LHVuYmluZDpmdW5jdGlvbihlLHQsbixyLGkpe2l8fChlLnN0eWxlLmRpc3BsYXk9ZS5fX3ZPcmlnaW5hbERpc3BsYXkpfX19LEZpPXtuYW1lOlN0cmluZyxhcHBlYXI6Qm9vbGVhbixjc3M6Qm9vbGVhbixtb2RlOlN0cmluZyx0eXBlOlN0cmluZyxlbnRlckNsYXNzOlN0cmluZyxsZWF2ZUNsYXNzOlN0cmluZyxlbnRlclRvQ2xhc3M6U3RyaW5nLGxlYXZlVG9DbGFzczpTdHJpbmcsZW50ZXJBY3RpdmVDbGFzczpTdHJpbmcsbGVhdmVBY3RpdmVDbGFzczpTdHJpbmcsYXBwZWFyQ2xhc3M6U3RyaW5nLGFwcGVhckFjdGl2ZUNsYXNzOlN0cmluZyxhcHBlYXJUb0NsYXNzOlN0cmluZyxkdXJhdGlvbjpbTnVtYmVyLFN0cmluZyxPYmplY3RdfTtmdW5jdGlvbiBSaShlKXt2YXIgdD1lJiZlLmNvbXBvbmVudE9wdGlvbnM7cmV0dXJuIHQmJnQuQ3Rvci5vcHRpb25zLmFic3RyYWN0P1JpKGx0KHQuY2hpbGRyZW4pKTplfWZ1bmN0aW9uIEhpKGUpe3ZhciB0PXt9LG49ZS4kb3B0aW9ucztmb3IodmFyIHIgaW4gbi5wcm9wc0RhdGEpdFtyXT1lW3JdO3ZhciBpPW4uX3BhcmVudExpc3RlbmVycztmb3IodmFyIG8gaW4gaSl0W2cobyldPWlbb107cmV0dXJuIHR9ZnVuY3Rpb24gQmkoZSx0KXtpZigvXGQta2VlcC1hbGl2ZSQvLnRlc3QodC50YWcpKXJldHVybiBlKCJrZWVwLWFsaXZlIix7cHJvcHM6dC5jb21wb25lbnRPcHRpb25zLnByb3BzRGF0YX0pfXZhciBVaT17bmFtZToidHJhbnNpdGlvbiIscHJvcHM6RmksYWJzdHJhY3Q6ITAscmVuZGVyOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMsbj10aGlzLiRzbG90cy5kZWZhdWx0O2lmKG4mJihuPW4uZmlsdGVyKGZ1bmN0aW9uKGUpe3JldHVybiBlLnRhZ3x8Y3QoZSl9KSkubGVuZ3RoKXt2YXIgcj10aGlzLm1vZGUsaT1uWzBdO2lmKGZ1bmN0aW9uKGUpe2Zvcig7ZT1lLnBhcmVudDspaWYoZS5kYXRhLnRyYW5zaXRpb24pcmV0dXJuITB9KHRoaXMuJHZub2RlKSlyZXR1cm4gaTt2YXIgbz1SaShpKTtpZighbylyZXR1cm4gaTtpZih0aGlzLl9sZWF2aW5nKXJldHVybiBCaShlLGkpO3ZhciBhPSJfX3RyYW5zaXRpb24tIit0aGlzLl91aWQrIi0iO28ua2V5PW51bGw9PW8ua2V5P28uaXNDb21tZW50P2ErImNvbW1lbnQiOmErby50YWc6VChvLmtleSk/MD09PVN0cmluZyhvLmtleSkuaW5kZXhPZihhKT9vLmtleTphK28ua2V5Om8ua2V5O3ZhciBzLGMsbD0oby5kYXRhfHwoby5kYXRhPXt9KSkudHJhbnNpdGlvbj1IaSh0aGlzKSx1PXRoaXMuX3Zub2RlLGY9UmkodSk7aWYoby5kYXRhLmRpcmVjdGl2ZXMmJm8uZGF0YS5kaXJlY3RpdmVzLnNvbWUoZnVuY3Rpb24oZSl7cmV0dXJuInNob3ciPT09ZS5uYW1lfSkmJihvLmRhdGEuc2hvdz0hMCksZiYmZi5kYXRhJiYocz1vLChjPWYpLmtleSE9PXMua2V5fHxjLnRhZyE9PXMudGFnKSYmIWN0KGYpJiYoIWYuY29tcG9uZW50SW5zdGFuY2V8fCFmLmNvbXBvbmVudEluc3RhbmNlLl92bm9kZS5pc0NvbW1lbnQpKXt2YXIgcD1mLmRhdGEudHJhbnNpdGlvbj1tKHt9LGwpO2lmKCJvdXQtaW4iPT09cilyZXR1cm4gdGhpcy5fbGVhdmluZz0hMCxydChwLCJhZnRlckxlYXZlIixmdW5jdGlvbigpe3QuX2xlYXZpbmc9ITEsdC4kZm9yY2VVcGRhdGUoKX0pLEJpKGUsaSk7aWYoImluLW91dCI9PT1yKXtpZihjdChvKSlyZXR1cm4gdTt2YXIgZCx2PWZ1bmN0aW9uKCl7ZCgpfTtydChsLCJhZnRlckVudGVyIix2KSxydChsLCJlbnRlckNhbmNlbGxlZCIsdikscnQocCwiZGVsYXlMZWF2ZSIsZnVuY3Rpb24oZSl7ZD1lfSl9fXJldHVybiBpfX19LFZpPW0oe3RhZzpTdHJpbmcsbW92ZUNsYXNzOlN0cmluZ30sRmkpO2Z1bmN0aW9uIHppKGUpe2UuZWxtLl9tb3ZlQ2ImJmUuZWxtLl9tb3ZlQ2IoKSxlLmVsbS5fZW50ZXJDYiYmZS5lbG0uX2VudGVyQ2IoKX1mdW5jdGlvbiBLaShlKXtlLmRhdGEubmV3UG9zPWUuZWxtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpfWZ1bmN0aW9uIEppKGUpe3ZhciB0PWUuZGF0YS5wb3Msbj1lLmRhdGEubmV3UG9zLHI9dC5sZWZ0LW4ubGVmdCxpPXQudG9wLW4udG9wO2lmKHJ8fGkpe2UuZGF0YS5tb3ZlZD0hMDt2YXIgbz1lLmVsbS5zdHlsZTtvLnRyYW5zZm9ybT1vLldlYmtpdFRyYW5zZm9ybT0idHJhbnNsYXRlKCIrcisicHgsIitpKyJweCkiLG8udHJhbnNpdGlvbkR1cmF0aW9uPSIwcyJ9fWRlbGV0ZSBWaS5tb2RlO3ZhciBxaT17VHJhbnNpdGlvbjpVaSxUcmFuc2l0aW9uR3JvdXA6e3Byb3BzOlZpLHJlbmRlcjpmdW5jdGlvbihlKXtmb3IodmFyIHQ9dGhpcy50YWd8fHRoaXMuJHZub2RlLmRhdGEudGFnfHwic3BhbiIsbj1PYmplY3QuY3JlYXRlKG51bGwpLHI9dGhpcy5wcmV2Q2hpbGRyZW49dGhpcy5jaGlsZHJlbixpPXRoaXMuJHNsb3RzLmRlZmF1bHR8fFtdLG89dGhpcy5jaGlsZHJlbj1bXSxhPUhpKHRoaXMpLHM9MDtzPGkubGVuZ3RoO3MrKyl7dmFyIGM9aVtzXTtjLnRhZyYmbnVsbCE9Yy5rZXkmJjAhPT1TdHJpbmcoYy5rZXkpLmluZGV4T2YoIl9fdmxpc3QiKSYmKG8ucHVzaChjKSwoKG5bYy5rZXldPWMpLmRhdGF8fChjLmRhdGE9e30pKS50cmFuc2l0aW9uPWEpfWlmKHIpe2Zvcih2YXIgbD1bXSx1PVtdLGY9MDtmPHIubGVuZ3RoO2YrKyl7dmFyIHA9cltmXTtwLmRhdGEudHJhbnNpdGlvbj1hLHAuZGF0YS5wb3M9cC5lbG0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksbltwLmtleV0/bC5wdXNoKHApOnUucHVzaChwKX10aGlzLmtlcHQ9ZSh0LG51bGwsbCksdGhpcy5yZW1vdmVkPXV9cmV0dXJuIGUodCxudWxsLG8pfSxiZWZvcmVVcGRhdGU6ZnVuY3Rpb24oKXt0aGlzLl9fcGF0Y2hfXyh0aGlzLl92bm9kZSx0aGlzLmtlcHQsITEsITApLHRoaXMuX3Zub2RlPXRoaXMua2VwdH0sdXBkYXRlZDpmdW5jdGlvbigpe3ZhciBlPXRoaXMucHJldkNoaWxkcmVuLHI9dGhpcy5tb3ZlQ2xhc3N8fCh0aGlzLm5hbWV8fCJ2IikrIi1tb3ZlIjtlLmxlbmd0aCYmdGhpcy5oYXNNb3ZlKGVbMF0uZWxtLHIpJiYoZS5mb3JFYWNoKHppKSxlLmZvckVhY2goS2kpLGUuZm9yRWFjaChKaSksdGhpcy5fcmVmbG93PWRvY3VtZW50LmJvZHkub2Zmc2V0SGVpZ2h0LGUuZm9yRWFjaChmdW5jdGlvbihlKXtpZihlLmRhdGEubW92ZWQpe3ZhciBuPWUuZWxtLHQ9bi5zdHlsZTtoaShuLHIpLHQudHJhbnNmb3JtPXQuV2Via2l0VHJhbnNmb3JtPXQudHJhbnNpdGlvbkR1cmF0aW9uPSIiLG4uYWRkRXZlbnRMaXN0ZW5lcih1aSxuLl9tb3ZlQ2I9ZnVuY3Rpb24gZSh0KXt0JiYhL3RyYW5zZm9ybSQvLnRlc3QodC5wcm9wZXJ0eU5hbWUpfHwobi5yZW1vdmVFdmVudExpc3RlbmVyKHVpLGUpLG4uX21vdmVDYj1udWxsLG1pKG4scikpfSl9fSkpfSxtZXRob2RzOntoYXNNb3ZlOmZ1bmN0aW9uKGUsdCl7aWYoIWFpKXJldHVybiExO2lmKHRoaXMuX2hhc01vdmUpcmV0dXJuIHRoaXMuX2hhc01vdmU7dmFyIG49ZS5jbG9uZU5vZGUoKTtlLl90cmFuc2l0aW9uQ2xhc3NlcyYmZS5fdHJhbnNpdGlvbkNsYXNzZXMuZm9yRWFjaChmdW5jdGlvbihlKXtyaShuLGUpfSksbmkobix0KSxuLnN0eWxlLmRpc3BsYXk9Im5vbmUiLHRoaXMuJGVsLmFwcGVuZENoaWxkKG4pO3ZhciByPV9pKG4pO3JldHVybiB0aGlzLiRlbC5yZW1vdmVDaGlsZChuKSx0aGlzLl9oYXNNb3ZlPXIuaGFzVHJhbnNmb3JtfX19fTtobi5jb25maWcubXVzdFVzZVByb3A9U24saG4uY29uZmlnLmlzUmVzZXJ2ZWRUYWc9VW4saG4uY29uZmlnLmlzUmVzZXJ2ZWRBdHRyPUFuLGhuLmNvbmZpZy5nZXRUYWdOYW1lc3BhY2U9Vm4saG4uY29uZmlnLmlzVW5rbm93bkVsZW1lbnQ9ZnVuY3Rpb24oZSl7aWYoIUIpcmV0dXJuITA7aWYoVW4oZSkpcmV0dXJuITE7aWYoZT1lLnRvTG93ZXJDYXNlKCksbnVsbCE9em5bZV0pcmV0dXJuIHpuW2VdO3ZhciB0PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoZSk7cmV0dXJuLTE8ZS5pbmRleE9mKCItIik/em5bZV09dC5jb25zdHJ1Y3Rvcj09PXdpbmRvdy5IVE1MVW5rbm93bkVsZW1lbnR8fHQuY29uc3RydWN0b3I9PT13aW5kb3cuSFRNTEVsZW1lbnQ6em5bZV09L0hUTUxVbmtub3duRWxlbWVudC8udGVzdCh0LnRvU3RyaW5nKCkpfSxtKGhuLm9wdGlvbnMuZGlyZWN0aXZlcyxQaSksbShobi5vcHRpb25zLmNvbXBvbmVudHMscWkpLGhuLnByb3RvdHlwZS5fX3BhdGNoX189Qj9PaTokLGhuLnByb3RvdHlwZS4kbW91bnQ9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZT1lJiZCP0puKGUpOnZvaWQgMCxyPWUsaT10LChuPXRoaXMpLiRlbD1yLG4uJG9wdGlvbnMucmVuZGVyfHwobi4kb3B0aW9ucy5yZW5kZXI9ZmUpLF90KG4sImJlZm9yZU1vdW50IiksbmV3IFN0KG4sZnVuY3Rpb24oKXtuLl91cGRhdGUobi5fcmVuZGVyKCksaSl9LCQsbnVsbCwhMCksaT0hMSxudWxsPT1uLiR2bm9kZSYmKG4uX2lzTW91bnRlZD0hMCxfdChuLCJtb3VudGVkIikpLG47dmFyIG4scixpfSxCJiZzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ai5kZXZ0b29scyYmUSYmUS5lbWl0KCJpbml0Iixobil9LDApO3ZhciBXaT0vXHtceygoPzoufFxuKSs/KVx9XH0vZyxHaT0vWy0uKis/XiR7fSgpfFtcXVwvXFxdL2csWmk9ZShmdW5jdGlvbihlKXt2YXIgdD1lWzBdLnJlcGxhY2UoR2ksIlxcJCYiKSxuPWVbMV0ucmVwbGFjZShHaSwiXFwkJiIpO3JldHVybiBuZXcgUmVnRXhwKHQrIigoPzoufFxcbikrPykiK24sImciKX0pO3ZhciBYaT17c3RhdGljS2V5czpbInN0YXRpY0NsYXNzIl0sdHJhbnNmb3JtTm9kZTpmdW5jdGlvbihlLHQpe3Qud2Fybjt2YXIgbj1TcihlLCJjbGFzcyIpO24mJihlLnN0YXRpY0NsYXNzPUpTT04uc3RyaW5naWZ5KG4pKTt2YXIgcj1PcihlLCJjbGFzcyIsITEpO3ImJihlLmNsYXNzQmluZGluZz1yKX0sZ2VuRGF0YTpmdW5jdGlvbihlKXt2YXIgdD0iIjtyZXR1cm4gZS5zdGF0aWNDbGFzcyYmKHQrPSJzdGF0aWNDbGFzczoiK2Uuc3RhdGljQ2xhc3MrIiwiKSxlLmNsYXNzQmluZGluZyYmKHQrPSJjbGFzczoiK2UuY2xhc3NCaW5kaW5nKyIsIiksdH19O3ZhciBZaSxRaT17c3RhdGljS2V5czpbInN0YXRpY1N0eWxlIl0sdHJhbnNmb3JtTm9kZTpmdW5jdGlvbihlLHQpe3Qud2Fybjt2YXIgbj1TcihlLCJzdHlsZSIpO24mJihlLnN0YXRpY1N0eWxlPUpTT04uc3RyaW5naWZ5KEtyKG4pKSk7dmFyIHI9T3IoZSwic3R5bGUiLCExKTtyJiYoZS5zdHlsZUJpbmRpbmc9cil9LGdlbkRhdGE6ZnVuY3Rpb24oZSl7dmFyIHQ9IiI7cmV0dXJuIGUuc3RhdGljU3R5bGUmJih0Kz0ic3RhdGljU3R5bGU6IitlLnN0YXRpY1N0eWxlKyIsIiksZS5zdHlsZUJpbmRpbmcmJih0Kz0ic3R5bGU6KCIrZS5zdHlsZUJpbmRpbmcrIiksIiksdH19LGVvPWZ1bmN0aW9uKGUpe3JldHVybihZaT1ZaXx8ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IikpLmlubmVySFRNTD1lLFlpLnRleHRDb250ZW50fSx0bz1zKCJhcmVhLGJhc2UsYnIsY29sLGVtYmVkLGZyYW1lLGhyLGltZyxpbnB1dCxpc2luZGV4LGtleWdlbixsaW5rLG1ldGEscGFyYW0sc291cmNlLHRyYWNrLHdiciIpLG5vPXMoImNvbGdyb3VwLGRkLGR0LGxpLG9wdGlvbnMscCx0ZCx0Zm9vdCx0aCx0aGVhZCx0cixzb3VyY2UiKSxybz1zKCJhZGRyZXNzLGFydGljbGUsYXNpZGUsYmFzZSxibG9ja3F1b3RlLGJvZHksY2FwdGlvbixjb2wsY29sZ3JvdXAsZGQsZGV0YWlscyxkaWFsb2csZGl2LGRsLGR0LGZpZWxkc2V0LGZpZ2NhcHRpb24sZmlndXJlLGZvb3Rlcixmb3JtLGgxLGgyLGgzLGg0LGg1LGg2LGhlYWQsaGVhZGVyLGhncm91cCxocixodG1sLGxlZ2VuZCxsaSxtZW51aXRlbSxtZXRhLG9wdGdyb3VwLG9wdGlvbixwYXJhbSxycCxydCxzb3VyY2Usc3R5bGUsc3VtbWFyeSx0Ym9keSx0ZCx0Zm9vdCx0aCx0aGVhZCx0aXRsZSx0cix0cmFjayIpLGlvPS9eXHMqKFteXHMiJzw+XC89XSspKD86XHMqKD0pXHMqKD86IihbXiJdKikiK3wnKFteJ10qKScrfChbXlxzIic9PD5gXSspKSk/Lyxvbz0iW2EtekEtWl9dW1xcd1xcLVxcLl0qIixhbz0iKCg/OiIrb28rIlxcOik/IitvbysiKSIsc289bmV3IFJlZ0V4cCgiXjwiK2FvKSxjbz0vXlxzKihcLz8pPi8sbG89bmV3IFJlZ0V4cCgiXjxcXC8iK2FvKyJbXj5dKj4iKSx1bz0vXjwhRE9DVFlQRSBbXj5dKz4vaSxmbz0vXjwhXC0tLyxwbz0vXjwhXFsvLHZvPSExOyJ4Ii5yZXBsYWNlKC94KC4pPy9nLGZ1bmN0aW9uKGUsdCl7dm89IiI9PT10fSk7dmFyIGhvPXMoInNjcmlwdCxzdHlsZSx0ZXh0YXJlYSIsITApLG1vPXt9LHlvPXsiJmx0OyI6IjwiLCImZ3Q7IjoiPiIsIiZxdW90OyI6JyInLCImYW1wOyI6IiYiLCImIzEwOyI6IlxuIiwiJiM5OyI6Ilx0In0sZ289LyYoPzpsdHxndHxxdW90fGFtcCk7L2csX289LyYoPzpsdHxndHxxdW90fGFtcHwjMTB8IzkpOy9nLGJvPXMoInByZSx0ZXh0YXJlYSIsITApLCRvPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUmJmJvKGUpJiYiXG4iPT09dFswXX07dmFyIHdvLENvLHhvLGtvLEFvLE9vLFNvLFRvLEVvPS9eQHxedi1vbjovLGpvPS9edi18XkB8XjovLE5vPS8oW15dKj8pXHMrKD86aW58b2YpXHMrKFteXSopLyxMbz0vLChbXixcfVxdXSopKD86LChbXixcfVxdXSopKT8kLyxJbz0vXlwofFwpJC9nLE1vPS86KC4qKSQvLERvPS9eOnxedi1iaW5kOi8sUG89L1wuW14uXSsvZyxGbz1lKGVvKTtmdW5jdGlvbiBSbyhlLHQsbil7cmV0dXJue3R5cGU6MSx0YWc6ZSxhdHRyc0xpc3Q6dCxhdHRyc01hcDpmdW5jdGlvbihlKXtmb3IodmFyIHQ9e30sbj0wLHI9ZS5sZW5ndGg7bjxyO24rKyl0W2Vbbl0ubmFtZV09ZVtuXS52YWx1ZTtyZXR1cm4gdH0odCkscGFyZW50Om4sY2hpbGRyZW46W119fWZ1bmN0aW9uIEhvKGUscCl7d289cC53YXJufHwkcixPbz1wLmlzUHJlVGFnfHxPLFNvPXAubXVzdFVzZVByb3B8fE8sVG89cC5nZXRUYWdOYW1lc3BhY2V8fE8seG89d3IocC5tb2R1bGVzLCJ0cmFuc2Zvcm1Ob2RlIiksa289d3IocC5tb2R1bGVzLCJwcmVUcmFuc2Zvcm1Ob2RlIiksQW89d3IocC5tb2R1bGVzLCJwb3N0VHJhbnNmb3JtTm9kZSIpLENvPXAuZGVsaW1pdGVyczt2YXIgZCx2LGg9W10saT0hMSE9PXAucHJlc2VydmVXaGl0ZXNwYWNlLG09ITEseT0hMTtmdW5jdGlvbiBnKGUpe2UucHJlJiYobT0hMSksT28oZS50YWcpJiYoeT0hMSk7Zm9yKHZhciB0PTA7dDxBby5sZW5ndGg7dCsrKUFvW3RdKGUscCl9cmV0dXJuIGZ1bmN0aW9uKGksZCl7Zm9yKHZhciBlLHYsaD1bXSxtPWQuZXhwZWN0SFRNTCx5PWQuaXNVbmFyeVRhZ3x8TyxnPWQuY2FuQmVMZWZ0T3BlblRhZ3x8TyxhPTA7aTspe2lmKGU9aSx2JiZobyh2KSl7dmFyIHI9MCxvPXYudG9Mb3dlckNhc2UoKSx0PW1vW29dfHwobW9bb109bmV3IFJlZ0V4cCgiKFtcXHNcXFNdKj8pKDwvIitvKyJbXj5dKj4pIiwiaSIpKSxuPWkucmVwbGFjZSh0LGZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gcj1uLmxlbmd0aCxobyhvKXx8Im5vc2NyaXB0Ij09PW98fCh0PXQucmVwbGFjZSgvPCFcLS0oW1xzXFNdKj8pLS0+L2csIiQxIikucmVwbGFjZSgvPCFcW0NEQVRBXFsoW1xzXFNdKj8pXV0+L2csIiQxIikpLCRvKG8sdCkmJih0PXQuc2xpY2UoMSkpLGQuY2hhcnMmJmQuY2hhcnModCksIiJ9KTthKz1pLmxlbmd0aC1uLmxlbmd0aCxpPW4sQShvLGEtcixhKX1lbHNle3ZhciBzPWkuaW5kZXhPZigiPCIpO2lmKDA9PT1zKXtpZihmby50ZXN0KGkpKXt2YXIgYz1pLmluZGV4T2YoIi0tXHgzZSIpO2lmKDA8PWMpe2Quc2hvdWxkS2VlcENvbW1lbnQmJmQuY29tbWVudChpLnN1YnN0cmluZyg0LGMpKSxDKGMrMyk7Y29udGludWV9fWlmKHBvLnRlc3QoaSkpe3ZhciBsPWkuaW5kZXhPZigiXT4iKTtpZigwPD1sKXtDKGwrMik7Y29udGludWV9fXZhciB1PWkubWF0Y2godW8pO2lmKHUpe0ModVswXS5sZW5ndGgpO2NvbnRpbnVlfXZhciBmPWkubWF0Y2gobG8pO2lmKGYpe3ZhciBwPWE7QyhmWzBdLmxlbmd0aCksQShmWzFdLHAsYSk7Y29udGludWV9dmFyIF89eCgpO2lmKF8pe2soXyksJG8odixpKSYmQygxKTtjb250aW51ZX19dmFyIGI9dm9pZCAwLCQ9dm9pZCAwLHc9dm9pZCAwO2lmKDA8PXMpe2ZvcigkPWkuc2xpY2Uocyk7IShsby50ZXN0KCQpfHxzby50ZXN0KCQpfHxmby50ZXN0KCQpfHxwby50ZXN0KCQpfHwodz0kLmluZGV4T2YoIjwiLDEpKTwwKTspcys9dywkPWkuc2xpY2Uocyk7Yj1pLnN1YnN0cmluZygwLHMpLEMocyl9czwwJiYoYj1pLGk9IiIpLGQuY2hhcnMmJmImJmQuY2hhcnMoYil9aWYoaT09PWUpe2QuY2hhcnMmJmQuY2hhcnMoaSk7YnJlYWt9fWZ1bmN0aW9uIEMoZSl7YSs9ZSxpPWkuc3Vic3RyaW5nKGUpfWZ1bmN0aW9uIHgoKXt2YXIgZT1pLm1hdGNoKHNvKTtpZihlKXt2YXIgdCxuLHI9e3RhZ05hbWU6ZVsxXSxhdHRyczpbXSxzdGFydDphfTtmb3IoQyhlWzBdLmxlbmd0aCk7ISh0PWkubWF0Y2goY28pKSYmKG49aS5tYXRjaChpbykpOylDKG5bMF0ubGVuZ3RoKSxyLmF0dHJzLnB1c2gobik7aWYodClyZXR1cm4gci51bmFyeVNsYXNoPXRbMV0sQyh0WzBdLmxlbmd0aCksci5lbmQ9YSxyfX1mdW5jdGlvbiBrKGUpe3ZhciB0PWUudGFnTmFtZSxuPWUudW5hcnlTbGFzaDttJiYoInAiPT09diYmcm8odCkmJkEodiksZyh0KSYmdj09PXQmJkEodCkpO2Zvcih2YXIgcixpLG8sYT15KHQpfHwhIW4scz1lLmF0dHJzLmxlbmd0aCxjPW5ldyBBcnJheShzKSxsPTA7bDxzO2wrKyl7dmFyIHU9ZS5hdHRyc1tsXTt2byYmLTE9PT11WzBdLmluZGV4T2YoJyIiJykmJigiIj09PXVbM10mJmRlbGV0ZSB1WzNdLCIiPT09dVs0XSYmZGVsZXRlIHVbNF0sIiI9PT11WzVdJiZkZWxldGUgdVs1XSk7dmFyIGY9dVszXXx8dVs0XXx8dVs1XXx8IiIscD0iYSI9PT10JiYiaHJlZiI9PT11WzFdP2Quc2hvdWxkRGVjb2RlTmV3bGluZXNGb3JIcmVmOmQuc2hvdWxkRGVjb2RlTmV3bGluZXM7Y1tsXT17bmFtZTp1WzFdLHZhbHVlOihyPWYsaT1wLG89aT9fbzpnbyxyLnJlcGxhY2UobyxmdW5jdGlvbihlKXtyZXR1cm4geW9bZV19KSl9fWF8fChoLnB1c2goe3RhZzp0LGxvd2VyQ2FzZWRUYWc6dC50b0xvd2VyQ2FzZSgpLGF0dHJzOmN9KSx2PXQpLGQuc3RhcnQmJmQuc3RhcnQodCxjLGEsZS5zdGFydCxlLmVuZCl9ZnVuY3Rpb24gQShlLHQsbil7dmFyIHIsaTtpZihudWxsPT10JiYodD1hKSxudWxsPT1uJiYobj1hKSxlJiYoaT1lLnRvTG93ZXJDYXNlKCkpLGUpZm9yKHI9aC5sZW5ndGgtMTswPD1yJiZoW3JdLmxvd2VyQ2FzZWRUYWchPT1pO3ItLSk7ZWxzZSByPTA7aWYoMDw9cil7Zm9yKHZhciBvPWgubGVuZ3RoLTE7cjw9bztvLS0pZC5lbmQmJmQuZW5kKGhbb10udGFnLHQsbik7aC5sZW5ndGg9cix2PXImJmhbci0xXS50YWd9ZWxzZSJiciI9PT1pP2Quc3RhcnQmJmQuc3RhcnQoZSxbXSwhMCx0LG4pOiJwIj09PWkmJihkLnN0YXJ0JiZkLnN0YXJ0KGUsW10sITEsdCxuKSxkLmVuZCYmZC5lbmQoZSx0LG4pKX1BKCl9KGUse3dhcm46d28sZXhwZWN0SFRNTDpwLmV4cGVjdEhUTUwsaXNVbmFyeVRhZzpwLmlzVW5hcnlUYWcsY2FuQmVMZWZ0T3BlblRhZzpwLmNhbkJlTGVmdE9wZW5UYWcsc2hvdWxkRGVjb2RlTmV3bGluZXM6cC5zaG91bGREZWNvZGVOZXdsaW5lcyxzaG91bGREZWNvZGVOZXdsaW5lc0ZvckhyZWY6cC5zaG91bGREZWNvZGVOZXdsaW5lc0ZvckhyZWYsc2hvdWxkS2VlcENvbW1lbnQ6cC5jb21tZW50cyxzdGFydDpmdW5jdGlvbihlLHQsbil7dmFyIHI9diYmdi5uc3x8VG8oZSk7SyYmInN2ZyI9PT1yJiYodD1mdW5jdGlvbihlKXtmb3IodmFyIHQ9W10sbj0wO248ZS5sZW5ndGg7bisrKXt2YXIgcj1lW25dO0tvLnRlc3Qoci5uYW1lKXx8KHIubmFtZT1yLm5hbWUucmVwbGFjZShKbywiIiksdC5wdXNoKHIpKX1yZXR1cm4gdH0odCkpO3ZhciBpLG8sYSxzLGMsbD1SbyhlLHQsdik7ciYmKGwubnM9ciksInN0eWxlIiE9PShpPWwpLnRhZyYmKCJzY3JpcHQiIT09aS50YWd8fGkuYXR0cnNNYXAudHlwZSYmInRleHQvamF2YXNjcmlwdCIhPT1pLmF0dHJzTWFwLnR5cGUpfHxZKCl8fChsLmZvcmJpZGRlbj0hMCk7Zm9yKHZhciB1PTA7dTxrby5sZW5ndGg7dSsrKWw9a29bdV0obCxwKXx8bDtpZihtfHwobnVsbCE9U3Iobz1sLCJ2LXByZSIpJiYoby5wcmU9ITApLGwucHJlJiYobT0hMCkpLE9vKGwudGFnKSYmKHk9ITApLG0/ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5hdHRyc0xpc3QubGVuZ3RoO2lmKHQpZm9yKHZhciBuPWUuYXR0cnM9bmV3IEFycmF5KHQpLHI9MDtyPHQ7cisrKW5bcl09e25hbWU6ZS5hdHRyc0xpc3Rbcl0ubmFtZSx2YWx1ZTpKU09OLnN0cmluZ2lmeShlLmF0dHJzTGlzdFtyXS52YWx1ZSl9O2Vsc2UgZS5wcmV8fChlLnBsYWluPSEwKX0obCk6bC5wcm9jZXNzZWR8fChVbyhsKSxmdW5jdGlvbihlKXt2YXIgdD1TcihlLCJ2LWlmIik7aWYodCllLmlmPXQsVm8oZSx7ZXhwOnQsYmxvY2s6ZX0pO2Vsc2V7bnVsbCE9U3IoZSwidi1lbHNlIikmJihlLmVsc2U9ITApO3ZhciBuPVNyKGUsInYtZWxzZS1pZiIpO24mJihlLmVsc2VpZj1uKX19KGwpLG51bGwhPVNyKGE9bCwidi1vbmNlIikmJihhLm9uY2U9ITApLEJvKGwscCkpLGQ/aC5sZW5ndGh8fGQuaWYmJihsLmVsc2VpZnx8bC5lbHNlKSYmVm8oZCx7ZXhwOmwuZWxzZWlmLGJsb2NrOmx9KTpkPWwsdiYmIWwuZm9yYmlkZGVuKWlmKGwuZWxzZWlmfHxsLmVsc2Upcz1sLChjPWZ1bmN0aW9uKGUpe3ZhciB0PWUubGVuZ3RoO2Zvcig7dC0tOyl7aWYoMT09PWVbdF0udHlwZSlyZXR1cm4gZVt0XTtlLnBvcCgpfX0odi5jaGlsZHJlbikpJiZjLmlmJiZWbyhjLHtleHA6cy5lbHNlaWYsYmxvY2s6c30pO2Vsc2UgaWYobC5zbG90U2NvcGUpe3YucGxhaW49ITE7dmFyIGY9bC5zbG90VGFyZ2V0fHwnImRlZmF1bHQiJzsodi5zY29wZWRTbG90c3x8KHYuc2NvcGVkU2xvdHM9e30pKVtmXT1sfWVsc2Ugdi5jaGlsZHJlbi5wdXNoKGwpLGwucGFyZW50PXY7bj9nKGwpOih2PWwsaC5wdXNoKGwpKX0sZW5kOmZ1bmN0aW9uKCl7dmFyIGU9aFtoLmxlbmd0aC0xXSx0PWUuY2hpbGRyZW5bZS5jaGlsZHJlbi5sZW5ndGgtMV07dCYmMz09PXQudHlwZSYmIiAiPT09dC50ZXh0JiYheSYmZS5jaGlsZHJlbi5wb3AoKSxoLmxlbmd0aC09MSx2PWhbaC5sZW5ndGgtMV0sZyhlKX0sY2hhcnM6ZnVuY3Rpb24oZSl7aWYodiYmKCFLfHwidGV4dGFyZWEiIT09di50YWd8fHYuYXR0cnNNYXAucGxhY2Vob2xkZXIhPT1lKSl7dmFyIHQsbixyPXYuY2hpbGRyZW47aWYoZT15fHxlLnRyaW0oKT8ic2NyaXB0Ij09PSh0PXYpLnRhZ3x8InN0eWxlIj09PXQudGFnP2U6Rm8oZSk6aSYmci5sZW5ndGg/IiAiOiIiKSFtJiYiICIhPT1lJiYobj1mdW5jdGlvbihlLHQpe3ZhciBuPXQ/WmkodCk6V2k7aWYobi50ZXN0KGUpKXtmb3IodmFyIHIsaSxvLGE9W10scz1bXSxjPW4ubGFzdEluZGV4PTA7cj1uLmV4ZWMoZSk7KXtjPChpPXIuaW5kZXgpJiYocy5wdXNoKG89ZS5zbGljZShjLGkpKSxhLnB1c2goSlNPTi5zdHJpbmdpZnkobykpKTt2YXIgbD1fcihyWzFdLnRyaW0oKSk7YS5wdXNoKCJfcygiK2wrIikiKSxzLnB1c2goeyJAYmluZGluZyI6bH0pLGM9aStyWzBdLmxlbmd0aH1yZXR1cm4gYzxlLmxlbmd0aCYmKHMucHVzaChvPWUuc2xpY2UoYykpLGEucHVzaChKU09OLnN0cmluZ2lmeShvKSkpLHtleHByZXNzaW9uOmEuam9pbigiKyIpLHRva2VuczpzfX19KGUsQ28pKT9yLnB1c2goe3R5cGU6MixleHByZXNzaW9uOm4uZXhwcmVzc2lvbix0b2tlbnM6bi50b2tlbnMsdGV4dDplfSk6IiAiPT09ZSYmci5sZW5ndGgmJiIgIj09PXJbci5sZW5ndGgtMV0udGV4dHx8ci5wdXNoKHt0eXBlOjMsdGV4dDplfSl9fSxjb21tZW50OmZ1bmN0aW9uKGUpe3YuY2hpbGRyZW4ucHVzaCh7dHlwZTozLHRleHQ6ZSxpc0NvbW1lbnQ6ITB9KX19KSxkfWZ1bmN0aW9uIEJvKGUsdCl7dmFyIG4scixpLG87KHI9T3Iobj1lLCJrZXkiKSkmJihuLmtleT1yKSxlLnBsYWluPSFlLmtleSYmIWUuYXR0cnNMaXN0Lmxlbmd0aCwobz1PcihpPWUsInJlZiIpKSYmKGkucmVmPW8saS5yZWZJbkZvcj1mdW5jdGlvbihlKXtmb3IodmFyIHQ9ZTt0Oyl7aWYodm9pZCAwIT09dC5mb3IpcmV0dXJuITA7dD10LnBhcmVudH1yZXR1cm4hMX0oaSkpLGZ1bmN0aW9uKGUpe2lmKCJzbG90Ij09PWUudGFnKWUuc2xvdE5hbWU9T3IoZSwibmFtZSIpO2Vsc2V7dmFyIHQ7InRlbXBsYXRlIj09PWUudGFnPyh0PVNyKGUsInNjb3BlIiksZS5zbG90U2NvcGU9dHx8U3IoZSwic2xvdC1zY29wZSIpKToodD1TcihlLCJzbG90LXNjb3BlIikpJiYoZS5zbG90U2NvcGU9dCk7dmFyIG49T3IoZSwic2xvdCIpO24mJihlLnNsb3RUYXJnZXQ9JyIiJz09PW4/JyJkZWZhdWx0Iic6biwidGVtcGxhdGUiPT09ZS50YWd8fGUuc2xvdFNjb3BlfHx4cihlLCJzbG90IixuKSl9fShlKSxmdW5jdGlvbihlKXt2YXIgdDsodD1PcihlLCJpcyIpKSYmKGUuY29tcG9uZW50PXQpO251bGwhPVNyKGUsImlubGluZS10ZW1wbGF0ZSIpJiYoZS5pbmxpbmVUZW1wbGF0ZT0hMCl9KGUpO2Zvcih2YXIgYT0wO2E8eG8ubGVuZ3RoO2ErKyllPXhvW2FdKGUsdCl8fGU7IWZ1bmN0aW9uKGUpe3ZhciB0LG4scixpLG8sYSxzLGM9ZS5hdHRyc0xpc3Q7Zm9yKHQ9MCxuPWMubGVuZ3RoO3Q8bjt0KyspaWYocj1pPWNbdF0ubmFtZSxvPWNbdF0udmFsdWUsam8udGVzdChyKSlpZihlLmhhc0JpbmRpbmdzPSEwLChhPXpvKHIpKSYmKHI9ci5yZXBsYWNlKFBvLCIiKSksRG8udGVzdChyKSlyPXIucmVwbGFjZShEbywiIiksbz1fcihvKSxzPSExLGEmJihhLnByb3AmJihzPSEwLCJpbm5lckh0bWwiPT09KHI9ZyhyKSkmJihyPSJpbm5lckhUTUwiKSksYS5jYW1lbCYmKHI9ZyhyKSksYS5zeW5jJiZBcihlLCJ1cGRhdGU6IitnKHIpLEVyKG8sIiRldmVudCIpKSksc3x8IWUuY29tcG9uZW50JiZTbyhlLnRhZyxlLmF0dHJzTWFwLnR5cGUscik/Q3IoZSxyLG8pOnhyKGUscixvKTtlbHNlIGlmKEVvLnRlc3Qocikpcj1yLnJlcGxhY2UoRW8sIiIpLEFyKGUscixvLGEsITEpO2Vsc2V7dmFyIGw9KHI9ci5yZXBsYWNlKGpvLCIiKSkubWF0Y2goTW8pLHU9bCYmbFsxXTt1JiYocj1yLnNsaWNlKDAsLSh1Lmxlbmd0aCsxKSkpLHA9cixkPWksdj1vLGg9dSxtPWEsKChmPWUpLmRpcmVjdGl2ZXN8fChmLmRpcmVjdGl2ZXM9W10pKS5wdXNoKHtuYW1lOnAscmF3TmFtZTpkLHZhbHVlOnYsYXJnOmgsbW9kaWZpZXJzOm19KSxmLnBsYWluPSExfWVsc2UgeHIoZSxyLEpTT04uc3RyaW5naWZ5KG8pKSwhZS5jb21wb25lbnQmJiJtdXRlZCI9PT1yJiZTbyhlLnRhZyxlLmF0dHJzTWFwLnR5cGUscikmJkNyKGUsciwidHJ1ZSIpO3ZhciBmLHAsZCx2LGgsbX0oZSl9ZnVuY3Rpb24gVW8oZSl7dmFyIHQ7aWYodD1TcihlLCJ2LWZvciIpKXt2YXIgbj1mdW5jdGlvbihlKXt2YXIgdD1lLm1hdGNoKE5vKTtpZighdClyZXR1cm47dmFyIG49e307bi5mb3I9dFsyXS50cmltKCk7dmFyIHI9dFsxXS50cmltKCkucmVwbGFjZShJbywiIiksaT1yLm1hdGNoKExvKTtpPyhuLmFsaWFzPXIucmVwbGFjZShMbywiIiksbi5pdGVyYXRvcjE9aVsxXS50cmltKCksaVsyXSYmKG4uaXRlcmF0b3IyPWlbMl0udHJpbSgpKSk6bi5hbGlhcz1yO3JldHVybiBufSh0KTtuJiZtKGUsbil9fWZ1bmN0aW9uIFZvKGUsdCl7ZS5pZkNvbmRpdGlvbnN8fChlLmlmQ29uZGl0aW9ucz1bXSksZS5pZkNvbmRpdGlvbnMucHVzaCh0KX1mdW5jdGlvbiB6byhlKXt2YXIgdD1lLm1hdGNoKFBvKTtpZih0KXt2YXIgbj17fTtyZXR1cm4gdC5mb3JFYWNoKGZ1bmN0aW9uKGUpe25bZS5zbGljZSgxKV09ITB9KSxufX12YXIgS289L154bWxuczpOU1xkKy8sSm89L15OU1xkKzovO2Z1bmN0aW9uIHFvKGUpe3JldHVybiBSbyhlLnRhZyxlLmF0dHJzTGlzdC5zbGljZSgpLGUucGFyZW50KX12YXIgV289W1hpLFFpLHtwcmVUcmFuc2Zvcm1Ob2RlOmZ1bmN0aW9uKGUsdCl7aWYoImlucHV0Ij09PWUudGFnKXt2YXIgbixyPWUuYXR0cnNNYXA7aWYoIXJbInYtbW9kZWwiXSlyZXR1cm47aWYoKHJbIjp0eXBlIl18fHJbInYtYmluZDp0eXBlIl0pJiYobj1PcihlLCJ0eXBlIikpLHIudHlwZXx8bnx8IXJbInYtYmluZCJdfHwobj0iKCIrclsidi1iaW5kIl0rIikudHlwZSIpLG4pe3ZhciBpPVNyKGUsInYtaWYiLCEwKSxvPWk/IiYmKCIraSsiKSI6IiIsYT1udWxsIT1TcihlLCJ2LWVsc2UiLCEwKSxzPVNyKGUsInYtZWxzZS1pZiIsITApLGM9cW8oZSk7VW8oYyksa3IoYywidHlwZSIsImNoZWNrYm94IiksQm8oYyx0KSxjLnByb2Nlc3NlZD0hMCxjLmlmPSIoIituKyIpPT09J2NoZWNrYm94JyIrbyxWbyhjLHtleHA6Yy5pZixibG9jazpjfSk7dmFyIGw9cW8oZSk7U3IobCwidi1mb3IiLCEwKSxrcihsLCJ0eXBlIiwicmFkaW8iKSxCbyhsLHQpLFZvKGMse2V4cDoiKCIrbisiKT09PSdyYWRpbyciK28sYmxvY2s6bH0pO3ZhciB1PXFvKGUpO3JldHVybiBTcih1LCJ2LWZvciIsITApLGtyKHUsIjp0eXBlIixuKSxCbyh1LHQpLFZvKGMse2V4cDppLGJsb2NrOnV9KSxhP2MuZWxzZT0hMDpzJiYoYy5lbHNlaWY9cyksY319fX1dO3ZhciBHbyxabyxYbyxZbz17ZXhwZWN0SFRNTDohMCxtb2R1bGVzOldvLGRpcmVjdGl2ZXM6e21vZGVsOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcixpLG8sYSxzLGMsbCx1LGYscCxkLHYsaCxtLHksZyxfPXQudmFsdWUsYj10Lm1vZGlmaWVycywkPWUudGFnLHc9ZS5hdHRyc01hcC50eXBlO2lmKGUuY29tcG9uZW50KXJldHVybiBUcihlLF8sYiksITE7aWYoInNlbGVjdCI9PT0kKWg9ZSxtPV8sZz0oZz0ndmFyICQkc2VsZWN0ZWRWYWwgPSBBcnJheS5wcm90b3R5cGUuZmlsdGVyLmNhbGwoJGV2ZW50LnRhcmdldC5vcHRpb25zLGZ1bmN0aW9uKG8pe3JldHVybiBvLnNlbGVjdGVkfSkubWFwKGZ1bmN0aW9uKG8pe3ZhciB2YWwgPSAiX3ZhbHVlIiBpbiBvID8gby5fdmFsdWUgOiBvLnZhbHVlO3JldHVybiAnKygoeT1iKSYmeS5udW1iZXI/Il9uKHZhbCkiOiJ2YWwiKSsifSk7IikrIiAiK0VyKG0sIiRldmVudC50YXJnZXQubXVsdGlwbGUgPyAkJHNlbGVjdGVkVmFsIDogJCRzZWxlY3RlZFZhbFswXSIpLEFyKGgsImNoYW5nZSIsZyxudWxsLCEwKTtlbHNlIGlmKCJpbnB1dCI9PT0kJiYiY2hlY2tib3giPT09dyljPWUsbD1fLGY9KHU9YikmJnUubnVtYmVyLHA9T3IoYywidmFsdWUiKXx8Im51bGwiLGQ9T3IoYywidHJ1ZS12YWx1ZSIpfHwidHJ1ZSIsdj1PcihjLCJmYWxzZS12YWx1ZSIpfHwiZmFsc2UiLENyKGMsImNoZWNrZWQiLCJBcnJheS5pc0FycmF5KCIrbCsiKT9faSgiK2wrIiwiK3ArIik+LTEiKygidHJ1ZSI9PT1kPyI6KCIrbCsiKSI6IjpfcSgiK2wrIiwiK2QrIikiKSksQXIoYywiY2hhbmdlIiwidmFyICQkYT0iK2wrIiwkJGVsPSRldmVudC50YXJnZXQsJCRjPSQkZWwuY2hlY2tlZD8oIitkKyIpOigiK3YrIik7aWYoQXJyYXkuaXNBcnJheSgkJGEpKXt2YXIgJCR2PSIrKGY/Il9uKCIrcCsiKSI6cCkrIiwkJGk9X2koJCRhLCQkdik7aWYoJCRlbC5jaGVja2VkKXskJGk8MCYmKCIrRXIobCwiJCRhLmNvbmNhdChbJCR2XSkiKSsiKX1lbHNleyQkaT4tMSYmKCIrRXIobCwiJCRhLnNsaWNlKDAsJCRpKS5jb25jYXQoJCRhLnNsaWNlKCQkaSsxKSkiKSsiKX19ZWxzZXsiK0VyKGwsIiQkYyIpKyJ9IixudWxsLCEwKTtlbHNlIGlmKCJpbnB1dCI9PT0kJiYicmFkaW8iPT09dylyPWUsaT1fLGE9KG89YikmJm8ubnVtYmVyLHM9T3IociwidmFsdWUiKXx8Im51bGwiLENyKHIsImNoZWNrZWQiLCJfcSgiK2krIiwiKyhzPWE/Il9uKCIrcysiKSI6cykrIikiKSxBcihyLCJjaGFuZ2UiLEVyKGkscyksbnVsbCwhMCk7ZWxzZSBpZigiaW5wdXQiPT09JHx8InRleHRhcmVhIj09PSQpIWZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1lLmF0dHJzTWFwLnR5cGUsaT1ufHx7fSxvPWkubGF6eSxhPWkubnVtYmVyLHM9aS50cmltLGM9IW8mJiJyYW5nZSIhPT1yLGw9bz8iY2hhbmdlIjoicmFuZ2UiPT09cj9QcjoiaW5wdXQiLHU9IiRldmVudC50YXJnZXQudmFsdWUiO3MmJih1PSIkZXZlbnQudGFyZ2V0LnZhbHVlLnRyaW0oKSIpLGEmJih1PSJfbigiK3UrIikiKTt2YXIgZj1Fcih0LHUpO2MmJihmPSJpZigkZXZlbnQudGFyZ2V0LmNvbXBvc2luZylyZXR1cm47IitmKSxDcihlLCJ2YWx1ZSIsIigiK3QrIikiKSxBcihlLGwsZixudWxsLCEwKSwoc3x8YSkmJkFyKGUsImJsdXIiLCIkZm9yY2VVcGRhdGUoKSIpfShlLF8sYik7ZWxzZSBpZighai5pc1Jlc2VydmVkVGFnKCQpKXJldHVybiBUcihlLF8sYiksITE7cmV0dXJuITB9LHRleHQ6ZnVuY3Rpb24oZSx0KXt0LnZhbHVlJiZDcihlLCJ0ZXh0Q29udGVudCIsIl9zKCIrdC52YWx1ZSsiKSIpfSxodG1sOmZ1bmN0aW9uKGUsdCl7dC52YWx1ZSYmQ3IoZSwiaW5uZXJIVE1MIiwiX3MoIit0LnZhbHVlKyIpIil9fSxpc1ByZVRhZzpmdW5jdGlvbihlKXtyZXR1cm4icHJlIj09PWV9LGlzVW5hcnlUYWc6dG8sbXVzdFVzZVByb3A6U24sY2FuQmVMZWZ0T3BlblRhZzpubyxpc1Jlc2VydmVkVGFnOlVuLGdldFRhZ05hbWVzcGFjZTpWbixzdGF0aWNLZXlzOihHbz1XbyxHby5yZWR1Y2UoZnVuY3Rpb24oZSx0KXtyZXR1cm4gZS5jb25jYXQodC5zdGF0aWNLZXlzfHxbXSl9LFtdKS5qb2luKCIsIikpfSxRbz1lKGZ1bmN0aW9uKGUpe3JldHVybiBzKCJ0eXBlLHRhZyxhdHRyc0xpc3QsYXR0cnNNYXAscGxhaW4scGFyZW50LGNoaWxkcmVuLGF0dHJzIisoZT8iLCIrZToiIikpfSk7ZnVuY3Rpb24gZWEoZSx0KXtlJiYoWm89UW8odC5zdGF0aWNLZXlzfHwiIiksWG89dC5pc1Jlc2VydmVkVGFnfHxPLGZ1bmN0aW9uIGUodCl7dC5zdGF0aWM9ZnVuY3Rpb24oZSl7aWYoMj09PWUudHlwZSlyZXR1cm4hMTtpZigzPT09ZS50eXBlKXJldHVybiEwO3JldHVybiEoIWUucHJlJiYoZS5oYXNCaW5kaW5nc3x8ZS5pZnx8ZS5mb3J8fGMoZS50YWcpfHwhWG8oZS50YWcpfHxmdW5jdGlvbihlKXtmb3IoO2UucGFyZW50Oyl7aWYoInRlbXBsYXRlIiE9PShlPWUucGFyZW50KS50YWcpcmV0dXJuITE7aWYoZS5mb3IpcmV0dXJuITB9cmV0dXJuITF9KGUpfHwhT2JqZWN0LmtleXMoZSkuZXZlcnkoWm8pKSl9KHQpO2lmKDE9PT10LnR5cGUpe2lmKCFYbyh0LnRhZykmJiJzbG90IiE9PXQudGFnJiZudWxsPT10LmF0dHJzTWFwWyJpbmxpbmUtdGVtcGxhdGUiXSlyZXR1cm47Zm9yKHZhciBuPTAscj10LmNoaWxkcmVuLmxlbmd0aDtuPHI7bisrKXt2YXIgaT10LmNoaWxkcmVuW25dO2UoaSksaS5zdGF0aWN8fCh0LnN0YXRpYz0hMSl9aWYodC5pZkNvbmRpdGlvbnMpZm9yKHZhciBvPTEsYT10LmlmQ29uZGl0aW9ucy5sZW5ndGg7bzxhO28rKyl7dmFyIHM9dC5pZkNvbmRpdGlvbnNbb10uYmxvY2s7ZShzKSxzLnN0YXRpY3x8KHQuc3RhdGljPSExKX19fShlKSxmdW5jdGlvbiBlKHQsbil7aWYoMT09PXQudHlwZSl7aWYoKHQuc3RhdGljfHx0Lm9uY2UpJiYodC5zdGF0aWNJbkZvcj1uKSx0LnN0YXRpYyYmdC5jaGlsZHJlbi5sZW5ndGgmJigxIT09dC5jaGlsZHJlbi5sZW5ndGh8fDMhPT10LmNoaWxkcmVuWzBdLnR5cGUpKXJldHVybiB2b2lkKHQuc3RhdGljUm9vdD0hMCk7aWYodC5zdGF0aWNSb290PSExLHQuY2hpbGRyZW4pZm9yKHZhciByPTAsaT10LmNoaWxkcmVuLmxlbmd0aDtyPGk7cisrKWUodC5jaGlsZHJlbltyXSxufHwhIXQuZm9yKTtpZih0LmlmQ29uZGl0aW9ucylmb3IodmFyIG89MSxhPXQuaWZDb25kaXRpb25zLmxlbmd0aDtvPGE7bysrKWUodC5pZkNvbmRpdGlvbnNbb10uYmxvY2ssbil9fShlLCExKSl9dmFyIHRhPS9eKFtcdyRfXSt8XChbXildKj9cKSlccyo9PnxeZnVuY3Rpb25ccypcKC8sbmE9L15bQS1aYS16XyRdW1x3JF0qKD86XC5bQS1aYS16XyRdW1x3JF0qfFxbJ1teJ10qPyddfFxbIlteIl0qPyJdfFxbXGQrXXxcW1tBLVphLXpfJF1bXHckXSpdKSokLyxyYT17ZXNjOjI3LHRhYjo5LGVudGVyOjEzLHNwYWNlOjMyLHVwOjM4LGxlZnQ6MzcscmlnaHQ6MzksZG93bjo0MCxkZWxldGU6WzgsNDZdfSxpYT17ZXNjOiJFc2NhcGUiLHRhYjoiVGFiIixlbnRlcjoiRW50ZXIiLHNwYWNlOiIgIix1cDpbIlVwIiwiQXJyb3dVcCJdLGxlZnQ6WyJMZWZ0IiwiQXJyb3dMZWZ0Il0scmlnaHQ6WyJSaWdodCIsIkFycm93UmlnaHQiXSxkb3duOlsiRG93biIsIkFycm93RG93biJdLGRlbGV0ZTpbIkJhY2tzcGFjZSIsIkRlbGV0ZSJdfSxvYT1mdW5jdGlvbihlKXtyZXR1cm4iaWYoIitlKyIpcmV0dXJuIG51bGw7In0sYWE9e3N0b3A6IiRldmVudC5zdG9wUHJvcGFnYXRpb24oKTsiLHByZXZlbnQ6IiRldmVudC5wcmV2ZW50RGVmYXVsdCgpOyIsc2VsZjpvYSgiJGV2ZW50LnRhcmdldCAhPT0gJGV2ZW50LmN1cnJlbnRUYXJnZXQiKSxjdHJsOm9hKCIhJGV2ZW50LmN0cmxLZXkiKSxzaGlmdDpvYSgiISRldmVudC5zaGlmdEtleSIpLGFsdDpvYSgiISRldmVudC5hbHRLZXkiKSxtZXRhOm9hKCIhJGV2ZW50Lm1ldGFLZXkiKSxsZWZ0Om9hKCInYnV0dG9uJyBpbiAkZXZlbnQgJiYgJGV2ZW50LmJ1dHRvbiAhPT0gMCIpLG1pZGRsZTpvYSgiJ2J1dHRvbicgaW4gJGV2ZW50ICYmICRldmVudC5idXR0b24gIT09IDEiKSxyaWdodDpvYSgiJ2J1dHRvbicgaW4gJGV2ZW50ICYmICRldmVudC5idXR0b24gIT09IDIiKX07ZnVuY3Rpb24gc2EoZSx0LG4pe3ZhciByPXQ/Im5hdGl2ZU9uOnsiOiJvbjp7Ijtmb3IodmFyIGkgaW4gZSlyKz0nIicraSsnIjonK2NhKGksZVtpXSkrIiwiO3JldHVybiByLnNsaWNlKDAsLTEpKyJ9In1mdW5jdGlvbiBjYSh0LGUpe2lmKCFlKXJldHVybiJmdW5jdGlvbigpe30iO2lmKEFycmF5LmlzQXJyYXkoZSkpcmV0dXJuIlsiK2UubWFwKGZ1bmN0aW9uKGUpe3JldHVybiBjYSh0LGUpfSkuam9pbigiLCIpKyJdIjt2YXIgbj1uYS50ZXN0KGUudmFsdWUpLHI9dGEudGVzdChlLnZhbHVlKTtpZihlLm1vZGlmaWVycyl7dmFyIGk9IiIsbz0iIixhPVtdO2Zvcih2YXIgcyBpbiBlLm1vZGlmaWVycylpZihhYVtzXSlvKz1hYVtzXSxyYVtzXSYmYS5wdXNoKHMpO2Vsc2UgaWYoImV4YWN0Ij09PXMpe3ZhciBjPWUubW9kaWZpZXJzO28rPW9hKFsiY3RybCIsInNoaWZ0IiwiYWx0IiwibWV0YSJdLmZpbHRlcihmdW5jdGlvbihlKXtyZXR1cm4hY1tlXX0pLm1hcChmdW5jdGlvbihlKXtyZXR1cm4iJGV2ZW50LiIrZSsiS2V5In0pLmpvaW4oInx8IikpfWVsc2UgYS5wdXNoKHMpO3JldHVybiBhLmxlbmd0aCYmKGkrPSJpZighKCdidXR0b24nIGluICRldmVudCkmJiIrYS5tYXAobGEpLmpvaW4oIiYmIikrIilyZXR1cm4gbnVsbDsiKSxvJiYoaSs9byksImZ1bmN0aW9uKCRldmVudCl7IitpKyhuPyJyZXR1cm4gIitlLnZhbHVlKyIoJGV2ZW50KSI6cj8icmV0dXJuICgiK2UudmFsdWUrIikoJGV2ZW50KSI6ZS52YWx1ZSkrIn0ifXJldHVybiBufHxyP2UudmFsdWU6ImZ1bmN0aW9uKCRldmVudCl7IitlLnZhbHVlKyJ9In1mdW5jdGlvbiBsYShlKXt2YXIgdD1wYXJzZUludChlLDEwKTtpZih0KXJldHVybiIkZXZlbnQua2V5Q29kZSE9PSIrdDt2YXIgbj1yYVtlXSxyPWlhW2VdO3JldHVybiJfaygkZXZlbnQua2V5Q29kZSwiK0pTT04uc3RyaW5naWZ5KGUpKyIsIitKU09OLnN0cmluZ2lmeShuKSsiLCRldmVudC5rZXksIitKU09OLnN0cmluZ2lmeShyKSsiKSJ9dmFyIHVhPXtvbjpmdW5jdGlvbihlLHQpe2Uud3JhcExpc3RlbmVycz1mdW5jdGlvbihlKXtyZXR1cm4iX2coIitlKyIsIit0LnZhbHVlKyIpIn19LGJpbmQ6ZnVuY3Rpb24odCxuKXt0LndyYXBEYXRhPWZ1bmN0aW9uKGUpe3JldHVybiJfYigiK2UrIiwnIit0LnRhZysiJywiK24udmFsdWUrIiwiKyhuLm1vZGlmaWVycyYmbi5tb2RpZmllcnMucHJvcD8idHJ1ZSI6ImZhbHNlIikrKG4ubW9kaWZpZXJzJiZuLm1vZGlmaWVycy5zeW5jPyIsdHJ1ZSI6IiIpKyIpIn19LGNsb2FrOiR9LGZhPWZ1bmN0aW9uKGUpe3RoaXMub3B0aW9ucz1lLHRoaXMud2Fybj1lLndhcm58fCRyLHRoaXMudHJhbnNmb3Jtcz13cihlLm1vZHVsZXMsInRyYW5zZm9ybUNvZGUiKSx0aGlzLmRhdGFHZW5GbnM9d3IoZS5tb2R1bGVzLCJnZW5EYXRhIiksdGhpcy5kaXJlY3RpdmVzPW0obSh7fSx1YSksZS5kaXJlY3RpdmVzKTt2YXIgdD1lLmlzUmVzZXJ2ZWRUYWd8fE87dGhpcy5tYXliZUNvbXBvbmVudD1mdW5jdGlvbihlKXtyZXR1cm4hdChlLnRhZyl9LHRoaXMub25jZUlkPTAsdGhpcy5zdGF0aWNSZW5kZXJGbnM9W119O2Z1bmN0aW9uIHBhKGUsdCl7dmFyIG49bmV3IGZhKHQpO3JldHVybntyZW5kZXI6IndpdGgodGhpcyl7cmV0dXJuICIrKGU/ZGEoZSxuKTonX2MoImRpdiIpJykrIn0iLHN0YXRpY1JlbmRlckZuczpuLnN0YXRpY1JlbmRlckZuc319ZnVuY3Rpb24gZGEoZSx0KXtpZihlLnN0YXRpY1Jvb3QmJiFlLnN0YXRpY1Byb2Nlc3NlZClyZXR1cm4gdmEoZSx0KTtpZihlLm9uY2UmJiFlLm9uY2VQcm9jZXNzZWQpcmV0dXJuIGhhKGUsdCk7aWYoZS5mb3ImJiFlLmZvclByb2Nlc3NlZClyZXR1cm4gZj10LHY9KHU9ZSkuZm9yLGg9dS5hbGlhcyxtPXUuaXRlcmF0b3IxPyIsIit1Lml0ZXJhdG9yMToiIix5PXUuaXRlcmF0b3IyPyIsIit1Lml0ZXJhdG9yMjoiIix1LmZvclByb2Nlc3NlZD0hMCwoZHx8Il9sIikrIigoIit2KyIpLGZ1bmN0aW9uKCIraCttK3krIil7cmV0dXJuICIrKHB8fGRhKSh1LGYpKyJ9KSI7aWYoZS5pZiYmIWUuaWZQcm9jZXNzZWQpcmV0dXJuIG1hKGUsdCk7aWYoInRlbXBsYXRlIiE9PWUudGFnfHxlLnNsb3RUYXJnZXQpe2lmKCJzbG90Ij09PWUudGFnKXJldHVybiBmdW5jdGlvbihlLHQpe3ZhciBuPWUuc2xvdE5hbWV8fCciZGVmYXVsdCInLHI9X2EoZSx0KSxpPSJfdCgiK24rKHI/IiwiK3I6IiIpLG89ZS5hdHRycyYmInsiK2UuYXR0cnMubWFwKGZ1bmN0aW9uKGUpe3JldHVybiBnKGUubmFtZSkrIjoiK2UudmFsdWV9KS5qb2luKCIsIikrIn0iLGE9ZS5hdHRyc01hcFsidi1iaW5kIl07IW8mJiFhfHxyfHwoaSs9IixudWxsIik7byYmKGkrPSIsIitvKTthJiYoaSs9KG8/IiI6IixudWxsIikrIiwiK2EpO3JldHVybiBpKyIpIn0oZSx0KTt2YXIgbjtpZihlLmNvbXBvbmVudClhPWUuY29tcG9uZW50LGM9dCxsPShzPWUpLmlubGluZVRlbXBsYXRlP251bGw6X2EocyxjLCEwKSxuPSJfYygiK2ErIiwiK3lhKHMsYykrKGw/IiwiK2w6IiIpKyIpIjtlbHNle3ZhciByPWUucGxhaW4/dm9pZCAwOnlhKGUsdCksaT1lLmlubGluZVRlbXBsYXRlP251bGw6X2EoZSx0LCEwKTtuPSJfYygnIitlLnRhZysiJyIrKHI/IiwiK3I6IiIpKyhpPyIsIitpOiIiKSsiKSJ9Zm9yKHZhciBvPTA7bzx0LnRyYW5zZm9ybXMubGVuZ3RoO28rKyluPXQudHJhbnNmb3Jtc1tvXShlLG4pO3JldHVybiBufXJldHVybiBfYShlLHQpfHwidm9pZCAwIjt2YXIgYSxzLGMsbCx1LGYscCxkLHYsaCxtLHl9ZnVuY3Rpb24gdmEoZSx0KXtyZXR1cm4gZS5zdGF0aWNQcm9jZXNzZWQ9ITAsdC5zdGF0aWNSZW5kZXJGbnMucHVzaCgid2l0aCh0aGlzKXtyZXR1cm4gIitkYShlLHQpKyJ9IiksIl9tKCIrKHQuc3RhdGljUmVuZGVyRm5zLmxlbmd0aC0xKSsoZS5zdGF0aWNJbkZvcj8iLHRydWUiOiIiKSsiKSJ9ZnVuY3Rpb24gaGEoZSx0KXtpZihlLm9uY2VQcm9jZXNzZWQ9ITAsZS5pZiYmIWUuaWZQcm9jZXNzZWQpcmV0dXJuIG1hKGUsdCk7aWYoZS5zdGF0aWNJbkZvcil7Zm9yKHZhciBuPSIiLHI9ZS5wYXJlbnQ7cjspe2lmKHIuZm9yKXtuPXIua2V5O2JyZWFrfXI9ci5wYXJlbnR9cmV0dXJuIG4/Il9vKCIrZGEoZSx0KSsiLCIrdC5vbmNlSWQrKysiLCIrbisiKSI6ZGEoZSx0KX1yZXR1cm4gdmEoZSx0KX1mdW5jdGlvbiBtYShlLHQsbixyKXtyZXR1cm4gZS5pZlByb2Nlc3NlZD0hMCxmdW5jdGlvbiBlKHQsbixyLGkpe2lmKCF0Lmxlbmd0aClyZXR1cm4gaXx8Il9lKCkiO3ZhciBvPXQuc2hpZnQoKTtyZXR1cm4gby5leHA/IigiK28uZXhwKyIpPyIrYShvLmJsb2NrKSsiOiIrZSh0LG4scixpKToiIithKG8uYmxvY2spO2Z1bmN0aW9uIGEoZSl7cmV0dXJuIHI/cihlLG4pOmUub25jZT9oYShlLG4pOmRhKGUsbil9fShlLmlmQ29uZGl0aW9ucy5zbGljZSgpLHQsbixyKX1mdW5jdGlvbiB5YShlLHQpe3ZhciBuLHIsaT0ieyIsbz1mdW5jdGlvbihlLHQpe3ZhciBuPWUuZGlyZWN0aXZlcztpZighbilyZXR1cm47dmFyIHIsaSxvLGEscz0iZGlyZWN0aXZlczpbIixjPSExO2ZvcihyPTAsaT1uLmxlbmd0aDtyPGk7cisrKXtvPW5bcl0sYT0hMDt2YXIgbD10LmRpcmVjdGl2ZXNbby5uYW1lXTtsJiYoYT0hIWwoZSxvLHQud2FybikpLGEmJihjPSEwLHMrPSd7bmFtZToiJytvLm5hbWUrJyIscmF3TmFtZToiJytvLnJhd05hbWUrJyInKyhvLnZhbHVlPyIsdmFsdWU6KCIrby52YWx1ZSsiKSxleHByZXNzaW9uOiIrSlNPTi5zdHJpbmdpZnkoby52YWx1ZSk6IiIpKyhvLmFyZz8nLGFyZzoiJytvLmFyZysnIic6IiIpKyhvLm1vZGlmaWVycz8iLG1vZGlmaWVyczoiK0pTT04uc3RyaW5naWZ5KG8ubW9kaWZpZXJzKToiIikrIn0sIil9aWYoYylyZXR1cm4gcy5zbGljZSgwLC0xKSsiXSJ9KGUsdCk7byYmKGkrPW8rIiwiKSxlLmtleSYmKGkrPSJrZXk6IitlLmtleSsiLCIpLGUucmVmJiYoaSs9InJlZjoiK2UucmVmKyIsIiksZS5yZWZJbkZvciYmKGkrPSJyZWZJbkZvcjp0cnVlLCIpLGUucHJlJiYoaSs9InByZTp0cnVlLCIpLGUuY29tcG9uZW50JiYoaSs9J3RhZzoiJytlLnRhZysnIiwnKTtmb3IodmFyIGE9MDthPHQuZGF0YUdlbkZucy5sZW5ndGg7YSsrKWkrPXQuZGF0YUdlbkZuc1thXShlKTtpZihlLmF0dHJzJiYoaSs9ImF0dHJzOnsiK3dhKGUuYXR0cnMpKyJ9LCIpLGUucHJvcHMmJihpKz0iZG9tUHJvcHM6eyIrd2EoZS5wcm9wcykrIn0sIiksZS5ldmVudHMmJihpKz1zYShlLmV2ZW50cywhMSx0Lndhcm4pKyIsIiksZS5uYXRpdmVFdmVudHMmJihpKz1zYShlLm5hdGl2ZUV2ZW50cywhMCx0Lndhcm4pKyIsIiksZS5zbG90VGFyZ2V0JiYhZS5zbG90U2NvcGUmJihpKz0ic2xvdDoiK2Uuc2xvdFRhcmdldCsiLCIpLGUuc2NvcGVkU2xvdHMmJihpKz0obj1lLnNjb3BlZFNsb3RzLHI9dCwic2NvcGVkU2xvdHM6X3UoWyIrT2JqZWN0LmtleXMobikubWFwKGZ1bmN0aW9uKGUpe3JldHVybiBnYShlLG5bZV0scil9KS5qb2luKCIsIikrIl0pLCIpKSxlLm1vZGVsJiYoaSs9Im1vZGVsOnt2YWx1ZToiK2UubW9kZWwudmFsdWUrIixjYWxsYmFjazoiK2UubW9kZWwuY2FsbGJhY2srIixleHByZXNzaW9uOiIrZS5tb2RlbC5leHByZXNzaW9uKyJ9LCIpLGUuaW5saW5lVGVtcGxhdGUpe3ZhciBzPWZ1bmN0aW9uKGUsdCl7dmFyIG49ZS5jaGlsZHJlblswXTtpZigxPT09bi50eXBlKXt2YXIgcj1wYShuLHQub3B0aW9ucyk7cmV0dXJuImlubGluZVRlbXBsYXRlOntyZW5kZXI6ZnVuY3Rpb24oKXsiK3IucmVuZGVyKyJ9LHN0YXRpY1JlbmRlckZuczpbIityLnN0YXRpY1JlbmRlckZucy5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuImZ1bmN0aW9uKCl7IitlKyJ9In0pLmpvaW4oIiwiKSsiXX0ifX0oZSx0KTtzJiYoaSs9cysiLCIpfXJldHVybiBpPWkucmVwbGFjZSgvLCQvLCIiKSsifSIsZS53cmFwRGF0YSYmKGk9ZS53cmFwRGF0YShpKSksZS53cmFwTGlzdGVuZXJzJiYoaT1lLndyYXBMaXN0ZW5lcnMoaSkpLGl9ZnVuY3Rpb24gZ2EoZSx0LG4pe3JldHVybiB0LmZvciYmIXQuZm9yUHJvY2Vzc2VkPyhyPWUsbz1uLGE9KGk9dCkuZm9yLHM9aS5hbGlhcyxjPWkuaXRlcmF0b3IxPyIsIitpLml0ZXJhdG9yMToiIixsPWkuaXRlcmF0b3IyPyIsIitpLml0ZXJhdG9yMjoiIixpLmZvclByb2Nlc3NlZD0hMCwiX2woKCIrYSsiKSxmdW5jdGlvbigiK3MrYytsKyIpe3JldHVybiAiK2dhKHIsaSxvKSsifSkiKToie2tleToiK2UrIixmbjoiKygiZnVuY3Rpb24oIitTdHJpbmcodC5zbG90U2NvcGUpKyIpe3JldHVybiAiKygidGVtcGxhdGUiPT09dC50YWc/dC5pZj90LmlmKyI/IisoX2EodCxuKXx8InVuZGVmaW5lZCIpKyI6dW5kZWZpbmVkIjpfYSh0LG4pfHwidW5kZWZpbmVkIjpkYSh0LG4pKSsifSIpKyJ9Ijt2YXIgcixpLG8sYSxzLGMsbH1mdW5jdGlvbiBfYShlLHQsbixyLGkpe3ZhciBvPWUuY2hpbGRyZW47aWYoby5sZW5ndGgpe3ZhciBhPW9bMF07aWYoMT09PW8ubGVuZ3RoJiZhLmZvciYmInRlbXBsYXRlIiE9PWEudGFnJiYic2xvdCIhPT1hLnRhZylyZXR1cm4ocnx8ZGEpKGEsdCk7dmFyIHM9bj9mdW5jdGlvbihlLHQpe2Zvcih2YXIgbj0wLHI9MDtyPGUubGVuZ3RoO3IrKyl7dmFyIGk9ZVtyXTtpZigxPT09aS50eXBlKXtpZihiYShpKXx8aS5pZkNvbmRpdGlvbnMmJmkuaWZDb25kaXRpb25zLnNvbWUoZnVuY3Rpb24oZSl7cmV0dXJuIGJhKGUuYmxvY2spfSkpe249MjticmVha30odChpKXx8aS5pZkNvbmRpdGlvbnMmJmkuaWZDb25kaXRpb25zLnNvbWUoZnVuY3Rpb24oZSl7cmV0dXJuIHQoZS5ibG9jayl9KSkmJihuPTEpfX1yZXR1cm4gbn0obyx0Lm1heWJlQ29tcG9uZW50KTowLGM9aXx8JGE7cmV0dXJuIlsiK28ubWFwKGZ1bmN0aW9uKGUpe3JldHVybiBjKGUsdCl9KS5qb2luKCIsIikrIl0iKyhzPyIsIitzOiIiKX19ZnVuY3Rpb24gYmEoZSl7cmV0dXJuIHZvaWQgMCE9PWUuZm9yfHwidGVtcGxhdGUiPT09ZS50YWd8fCJzbG90Ij09PWUudGFnfWZ1bmN0aW9uICRhKGUsdCl7cmV0dXJuIDE9PT1lLnR5cGU/ZGEoZSx0KTozPT09ZS50eXBlJiZlLmlzQ29tbWVudD8ocj1lLCJfZSgiK0pTT04uc3RyaW5naWZ5KHIudGV4dCkrIikiKToiX3YoIisoMj09PShuPWUpLnR5cGU/bi5leHByZXNzaW9uOkNhKEpTT04uc3RyaW5naWZ5KG4udGV4dCkpKSsiKSI7dmFyIG4scn1mdW5jdGlvbiB3YShlKXtmb3IodmFyIHQ9IiIsbj0wO248ZS5sZW5ndGg7bisrKXt2YXIgcj1lW25dO3QrPSciJytyLm5hbWUrJyI6JytDYShyLnZhbHVlKSsiLCJ9cmV0dXJuIHQuc2xpY2UoMCwtMSl9ZnVuY3Rpb24gQ2EoZSl7cmV0dXJuIGUucmVwbGFjZSgvXHUyMDI4L2csIlxcdTIwMjgiKS5yZXBsYWNlKC9cdTIwMjkvZywiXFx1MjAyOSIpfW5ldyBSZWdFeHAoIlxcYiIrImRvLGlmLGZvcixsZXQsbmV3LHRyeSx2YXIsY2FzZSxlbHNlLHdpdGgsYXdhaXQsYnJlYWssY2F0Y2gsY2xhc3MsY29uc3Qsc3VwZXIsdGhyb3csd2hpbGUseWllbGQsZGVsZXRlLGV4cG9ydCxpbXBvcnQscmV0dXJuLHN3aXRjaCxkZWZhdWx0LGV4dGVuZHMsZmluYWxseSxjb250aW51ZSxkZWJ1Z2dlcixmdW5jdGlvbixhcmd1bWVudHMiLnNwbGl0KCIsIikuam9pbigiXFxifFxcYiIpKyJcXGIiKSxuZXcgUmVnRXhwKCJcXGIiKyJkZWxldGUsdHlwZW9mLHZvaWQiLnNwbGl0KCIsIikuam9pbigiXFxzKlxcKFteXFwpXSpcXCl8XFxiIikrIlxccypcXChbXlxcKV0qXFwpIik7ZnVuY3Rpb24geGEodCxuKXt0cnl7cmV0dXJuIG5ldyBGdW5jdGlvbih0KX1jYXRjaChlKXtyZXR1cm4gbi5wdXNoKHtlcnI6ZSxjb2RlOnR9KSwkfX12YXIga2EsQWEsT2E9KGthPWZ1bmN0aW9uKGUsdCl7dmFyIG49SG8oZS50cmltKCksdCk7ITEhPT10Lm9wdGltaXplJiZlYShuLHQpO3ZhciByPXBhKG4sdCk7cmV0dXJue2FzdDpuLHJlbmRlcjpyLnJlbmRlcixzdGF0aWNSZW5kZXJGbnM6ci5zdGF0aWNSZW5kZXJGbnN9fSxmdW5jdGlvbihzKXtmdW5jdGlvbiBlKGUsdCl7dmFyIG49T2JqZWN0LmNyZWF0ZShzKSxyPVtdLGk9W107aWYobi53YXJuPWZ1bmN0aW9uKGUsdCl7KHQ/aTpyKS5wdXNoKGUpfSx0KWZvcih2YXIgbyBpbiB0Lm1vZHVsZXMmJihuLm1vZHVsZXM9KHMubW9kdWxlc3x8W10pLmNvbmNhdCh0Lm1vZHVsZXMpKSx0LmRpcmVjdGl2ZXMmJihuLmRpcmVjdGl2ZXM9bShPYmplY3QuY3JlYXRlKHMuZGlyZWN0aXZlc3x8bnVsbCksdC5kaXJlY3RpdmVzKSksdCkibW9kdWxlcyIhPT1vJiYiZGlyZWN0aXZlcyIhPT1vJiYobltvXT10W29dKTt2YXIgYT1rYShlLG4pO3JldHVybiBhLmVycm9ycz1yLGEudGlwcz1pLGF9cmV0dXJue2NvbXBpbGU6ZSxjb21waWxlVG9GdW5jdGlvbnM6KGM9ZSxsPU9iamVjdC5jcmVhdGUobnVsbCksZnVuY3Rpb24oZSx0LG4peyh0PW0oe30sdCkpLndhcm4sZGVsZXRlIHQud2Fybjt2YXIgcj10LmRlbGltaXRlcnM/U3RyaW5nKHQuZGVsaW1pdGVycykrZTplO2lmKGxbcl0pcmV0dXJuIGxbcl07dmFyIGk9YyhlLHQpLG89e30sYT1bXTtyZXR1cm4gby5yZW5kZXI9eGEoaS5yZW5kZXIsYSksby5zdGF0aWNSZW5kZXJGbnM9aS5zdGF0aWNSZW5kZXJGbnMubWFwKGZ1bmN0aW9uKGUpe3JldHVybiB4YShlLGEpfSksbFtyXT1vfSl9O3ZhciBjLGx9KShZbykuY29tcGlsZVRvRnVuY3Rpb25zO2Z1bmN0aW9uIFNhKGUpe3JldHVybihBYT1BYXx8ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IikpLmlubmVySFRNTD1lPyc8YSBocmVmPSJcbiIvPic6JzxkaXYgYT0iXG4iLz4nLDA8QWEuaW5uZXJIVE1MLmluZGV4T2YoIiYjMTA7Iil9dmFyIFRhPSEhQiYmU2EoITEpLEVhPSEhQiYmU2EoITApLGphPWUoZnVuY3Rpb24oZSl7dmFyIHQ9Sm4oZSk7cmV0dXJuIHQmJnQuaW5uZXJIVE1MfSksTmE9aG4ucHJvdG90eXBlLiRtb3VudDtyZXR1cm4gaG4ucHJvdG90eXBlLiRtb3VudD1mdW5jdGlvbihlLHQpe2lmKChlPWUmJkpuKGUpKT09PWRvY3VtZW50LmJvZHl8fGU9PT1kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpcmV0dXJuIHRoaXM7dmFyIG49dGhpcy4kb3B0aW9ucztpZighbi5yZW5kZXIpe3ZhciByPW4udGVtcGxhdGU7aWYocilpZigic3RyaW5nIj09dHlwZW9mIHIpIiMiPT09ci5jaGFyQXQoMCkmJihyPWphKHIpKTtlbHNle2lmKCFyLm5vZGVUeXBlKXJldHVybiB0aGlzO3I9ci5pbm5lckhUTUx9ZWxzZSBlJiYocj1mdW5jdGlvbihlKXt7aWYoZS5vdXRlckhUTUwpcmV0dXJuIGUub3V0ZXJIVE1MO3ZhciB0PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3JldHVybiB0LmFwcGVuZENoaWxkKGUuY2xvbmVOb2RlKCEwKSksdC5pbm5lckhUTUx9fShlKSk7aWYocil7dmFyIGk9T2Eocix7c2hvdWxkRGVjb2RlTmV3bGluZXM6VGEsc2hvdWxkRGVjb2RlTmV3bGluZXNGb3JIcmVmOkVhLGRlbGltaXRlcnM6bi5kZWxpbWl0ZXJzLGNvbW1lbnRzOm4uY29tbWVudHN9LHRoaXMpLG89aS5yZW5kZXIsYT1pLnN0YXRpY1JlbmRlckZucztuLnJlbmRlcj1vLG4uc3RhdGljUmVuZGVyRm5zPWF9fXJldHVybiBOYS5jYWxsKHRoaXMsZSx0KX0saG4uY29tcGlsZT1PYSxobn0pOw=='></script>   

	<style id='style_magazine_css'>
		body{
			overflow:hidden;
//			background-color:#fcfcfc;
//			background-color:darkslategray;
			background-color:wheat;
			background-color:#FFFDDA;
			margin:0;
			padding:0;
			}

.magazine-viewport .container{
	position:absolute;
	top:50%;
	left:50%;
	width:922px;
	height:600px;
	margin:auto;
}

.magazine-viewport .magazine{
	width:922px;
	height:600px;
	left:-461px;
	top:-300px;
}

.magazine-viewport .page{
	width:461px;
	height:600px;
	background-color:white;
	background-repeat:no-repeat;
	background-size:100% 100%;
}

.magazine-viewport .zoomer .region{
	display:none;
}

.magazine .region{
	position:absolute;
	overflow:hidden;
	background:#0066FF;
	opacity:0.2;
	-webkit-border-radius:10px;
	-moz-border-radius:10px;
	-ms-border-radius:10px;
	-o-border-radius:10px;
	border-radius:10px;
	cursor:pointer;
	-ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=20)";
	filter: alpha(opacity=20);
}

.magazine .region:hover{
	opacity:0.5;
	-ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=50)";
	filter: alpha(opacity=50);
}

.magazine .region.zoom{
	opacity:0.01;
	-ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=1)";
	filter: alpha(opacity=1);
}

.magazine .region.zoom:hover{
	opacity:0.2;
	-ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=20)";
	filter: alpha(opacity=20);
}

.magazine .page{
	-webkit-box-shadow:0 0 20px rgba(0,0,0,0.2);
	-moz-box-shadow:0 0 20px rgba(0,0,0,0.2);
	-ms-box-shadow:0 0 20px rgba(0,0,0,0.2);
	-o-box-shadow:0 0 20px rgba(0,0,0,0.2);
	box-shadow:0 0 20px rgba(0,0,0,0.2);
}

.magazine-viewport .page img{
	-webkit-touch-callout: none;
	-webkit-user-select: none;
	-khtml-user-select: none;
	-moz-user-select: none;
	-ms-user-select: none;
	user-select: none;
	margin:0;
}

.magazine .even .gradient{
	position:absolute;
	top:0;
	left:0;
	width:100%;
	height:100%;

	background:-webkit-gradient(linear, left top, right top, color-stop(0.95, rgba(0,0,0,0)), color-stop(1, rgba(0,0,0,0.2)));
	background-image:-webkit-linear-gradient(left, rgba(0,0,0,0) 95%, rgba(0,0,0,0.2) 100%);
	background-image:-moz-linear-gradient(left, rgba(0,0,0,0) 95%, rgba(0,0,0,0.2) 100%);
	background-image:-ms-linear-gradient(left, rgba(0,0,0,0) 95%, rgba(0,0,0,0.2) 100%);
	background-image:-o-linear-gradient(left, rgba(0,0,0,0) 95%, rgba(0,0,0,0.2) 100%);
	background-image:linear-gradient(left, rgba(0,0,0,0) 95%, rgba(0,0,0,0.2) 100%);
}

.magazine .odd .gradient{
	position:absolute;
	top:0;
	left:0;
	width:100%;
	height:100%;

	background:-webkit-gradient(linear, right top, left top, color-stop(0.95, rgba(0,0,0,0)), color-stop(1, rgba(0,0,0,0.15)));
	background-image:-webkit-linear-gradient(right, rgba(0,0,0,0) 95%, rgba(0,0,0,0.15) 100%);
	background-image:-moz-linear-gradient(right, rgba(0,0,0,0) 95%, rgba(0,0,0,0.15) 100%);
	background-image:-ms-linear-gradient(right, rgba(0,0,0,0) 95%, rgba(0,0,0,0.15) 100%);
	background-image:-o-linear-gradient(right, rgba(0,0,0,0) 95%, rgba(0,0,0,0.15) 100%);
	background-image:linear-gradient(right, rgba(0,0,0,0) 95%, rgba(0,0,0,0.15) 100%);
}

.magazine-viewport .zoom-in .even .gradient,
.magazine-viewport .zoom-in .odd .gradient{

	display:none;

}

.magazine-viewport .loader{
	background-image:url(../pics/loader.gif);
	width:22px;
	height:22px;
	position:absolute;
	top:280px;
	left:219px;
}

.magazine-viewport .shadow{
	-webkit-transition: -webkit-box-shadow 0.5s;
	-moz-transition: -moz-box-shadow 0.5s;
	-o-transition: -webkit-box-shadow 0.5s;
	-ms-transition: -ms-box-shadow 0.5s;

	-webkit-box-shadow:0 0 20px #ccc;
	-moz-box-shadow:0 0 20px #ccc;
	-o-box-shadow:0 0 20px #ccc;
	-ms-box-shadow:0 0 20px #ccc;
	box-shadow:0 0 20px #ccc;
}

.magazine-viewport .next-button,
.magazine-viewport .previous-button{
	width:22px;
	height:600px;
	position:absolute;
	top:0;
}

.magazine-viewport .next-button{
	right:-22px;
	-webkit-border-radius:0 15px 15px 0;
	-moz-border-radius:0 15px 15px 0;
	-ms-border-radius:0 15px 15px 0;
	-o-border-radius:0 15px 15px 0;
	border-radius:0 15px 15px 0;
}

.magazine-viewport .previous-button{
	left:-22px;
	-webkit-border-radius:15px 0 0 15px;
	-moz-border-radius:15px 0 0 15px;
	-ms-border-radius:15px 0 0 15px;
	-o-border-radius:15px 0 0 15px;
	border-radius:15px 0 0 15px;
}

.magazine-viewport .previous-button-hover,
.magazine-viewport .next-button-hover{
	background-color:rgba(0,0,0, 0.2);
}

.magazine-viewport .previous-button-hover,
.magazine-viewport .previous-button-down{
	background-image:url(../pics/arrows.png);
	background-position:-4px 284px;
	background-repeat:no-repeat;
}

.magazine-viewport .previous-button-down,
.magazine-viewport .next-button-down{
	background-color:rgba(0,0,0, 0.4);
}

.magazine-viewport .next-button-hover,
.magazine-viewport .next-button-down{
	background-image:url(../pics/arrows.png);
	background-position:-38px 284px;
	background-repeat:no-repeat;
}

.magazine-viewport .zoom-in .next-button,
.magazine-viewport .zoom-in .previous-button{
	display:none;
}

.animated{
	-webkit-transition:margin-left 0.5s;
	-moz-transition:margin-left 0.5s;
	-ms-transition:margin-left 0.5s;
	-o-transition:margin-left 0.5s;
	transition:margin-left 0.5s;
}

.thumbnails{
//	position:absolute;
	bottom:0;
	left:0;
	width:100%;
	height:140px;
	z-index:1;
}

.thumbnails > div{
	width:1050px;
	height:100px;
	margin:20px auto;
}

.thumbnails ul{
	margin:0;
	padding:0;
	text-align:center;
	-webkit-transform:scale3d(0.5, 0.5, 1);
	-moz-transform:scale3d(0.5, 0.5, 1);
	-o-transform:scale3d(0.5, 0.5, 1);
	-ms-transform:scale3d(0.5, 0.5, 1);
	transform:scale3d(0.5, 0.5, 1);
	-webkit-transition:-webkit-transform ease-in-out 100ms;
	-moz-transition:-moz-transform ease-in-out 100ms;
	-ms-transition:-ms-transform ease-in-out 100ms;
	-o-transition:-o-transform ease-in-out 100ms;
	transition:transform ease-in-out 100ms;
}

.thumbanils-touch ul{
	-webkit-transform:none;
	-moz-transform:none;
	-o-transform:none;
	-ms-transform:none;
	transform:none;
}

.thumbnails-hover ul{
	-webkit-transform:scale3d(0.6, 0.6, 1);
	-moz-transform:scale3d(0.6, 0.6, 1);
	-o-transform:scale3d(0.6, 0.6, 1);
	-ms-transform:scale3d(0.6, 0.6, 1);
	transform:scale3d(0.6, 0.6, 1);
}

.thumbnails li{
	list-style:none;
	display:inline-block;
	margin:0 5px;
	-webkit-box-shadow:0 0 10px #ccc;
	-moz-box-shadow:0 0 10px #ccc;
	-ms-box-shadow:0 0 10px #ccc;
	-o-box-shadow:0 0 10px #ccc;
	box-shadow:0 0 10px  #ccc;
	-webkit-transition:-webkit-transform 60ms;
	-moz-transition:-webkit-transform 60ms;
	-o-transition:-webkit-transform 60ms;
	-ms-transition:-webkit-transform 60ms;
	transition:-webkit-transform 60ms;
}

.thumbnails li span{
	display:none;
}

.thumbnails .current{
	-webkit-box-shadow:0 0 10px red;
	-moz-box-shadow:0 0 10px red;
	-ms-box-shadow:0 0 10px red;
	-o-box-shadow:0 0 10px red;
	box-shadow:0 0 10px red;
}

.thumbnails .thumb-hover{
	-webkit-transform:scale3d(1.3, 1.3, 1);
	-moz-transform:scale3d(1.3, 1.3, 1);
	-o-transform:scale3d(1.3, 1.3, 1);
	-ms-transform:scale3d(1.3, 1.3, 1);
	transform:scale3d(1.3, 1.3, 1);

	-webkit-box-shadow:0 0 10px #666;
	-moz-box-shadow:0 0 10px #666;
	-ms-box-shadow:0 0 10px #666;
	-o-box-shadow:0 0 10px #666;
	box-shadow:0 0 10px #666;
}

.thumbanils-touch .thumb-hover{
	-webkit-transform:none;
	-moz-transform:none;
	-o-transform:none;
	-ms-transform:none;
	transform:none;
}

.thumbnails .thumb-hover span{
	position:absolute;
	bottom:-30px;
	left:0;
	z-index:2;
	width:100%;
	height:30px;
	font:bold 15px arial;
	line-height:30px;
	color:#666;
	display:block;
	cursor:default;
}

.thumbnails img{
	float:left;
}

.exit-message{
	position: absolute;
	top:10px;
	left:0;
	width:100%;
	height:40px;
	z-index:10000;
}

.exit-message > div{
	width:140px;
	height:30px;
	margin:auto;
	background:rgba(0,0,0,0.5);
	text-align:center;
	font:12px arial;
	line-height:30px;
	color:white;
	-webkit-border-radius:10px;
	-moz-border-radius:10px;
	-ms-border-radius:10px;
	-o-border-radius:10px;
	border-radius:10px;
}

.zoom-icon{
	position:absolute;
	z-index:1000;
	width:22px;
	height:22px;
	top:10px;
	right:10px;
//	background-image:url(../pics/zoom-icons.png);
	background-image:url(fb/html/magazine/pics/zoom-icons.png);
	background-size:88px 22px;
}

.zoom-icon-in{
	background-position:0 0;
	cursor: pointer;
}

.zoom-icon-in.zoom-icon-in-hover{
	background-position:-22px 0;
	cursor: pointer;
}

.zoom-icon-out{
	background-position:-44px 0;
}

.zoom-icon-out.zoom-icon-out-hover{
	background-position:-66px 0;
	cursor: pointer;
}

.bottom{
	position:absolute;
	left:0;
	bottom:0;
	width:100%;
}
		</style>

<script id="fb_magazine_js">
/*
 * Magazine sample
*/

function addPage(page, book) {

	var id, pages = book.turn('pages');

	// Create a new element for this page
	var element = $('<div />', {});

// Add the page to the flipbook
// Add the initial HTML
// It will contain a loader indicator and a gradient
	if (book.turn('addPage', element, page)) {
		element.html('<div class="gradient"></div><div class="loader"></div>');
// Load the page
		loadPage(page, element);
		}
	}

// Create an image element
	function loadPage(page, pageElement) {
		var img = $('<img />');
		img.mousedown(function(e) {
			e.preventDefault();
			});
		img.load(function() {
		
// Set the size
// Add the image to the page after loaded
// Remove the loader indicator
			$(this).css({width: '100%', height: '100%'});
			$(this).appendTo(pageElement);
			pageElement.find('.loader').remove();
			});

// Load the page
		var pagelist = new Array();
		var pagelist_len = 0;
		var src = "";
		var ajaks = "";
		pagelist = load_pagelist();
		pagelist_len = pagelist.length;	


		var htmout = "";
//		alert( "BUGS_470 pageslist="+pageslist+" page="+page+" pages_len="+pages_len );
		var splitlim = pagelist[page].split("|").length;
		src = pagelist[page].split("|")[splitlim-1];

//		src = pagelist[page].split("|")[12];
//		alert( "BUGS_490 page="+page+" pages_len="+pages_len+" src="+src );
//		img.attr('src', 'pages/' +  page + '.jpg');

//		var src_default = '/imgs/gif/spacers/giphy_spacers_01.gif';
//		var src_default = '/imgs/gif/spacers/giphy_jkwii_head.gif';
//		var src_default = '/imgs/gif/spacers/giphy_spacer10.gif';
//		var src_default = '/imgs/gif/spacers/giphy_spacer13.gif';
//		var src_default = '/imgs/gif/spacers/giphy_spacer15.gif';
//		var src_notfound = '/imgs/gif/spacers/giphy_spacer19.gif';
//		var src_notfound = '/imgs/gif/gif_bugs/giphy_anthead.gif';
//		var src_notfound = '/imgs/gif/gif_bugs/giphy_bugs_alien_bodyscan.gif';
		var src_notfound = '/imgs/gif/gif_bugs/giphy_bugs_alien_digits.gif';
		var src_notfound = '/imgs/gif/notfound.gif';
		if( filecheck(src)) {
//			alert("BUGS_5001 ___found src="+src );
			img.attr('src', src);
			}
		else {
//			alert("BUGS_5002 NOTFOUND src_notfound="+src_notfound );
			img.attr('src', src_notfound );
			}
		var pagelim=pagelist.length;	
		htmout += '<div id="div_fblink" >';
		htmout += '	<h1>page='+page+' of '+pagelim+' src='+src+'</h1>';
		htmout += '<img src="'+src+'" ';
		htmout += ' onclick="window.open(\''+src+'\');return false;"';
		htmout += ' alt="'+src+'" ';
		htmout += ' height=50 border=0 draggable="true" >';
		htmout += '	</div>';
		if( document.getElementById('div_fblink')) {
			document.getElementById('div_fblink').innerHTML=htmout;
			}
		loadRegions(page, pageElement);
		}

// Zoom in / Zoom out
	function zoomTo(event) {

		setTimeout(function() {
			if ($('.magazine-viewport').data().regionClicked) {
				$('.magazine-viewport').data().regionClicked = false;
			} else {
				if ($('.magazine-viewport').zoom('value')==1) {
					$('.magazine-viewport').zoom('zoomIn', event);
				} else {
					$('.magazine-viewport').zoom('zoomOut');
				}
			}
		}, 1);

}



// Load regions

	function loadRegions(page, element) {
		var fp_js = "pages/js/"+page+"-regions.json";
//		$.getJSON('pages/'+page+'-regions.json').
//		$.getJSON('pages/js/'+page+'-regions.json').
		$.getJSON(fp_js).
			done(function(data) {
				$.each(data, function(key, region) {
					addRegion(region, element);
				});
			});
		}

// Add region

function addRegion(region, pageElement) {
	
	var reg = $('<div />', {'class': 'region  ' + region['class']}),
		options = $('.magazine').turn('options'),
		pageWidth = options.width/2,
		pageHeight = options.height;

	reg.css({
		top: Math.round(region.y/pageHeight*100)+'%',
		left: Math.round(region.x/pageWidth*100)+'%',
		width: Math.round(region.width/pageWidth*100)+'%',
		height: Math.round(region.height/pageHeight*100)+'%'
	}).attr('region-data', $.param(region.data||''));


	reg.appendTo(pageElement);
}

// Process click on a region

function regionClick(event) {

	var region = $(event.target);

	if (region.hasClass('region')) {

		$('.magazine-viewport').data().regionClicked = true;
		
		setTimeout(function() {
			$('.magazine-viewport').data().regionClicked = false;
		}, 100);
		
		var regionType = $.trim(region.attr('class').replace('region', ''));

		return processRegion(region, regionType);

	}

}

// Process the data of every region

function processRegion(region, regionType) {

	data = decodeParams(region.attr('region-data'));

	switch (regionType) {
		case 'link' :

			window.open(data.url);

		break;
		case 'zoom' :

			var regionOffset = region.offset(),
				viewportOffset = $('.magazine-viewport').offset(),
				pos = {
					x: regionOffset.left-viewportOffset.left,
					y: regionOffset.top-viewportOffset.top
				};

			$('.magazine-viewport').zoom('zoomIn', pos);

		break;
		case 'to-page' :

			$('.magazine').turn('page', data.page);

		break;
	}

}

// Load large page

	function loadLargePage(page, pageElement) {
		var img = $('<img />');
		img.load(function() {
			var prevImg = pageElement.find('img');
			$(this).css({width: '100%', height: '100%'});
			$(this).appendTo(pageElement);
			prevImg.remove();
			});

// Loadnew page
		var pagelist = new Array();
		var pagelist_len = pagelist.length;
		var j=0;
		var src = "";
//		alert("BUGS_610 loadSmallPage page="+page+" pagelist="+pagelist );
		pagelist = load_pagelist();
		pagelist_len = pagelist.length;
//		src = "pages/"+page+".jpg";


		var splitlim=pagelist[page].split("|").length;
//		src = pagelist[page].split( "|" )[12];
		src = pagelist[page].split( "|" )[splitlim-1];

		var zn_src_path = execTest(src);
		var zn_src_file = splitTest(src);
		var zn_src = zn_src_path.replace( zn_src_file, "zn/zn_"+zn_src_file );
		var tn_src = zn_src_path.replace( zn_src_file, "tn/tn_"+zn_src_file ).replace(".jpg",".png");
//		var zn_src = zn_src_path + "zn/zn_"+zn_src_file;

//		alert( "BUGS_685 src="+src );
//		alert( "BUGS_687 zn_src="+zn_src );
//		alert( "BUGS_688 tn_src="+tn_src );




//		alert("BUGS_620 loadLargePage page="+page+" pages_len="+pages_len+" src="+src );
//		alert("BUGS_621 loadLargePage pages="+pages+" pages_len="+pages_len );
//		alert("BUGS_622 loadLargePage window.pages="+window.pages+" pages_len="+pages_len );
//		img.attr('src', 'pages/' +  page + '.jpg');
//		img.attr('src', 'pages/' +  page + '-large.jpg');
//		img.attr('src', 'pages/zn/zn_' +  page + '.jpg');
		img.attr('src', zn_src );
		}

// Load small page

function loadSmallPage(page, pageElement) {
	var img = pageElement.find('img');
	img.css({width: '100%', height: '100%'});
	img.unbind('load');

// Loadnew page
	var pagelist = new Array();
	var pagelist_len = pagelist.length;
	var j=0;
	var src = "";
//	alert("BUGS_610 loadSmallPage page="+page+" pagelist="+pagelist );
	pagelist = load_pagelist();
	pagelist_len = pagelist.length;
	var splitlim=pagelist[page].split("|").length;
	src = "pages/"+page+".jpg";
	src = pagelist[page].split( "|" )[splitlim-1];
//	src = pagelist[page].split( "|" )[12];
//	alert("BUGS_650 loadSmallPage page="+page+" pages_len="+pages_len+" src="+src );
//	alert("BUGS_651 loadSmallPage pages="+pages+" pages_len="+pages_len );
//	alert("BUGS_652 loadSmallPage window.pages="+window.pages+" pages_len="+pages_len );
//	img.attr('src', 'pages/' +  page + '.jpg');
	img.attr('src', src );
	}

// http://code.google.com/p/chromium/issues/detail?id=128488

	function isChrome() {
		return navigator.userAgent.indexOf('Chrome')!=-1;
		}

	function disableControls(page) {
		if (page==1)
			$('.previous-button').hide();
		else
			$('.previous-button').show();
					
		if (page==$('.magazine').turn('pages'))
			$('.next-button').hide();
		else
			$('.next-button').show();
}

// Set the width and height for the viewport

function resizeViewport() {

	var width = $(window).width(),
		height = $(window).height(),
		options = $('.magazine').turn('options');

	$('.magazine').removeClass('animated');

	$('.magazine-viewport').css({
		width: width,
		height: height
	}).
	zoom('resize');


	if ($('.magazine').turn('zoom')==1) {
		var bound = calculateBound({
			width: options.width,
			height: options.height,
			boundWidth: Math.min(options.width, width),
			boundHeight: Math.min(options.height, height)
		});

		if (bound.width%2!==0)
			bound.width-=1;

			
		if (bound.width!=$('.magazine').width() || bound.height!=$('.magazine').height()) {

			$('.magazine').turn('size', bound.width, bound.height);

			if ($('.magazine').turn('page')==1)
				$('.magazine').turn('peel', 'br');

			$('.next-button').css({height: bound.height, backgroundPosition: '-38px '+(bound.height/2-32/2)+'px'});
			$('.previous-button').css({height: bound.height, backgroundPosition: '-4px '+(bound.height/2-32/2)+'px'});
		}

		$('.magazine').css({top: -bound.height/2, left: -bound.width/2});
	}

	var magazineOffset = $('.magazine').offset(),
		boundH = height - magazineOffset.top - $('.magazine').height(),
		marginTop = (boundH - $('.thumbnails > div').height()) / 2;

	if (marginTop<0) {
		$('.thumbnails').css({height:1});
	} else {
		$('.thumbnails').css({height: boundH});
		$('.thumbnails > div').css({marginTop: marginTop});
	}

	if (magazineOffset.top<$('.made').height())
		$('.made').hide();
	else
		$('.made').show();

	$('.magazine').addClass('animated');
	
}


// Number of views in a flipbook

function numberOfViews(book) {
	return book.turn('pages') / 2 + 1;
}

// Current view in a flipbook

function getViewNumber(book, page) {
	return parseInt((page || book.turn('page'))/2 + 1, 10);
}

function moveBar(yes) {
	if (Modernizr && Modernizr.csstransforms) {
		$('#slider .ui-slider-handle').css({zIndex: yes ? -1 : 10000});
	}
}

function setPreview(view) {

	var previewWidth = 112,
		previewHeight = 73,
//		previewSrc = 'pages/preview.jpg',
		previewSrc = 'imgs/preview.jpg',
		preview = $(_thumbPreview.children(':first')),
		numPages = (view==1 || view==$('#slider').slider('option', 'max')) ? 1 : 2,
		width = (numPages==1) ? previewWidth/2 : previewWidth;

	_thumbPreview.
		addClass('no-transition').
		css({width: width + 15,
			height: previewHeight + 15,
			top: -previewHeight - 30,
			left: ($($('#slider').children(':first')).width() - width - 15)/2
		});

	preview.css({
		width: width,
		height: previewHeight
	});

	if (preview.css('background-image')==='' ||
		preview.css('background-image')=='none') {

		preview.css({backgroundImage: 'url(' + previewSrc + ')'});

		setTimeout(function(){
			_thumbPreview.removeClass('no-transition');
		}, 0);

	}

	preview.css({backgroundPosition:
		'0px -'+((view-1)*previewHeight)+'px'
	});
}

// Width of the flipbook when zoomed in

function largeMagazineWidth() {
	
	return 2214;

}

// decode URL Parameters

function decodeParams(data) {

	var parts = data.split('&'), d, obj = {};

	for (var i =0; i<parts.length; i++) {
		d = parts[i].split('=');
		obj[decodeURIComponent(d[0])] = decodeURIComponent(d[1]);
	}

	return obj;
}

// Calculate the width and height of a square within another square

function calculateBound(d) {
	
	var bound = {width: d.width, height: d.height};

	if (bound.width>d.boundWidth || bound.height>d.boundHeight) {
		
		var rel = bound.width/bound.height;

		if (d.boundWidth/rel>d.boundHeight && d.boundHeight*rel<=d.boundWidth) {
			
			bound.width = Math.round(d.boundHeight*rel);
			bound.height = d.boundHeight;

		} else {
			
			bound.width = d.boundWidth;
			bound.height = Math.round(d.boundWidth/rel);
		
		}
			}
		return bound;
		}
	</script>

	<script id="script_load_pagelist_head" >
		function load_pagelist_head() {
var pagelist_head_jtfdcr=
`||||||||/fb/jtfdcr/pages/1.jpg
||||||||/fb/jtfdcr/pages/2.jpg
||||||||/fb/jtfdcr/pages/3.jpg
||||||||/fb/jtfdcr/pages/4.jpg
||||||||/fb/jtfdcr/pages/5.jpg
||||||||/fb/jtfdcr/pages/6.jpg
||||||||/fb/jtfdcr/pages/7.jpg
||||||||/fb/jtfdcr/pages/8.jpg
||||||||/fb/jtfdcr/pages/9.jpg
||||||||/fb/jtfdcr/pages/10.jpg
||||||||/fb/jtfdcr/pages/11.jpg
||||||||/fb/jtfdcr/pages/12.jpg
||||||||/fb/jtfdcr/pages/13.jpg
||||||||/fb/jtfdcr/pages/14.jpg`;

var pagelist_head_pages=``;

var pagelist_head=
`pages/1.jpg
pages/2.jpg
pages/3.jpg
pages/4.jpg
pages/5.jpg
pages/6.jpg
pages/7.jpg
pages/8.jpg
pages/9.jpg
pages/10.jpg
pages/11.jpg
pages/12.jpg
pages/13.jpg
pages/14.jpg
pages/15.jpg
pages/16.jpg
pages/17.jpg
pages/18.jpg
pages/19.jpg
pages/20.jpg
pages/21.jpg
pages/22.jpg
pages/23.jpg
pages/24.jpg
pages/25.jpg
pages/26.jpg
pages/27.jpg
pages/28.jpg
pages/29.jpg
pages/30.jpg
pages/31.jpg
pages/32.jpg
pages/33.jpg
pages/34.jpg
pages/35.jpg
pages/36.jpg
pages/37.jpg
pages/38.jpg
pages/39.jpg
pages/40.jpg
pages/41.jpg
pages/42.jpg
pages/43.jpg
pages/44.jpg
pages/45.jpg
pages/46.jpg
pages/47.jpg
pages/48.jpg
pages/49.jpg
pages/50.jpg
pages/51.jpg
pages/52.jpg
pages/53.jpg
pages/54.jpg
pages/55.jpg
pages/56.jpg
pages/57.jpg
pages/58.jpg
pages/59.jpg
pages/60.jpg
pages/61.jpg
pages/62.jpg
pages/63.jpg
pages/64.jpg`;
		return( pagelist_head.split("\n"));
		}
		</script>



	<script id="script_load_pagelist_pages" >
		function load_pagelist_pages() {
var pagelist_pages =
`pages/0.jpg
pages/1.jpg
pages/2.jpg
pages/3.jpg
pages/4.jpg
pages/5.jpg
pages/6.jpg
pages/7.jpg
pages/8.jpg
pages/9.jpg
pages/10.jpg
pages/11.jpg
pages/12.jpg
pages/13.jpg
pages/14.jpg
pages/15.jpg
pages/16.jpg
pages/17.jpg
pages/18.jpg
pages/19.jpg
pages/20.jpg
pages/21.jpg
pages/22.jpg
pages/23.jpg
pages/24.jpg
pages/25.jpg
pages/26.jpg
pages/27.jpg
pages/28.jpg
pages/29.jpg
pages/30.jpg
pages/31.jpg
pages/32.jpg
pages/33.jpg
pages/34.jpg
pages/35.jpg
pages/36.jpg
pages/notfound.jpg
pages/37.jpg
pages/38.jpg
pages/39.jpg
pages/40.jpg
pages/41.jpg
pages/42.jpg
pages/43.jpg
pages/44.jpg
pages/45.jpg
pages/46.jpg
pages/47.jpg
pages/48.jpg
pages/49.jpg
pages/50.jpg
pages/51.jpg
pages/52.jpg
pages/53.jpg
pages/54.jpg
pages/55.jpg
pages/56.jpg
pages/57.jpg
pages/58.jpg
pages/59.jpg
pages/60.jpg
pages/61.jpg
pages/62.jpg
pages/63.jpg
pages/64.jpg
./pages/0.jpg
./pages/1.jpg
./pages/2.jpg
./pages/3.jpg
./pages/4.jpg
./pages/5.jpg
./pages/6.jpg
./pages/7.jpg
./pages/8.jpg
./pages/9.jpg
./pages/10.jpg
./pages/11.jpg
./pages/11b.jpg
./pages/12.jpg
./pages/12b.jpg
./pages/13.jpg
./pages/14.jpg
./pages/15.jpg
./pages/16.jpg
./pages/16b.jpg
./pages/17.jpg
./pages/18.jpg
./pages/19.jpg
./pages/1_kids_front.jpg
./pages/1_stop.jpg
./pages/20.jpg
./pages/2017181-1818_002b.jpg
./pages/21.jpg
./pages/22.jpg
./pages/23.jpg
./pages/24.jpg
./pages/25.jpg
./pages/26.jpg
./pages/27.jpg
./pages/28.jpg
./pages/29.jpg
./pages/2b.jpg
./pages/30.jpg
./pages/31.jpg
./pages/32.jpg
./pages/33.jpg
./pages/34.jpg
./pages/35.jpg
./pages/36.jpg
./pages/37.jpg
./pages/38.jpg
./pages/39.jpg
./pages/3a.jpg
./pages/40.jpg
./pages/41.jpg
./pages/42.jpg
./pages/43.jpg
./pages/44.jpg
./pages/45.jpg
./pages/46.jpg
./pages/47.jpg
./pages/48.jpg
./pages/49.jpg
./pages/50.jpg
./pages/51.jpg
./pages/52.jpg
./pages/53.jpg
./pages/54.jpg
./pages/55.jpg
./pages/56.jpg
./pages/57.jpg
./pages/58.jpg
./pages/59.jpg
./pages/60.jpg
/imgs/gif/alien_tek/a11_flipbook.gif
/imgs/gif/alien_tek/afda.gif
/imgs/gif/alien_tek/applewait.gif
/imgs/gif/alien_tek/asdfadfad.gif
/imgs/gif/alien_tek/cityspiral.gif
/imgs/gif/alien_tek/cobe4.gif
/imgs/gif/alien_tek/donujt.gif
/imgs/gif/alien_tek/drip1.gif
/imgs/gif/alien_tek/floaters.gif
/imgs/gif/alien_tek/icepalace.gif
/imgs/gif/alien_tek/lit2.gif
/imgs/gif/alien_tek/lite1.gif
/imgs/gif/alien_tek/litecrystle.gif
/imgs/gif/alien_tek/med1.gif
/imgs/gif/alien_tek/med19.gif
/imgs/gif/alien_tek/med3.gif
/imgs/gif/alien_tek/med5.gif
/imgs/gif/alien_tek/med6.gif
/imgs/gif/alien_tek/medpump.gif
/imgs/gif/alien_tek/medskin.gif
/imgs/gif/alien_tek/mek1.gif
/imgs/gif/alien_tek/mek12.gif
/imgs/gif/alien_tek/mek17.gif
/imgs/gif/alien_tek/mek2.gif
/imgs/gif/alien_tek/mek3.gif
/imgs/gif/alien_tek/mek5.gif
/imgs/gif/alien_tek/mek7.gif
/imgs/gif/alien_tek/mek8.gif
/imgs/gif/alien_tek/mek9.gif
/imgs/gif/alien_tek/memcore.gif
/imgs/gif/alien_tek/merd2.gif
/imgs/gif/alien_tek/octopus.gif
/imgs/gif/alien_tek/org1.gif
/imgs/gif/alien_tek/photons.gif
/imgs/gif/alien_tek/pip2.gif
/imgs/gif/alien_tek/pulsehelix.gif
/imgs/gif/alien_tek/smoke.gif
/imgs/gif/alien_tek/static4.gif
/imgs/gif/alien_tek/su5_67_h_1340.gif
/imgs/gif/alien_tek/tesla.gif
/imgs/gif/alien_tek/wave.gif
/imgs/gif/byrdpucker/giph_horse_distotiony.gif
/imgs/gif/byrdpucker/giph_horse_smerky.gif
/imgs/gif/byrdpucker/giphy._horse_glittergif.gif
/imgs/gif/byrdpucker/giphy._horse_koballsgif.gif
/imgs/gif/byrdpucker/giphy_bugs_boundry.gif
/imgs/gif/byrdpucker/giphy_bugs_jaildoors.gif
/imgs/gif/byrdpucker/giphy_bugs_pase.gif
/imgs/gif/byrdpucker/giphy_bugs_sstop.gif
/imgs/gif/byrdpucker/giphy_bugs_takaway.gif
/imgs/gif/byrdpucker/giphy_bugs_wakeup.gif
/imgs/gif/byrdpucker/giphy_byrdpucker_dog_n_pony_show.gif
/imgs/gif/byrdpucker/giphy_cruella_1.gif
/imgs/gif/byrdpucker/giphy_cruella_2.gif
/imgs/gif/byrdpucker/giphy_cubemembrain.gif
/imgs/gif/byrdpucker/giphy_cycle.gif
/imgs/gif/byrdpucker/giphy_cycle_circle.gif
/imgs/gif/byrdpucker/giphy_cycle_dog.gif
/imgs/gif/byrdpucker/giphy_cycle_jtf39.gif
/imgs/gif/byrdpucker/giphy_cycle_legs.gif
/imgs/gif/byrdpucker/giphy_cycle_rodent.gif
/imgs/gif/byrdpucker/giphy_dogpaddle.gif
/imgs/gif/byrdpucker/giphy_dogs1.gif
/imgs/gif/byrdpucker/giphy_dogygym.gif
/imgs/gif/byrdpucker/giphy_horse_soccor.gif
/imgs/gif/byrdpucker/giphy_horse_views.gif
/imgs/gif/byrdpucker/giphy_horsefish.gif
/imgs/gif/byrdpucker/giphy_horseg_girl_vintage.gif
/imgs/gif/byrdpucker/giphy_horseguy_pranser.gif
/imgs/gif/byrdpucker/giphy_horserun_pencil.gif
/imgs/gif/byrdpucker/giphy_horserun_vintage.gif
/imgs/gif/byrdpucker/giphy_koponies.gif
/imgs/gif/byrdpucker/giphy_magicdoors2.gif
/imgs/gif/byrdpucker/giphy_magicscary_shadows.gif
/imgs/gif/byrdpucker/giphy_magicspecter2.gif
/imgs/gif/byrdpucker/giphy_mrevil.gif
/imgs/gif/byrdpucker/giphy_mtfail.gif
/imgs/gif/byrdpucker/giphy_pinocio_1.gif
/imgs/gif/byrdpucker/giphy_pinocioa_2.gif
/imgs/gif/byrdpucker/giphy_pinocioa_4.gif
/imgs/gif/byrdpucker/giphy_wicked_curtains_closel_.gif
/imgs/gif/crazy/giph_imnotcrazyy.gif
/imgs/gif/crazy/giphy_containment.gif
/imgs/gif/crazy/giphy_crazy3.gif
/imgs/gif/crazy/giphy_crazy5.gif
/imgs/gif/crazy/giphy_crazy_blond.gif
/imgs/gif/crazy/giphy_crazy_mickey.gif
/imgs/gif/crazy/giphy_crazy_princess.gif
/imgs/gif/crazy/giphy_crazy_simsoncalass.gif
/imgs/gif/crazy/giphy_crazy_smilyface.gif
/imgs/gif/crazy/giphy_crazyguy.gif
/imgs/gif/crazy/giphy_crazylady.gif
/imgs/gif/crazy/giphy_crazyorb.gif
/imgs/gif/crazy/giphy_crazytoon.gif
/imgs/gif/crazy/giphy_derbyguy.gif
/imgs/gif/crazy/giphy_dracual_onoff.gif
/imgs/gif/crazy/giphy_duck_crazy.gif
/imgs/gif/crazy/giphy_duckcrash.gif
/imgs/gif/crazy/giphy_einstein.gif
/imgs/gif/crazy/giphy_einstein_wabblehead.gif
/imgs/gif/crazy/giphy_expression_dancer.gif
/imgs/gif/crazy/giphy_fingerwave.gif
/imgs/gif/crazy/giphy_ladyscarey.gif
/imgs/gif/crazy/giphy_magicorb_laddle.gif
/imgs/gif/crazy/giphy_nerdy.gif
/imgs/gif/crazy/giphy_rumshower.gif
/imgs/gif/crazy/giphy_science_frank.gif
/imgs/gif/crazy/giphy_screamer.gif
/imgs/gif/crazy/giphy_showergirl.gif
/imgs/gif/crazy/giphy_smile.gif
/imgs/gif/crazy/giphy_smileyshark.gif
/imgs/gif/crazy/giphy_time_waites.gif
/imgs/gif/crazy/giphy_timeguy_late.gif
/imgs/gif/crazy/giphy_zoom_crazyguy.gif
/imgs/gif/cute/bee.gif
/imgs/gif/cute/boop.gif
/imgs/gif/cute/CA 4th 027 copy.gif
/imgs/gif/cute/CA 4th 027.gif
/imgs/gif/cute/catas.gif
/imgs/gif/cute/cats.gif
/imgs/gif/cute/cd81506101b9407dec74b5635a70fb16.gif
/imgs/gif/cute/crayons.gif
/imgs/gif/cute/disb.gif
/imgs/gif/cute/dogconfusion.gif
/imgs/gif/cute/fireworks.gif
/imgs/gif/cute/fireworks13.gif
/imgs/gif/cute/fireworks3.gif
/imgs/gif/cute/fireworks4.gif
/imgs/gif/cute/fish-swimming.gif
/imgs/gif/cute/fish.gif
/imgs/gif/cute/gipdicehy.gif
/imgs/gif/cute/gipdisneyhy.gif
/imgs/gif/cute/gipfadfahy.gif
/imgs/gif/cute/giphy.gif
/imgs/gif/cute/kid.gif
/imgs/gif/cute/party.gif
/imgs/gif/cute/photonorb.gif
/imgs/gif/cute/sfg.gif
/imgs/gif/cute/spinning-arrow-right.gif
/imgs/gif/firebubbles.gif
/imgs/gif/firebubblesb.gif
/imgs/gif/firebubblesd.gif
/imgs/gif/firebubblesp.gif
/imgs/gif/firebubblesq.gif
/imgs/gif/focus/giph_focus_kidy.gif
/imgs/gif/focus/giph_focus_simpson.gif
/imgs/gif/focus/giph_watchery.gif
/imgs/gif/focus/giphy._eyeball_glossygif.gif
/imgs/gif/focus/giphy_eye_1.gif
/imgs/gif/focus/giphy_eye_owl.gif
/imgs/gif/focus/giphy_eyes2mouth.gif
/imgs/gif/focus/giphy_eyes_linedraw.gif
/imgs/gif/focus/giphy_facemasks.gif
/imgs/gif/focus/giphy_focus_3dglasses.gif
/imgs/gif/focus/giphy_focus_dali.gif
/imgs/gif/focus/giphy_focus_goggles.gif
/imgs/gif/focus/giphy_focus_iris.gif
/imgs/gif/focus/giphy_focus_koglasses.gif
/imgs/gif/focus/giphy_focus_sleuth.gif
/imgs/gif/gif_bugs/giph_bugs_bellydancery.gif
/imgs/gif/gif_bugs/giph_bugs_monster_outy.gif
/imgs/gif/gif_bugs/giph_bugs_peppy_heartsy.gif
/imgs/gif/gif_bugs/giph_kiti_earthrise.gif
/imgs/gif/gif_bugs/giph_kiti_flyingsaucersy.gif
/imgs/gif/gif_bugs/giph_kiti_unicorn.gif
/imgs/gif/gif_bugs/giph_the_end1y.gif
/imgs/gif/gif_bugs/giphy.=_bugs_beepbeep_cliff.gif
/imgs/gif/gif_bugs/giphy._bugs_apple_androidgif.gif
/imgs/gif/gif_bugs/giphy4.gif
/imgs/gif/gif_bugs/giphy_alien_tek0721.gif
/imgs/gif/gif_bugs/giphy_anthead.gif
/imgs/gif/gif_bugs/giphy_beepbeep_ropebride.gif
/imgs/gif/gif_bugs/giphy_box_conveyor.gif
/imgs/gif/gif_bugs/giphy_box_spinners.gif
/imgs/gif/gif_bugs/giphy_boxhop.gif
/imgs/gif/gif_bugs/giphy_boxopen.gif
/imgs/gif/gif_bugs/giphy_boxs_amazon.gif
/imgs/gif/gif_bugs/giphy_boxtoon.gif
/imgs/gif/gif_bugs/giphy_bugs_alian_upskirt.gif
/imgs/gif/gif_bugs/giphy_bugs_alien.gif
/imgs/gif/gif_bugs/giphy_bugs_alien_bodyscan.gif
/imgs/gif/gif_bugs/giphy_bugs_alien_digits.gif
/imgs/gif/gif_bugs/giphy_bugs_alien_dog.gif
/imgs/gif/gif_bugs/giphy_bugs_alien_flagplan.gif
/imgs/gif/gif_bugs/giphy_bugs_alien_judge.gif
/imgs/gif/gif_bugs/giphy_bugs_attention.gif
/imgs/gif/gif_bugs/giphy_bugs_beepbeep_bizcard.gif
/imgs/gif/gif_bugs/giphy_bugs_beepbeep_byrdman.gif
/imgs/gif/gif_bugs/giphy_bugs_beepbeep_dont_have_the_heart.gif
/imgs/gif/gif_bugs/giphy_bugs_beepbeep_fallin.gif
/imgs/gif/gif_bugs/giphy_bugs_birdcat.gif
/imgs/gif/gif_bugs/giphy_bugs_bow.gif
/imgs/gif/gif_bugs/giphy_bugs_brunhilda.gif
/imgs/gif/gif_bugs/giphy_bugs_bugattack.gif
/imgs/gif/gif_bugs/giphy_bugs_bull.gif
/imgs/gif/gif_bugs/giphy_bugs_deal_with_it.gif
/imgs/gif/gif_bugs/giphy_bugs_ducklightergif.gif
/imgs/gif/gif_bugs/giphy_bugs_evil_castle.gif
/imgs/gif/gif_bugs/giphy_bugs_excuse_me.gif
/imgs/gif/gif_bugs/giphy_bugs_eyeroll.gif
/imgs/gif/gif_bugs/giphy_bugs_fire.gif
/imgs/gif/gif_bugs/giphy_bugs_heart_skipping.gif
/imgs/gif/gif_bugs/giphy_bugs_heaven_fall.gif
/imgs/gif/gif_bugs/giphy_bugs_hencook.gif
/imgs/gif/gif_bugs/giphy_bugs_heyyou.gif
/imgs/gif/gif_bugs/giphy_bugs_inspiration.gif
/imgs/gif/gif_bugs/giphy_bugs_jailbuny.gif
/imgs/gif/gif_bugs/giphy_bugs_jailsam.gif
/imgs/gif/gif_bugs/giphy_bugs_jitters_sip.gif
/imgs/gif/gif_bugs/giphy_bugs_kiti_jitters.gif
/imgs/gif/gif_bugs/giphy_bugs_mess.gif
/imgs/gif/gif_bugs/giphy_bugs_monster_conon.gif
/imgs/gif/gif_bugs/giphy_bugs_monster_contained.gif
/imgs/gif/gif_bugs/giphy_bugs_monster_doorbar.gif
/imgs/gif/gif_bugs/giphy_bugs_monster_flee.gif
/imgs/gif/gif_bugs/giphy_bugs_monster_grab.gif
/imgs/gif/gif_bugs/giphy_bugs_monster_scare.gif
/imgs/gif/gif_bugs/giphy_bugs_monster_stalk.gif
/imgs/gif/gif_bugs/giphy_bugs_monster_stalk2.gif
/imgs/gif/gif_bugs/giphy_bugs_now_we_dance.gif
/imgs/gif/gif_bugs/giphy_bugs_one_more_time.gif
/imgs/gif/gif_bugs/giphy_bugs_pagecut.gif
/imgs/gif/gif_bugs/giphy_bugs_peppy_kiss.gif
/imgs/gif/gif_bugs/giphy_bugs_piano.gif
/imgs/gif/gif_bugs/giphy_bugs_play_this_game.gif
/imgs/gif/gif_bugs/giphy_bugs_pot.gif
/imgs/gif/gif_bugs/giphy_bugs_rockette.gif
/imgs/gif/gif_bugs/giphy_bugs_rocky.gif
/imgs/gif/gif_bugs/giphy_bugs_season.gif
/imgs/gif/gif_bugs/giphy_bugs_shave.gif
/imgs/gif/gif_bugs/giphy_bugs_slots.gif
/imgs/gif/gif_bugs/giphy_bugs_start.gif
/imgs/gif/gif_bugs/giphy_bugs_target.gif
/imgs/gif/gif_bugs/giphy_bugs_thats_all_folks.gif
/imgs/gif/gif_bugs/giphy_bugs_tooth.gif
/imgs/gif/gif_bugs/giphy_bugs_tv_western.gif
/imgs/gif/gif_bugs/giphy_bugs_tweetybird.gif
/imgs/gif/gif_bugs/giphy_bugs_wanted.gif
/imgs/gif/gif_bugs/giphy_bugs_what_a_maroon.gif
/imgs/gif/gif_bugs/giphy_bugs_whitehorse.gif
/imgs/gif/gif_bugs/giphy_bugs_yipe.gif
/imgs/gif/gif_bugs/giphy_chain_n_torus.gif
/imgs/gif/gif_bugs/giphy_chaos.gif
/imgs/gif/gif_bugs/giphy_checkerboard.gif
/imgs/gif/gif_bugs/giphy_choc_girl_tomuch.gif
/imgs/gif/gif_bugs/giphy_choc_kid.gif
/imgs/gif/gif_bugs/giphy_choc_kid2.gif
/imgs/gif/gif_bugs/giphy_choc_lucy.gif
/imgs/gif/gif_bugs/giphy_choc_pour1.gif
/imgs/gif/gif_bugs/giphy_choc_princess.gif
/imgs/gif/gif_bugs/giphy_choc_selfmed.gif
/imgs/gif/gif_bugs/giphy_clapguy.gif
/imgs/gif/gif_bugs/giphy_corners.gif
/imgs/gif/gif_bugs/giphy_corners2.gif
/imgs/gif/gif_bugs/giphy_crown.gif
/imgs/gif/gif_bugs/giphy_diamond_tubing.gif
/imgs/gif/gif_bugs/giphy_digit_copypaste.gif
/imgs/gif/gif_bugs/giphy_dog_fan.gif
/imgs/gif/gif_bugs/giphy_dogewaves.gif
/imgs/gif/gif_bugs/giphy_escalator.gif
/imgs/gif/gif_bugs/giphy_eyebug_hover.gif
/imgs/gif/gif_bugs/giphy_eyefly.gif
/imgs/gif/gif_bugs/giphy_fantube.gif
/imgs/gif/gif_bugs/giphy_gillligan.gif
/imgs/gif/gif_bugs/giphy_go__barbells.gif
/imgs/gif/gif_bugs/giphy_godtwiddle.gif
/imgs/gif/gif_bugs/giphy_kali_0721_a.gif
/imgs/gif/gif_bugs/giphy_kali_boxs.gif
/imgs/gif/gif_bugs/giphy_kali_cirles.gif
/imgs/gif/gif_bugs/giphy_kiti_boxclose.gif
/imgs/gif/gif_bugs/giphy_kiti_boxlid.gif
/imgs/gif/gif_bugs/giphy_kiti_boxthru.gif
/imgs/gif/gif_bugs/giphy_kiti_inabox.gif
/imgs/gif/gif_bugs/giphy_kiti_lightning.gif
/imgs/gif/gif_bugs/giphy_kitisews.gif
/imgs/gif/gif_bugs/giphy_kity_wings.gif
/imgs/gif/gif_bugs/giphy_konabus_loosewheels.gif
/imgs/gif/gif_bugs/giphy_kt_baseball.gif
/imgs/gif/gif_bugs/giphy_lineart.gif
/imgs/gif/gif_bugs/giphy_lineart2.gif
/imgs/gif/gif_bugs/giphy_mouthballs.gif
/imgs/gif/gif_bugs/giphy_mouthtube.gif
/imgs/gif/gif_bugs/giphy_orb_stamper.gif
/imgs/gif/gif_bugs/giphy_orb_stars_.gif
/imgs/gif/gif_bugs/giphy_orb_wave.gif
/imgs/gif/gif_bugs/giphy_orbs_0721b.gif
/imgs/gif/gif_bugs/giphy_orbs_bubbles.gif
/imgs/gif/gif_bugs/giphy_orbs_pods.gif
/imgs/gif/gif_bugs/giphy_org0721a.gif
/imgs/gif/gif_bugs/giphy_ringman.gif
/imgs/gif/gif_bugs/giphy_skateboard_torus.gif
/imgs/gif/gif_bugs/giphy_sketch_laps.gif
/imgs/gif/gif_bugs/giphy_spinner_white.gif
/imgs/gif/gif_bugs/giphy_star_bounce.gif
/imgs/gif/gif_bugs/giphy_tanklite.gif
/imgs/gif/gif_bugs/giphy_thats_all_folks_porky.gif
/imgs/gif/gif_bugs/giphy_the_end2.gif
/imgs/gif/gif_bugs/giphy_the_end_shade.gif
/imgs/gif/gif_bugs/giphy_thinkguy.gif
/imgs/gif/gif_bugs/giphy_triangles.gif
/imgs/gif/gif_bugs/giphy_undulator.gif
/imgs/gif/gif_bugs/giphy_wrap_it_up.gif
/imgs/gif/gif_spinners/giph_headsy.gif
/imgs/gif/gif_spinners/giphy_0rbs21.gif
/imgs/gif/gif_spinners/giphy_ali_ropeadope.gif
/imgs/gif/gif_spinners/giphy_ball_in_box.gif
/imgs/gif/gif_spinners/giphy_barcoede.gif
/imgs/gif/gif_spinners/giphy_blow_the_house_down.gif
/imgs/gif/gif_spinners/giphy_bookdeamon.gif
/imgs/gif/gif_spinners/giphy_box_dancing.gif
/imgs/gif/gif_spinners/giphy_box_of_shame.gif
/imgs/gif/gif_spinners/giphy_box_of_shane2.gif
/imgs/gif/gif_spinners/giphy_boxes_in_boxes.gif
/imgs/gif/gif_spinners/giphy_boxes_up.gif
/imgs/gif/gif_spinners/giphy_bugout.gif
/imgs/gif/gif_spinners/giphy_bugs_alien_hothead.gif
/imgs/gif/gif_spinners/giphy_bugs_beepbeep_cliffdoor.gif
/imgs/gif/gif_spinners/giphy_bugs_beepbeep_crusin.gif
/imgs/gif/gif_spinners/giphy_bugs_beepbeep_crusin_sketch.gif
/imgs/gif/gif_spinners/giphy_bugs_piano_finger.gif
/imgs/gif/gif_spinners/giphy_bugwalker.gif
/imgs/gif/gif_spinners/giphy_cinderella_shoe_not4u.gif
/imgs/gif/gif_spinners/giphy_control_panel.gif
/imgs/gif/gif_spinners/giphy_crosses.gif
/imgs/gif/gif_spinners/giphy_cube_undulate.gif
/imgs/gif/gif_spinners/giphy_cubefalls.gif
/imgs/gif/gif_spinners/giphy_cubeline.gif
/imgs/gif/gif_spinners/giphy_evenplaning.gif
/imgs/gif/gif_spinners/giphy_eyet_ears.gif
/imgs/gif/gif_spinners/giphy_finders_eye_heart.gif
/imgs/gif/gif_spinners/giphy_fixit.gif
/imgs/gif/gif_spinners/giphy_fractals.gif
/imgs/gif/gif_spinners/giphy_fuzzy_orb.gif
/imgs/gif/gif_spinners/giphy_fuzzyv.gif
/imgs/gif/gif_spinners/giphy_girl_pokadots.gif
/imgs/gif/gif_spinners/giphy_go_gridwaves.gif
/imgs/gif/gif_spinners/giphy_go_lites_around.gif
/imgs/gif/gif_spinners/giphy_go_square_crosses.gif
/imgs/gif/gif_spinners/giphy_go_squares.gif
/imgs/gif/gif_spinners/giphy_go_squares_3d.gif
/imgs/gif/gif_spinners/giphy_go_wobbles.gif
/imgs/gif/gif_spinners/giphy_gorays.gif
/imgs/gif/gif_spinners/giphy_gradient.gif
/imgs/gif/gif_spinners/giphy_gush.gif
/imgs/gif/gif_spinners/giphy_gushpipes.gif
/imgs/gif/gif_spinners/giphy_guy_fingertalk.gif
/imgs/gif/gif_spinners/giphy_guy_salute.gif
/imgs/gif/gif_spinners/giphy_guy_stand_proud.gif
/imgs/gif/gif_spinners/giphy_guy_thumbs_down.gif
/imgs/gif/gif_spinners/giphy_hallway_wiggle.gif
/imgs/gif/gif_spinners/giphy_hand2sand.gif
/imgs/gif/gif_spinners/giphy_head_androidspin.gif
/imgs/gif/gif_spinners/giphy_head_dog.gif
/imgs/gif/gif_spinners/giphy_head_milkbob.gif
/imgs/gif/gif_spinners/giphy_head_oz.gif
/imgs/gif/gif_spinners/giphy_head_rings.gif
/imgs/gif/gif_spinners/giphy_head_running.gif
/imgs/gif/gif_spinners/giphy_head_spin.gif
/imgs/gif/gif_spinners/giphy_head_thinker.gif
/imgs/gif/gif_spinners/giphy_head_trippy.gif
/imgs/gif/gif_spinners/giphy_head_trippy_suit.gif
/imgs/gif/gif_spinners/giphy_headtoo.gif
/imgs/gif/gif_spinners/giphy_heart.gif
/imgs/gif/gif_spinners/giphy_heart_sunny.gif
/imgs/gif/gif_spinners/giphy_hex_mnaggots.gif
/imgs/gif/gif_spinners/giphy_hockey_snoopy.gif
/imgs/gif/gif_spinners/giphy_js.gif
/imgs/gif/gif_spinners/giphy_jumpher.gif
/imgs/gif/gif_spinners/giphy_kali22.gif
/imgs/gif/gif_spinners/giphy_kali_eyeball.gif
/imgs/gif/gif_spinners/giphy_kids_out_of_boxes.gif
/imgs/gif/gif_spinners/giphy_ko_ali.gif
/imgs/gif/gif_spinners/giphy_konabus_catpillar.gif
/imgs/gif/gif_spinners/giphy_kt_circlemovie.gif
/imgs/gif/gif_spinners/giphy_kt_orb_boxers.gif
/imgs/gif/gif_spinners/giphy_kt_wooky.gif
/imgs/gif/gif_spinners/giphy_laptops.gif
/imgs/gif/gif_spinners/giphy_latern.gif
/imgs/gif/gif_spinners/giphy_layers.gif
/imgs/gif/gif_spinners/giphy_litedisplay.gif
/imgs/gif/gif_spinners/giphy_litehouse_pyramid.gif
/imgs/gif/gif_spinners/giphy_longdress.gif
/imgs/gif/gif_spinners/giphy_man_siluet.gif
/imgs/gif/gif_spinners/giphy_manlaser.gif
/imgs/gif/gif_spinners/giphy_mesh_popcorn.gif
/imgs/gif/gif_spinners/giphy_meshwrap.gif
/imgs/gif/gif_spinners/giphy_network_grid.gif
/imgs/gif/gif_spinners/giphy_network_wiggle.gif
/imgs/gif/gif_spinners/giphy_noise3.gif
/imgs/gif/gif_spinners/giphy_orb_cicle.gif
/imgs/gif/gif_spinners/giphy_orb_drips.gif
/imgs/gif/gif_spinners/giphy_orb_fuzzy.gif
/imgs/gif/gif_spinners/giphy_orb_hary.gif
/imgs/gif/gif_spinners/giphy_orb_in_cube.gif
/imgs/gif/gif_spinners/giphy_orb_jar.gif
/imgs/gif/gif_spinners/giphy_orb_layers.gif
/imgs/gif/gif_spinners/giphy_orb_noise1.gif
/imgs/gif/gif_spinners/giphy_orb_noise2.gif
/imgs/gif/gif_spinners/giphy_orb_noise3.gif
/imgs/gif/gif_spinners/giphy_orb_slow.gif
/imgs/gif/gif_spinners/giphy_orb_spiral.gif
/imgs/gif/gif_spinners/giphy_orb_torus.gif
/imgs/gif/gif_spinners/giphy_orb_tubemesh.gif
/imgs/gif/gif_spinners/giphy_orb_undulate.gif
/imgs/gif/gif_spinners/giphy_orbnois4.gif
/imgs/gif/gif_spinners/giphy_orbtubes.gif
/imgs/gif/gif_spinners/giphy_pagedown.gif
/imgs/gif/gif_spinners/giphy_pastryroad_dunes.gif
/imgs/gif/gif_spinners/giphy_pdf.gif
/imgs/gif/gif_spinners/giphy_pyramid_spirals.gif
/imgs/gif/gif_spinners/giphy_radar.gif
/imgs/gif/gif_spinners/giphy_rectanges.gif
/imgs/gif/gif_spinners/giphy_runningman2.gif
/imgs/gif/gif_spinners/giphy_runningman_atyou.gif
/imgs/gif/gif_spinners/giphy_shades.gif
/imgs/gif/gif_spinners/giphy_spinner2.gif
/imgs/gif/gif_spinners/giphy_spinner3.gif
/imgs/gif/gif_spinners/giphy_spinner8.gif
/imgs/gif/gif_spinners/giphy_spinner9.gif
/imgs/gif/gif_spinners/giphy_spinner_disk.gif
/imgs/gif/gif_spinners/giphy_spinner_orb.gif
/imgs/gif/gif_spinners/giphy_spinner_sumi.gif
/imgs/gif/gif_spinners/giphy_spinners.gif
/imgs/gif/gif_spinners/giphy_spinners_cubes.gif
/imgs/gif/gif_spinners/giphy_spiral.gif
/imgs/gif/gif_spinners/giphy_spiraltwists.gif
/imgs/gif/gif_spinners/giphy_spotlite.gif
/imgs/gif/gif_spinners/giphy_sprial_ripples.gif
/imgs/gif/gif_spinners/giphy_stickynotes.gif
/imgs/gif/gif_spinners/giphy_tetertotter.gif
/imgs/gif/gif_spinners/giphy_toiletpaper.gif
/imgs/gif/gif_spinners/giphy_torusstripes.gif
/imgs/gif/gif_spinners/giphy_tvwatcher.gif
/imgs/gif/gif_spinners/giphy_undulate2.gif
/imgs/gif/gif_spinners/giphy_waveup.gif
/imgs/gif/gif_spinners/giphy_wirebouncer.gif
/imgs/gif/gif_spinners/tumblr_nbuxxtxV3w1tre1zbo1_500.gif
/imgs/gif/gifset_b/apple.gif
/imgs/gif/gifset_b/appleb.gif
/imgs/gif/gifset_b/appleb_1.gif
/imgs/gif/gifset_b/appleb_10.gif
/imgs/gif/gifset_b/appleb_100.gif
/imgs/gif/gifset_b/appleb_2.gif
/imgs/gif/gifset_b/appleb_20.gif
/imgs/gif/gifset_b/appleb_3.gif
/imgs/gif/gifset_b/appleb_30.gif
/imgs/gif/gifset_b/appleb_4.gif
/imgs/gif/gifset_b/appleb_40.gif
/imgs/gif/gifset_b/appleb_5.gif
/imgs/gif/gifset_b/appleb_50.gif
/imgs/gif/gifset_b/appleb_6.gif
/imgs/gif/gifset_b/appleb_7.gif
/imgs/gif/gifset_b/appleb_70.gif
/imgs/gif/gifset_b/appleb_8.gif
/imgs/gif/gifset_b/appleb_80.gif
/imgs/gif/gifset_b/appleb_9.gif
/imgs/gif/gifset_b/appleb_90.gif
/imgs/gif/gifset_b/appled.gif
/imgs/gif/gifset_b/appled_1.gif
/imgs/gif/gifset_b/appled_10.gif
/imgs/gif/gifset_b/appled_100.gif
/imgs/gif/gifset_b/appled_2.gif
/imgs/gif/gifset_b/appled_20.gif
/imgs/gif/gifset_b/appled_3.gif
/imgs/gif/gifset_b/appled_30.gif
/imgs/gif/gifset_b/appled_4.gif
/imgs/gif/gifset_b/appled_40.gif
/imgs/gif/gifset_b/appled_5.gif
/imgs/gif/gifset_b/appled_50.gif
/imgs/gif/gifset_b/appled_6.gif
/imgs/gif/gifset_b/appled_7.gif
/imgs/gif/gifset_b/appled_70.gif
/imgs/gif/gifset_b/appled_8.gif
/imgs/gif/gifset_b/appled_80.gif
/imgs/gif/gifset_b/appled_9.gif
/imgs/gif/gifset_b/appled_90.gif
/imgs/gif/gifset_b/applep.gif
/imgs/gif/gifset_b/applep_1.gif
/imgs/gif/gifset_b/applep_10.gif
/imgs/gif/gifset_b/applep_100.gif
/imgs/gif/gifset_b/applep_2.gif
/imgs/gif/gifset_b/applep_20.gif
/imgs/gif/gifset_b/applep_3.gif
/imgs/gif/gifset_b/applep_30.gif
/imgs/gif/gifset_b/applep_4.gif
/imgs/gif/gifset_b/applep_40.gif
/imgs/gif/gifset_b/applep_5.gif
/imgs/gif/gifset_b/applep_50.gif
/imgs/gif/gifset_b/applep_6.gif
/imgs/gif/gifset_b/applep_7.gif
/imgs/gif/gifset_b/applep_70.gif
/imgs/gif/gifset_b/applep_8.gif
/imgs/gif/gifset_b/applep_80.gif
/imgs/gif/gifset_b/applep_9.gif
/imgs/gif/gifset_b/applep_90.gif
/imgs/gif/gifset_b/appleq.gif
/imgs/gif/gifset_b/appleq_1.gif
/imgs/gif/gifset_b/appleq_10.gif
/imgs/gif/gifset_b/appleq_100.gif
/imgs/gif/gifset_b/appleq_2.gif
/imgs/gif/gifset_b/appleq_20.gif
/imgs/gif/gifset_b/appleq_3.gif
/imgs/gif/gifset_b/appleq_30.gif
/imgs/gif/gifset_b/appleq_4.gif
/imgs/gif/gifset_b/appleq_40.gif
/imgs/gif/gifset_b/appleq_5.gif
/imgs/gif/gifset_b/appleq_50.gif
/imgs/gif/gifset_b/appleq_6.gif
/imgs/gif/gifset_b/appleq_7.gif
/imgs/gif/gifset_b/appleq_70.gif
/imgs/gif/gifset_b/appleq_8.gif
/imgs/gif/gifset_b/appleq_80.gif
/imgs/gif/gifset_b/appleq_9.gif
/imgs/gif/gifset_b/appleq_90.gif
/imgs/gif/gifset_b/awards.gif
/imgs/gif/gifset_b/bh.gif
/imgs/gif/gifset_b/bhb.gif
/imgs/gif/gifset_b/bhb_1.gif
/imgs/gif/gifset_b/bhb_10.gif
/imgs/gif/gifset_b/bhb_100.gif
/imgs/gif/gifset_b/bhb_2.gif
/imgs/gif/gifset_b/bhb_20.gif
/imgs/gif/gifset_b/bhb_3.gif
/imgs/gif/gifset_b/bhb_30.gif
/imgs/gif/gifset_b/bhb_4.gif
/imgs/gif/gifset_b/bhb_40.gif
/imgs/gif/gifset_b/bhb_5.gif
/imgs/gif/gifset_b/bhb_50.gif
/imgs/gif/gifset_b/bhb_6.gif
/imgs/gif/gifset_b/bhb_7.gif
/imgs/gif/gifset_b/bhb_70.gif
/imgs/gif/gifset_b/bhb_8.gif
/imgs/gif/gifset_b/bhb_80.gif
/imgs/gif/gifset_b/bhb_9.gif
/imgs/gif/gifset_b/bhb_90.gif
/imgs/gif/gifset_b/bhd.gif
/imgs/gif/gifset_b/bhd_1.gif
/imgs/gif/gifset_b/bhd_10.gif
/imgs/gif/gifset_b/bhd_100.gif
/imgs/gif/gifset_b/bhd_2.gif
/imgs/gif/gifset_b/bhd_20.gif
/imgs/gif/gifset_b/bhd_3.gif
/imgs/gif/gifset_b/bhd_30.gif
/imgs/gif/gifset_b/bhd_4.gif
/imgs/gif/gifset_b/bhd_40.gif
/imgs/gif/gifset_b/bhd_5.gif
/imgs/gif/gifset_b/bhd_50.gif
/imgs/gif/gifset_b/bhd_6.gif
/imgs/gif/gifset_b/bhd_7.gif
/imgs/gif/gifset_b/bhd_70.gif
/imgs/gif/gifset_b/bhd_8.gif
/imgs/gif/gifset_b/bhd_80.gif
/imgs/gif/gifset_b/bhd_9.gif
/imgs/gif/gifset_b/bhd_90.gif
/imgs/gif/gifset_b/bhp.gif
/imgs/gif/gifset_b/bhp_1.gif
/imgs/gif/gifset_b/bhp_10.gif
/imgs/gif/gifset_b/bhp_100.gif
/imgs/gif/gifset_b/bhp_2.gif
/imgs/gif/gifset_b/bhp_20.gif
/imgs/gif/gifset_b/bhp_3.gif
/imgs/gif/gifset_b/bhp_30.gif
/imgs/gif/gifset_b/bhp_4.gif
/imgs/gif/gifset_b/bhp_40.gif
/imgs/gif/gifset_b/bhp_5.gif
/imgs/gif/gifset_b/bhp_50.gif
/imgs/gif/gifset_b/bhp_6.gif
/imgs/gif/gifset_b/bhp_7.gif
/imgs/gif/gifset_b/bhp_70.gif
/imgs/gif/gifset_b/bhp_8.gif
/imgs/gif/gifset_b/bhp_80.gif
/imgs/gif/gifset_b/bhp_9.gif
/imgs/gif/gifset_b/bhp_90.gif
/imgs/gif/gifset_b/bhq.gif
/imgs/gif/gifset_b/bhq_1.gif
/imgs/gif/gifset_b/bhq_10.gif
/imgs/gif/gifset_b/bhq_100.gif
/imgs/gif/gifset_b/bhq_2.gif
/imgs/gif/gifset_b/bhq_20.gif
/imgs/gif/gifset_b/bhq_3.gif
/imgs/gif/gifset_b/bhq_30.gif
/imgs/gif/gifset_b/bhq_4.gif
/imgs/gif/gifset_b/bhq_40.gif
/imgs/gif/gifset_b/bhq_5.gif
/imgs/gif/gifset_b/bhq_50.gif
/imgs/gif/gifset_b/bhq_6.gif
/imgs/gif/gifset_b/bhq_7.gif
/imgs/gif/gifset_b/bhq_70.gif
/imgs/gif/gifset_b/bhq_8.gif
/imgs/gif/gifset_b/bhq_80.gif
/imgs/gif/gifset_b/bhq_9.gif
/imgs/gif/gifset_b/bhq_90.gif
/imgs/gif/gifset_f/dollars.gif
/imgs/gif/gifset_f/dollarsb.gif
/imgs/gif/gifset_f/dollarsb_1.gif
/imgs/gif/gifset_f/dollarsb_10.gif
/imgs/gif/gifset_f/dollarsb_100.gif
/imgs/gif/gifset_f/dollarsb_2.gif
/imgs/gif/gifset_f/dollarsb_20.gif
/imgs/gif/gifset_f/dollarsb_3.gif
/imgs/gif/gifset_f/dollarsb_30.gif
/imgs/gif/gifset_f/dollarsb_4.gif
/imgs/gif/gifset_f/dollarsb_40.gif
/imgs/gif/gifset_f/dollarsb_5.gif
/imgs/gif/gifset_f/dollarsb_50.gif
/imgs/gif/gifset_f/dollarsb_6.gif
/imgs/gif/gifset_f/dollarsb_7.gif
/imgs/gif/gifset_f/dollarsb_70.gif
/imgs/gif/gifset_f/dollarsb_8.gif
/imgs/gif/gifset_f/dollarsb_80.gif
/imgs/gif/gifset_f/dollarsb_9.gif
/imgs/gif/gifset_f/dollarsb_90.gif
/imgs/gif/gifset_f/dollarsd.gif
/imgs/gif/gifset_f/dollarsd_1.gif
/imgs/gif/gifset_f/dollarsd_10.gif
/imgs/gif/gifset_f/dollarsd_100.gif
/imgs/gif/gifset_f/dollarsd_2.gif
/imgs/gif/gifset_f/dollarsd_20.gif
/imgs/gif/gifset_f/dollarsd_3.gif
/imgs/gif/gifset_f/dollarsd_30.gif
/imgs/gif/gifset_f/dollarsd_4.gif
/imgs/gif/gifset_f/dollarsd_40.gif
/imgs/gif/gifset_f/dollarsd_5.gif
/imgs/gif/gifset_f/dollarsd_50.gif
/imgs/gif/gifset_f/dollarsd_6.gif
/imgs/gif/gifset_f/dollarsd_7.gif
/imgs/gif/gifset_f/dollarsd_70.gif
/imgs/gif/gifset_f/dollarsd_8.gif
/imgs/gif/gifset_f/dollarsd_80.gif
/imgs/gif/gifset_f/dollarsd_9.gif
/imgs/gif/gifset_f/dollarsd_90.gif
/imgs/gif/gifset_f/dollarsp.gif
/imgs/gif/gifset_f/dollarsp_1.gif
/imgs/gif/gifset_f/dollarsp_10.gif
/imgs/gif/gifset_f/dollarsp_100.gif
/imgs/gif/gifset_f/dollarsp_2.gif
/imgs/gif/gifset_f/dollarsp_20.gif
/imgs/gif/gifset_f/dollarsp_3.gif
/imgs/gif/gifset_f/dollarsp_30.gif
/imgs/gif/gifset_f/dollarsp_4.gif
/imgs/gif/gifset_f/dollarsp_40.gif
/imgs/gif/gifset_f/dollarsp_5.gif
/imgs/gif/gifset_f/dollarsp_50.gif
/imgs/gif/gifset_f/dollarsp_6.gif
/imgs/gif/gifset_f/dollarsp_7.gif
/imgs/gif/gifset_f/dollarsp_70.gif
/imgs/gif/gifset_f/dollarsp_8.gif
/imgs/gif/gifset_f/dollarsp_80.gif
/imgs/gif/gifset_f/dollarsp_9.gif
/imgs/gif/gifset_f/dollarsp_90.gif
/imgs/gif/gifset_f/dollarsq.gif
/imgs/gif/gifset_f/dollarsq_1.gif
/imgs/gif/gifset_f/dollarsq_10.gif
/imgs/gif/gifset_f/dollarsq_100.gif
/imgs/gif/gifset_f/dollarsq_2.gif
/imgs/gif/gifset_f/dollarsq_20.gif
/imgs/gif/gifset_f/dollarsq_3.gif
/imgs/gif/gifset_f/dollarsq_30.gif
/imgs/gif/gifset_f/dollarsq_4.gif
/imgs/gif/gifset_f/dollarsq_40.gif
/imgs/gif/gifset_f/dollarsq_5.gif
/imgs/gif/gifset_f/dollarsq_50.gif
/imgs/gif/gifset_f/dollarsq_6.gif
/imgs/gif/gifset_f/dollarsq_7.gif
/imgs/gif/gifset_f/dollarsq_70.gif
/imgs/gif/gifset_f/dollarsq_8.gif
/imgs/gif/gifset_f/dollarsq_80.gif
/imgs/gif/gifset_f/dollarsq_9.gif
/imgs/gif/gifset_f/dollarsq_90.gif
/imgs/gif/gifset_f/eye1.gif
/imgs/gif/gifset_f/eye1b.gif
/imgs/gif/gifset_f/eye1b_1.gif
/imgs/gif/gifset_f/eye1b_10.gif
/imgs/gif/gifset_f/eye1b_100.gif
/imgs/gif/gifset_f/eye1b_2.gif
/imgs/gif/gifset_f/eye1b_20.gif
/imgs/gif/gifset_f/eye1b_3.gif
/imgs/gif/gifset_f/eye1b_30.gif
/imgs/gif/gifset_f/eye1b_4.gif
/imgs/gif/gifset_f/eye1b_40.gif
/imgs/gif/gifset_f/eye1b_5.gif
/imgs/gif/gifset_f/eye1b_50.gif
/imgs/gif/gifset_f/eye1b_6.gif
/imgs/gif/gifset_f/eye1b_7.gif
/imgs/gif/gifset_f/eye1b_70.gif
/imgs/gif/gifset_f/eye1b_8.gif
/imgs/gif/gifset_f/eye1b_80.gif
/imgs/gif/gifset_f/eye1b_9.gif
/imgs/gif/gifset_f/eye1b_90.gif
/imgs/gif/gifset_f/eye1d.gif
/imgs/gif/gifset_f/eye1d_1.gif
/imgs/gif/gifset_f/eye1d_10.gif
/imgs/gif/gifset_f/eye1d_100.gif
/imgs/gif/gifset_f/eye1d_2.gif
/imgs/gif/gifset_f/eye1d_20.gif
/imgs/gif/gifset_f/eye1d_3.gif
/imgs/gif/gifset_f/eye1d_30.gif
/imgs/gif/gifset_f/eye1d_4.gif
/imgs/gif/gifset_f/eye1d_40.gif
/imgs/gif/gifset_f/eye1d_5.gif
/imgs/gif/gifset_f/eye1d_50.gif
/imgs/gif/gifset_f/eye1d_6.gif
/imgs/gif/gifset_f/eye1d_7.gif
/imgs/gif/gifset_f/eye1d_70.gif
/imgs/gif/gifset_f/eye1d_8.gif
/imgs/gif/gifset_f/eye1d_80.gif
/imgs/gif/gifset_f/eye1d_9.gif
/imgs/gif/gifset_f/eye1d_90.gif
/imgs/gif/gifset_f/eye1p.gif
/imgs/gif/gifset_f/eye1p_1.gif
/imgs/gif/gifset_f/eye1p_10.gif
/imgs/gif/gifset_f/eye1p_100.gif
/imgs/gif/gifset_f/eye1p_2.gif
/imgs/gif/gifset_f/eye1p_20.gif
/imgs/gif/gifset_f/eye1p_3.gif
/imgs/gif/gifset_f/eye1p_30.gif
/imgs/gif/gifset_f/eye1p_4.gif
/imgs/gif/gifset_f/eye1p_40.gif
/imgs/gif/gifset_f/eye1p_5.gif
/imgs/gif/gifset_f/eye1p_50.gif
/imgs/gif/gifset_f/eye1p_6.gif
/imgs/gif/gifset_f/eye1p_7.gif
/imgs/gif/gifset_f/eye1p_70.gif
/imgs/gif/gifset_f/eye1p_8.gif
/imgs/gif/gifset_f/eye1p_80.gif
/imgs/gif/gifset_f/eye1p_9.gif
/imgs/gif/gifset_f/eye1p_90.gif
/imgs/gif/gifset_f/eye1q.gif
/imgs/gif/gifset_f/eye1q_1.gif
/imgs/gif/gifset_f/eye1q_10.gif
/imgs/gif/gifset_f/eye1q_100.gif
/imgs/gif/gifset_f/eye1q_2.gif
/imgs/gif/gifset_f/eye1q_20.gif
/imgs/gif/gifset_f/eye1q_3.gif
/imgs/gif/gifset_f/eye1q_30.gif
/imgs/gif/gifset_f/eye1q_4.gif
/imgs/gif/gifset_f/eye1q_40.gif
/imgs/gif/gifset_f/eye1q_5.gif
/imgs/gif/gifset_f/eye1q_50.gif
/imgs/gif/gifset_f/eye1q_6.gif
/imgs/gif/gifset_f/eye1q_7.gif
/imgs/gif/gifset_f/eye1q_70.gif
/imgs/gif/gifset_f/eye1q_8.gif
/imgs/gif/gifset_f/eye1q_80.gif
/imgs/gif/gifset_f/eye1q_9.gif
/imgs/gif/gifset_f/eye1q_90.gif
/imgs/gif/gifset_f/eye2.gif
/imgs/gif/gifset_f/eye2b.gif
/imgs/gif/gifset_f/eye2b_1.gif
/imgs/gif/gifset_f/eye2b_10.gif
/imgs/gif/gifset_f/eye2b_100.gif
/imgs/gif/gifset_f/eye2b_2.gif
/imgs/gif/gifset_f/eye2b_20.gif
/imgs/gif/gifset_f/eye2b_3.gif
/imgs/gif/gifset_f/eye2b_30.gif
/imgs/gif/gifset_f/eye2b_4.gif
/imgs/gif/gifset_f/eye2b_40.gif
/imgs/gif/gifset_f/eye2b_5.gif
/imgs/gif/gifset_f/eye2b_50.gif
/imgs/gif/gifset_f/eye2b_6.gif
/imgs/gif/gifset_f/eye2b_7.gif
/imgs/gif/gifset_f/eye2b_70.gif
/imgs/gif/gifset_f/eye2b_8.gif
/imgs/gif/gifset_f/eye2b_80.gif
/imgs/gif/gifset_f/eye2b_9.gif
/imgs/gif/gifset_f/eye2b_90.gif
/imgs/gif/gifset_f/eye2d.gif
/imgs/gif/gifset_f/eye2d_1.gif
/imgs/gif/gifset_f/eye2d_10.gif
/imgs/gif/gifset_f/eye2d_100.gif
/imgs/gif/gifset_f/eye2d_2.gif
/imgs/gif/gifset_f/eye2d_20.gif
/imgs/gif/gifset_f/eye2d_3.gif
/imgs/gif/gifset_f/eye2d_30.gif
/imgs/gif/gifset_f/eye2d_4.gif
/imgs/gif/gifset_f/eye2d_40.gif
/imgs/gif/gifset_f/eye2d_5.gif
/imgs/gif/gifset_f/eye2d_50.gif
/imgs/gif/gifset_f/eye2d_6.gif
/imgs/gif/gifset_f/eye2d_7.gif
/imgs/gif/gifset_f/eye2d_70.gif
/imgs/gif/gifset_f/eye2d_8.gif
/imgs/gif/gifset_f/eye2d_80.gif
/imgs/gif/gifset_f/eye2d_9.gif
/imgs/gif/gifset_f/eye2d_90.gif
/imgs/gif/gifset_f/eye2p.gif
/imgs/gif/gifset_f/eye2p_1.gif
/imgs/gif/gifset_f/eye2p_10.gif
/imgs/gif/gifset_f/eye2p_100.gif
/imgs/gif/gifset_f/eye2p_2.gif
/imgs/gif/gifset_f/eye2p_20.gif
/imgs/gif/gifset_f/eye2p_3.gif
/imgs/gif/gifset_f/eye2p_30.gif
/imgs/gif/gifset_f/eye2p_4.gif
/imgs/gif/gifset_f/eye2p_40.gif
/imgs/gif/gifset_f/eye2p_5.gif
/imgs/gif/gifset_f/eye2p_50.gif
/imgs/gif/gifset_f/eye2p_6.gif
/imgs/gif/gifset_f/eye2p_7.gif
/imgs/gif/gifset_f/eye2p_70.gif
/imgs/gif/gifset_f/eye2p_8.gif
/imgs/gif/gifset_f/eye2p_80.gif
/imgs/gif/gifset_f/eye2p_9.gif
/imgs/gif/gifset_f/eye2p_90.gif
/imgs/gif/gifset_f/eye2q.gif
/imgs/gif/gifset_f/eye2q_1.gif
/imgs/gif/gifset_f/eye2q_10.gif
/imgs/gif/gifset_f/eye2q_100.gif
/imgs/gif/gifset_f/eye2q_2.gif
/imgs/gif/gifset_f/eye2q_20.gif
/imgs/gif/gifset_f/eye2q_3.gif
/imgs/gif/gifset_f/eye2q_30.gif
/imgs/gif/gifset_f/eye2q_4.gif
/imgs/gif/gifset_f/eye2q_40.gif
/imgs/gif/gifset_f/eye2q_5.gif
/imgs/gif/gifset_f/eye2q_50.gif
/imgs/gif/gifset_f/eye2q_6.gif
/imgs/gif/gifset_f/eye2q_7.gif
/imgs/gif/gifset_f/eye2q_70.gif
/imgs/gif/gifset_f/eye2q_8.gif
/imgs/gif/gifset_f/eye2q_80.gif
/imgs/gif/gifset_f/eye2q_9.gif
/imgs/gif/gifset_f/eye2q_90.gif
/imgs/gif/gifset_f/eye3.gif
/imgs/gif/gifset_f/eye3b.gif
/imgs/gif/gifset_f/eye3b_1.gif
/imgs/gif/gifset_f/eye3b_10.gif
/imgs/gif/gifset_f/eye3b_100.gif
/imgs/gif/gifset_f/eye3b_2.gif
/imgs/gif/gifset_f/eye3b_20.gif
/imgs/gif/gifset_f/eye3b_3.gif
/imgs/gif/gifset_f/eye3b_30.gif
/imgs/gif/gifset_f/eye3b_4.gif
/imgs/gif/gifset_f/eye3b_40.gif
/imgs/gif/gifset_f/eye3b_5.gif
/imgs/gif/gifset_f/eye3b_50.gif
/imgs/gif/gifset_f/eye3b_6.gif
/imgs/gif/gifset_f/eye3b_7.gif
/imgs/gif/gifset_f/eye3b_70.gif
/imgs/gif/gifset_f/eye3b_8.gif
/imgs/gif/gifset_f/eye3b_80.gif
/imgs/gif/gifset_f/eye3b_9.gif
/imgs/gif/gifset_f/eye3b_90.gif
/imgs/gif/gifset_f/eye3d.gif
/imgs/gif/gifset_f/eye3d_1.gif
/imgs/gif/gifset_f/eye3d_10.gif
/imgs/gif/gifset_f/eye3d_100.gif
/imgs/gif/gifset_f/eye3d_2.gif
/imgs/gif/gifset_f/eye3d_20.gif
/imgs/gif/gifset_f/eye3d_3.gif
/imgs/gif/gifset_f/eye3d_30.gif
/imgs/gif/gifset_f/eye3d_4.gif
/imgs/gif/gifset_f/eye3d_40.gif
/imgs/gif/gifset_f/eye3d_5.gif
/imgs/gif/gifset_f/eye3d_50.gif
/imgs/gif/gifset_f/eye3d_6.gif
/imgs/gif/gifset_f/eye3d_7.gif
/imgs/gif/gifset_f/eye3d_70.gif
/imgs/gif/gifset_f/eye3d_8.gif
/imgs/gif/gifset_f/eye3d_80.gif
/imgs/gif/gifset_f/eye3d_9.gif
/imgs/gif/gifset_f/eye3d_90.gif
/imgs/gif/gifset_f/eye3p.gif
/imgs/gif/gifset_f/eye3p_1.gif
/imgs/gif/gifset_f/eye3p_10.gif
/imgs/gif/gifset_f/eye3p_100.gif
/imgs/gif/gifset_f/eye3p_2.gif
/imgs/gif/gifset_f/eye3p_20.gif
/imgs/gif/gifset_f/eye3p_3.gif
/imgs/gif/gifset_f/eye3p_30.gif
/imgs/gif/gifset_f/eye3p_4.gif
/imgs/gif/gifset_f/eye3p_40.gif
/imgs/gif/gifset_f/eye3p_5.gif
/imgs/gif/gifset_f/eye3p_50.gif
/imgs/gif/gifset_f/eye3p_6.gif
/imgs/gif/gifset_f/eye3p_7.gif
/imgs/gif/gifset_f/eye3p_70.gif
/imgs/gif/gifset_f/eye3p_8.gif
/imgs/gif/gifset_f/eye3p_80.gif
/imgs/gif/gifset_f/eye3p_9.gif
/imgs/gif/gifset_f/eye3p_90.gif
/imgs/gif/gifset_f/eye3q.gif
/imgs/gif/gifset_f/eye3q_1.gif
/imgs/gif/gifset_f/eye3q_10.gif
/imgs/gif/gifset_f/eye3q_100.gif
/imgs/gif/gifset_f/eye3q_2.gif
/imgs/gif/gifset_f/eye3q_20.gif
/imgs/gif/gifset_f/eye3q_3.gif
/imgs/gif/gifset_f/eye3q_30.gif
/imgs/gif/gifset_f/eye3q_4.gif
/imgs/gif/gifset_f/eye3q_40.gif
/imgs/gif/gifset_f/eye3q_5.gif
/imgs/gif/gifset_f/eye3q_50.gif
/imgs/gif/gifset_f/eye3q_6.gif
/imgs/gif/gifset_f/eye3q_7.gif
/imgs/gif/gifset_f/eye3q_70.gif
/imgs/gif/gifset_f/eye3q_8.gif
/imgs/gif/gifset_f/eye3q_80.gif
/imgs/gif/gifset_f/eye3q_9.gif
/imgs/gif/gifset_f/eye3q_90.gif
/imgs/gif/gifset_f/film.gif
/imgs/gif/gifset_f/filmb.gif
/imgs/gif/gifset_f/filmb_1.gif
/imgs/gif/gifset_f/filmb_10.gif
/imgs/gif/gifset_f/filmb_100.gif
/imgs/gif/gifset_f/filmb_2.gif
/imgs/gif/gifset_f/filmb_20.gif
/imgs/gif/gifset_f/filmb_3.gif
/imgs/gif/gifset_f/filmb_30.gif
/imgs/gif/gifset_f/filmb_4.gif
/imgs/gif/gifset_f/filmb_40.gif
/imgs/gif/gifset_f/filmb_5.gif
/imgs/gif/gifset_f/filmb_50.gif
/imgs/gif/gifset_f/filmb_6.gif
/imgs/gif/gifset_f/filmb_7.gif
/imgs/gif/gifset_f/filmb_70.gif
/imgs/gif/gifset_f/filmb_8.gif
/imgs/gif/gifset_f/filmb_80.gif
/imgs/gif/gifset_f/filmb_9.gif
/imgs/gif/gifset_f/filmb_90.gif
/imgs/gif/gifset_f/filmd.gif
/imgs/gif/gifset_f/filmd_1.gif
/imgs/gif/gifset_f/filmd_10.gif
/imgs/gif/gifset_f/filmd_100.gif
/imgs/gif/gifset_f/filmd_2.gif
/imgs/gif/gifset_f/filmd_20.gif
/imgs/gif/gifset_f/filmd_3.gif
/imgs/gif/gifset_f/filmd_30.gif
/imgs/gif/gifset_f/filmd_4.gif
/imgs/gif/gifset_f/filmd_40.gif
/imgs/gif/gifset_f/filmd_5.gif
/imgs/gif/gifset_f/filmd_50.gif
/imgs/gif/gifset_f/filmd_6.gif
/imgs/gif/gifset_f/filmd_7.gif
/imgs/gif/gifset_f/filmd_70.gif
/imgs/gif/gifset_f/filmd_8.gif
/imgs/gif/gifset_f/filmd_80.gif
/imgs/gif/gifset_f/filmd_9.gif
/imgs/gif/gifset_f/filmd_90.gif
/imgs/gif/gifset_f/filmp.gif
/imgs/gif/gifset_f/filmp_1.gif
/imgs/gif/gifset_f/filmp_10.gif
/imgs/gif/gifset_f/filmp_100.gif
/imgs/gif/gifset_f/filmp_2.gif
/imgs/gif/gifset_f/filmp_20.gif
/imgs/gif/gifset_f/filmp_3.gif
/imgs/gif/gifset_f/filmp_30.gif
/imgs/gif/gifset_f/filmp_4.gif
/imgs/gif/gifset_f/filmp_40.gif
/imgs/gif/gifset_f/filmp_5.gif
/imgs/gif/gifset_f/filmp_50.gif
/imgs/gif/gifset_f/filmp_6.gif
/imgs/gif/gifset_f/filmp_7.gif
/imgs/gif/gifset_f/filmp_70.gif
/imgs/gif/gifset_f/filmp_8.gif
/imgs/gif/gifset_f/filmp_80.gif
/imgs/gif/gifset_f/filmp_9.gif
/imgs/gif/gifset_f/filmp_90.gif
/imgs/gif/gifset_f/filmq.gif
/imgs/gif/gifset_f/filmq_1.gif
/imgs/gif/gifset_f/filmq_10.gif
/imgs/gif/gifset_f/filmq_100.gif
/imgs/gif/gifset_f/filmq_2.gif
/imgs/gif/gifset_f/filmq_20.gif
/imgs/gif/gifset_f/filmq_3.gif
/imgs/gif/gifset_f/filmq_30.gif
/imgs/gif/gifset_f/filmq_4.gif
/imgs/gif/gifset_f/filmq_40.gif
/imgs/gif/gifset_f/filmq_5.gif
/imgs/gif/gifset_f/filmq_50.gif
/imgs/gif/gifset_f/filmq_6.gif
/imgs/gif/gifset_f/filmq_7.gif
/imgs/gif/gifset_f/filmq_70.gif
/imgs/gif/gifset_f/filmq_8.gif
/imgs/gif/gifset_f/filmq_80.gif
/imgs/gif/gifset_f/filmq_9.gif
/imgs/gif/gifset_f/filmq_90.gif
/imgs/gif/gifset_f/firebubblesb_1.gif
/imgs/gif/gifset_f/firebubblesb_10.gif
/imgs/gif/gifset_f/firebubblesb_100.gif
/imgs/gif/gifset_f/firebubblesb_2.gif
/imgs/gif/gifset_f/firebubblesb_20.gif
/imgs/gif/gifset_f/firebubblesb_3.gif
/imgs/gif/gifset_f/firebubblesb_30.gif
/imgs/gif/gifset_f/firebubblesb_4.gif
/imgs/gif/gifset_f/firebubblesb_40.gif
/imgs/gif/gifset_f/firebubblesb_5.gif
/imgs/gif/gifset_f/firebubblesb_50.gif
/imgs/gif/gifset_f/firebubblesb_6.gif
/imgs/gif/gifset_f/firebubblesb_7.gif
/imgs/gif/gifset_f/firebubblesb_70.gif
/imgs/gif/gifset_f/firebubblesb_8.gif
/imgs/gif/gifset_f/firebubblesb_80.gif
/imgs/gif/gifset_f/firebubblesb_9.gif
/imgs/gif/gifset_f/firebubblesb_90.gif
/imgs/gif/gifset_f/firebubblesd_1.gif
/imgs/gif/gifset_f/firebubblesd_10.gif
/imgs/gif/gifset_f/firebubblesd_100.gif
/imgs/gif/gifset_f/firebubblesd_2.gif
/imgs/gif/gifset_f/firebubblesd_20.gif
/imgs/gif/gifset_f/firebubblesd_3.gif
/imgs/gif/gifset_f/firebubblesd_30.gif
/imgs/gif/gifset_f/firebubblesd_4.gif
/imgs/gif/gifset_f/firebubblesd_40.gif
/imgs/gif/gifset_f/firebubblesd_5.gif
/imgs/gif/gifset_f/firebubblesd_50.gif
/imgs/gif/gifset_f/firebubblesd_6.gif
/imgs/gif/gifset_f/firebubblesd_7.gif
/imgs/gif/gifset_f/firebubblesd_70.gif
/imgs/gif/gifset_f/firebubblesd_8.gif
/imgs/gif/gifset_f/firebubblesd_80.gif
/imgs/gif/gifset_f/firebubblesd_9.gif
/imgs/gif/gifset_f/firebubblesd_90.gif
/imgs/gif/gifset_f/firebubblesp_1.gif
/imgs/gif/gifset_f/firebubblesp_10.gif
/imgs/gif/gifset_f/firebubblesp_100.gif
/imgs/gif/gifset_f/firebubblesp_2.gif
/imgs/gif/gifset_f/firebubblesp_20.gif
/imgs/gif/gifset_f/firebubblesp_3.gif
/imgs/gif/gifset_f/firebubblesp_30.gif
/imgs/gif/gifset_f/firebubblesp_4.gif
/imgs/gif/gifset_f/firebubblesp_40.gif
/imgs/gif/gifset_f/firebubblesp_5.gif
/imgs/gif/gifset_f/firebubblesp_50.gif
/imgs/gif/gifset_f/firebubblesp_6.gif
/imgs/gif/gifset_f/firebubblesp_7.gif
/imgs/gif/gifset_f/firebubblesp_70.gif
/imgs/gif/gifset_f/firebubblesp_8.gif
/imgs/gif/gifset_f/firebubblesp_80.gif
/imgs/gif/gifset_f/firebubblesp_9.gif
/imgs/gif/gifset_f/firebubblesp_90.gif
/imgs/gif/gifset_firebubbles/firework.gif
/imgs/gif/gifset_firebubbles/fireworkb.gif
/imgs/gif/gifset_firebubbles/fireworkb_1.gif
/imgs/gif/gifset_firebubbles/fireworkb_10.gif
/imgs/gif/gifset_firebubbles/fireworkb_100.gif
/imgs/gif/gifset_firebubbles/fireworkb_2.gif
/imgs/gif/gifset_firebubbles/fireworkb_20.gif
/imgs/gif/gifset_firebubbles/fireworkb_3.gif
/imgs/gif/gifset_firebubbles/fireworkb_30.gif
/imgs/gif/gifset_firebubbles/fireworkb_4.gif
/imgs/gif/gifset_firebubbles/fireworkb_40.gif
/imgs/gif/gifset_firebubbles/fireworkb_5.gif
/imgs/gif/gifset_firebubbles/fireworkb_50.gif
/imgs/gif/gifset_firebubbles/fireworkb_6.gif
/imgs/gif/gifset_firebubbles/fireworkb_7.gif
/imgs/gif/gifset_firebubbles/fireworkb_70.gif
/imgs/gif/gifset_firebubbles/fireworkb_8.gif
/imgs/gif/gifset_firebubbles/fireworkb_80.gif
/imgs/gif/gifset_firebubbles/fireworkb_9.gif
/imgs/gif/gifset_firebubbles/fireworkb_90.gif
/imgs/gif/gifset_firebubbles/fireworkd.gif
/imgs/gif/gifset_firebubbles/fireworkd_1.gif
/imgs/gif/gifset_firebubbles/fireworkd_10.gif
/imgs/gif/gifset_firebubbles/fireworkd_100.gif
/imgs/gif/gifset_firebubbles/fireworkd_2.gif
/imgs/gif/gifset_firebubbles/fireworkd_20.gif
/imgs/gif/gifset_firebubbles/fireworkd_3.gif
/imgs/gif/gifset_firebubbles/fireworkd_30.gif
/imgs/gif/gifset_firebubbles/fireworkd_4.gif
/imgs/gif/gifset_firebubbles/fireworkd_40.gif
/imgs/gif/gifset_firebubbles/fireworkd_5.gif
/imgs/gif/gifset_firebubbles/fireworkd_50.gif
/imgs/gif/gifset_firebubbles/fireworkd_6.gif
/imgs/gif/gifset_firebubbles/fireworkd_7.gif
/imgs/gif/gifset_firebubbles/fireworkd_70.gif
/imgs/gif/gifset_firebubbles/fireworkd_8.gif
/imgs/gif/gifset_firebubbles/fireworkd_80.gif
/imgs/gif/gifset_firebubbles/fireworkd_9.gif
/imgs/gif/gifset_firebubbles/fireworkd_90.gif
/imgs/gif/gifset_firebubbles/fireworkp.gif
/imgs/gif/gifset_firebubbles/fireworkp_1.gif
/imgs/gif/gifset_firebubbles/fireworkp_10.gif
/imgs/gif/gifset_firebubbles/fireworkp_100.gif
/imgs/gif/gifset_firebubbles/fireworkp_2.gif
/imgs/gif/gifset_firebubbles/fireworkp_20.gif
/imgs/gif/gifset_firebubbles/fireworkp_3.gif
/imgs/gif/gifset_firebubbles/fireworkp_30.gif
/imgs/gif/gifset_firebubbles/fireworkp_4.gif
/imgs/gif/gifset_firebubbles/fireworkp_40.gif
/imgs/gif/gifset_firebubbles/fireworkp_5.gif
/imgs/gif/gifset_firebubbles/fireworkp_50.gif
/imgs/gif/gifset_firebubbles/fireworkp_6.gif
/imgs/gif/gifset_firebubbles/fireworkp_7.gif
/imgs/gif/gifset_firebubbles/fireworkp_70.gif
/imgs/gif/gifset_firebubbles/fireworkp_8.gif
/imgs/gif/gifset_firebubbles/fireworkp_80.gif
/imgs/gif/gifset_firebubbles/fireworkp_9.gif
/imgs/gif/gifset_firebubbles/fireworkp_90.gif
/imgs/gif/gifset_firebubbles/fireworkq.gif
/imgs/gif/gifset_firebubbles/fireworkq_1.gif
/imgs/gif/gifset_firebubbles/fireworkq_10.gif
/imgs/gif/gifset_firebubbles/fireworkq_100.gif
/imgs/gif/gifset_firebubbles/fireworkq_2.gif
/imgs/gif/gifset_firebubbles/fireworkq_20.gif
/imgs/gif/gifset_firebubbles/fireworkq_3.gif
/imgs/gif/gifset_firebubbles/fireworkq_30.gif
/imgs/gif/gifset_firebubbles/fireworkq_4.gif
/imgs/gif/gifset_firebubbles/fireworkq_40.gif
/imgs/gif/gifset_firebubbles/fireworkq_5.gif
/imgs/gif/gifset_firebubbles/fireworkq_50.gif
/imgs/gif/gifset_firebubbles/fireworkq_6.gif
/imgs/gif/gifset_firebubbles/fireworkq_7.gif
/imgs/gif/gifset_firebubbles/fireworkq_70.gif
/imgs/gif/gifset_firebubbles/fireworkq_8.gif
/imgs/gif/gifset_firebubbles/fireworkq_80.gif
/imgs/gif/gifset_firebubbles/fireworkq_9.gif
/imgs/gif/gifset_firebubbles/fireworkq_90.gif
/imgs/gif/gifset_h/geard2.gif
/imgs/gif/gifset_h/geard2b.gif
/imgs/gif/gifset_h/geard2b_1.gif
/imgs/gif/gifset_h/geard2b_10.gif
/imgs/gif/gifset_h/geard2b_100.gif
/imgs/gif/gifset_h/geard2b_2.gif
/imgs/gif/gifset_h/geard2b_20.gif
/imgs/gif/gifset_h/geard2b_3.gif
/imgs/gif/gifset_h/geard2b_30.gif
/imgs/gif/gifset_h/geard2b_4.gif
/imgs/gif/gifset_h/geard2b_40.gif
/imgs/gif/gifset_h/geard2b_5.gif
/imgs/gif/gifset_h/geard2b_50.gif
/imgs/gif/gifset_h/geard2b_6.gif
/imgs/gif/gifset_h/geard2b_7.gif
/imgs/gif/gifset_h/geard2b_70.gif
/imgs/gif/gifset_h/geard2b_8.gif
/imgs/gif/gifset_h/geard2b_80.gif
/imgs/gif/gifset_h/geard2b_9.gif
/imgs/gif/gifset_h/geard2b_90.gif
/imgs/gif/gifset_h/geard2d.gif
/imgs/gif/gifset_h/geard2d_1.gif
/imgs/gif/gifset_h/geard2d_10.gif
/imgs/gif/gifset_h/geard2d_100.gif
/imgs/gif/gifset_h/geard2d_2.gif
/imgs/gif/gifset_h/geard2d_20.gif
/imgs/gif/gifset_h/geard2d_3.gif
/imgs/gif/gifset_h/geard2d_30.gif
/imgs/gif/gifset_h/geard2d_4.gif
/imgs/gif/gifset_h/geard2d_40.gif
/imgs/gif/gifset_h/geard2d_5.gif
/imgs/gif/gifset_h/geard2d_50.gif
/imgs/gif/gifset_h/geard2d_6.gif
/imgs/gif/gifset_h/geard2d_7.gif
/imgs/gif/gifset_h/geard2d_70.gif
/imgs/gif/gifset_h/geard2d_8.gif
/imgs/gif/gifset_h/geard2d_80.gif
/imgs/gif/gifset_h/geard2d_9.gif
/imgs/gif/gifset_h/geard2d_90.gif
/imgs/gif/gifset_h/geard2p.gif
/imgs/gif/gifset_h/geard2p_1.gif
/imgs/gif/gifset_h/geard2p_10.gif
/imgs/gif/gifset_h/geard2p_100.gif
/imgs/gif/gifset_h/geard2p_2.gif
/imgs/gif/gifset_h/geard2p_20.gif
/imgs/gif/gifset_h/geard2p_3.gif
/imgs/gif/gifset_h/geard2p_30.gif
/imgs/gif/gifset_h/geard2p_4.gif
/imgs/gif/gifset_h/geard2p_40.gif
/imgs/gif/gifset_h/geard2p_5.gif
/imgs/gif/gifset_h/geard2p_50.gif
/imgs/gif/gifset_h/geard2p_6.gif
/imgs/gif/gifset_h/geard2p_7.gif
/imgs/gif/gifset_h/geard2p_70.gif
/imgs/gif/gifset_h/geard2p_8.gif
/imgs/gif/gifset_h/geard2p_80.gif
/imgs/gif/gifset_h/geard2p_9.gif
/imgs/gif/gifset_h/geard2p_90.gif
/imgs/gif/gifset_h/geard2q.gif
/imgs/gif/gifset_h/geard2q_1.gif
/imgs/gif/gifset_h/geard2q_10.gif
/imgs/gif/gifset_h/geard2q_100.gif
/imgs/gif/gifset_h/geard2q_2.gif
/imgs/gif/gifset_h/geard2q_20.gif
/imgs/gif/gifset_h/geard2q_3.gif
/imgs/gif/gifset_h/geard2q_30.gif
/imgs/gif/gifset_h/geard2q_4.gif
/imgs/gif/gifset_h/geard2q_40.gif
/imgs/gif/gifset_h/geard2q_5.gif
/imgs/gif/gifset_h/geard2q_50.gif
/imgs/gif/gifset_h/geard2q_6.gif
/imgs/gif/gifset_h/geard2q_7.gif
/imgs/gif/gifset_h/geard2q_70.gif
/imgs/gif/gifset_h/geard2q_8.gif
/imgs/gif/gifset_h/geard2q_80.gif
/imgs/gif/gifset_h/geard2q_9.gif
/imgs/gif/gifset_h/geard2q_90.gif
/imgs/gif/gifset_h/gears2.gif
/imgs/gif/gifset_h/gears2b.gif
/imgs/gif/gifset_h/gears2b_1.gif
/imgs/gif/gifset_h/gears2b_10.gif
/imgs/gif/gifset_h/gears2b_100.gif
/imgs/gif/gifset_h/gears2b_2.gif
/imgs/gif/gifset_h/gears2b_20.gif
/imgs/gif/gifset_h/gears2b_3.gif
/imgs/gif/gifset_h/gears2b_30.gif
/imgs/gif/gifset_h/gears2b_4.gif
/imgs/gif/gifset_h/gears2b_40.gif
/imgs/gif/gifset_h/gears2b_5.gif
/imgs/gif/gifset_h/gears2b_50.gif
/imgs/gif/gifset_h/gears2b_6.gif
/imgs/gif/gifset_h/gears2b_7.gif
/imgs/gif/gifset_h/gears2b_70.gif
/imgs/gif/gifset_h/gears2b_8.gif
/imgs/gif/gifset_h/gears2b_80.gif
/imgs/gif/gifset_h/gears2b_9.gif
/imgs/gif/gifset_h/gears2b_90.gif
/imgs/gif/gifset_h/gears2d.gif
/imgs/gif/gifset_h/gears2d_1.gif
/imgs/gif/gifset_h/gears2d_10.gif
/imgs/gif/gifset_h/gears2d_100.gif
/imgs/gif/gifset_h/gears2d_2.gif
/imgs/gif/gifset_h/gears2d_20.gif
/imgs/gif/gifset_h/gears2d_3.gif
/imgs/gif/gifset_h/gears2d_30.gif
/imgs/gif/gifset_h/gears2d_4.gif
/imgs/gif/gifset_h/gears2d_40.gif
/imgs/gif/gifset_h/gears2d_5.gif
/imgs/gif/gifset_h/gears2d_50.gif
/imgs/gif/gifset_h/gears2d_6.gif
/imgs/gif/gifset_h/gears2d_7.gif
/imgs/gif/gifset_h/gears2d_70.gif
/imgs/gif/gifset_h/gears2d_8.gif
/imgs/gif/gifset_h/gears2d_80.gif
/imgs/gif/gifset_h/gears2d_9.gif
/imgs/gif/gifset_h/gears2d_90.gif
/imgs/gif/gifset_h/gears2p.gif
/imgs/gif/gifset_h/gears2p_1.gif
/imgs/gif/gifset_h/gears2p_10.gif
/imgs/gif/gifset_h/gears2p_100.gif
/imgs/gif/gifset_h/gears2p_2.gif
/imgs/gif/gifset_h/gears2p_20.gif
/imgs/gif/gifset_h/gears2p_3.gif
/imgs/gif/gifset_h/gears2p_30.gif
/imgs/gif/gifset_h/gears2p_4.gif
/imgs/gif/gifset_h/gears2p_40.gif
/imgs/gif/gifset_h/gears2p_5.gif
/imgs/gif/gifset_h/gears2p_50.gif
/imgs/gif/gifset_h/gears2p_6.gif
/imgs/gif/gifset_h/gears2p_7.gif
/imgs/gif/gifset_h/gears2p_70.gif
/imgs/gif/gifset_h/gears2p_8.gif
/imgs/gif/gifset_h/gears2p_80.gif
/imgs/gif/gifset_h/gears2p_9.gif
/imgs/gif/gifset_h/gears2p_90.gif
/imgs/gif/gifset_h/gears2q.gif
/imgs/gif/gifset_h/gears2q_1.gif
/imgs/gif/gifset_h/gears2q_10.gif
/imgs/gif/gifset_h/gears2q_100.gif
/imgs/gif/gifset_h/gears2q_2.gif
/imgs/gif/gifset_h/gears2q_20.gif
/imgs/gif/gifset_h/gears2q_3.gif
/imgs/gif/gifset_h/gears2q_30.gif
/imgs/gif/gifset_h/gears2q_4.gif
/imgs/gif/gifset_h/gears2q_40.gif
/imgs/gif/gifset_h/gears2q_5.gif
/imgs/gif/gifset_h/gears2q_50.gif
/imgs/gif/gifset_h/gears2q_6.gif
/imgs/gif/gifset_h/gears2q_7.gif
/imgs/gif/gifset_h/gears2q_70.gif
/imgs/gif/gifset_h/gears2q_8.gif
/imgs/gif/gifset_h/gears2q_80.gif
/imgs/gif/gifset_h/gears2q_9.gif
/imgs/gif/gifset_h/gears2q_90.gif
/imgs/gif/gifset_h/header.gif
/imgs/gif/gifset_h/headerb.gif
/imgs/gif/gifset_h/headerb_1.gif
/imgs/gif/gifset_h/headerb_10.gif
/imgs/gif/gifset_h/headerb_100.gif
/imgs/gif/gifset_h/headerb_2.gif
/imgs/gif/gifset_h/headerb_20.gif
/imgs/gif/gifset_h/headerb_3.gif
/imgs/gif/gifset_h/headerb_30.gif
/imgs/gif/gifset_h/headerb_4.gif
/imgs/gif/gifset_h/headerb_40.gif
/imgs/gif/gifset_h/headerb_5.gif
/imgs/gif/gifset_h/headerb_50.gif
/imgs/gif/gifset_h/headerb_6.gif
/imgs/gif/gifset_h/headerb_7.gif
/imgs/gif/gifset_h/headerb_70.gif
/imgs/gif/gifset_h/headerb_8.gif
/imgs/gif/gifset_h/headerb_80.gif
/imgs/gif/gifset_h/headerb_9.gif
/imgs/gif/gifset_h/headerb_90.gif
/imgs/gif/gifset_h/headerd.gif
/imgs/gif/gifset_h/headerd_1.gif
/imgs/gif/gifset_h/headerd_10.gif
/imgs/gif/gifset_h/headerd_100.gif
/imgs/gif/gifset_h/headerd_2.gif
/imgs/gif/gifset_h/headerd_20.gif
/imgs/gif/gifset_h/headerd_3.gif
/imgs/gif/gifset_h/headerd_30.gif
/imgs/gif/gifset_h/headerd_4.gif
/imgs/gif/gifset_h/headerd_40.gif
/imgs/gif/gifset_h/headerd_5.gif
/imgs/gif/gifset_h/headerd_50.gif
/imgs/gif/gifset_h/headerd_6.gif
/imgs/gif/gifset_h/headerd_7.gif
/imgs/gif/gifset_h/headerd_70.gif
/imgs/gif/gifset_h/headerd_8.gif
/imgs/gif/gifset_h/headerd_80.gif
/imgs/gif/gifset_h/headerd_9.gif
/imgs/gif/gifset_h/headerd_90.gif
/imgs/gif/gifset_h/headerp.gif
/imgs/gif/gifset_h/headerp_1.gif
/imgs/gif/gifset_h/headerp_10.gif
/imgs/gif/gifset_h/headerp_100.gif
/imgs/gif/gifset_h/headerp_2.gif
/imgs/gif/gifset_h/headerp_20.gif
/imgs/gif/gifset_h/headerp_3.gif
/imgs/gif/gifset_h/headerp_30.gif
/imgs/gif/gifset_h/headerp_4.gif
/imgs/gif/gifset_h/headerp_40.gif
/imgs/gif/gifset_h/headerp_5.gif
/imgs/gif/gifset_h/headerp_50.gif
/imgs/gif/gifset_h/headerp_6.gif
/imgs/gif/gifset_h/headerp_7.gif
/imgs/gif/gifset_h/headerp_70.gif
/imgs/gif/gifset_h/headerp_8.gif
/imgs/gif/gifset_h/headerp_80.gif
/imgs/gif/gifset_h/headerp_9.gif
/imgs/gif/gifset_h/headerp_90.gif
/imgs/gif/gifset_h/headerq.gif
/imgs/gif/gifset_h/headerq_1.gif
/imgs/gif/gifset_h/headerq_10.gif
/imgs/gif/gifset_h/headerq_100.gif
/imgs/gif/gifset_h/headerq_2.gif
/imgs/gif/gifset_h/headerq_20.gif
/imgs/gif/gifset_h/headerq_3.gif
/imgs/gif/gifset_h/headerq_30.gif
/imgs/gif/gifset_h/headerq_4.gif
/imgs/gif/gifset_h/headerq_40.gif
/imgs/gif/gifset_h/headerq_5.gif
/imgs/gif/gifset_h/headerq_50.gif
/imgs/gif/gifset_h/headerq_6.gif
/imgs/gif/gifset_h/headerq_7.gif
/imgs/gif/gifset_h/headerq_70.gif
/imgs/gif/gifset_h/headerq_8.gif
/imgs/gif/gifset_h/headerq_80.gif
/imgs/gif/gifset_h/headerq_9.gif
/imgs/gif/gifset_h/headerq_90.gif
/imgs/gif/gifset_h/heart.gif
/imgs/gif/gifset_h/heartb.gif
/imgs/gif/gifset_h/heartb_1.gif
/imgs/gif/gifset_h/heartb_10.gif
/imgs/gif/gifset_h/heartb_100.gif
/imgs/gif/gifset_h/heartb_2.gif
/imgs/gif/gifset_h/heartb_20.gif
/imgs/gif/gifset_h/heartb_3.gif
/imgs/gif/gifset_h/heartb_30.gif
/imgs/gif/gifset_h/heartb_4.gif
/imgs/gif/gifset_h/heartb_40.gif
/imgs/gif/gifset_h/heartb_5.gif
/imgs/gif/gifset_h/heartb_50.gif
/imgs/gif/gifset_h/heartb_6.gif
/imgs/gif/gifset_h/heartb_7.gif
/imgs/gif/gifset_h/heartb_70.gif
/imgs/gif/gifset_h/heartb_8.gif
/imgs/gif/gifset_h/heartb_80.gif
/imgs/gif/gifset_h/heartb_9.gif
/imgs/gif/gifset_h/heartb_90.gif
/imgs/gif/gifset_h/heartd.gif
/imgs/gif/gifset_h/heartd_1.gif
/imgs/gif/gifset_h/heartd_10.gif
/imgs/gif/gifset_h/heartd_100.gif
/imgs/gif/gifset_h/heartd_2.gif
/imgs/gif/gifset_h/heartd_20.gif
/imgs/gif/gifset_h/heartd_3.gif
/imgs/gif/gifset_h/heartd_30.gif
/imgs/gif/gifset_h/heartd_4.gif
/imgs/gif/gifset_h/heartd_40.gif
/imgs/gif/gifset_h/heartd_5.gif
/imgs/gif/gifset_h/heartd_50.gif
/imgs/gif/gifset_h/heartd_6.gif
/imgs/gif/gifset_h/heartd_7.gif
/imgs/gif/gifset_h/heartd_70.gif
/imgs/gif/gifset_h/heartd_8.gif
/imgs/gif/gifset_h/heartd_80.gif
/imgs/gif/gifset_h/heartd_9.gif
/imgs/gif/gifset_h/heartd_90.gif
/imgs/gif/gifset_h/heartp.gif
/imgs/gif/gifset_h/heartp_1.gif
/imgs/gif/gifset_h/heartp_10.gif
/imgs/gif/gifset_h/heartp_100.gif
/imgs/gif/gifset_h/heartp_2.gif
/imgs/gif/gifset_h/heartp_20.gif
/imgs/gif/gifset_h/heartp_3.gif
/imgs/gif/gifset_h/heartp_30.gif
/imgs/gif/gifset_h/heartp_4.gif
/imgs/gif/gifset_h/heartp_40.gif
/imgs/gif/gifset_h/heartp_5.gif
/imgs/gif/gifset_h/heartp_50.gif
/imgs/gif/gifset_h/heartp_6.gif
/imgs/gif/gifset_h/heartp_7.gif
/imgs/gif/gifset_h/heartp_70.gif
/imgs/gif/gifset_h/heartp_8.gif
/imgs/gif/gifset_h/heartp_80.gif
/imgs/gif/gifset_h/heartp_9.gif
/imgs/gif/gifset_h/heartp_90.gif
/imgs/gif/gifset_h/heartq.gif
/imgs/gif/gifset_h/heartq_1.gif
/imgs/gif/gifset_h/heartq_10.gif
/imgs/gif/gifset_h/heartq_100.gif
/imgs/gif/gifset_h/heartq_2.gif
/imgs/gif/gifset_h/heartq_20.gif
/imgs/gif/gifset_h/heartq_3.gif
/imgs/gif/gifset_h/heartq_30.gif
/imgs/gif/gifset_h/heartq_4.gif
/imgs/gif/gifset_h/heartq_40.gif
/imgs/gif/gifset_h/heartq_5.gif
/imgs/gif/gifset_h/heartq_50.gif
/imgs/gif/gifset_h/heartq_6.gif
/imgs/gif/gifset_h/heartq_7.gif
/imgs/gif/gifset_h/heartq_70.gif
/imgs/gif/gifset_h/heartq_8.gif
/imgs/gif/gifset_h/heartq_80.gif
/imgs/gif/gifset_h/heartq_9.gif
/imgs/gif/gifset_h/heartq_90.gif
/imgs/gif/gifset_h/helpbean.gif
/imgs/gif/gifset_knots/knot.gif
/imgs/gif/gifset_knots/knot_koeye.gif
/imgs/gif/gifset_knots/knotb.gif
/imgs/gif/gifset_knots/knotb_1.gif
/imgs/gif/gifset_knots/knotb_10.gif
/imgs/gif/gifset_knots/knotb_100.gif
/imgs/gif/gifset_knots/knotb_2.gif
/imgs/gif/gifset_knots/knotb_20.gif
/imgs/gif/gifset_knots/knotb_3.gif
/imgs/gif/gifset_knots/knotb_30.gif
/imgs/gif/gifset_knots/knotb_4.gif
/imgs/gif/gifset_knots/knotb_40.gif
/imgs/gif/gifset_knots/knotb_5.gif
/imgs/gif/gifset_knots/knotb_50.gif
/imgs/gif/gifset_knots/knotb_6.gif
/imgs/gif/gifset_knots/knotb_7.gif
/imgs/gif/gifset_knots/knotb_70.gif
/imgs/gif/gifset_knots/knotb_8.gif
/imgs/gif/gifset_knots/knotb_80.gif
/imgs/gif/gifset_knots/knotb_9.gif
/imgs/gif/gifset_knots/knotb_90.gif
/imgs/gif/gifset_knots/knotd.gif
/imgs/gif/gifset_knots/knotd_1.gif
/imgs/gif/gifset_knots/knotd_10.gif
/imgs/gif/gifset_knots/knotd_100.gif
/imgs/gif/gifset_knots/knotd_2.gif
/imgs/gif/gifset_knots/knotd_20.gif
/imgs/gif/gifset_knots/knotd_3.gif
/imgs/gif/gifset_knots/knotd_30.gif
/imgs/gif/gifset_knots/knotd_4.gif
/imgs/gif/gifset_knots/knotd_40.gif
/imgs/gif/gifset_knots/knotd_5.gif
/imgs/gif/gifset_knots/knotd_50.gif
/imgs/gif/gifset_knots/knotd_6.gif
/imgs/gif/gifset_knots/knotd_7.gif
/imgs/gif/gifset_knots/knotd_70.gif
/imgs/gif/gifset_knots/knotd_8.gif
/imgs/gif/gifset_knots/knotd_80.gif
/imgs/gif/gifset_knots/knotd_9.gif
/imgs/gif/gifset_knots/knotd_90.gif
/imgs/gif/gifset_knots/knotl.gif
/imgs/gif/gifset_knots/knotp.gif
/imgs/gif/gifset_knots/knotp_1.gif
/imgs/gif/gifset_knots/knotp_10.gif
/imgs/gif/gifset_knots/knotp_100.gif
/imgs/gif/gifset_knots/knotp_2.gif
/imgs/gif/gifset_knots/knotp_20.gif
/imgs/gif/gifset_knots/knotp_3.gif
/imgs/gif/gifset_knots/knotp_30.gif
/imgs/gif/gifset_knots/knotp_4.gif
/imgs/gif/gifset_knots/knotp_40.gif
/imgs/gif/gifset_knots/knotp_5.gif
/imgs/gif/gifset_knots/knotp_50.gif
/imgs/gif/gifset_knots/knotp_6.gif
/imgs/gif/gifset_knots/knotp_7.gif
/imgs/gif/gifset_knots/knotp_70.gif
/imgs/gif/gifset_knots/knotp_8.gif
/imgs/gif/gifset_knots/knotp_80.gif
/imgs/gif/gifset_knots/knotp_9.gif
/imgs/gif/gifset_knots/knotp_90.gif
/imgs/gif/gifset_knots/knotq.gif
/imgs/gif/gifset_knots/knotq_1.gif
/imgs/gif/gifset_knots/knotq_10.gif
/imgs/gif/gifset_knots/knotq_100.gif
/imgs/gif/gifset_knots/knotq_2.gif
/imgs/gif/gifset_knots/knotq_20.gif
/imgs/gif/gifset_knots/knotq_3.gif
/imgs/gif/gifset_knots/knotq_30.gif
/imgs/gif/gifset_knots/knotq_4.gif
/imgs/gif/gifset_knots/knotq_40.gif
/imgs/gif/gifset_knots/knotq_5.gif
/imgs/gif/gifset_knots/knotq_50.gif
/imgs/gif/gifset_knots/knotq_6.gif
/imgs/gif/gifset_knots/knotq_7.gif
/imgs/gif/gifset_knots/knotq_70.gif
/imgs/gif/gifset_knots/knotq_8.gif
/imgs/gif/gifset_knots/knotq_80.gif
/imgs/gif/gifset_knots/knotq_9.gif
/imgs/gif/gifset_knots/knotq_90.gif
/imgs/gif/gifset_knots/koeye_knot.gif
/imgs/gif/gifset_knots/koeye_knot_100x40.gif
/imgs/gif/gifset_knots/koeye_knot_200x80.gif
/imgs/gif/gifset_knots/koeye_knot_400x160.gif
/imgs/gif/gifset_knots/koeye_rings.gif
/imgs/gif/gifset_m/laser1.gif
/imgs/gif/gifset_m/laser1b.gif
/imgs/gif/gifset_m/laser1b_1.gif
/imgs/gif/gifset_m/laser1b_10.gif
/imgs/gif/gifset_m/laser1b_100.gif
/imgs/gif/gifset_m/laser1b_2.gif
/imgs/gif/gifset_m/laser1b_20.gif
/imgs/gif/gifset_m/laser1b_3.gif
/imgs/gif/gifset_m/laser1b_30.gif
/imgs/gif/gifset_m/laser1b_4.gif
/imgs/gif/gifset_m/laser1b_40.gif
/imgs/gif/gifset_m/laser1b_5.gif
/imgs/gif/gifset_m/laser1b_50.gif
/imgs/gif/gifset_m/laser1b_6.gif
/imgs/gif/gifset_m/laser1b_7.gif
/imgs/gif/gifset_m/laser1b_70.gif
/imgs/gif/gifset_m/laser1b_8.gif
/imgs/gif/gifset_m/laser1b_80.gif
/imgs/gif/gifset_m/laser1b_9.gif
/imgs/gif/gifset_m/laser1b_90.gif
/imgs/gif/gifset_m/laser1d.gif
/imgs/gif/gifset_m/laser1d_1.gif
/imgs/gif/gifset_m/laser1d_10.gif
/imgs/gif/gifset_m/laser1d_100.gif
/imgs/gif/gifset_m/laser1d_2.gif
/imgs/gif/gifset_m/laser1d_20.gif
/imgs/gif/gifset_m/laser1d_3.gif
/imgs/gif/gifset_m/laser1d_30.gif
/imgs/gif/gifset_m/laser1d_4.gif
/imgs/gif/gifset_m/laser1d_40.gif
/imgs/gif/gifset_m/laser1d_5.gif
/imgs/gif/gifset_m/laser1d_50.gif
/imgs/gif/gifset_m/laser1d_6.gif
/imgs/gif/gifset_m/laser1d_7.gif
/imgs/gif/gifset_m/laser1d_70.gif
/imgs/gif/gifset_m/laser1d_8.gif
/imgs/gif/gifset_m/laser1d_80.gif
/imgs/gif/gifset_m/laser1d_9.gif
/imgs/gif/gifset_m/laser1d_90.gif
/imgs/gif/gifset_m/laser1p.gif
/imgs/gif/gifset_m/laser1p_1.gif
/imgs/gif/gifset_m/laser1p_10.gif
/imgs/gif/gifset_m/laser1p_100.gif
/imgs/gif/gifset_m/laser1p_2.gif
/imgs/gif/gifset_m/laser1p_20.gif
/imgs/gif/gifset_m/laser1p_3.gif
/imgs/gif/gifset_m/laser1p_30.gif
/imgs/gif/gifset_m/laser1p_4.gif
/imgs/gif/gifset_m/laser1p_40.gif
/imgs/gif/gifset_m/laser1p_5.gif
/imgs/gif/gifset_m/laser1p_50.gif
/imgs/gif/gifset_m/laser1p_6.gif
/imgs/gif/gifset_m/laser1p_7.gif
/imgs/gif/gifset_m/laser1p_70.gif
/imgs/gif/gifset_m/laser1p_8.gif
/imgs/gif/gifset_m/laser1p_80.gif
/imgs/gif/gifset_m/laser1p_9.gif
/imgs/gif/gifset_m/laser1p_90.gif
/imgs/gif/gifset_m/laser1q.gif
/imgs/gif/gifset_m/laser1q_1.gif
/imgs/gif/gifset_m/laser1q_10.gif
/imgs/gif/gifset_m/laser1q_100.gif
/imgs/gif/gifset_m/laser1q_2.gif
/imgs/gif/gifset_m/laser1q_20.gif
/imgs/gif/gifset_m/laser1q_3.gif
/imgs/gif/gifset_m/laser1q_30.gif
/imgs/gif/gifset_m/laser1q_4.gif
/imgs/gif/gifset_m/laser1q_40.gif
/imgs/gif/gifset_m/laser1q_5.gif
/imgs/gif/gifset_m/laser1q_50.gif
/imgs/gif/gifset_m/laser1q_6.gif
/imgs/gif/gifset_m/laser1q_7.gif
/imgs/gif/gifset_m/laser1q_70.gif
/imgs/gif/gifset_m/laser1q_8.gif
/imgs/gif/gifset_m/laser1q_80.gif
/imgs/gif/gifset_m/laser1q_9.gif
/imgs/gif/gifset_m/laser1q_90.gif
/imgs/gif/gifset_m/laser2.gif
/imgs/gif/gifset_m/laser2b.gif
/imgs/gif/gifset_m/laser2b_1.gif
/imgs/gif/gifset_m/laser2b_10.gif
/imgs/gif/gifset_m/laser2b_100.gif
/imgs/gif/gifset_m/laser2b_2.gif
/imgs/gif/gifset_m/laser2b_20.gif
/imgs/gif/gifset_m/laser2b_3.gif
/imgs/gif/gifset_m/laser2b_30.gif
/imgs/gif/gifset_m/laser2b_4.gif
/imgs/gif/gifset_m/laser2b_40.gif
/imgs/gif/gifset_m/laser2b_5.gif
/imgs/gif/gifset_m/laser2b_50.gif
/imgs/gif/gifset_m/laser2b_6.gif
/imgs/gif/gifset_m/laser2b_7.gif
/imgs/gif/gifset_m/laser2b_70.gif
/imgs/gif/gifset_m/laser2b_8.gif
/imgs/gif/gifset_m/laser2b_80.gif
/imgs/gif/gifset_m/laser2b_9.gif
/imgs/gif/gifset_m/laser2b_90.gif
/imgs/gif/gifset_m/laser2d.gif
/imgs/gif/gifset_m/laser2d_1.gif
/imgs/gif/gifset_m/laser2d_10.gif
/imgs/gif/gifset_m/laser2d_100.gif
/imgs/gif/gifset_m/laser2d_2.gif
/imgs/gif/gifset_m/laser2d_20.gif
/imgs/gif/gifset_m/laser2d_3.gif
/imgs/gif/gifset_m/laser2d_30.gif
/imgs/gif/gifset_m/laser2d_4.gif
/imgs/gif/gifset_m/laser2d_40.gif
/imgs/gif/gifset_m/laser2d_5.gif
/imgs/gif/gifset_m/laser2d_50.gif
/imgs/gif/gifset_m/laser2d_6.gif
/imgs/gif/gifset_m/laser2d_7.gif
/imgs/gif/gifset_m/laser2d_70.gif
/imgs/gif/gifset_m/laser2d_8.gif
/imgs/gif/gifset_m/laser2d_80.gif
/imgs/gif/gifset_m/laser2d_9.gif
/imgs/gif/gifset_m/laser2d_90.gif
/imgs/gif/gifset_m/laser2p.gif
/imgs/gif/gifset_m/laser2p_1.gif
/imgs/gif/gifset_m/laser2p_10.gif
/imgs/gif/gifset_m/laser2p_100.gif
/imgs/gif/gifset_m/laser2p_2.gif
/imgs/gif/gifset_m/laser2p_20.gif
/imgs/gif/gifset_m/laser2p_3.gif
/imgs/gif/gifset_m/laser2p_30.gif
/imgs/gif/gifset_m/laser2p_4.gif
/imgs/gif/gifset_m/laser2p_40.gif
/imgs/gif/gifset_m/laser2p_5.gif
/imgs/gif/gifset_m/laser2p_50.gif
/imgs/gif/gifset_m/laser2p_6.gif
/imgs/gif/gifset_m/laser2p_7.gif
/imgs/gif/gifset_m/laser2p_70.gif
/imgs/gif/gifset_m/laser2p_8.gif
/imgs/gif/gifset_m/laser2p_80.gif
/imgs/gif/gifset_m/laser2p_9.gif
/imgs/gif/gifset_m/laser2p_90.gif
/imgs/gif/gifset_m/laser2q.gif
/imgs/gif/gifset_m/laser2q_1.gif
/imgs/gif/gifset_m/laser2q_10.gif
/imgs/gif/gifset_m/laser2q_100.gif
/imgs/gif/gifset_m/laser2q_2.gif
/imgs/gif/gifset_m/laser2q_20.gif
/imgs/gif/gifset_m/laser2q_3.gif
/imgs/gif/gifset_m/laser2q_30.gif
/imgs/gif/gifset_m/laser2q_4.gif
/imgs/gif/gifset_m/laser2q_40.gif
/imgs/gif/gifset_m/laser2q_5.gif
/imgs/gif/gifset_m/laser2q_50.gif
/imgs/gif/gifset_m/laser2q_6.gif
/imgs/gif/gifset_m/laser2q_7.gif
/imgs/gif/gifset_m/laser2q_70.gif
/imgs/gif/gifset_m/laser2q_8.gif
/imgs/gif/gifset_m/laser2q_80.gif
/imgs/gif/gifset_m/laser2q_9.gif
/imgs/gif/gifset_m/laser2q_90.gif
/imgs/gif/gifset_m/laser3.gif
/imgs/gif/gifset_m/laser3b.gif
/imgs/gif/gifset_m/laser3b_1.gif
/imgs/gif/gifset_m/laser3b_10.gif
/imgs/gif/gifset_m/laser3b_100.gif
/imgs/gif/gifset_m/laser3b_2.gif
/imgs/gif/gifset_m/laser3b_20.gif
/imgs/gif/gifset_m/laser3b_3.gif
/imgs/gif/gifset_m/laser3b_30.gif
/imgs/gif/gifset_m/laser3b_4.gif
/imgs/gif/gifset_m/laser3b_40.gif
/imgs/gif/gifset_m/laser3b_5.gif
/imgs/gif/gifset_m/laser3b_50.gif
/imgs/gif/gifset_m/laser3b_6.gif
/imgs/gif/gifset_m/laser3b_7.gif
/imgs/gif/gifset_m/laser3b_70.gif
/imgs/gif/gifset_m/laser3b_8.gif
/imgs/gif/gifset_m/laser3b_80.gif
/imgs/gif/gifset_m/laser3b_9.gif
/imgs/gif/gifset_m/laser3b_90.gif
/imgs/gif/gifset_m/laser3d.gif
/imgs/gif/gifset_m/laser3d_1.gif
/imgs/gif/gifset_m/laser3d_10.gif
/imgs/gif/gifset_m/laser3d_100.gif
/imgs/gif/gifset_m/laser3d_2.gif
/imgs/gif/gifset_m/laser3d_20.gif
/imgs/gif/gifset_m/laser3d_3.gif
/imgs/gif/gifset_m/laser3d_30.gif
/imgs/gif/gifset_m/laser3d_4.gif
/imgs/gif/gifset_m/laser3d_40.gif
/imgs/gif/gifset_m/laser3d_5.gif
/imgs/gif/gifset_m/laser3d_50.gif
/imgs/gif/gifset_m/laser3d_6.gif
/imgs/gif/gifset_m/laser3d_7.gif
/imgs/gif/gifset_m/laser3d_70.gif
/imgs/gif/gifset_m/laser3d_8.gif
/imgs/gif/gifset_m/laser3d_80.gif
/imgs/gif/gifset_m/laser3d_9.gif
/imgs/gif/gifset_m/laser3d_90.gif
/imgs/gif/gifset_m/laser3p.gif
/imgs/gif/gifset_m/laser3p_1.gif
/imgs/gif/gifset_m/laser3p_10.gif
/imgs/gif/gifset_m/laser3p_100.gif
/imgs/gif/gifset_m/laser3p_2.gif
/imgs/gif/gifset_m/laser3p_20.gif
/imgs/gif/gifset_m/laser3p_3.gif
/imgs/gif/gifset_m/laser3p_30.gif
/imgs/gif/gifset_m/laser3p_4.gif
/imgs/gif/gifset_m/laser3p_40.gif
/imgs/gif/gifset_m/laser3p_5.gif
/imgs/gif/gifset_m/laser3p_50.gif
/imgs/gif/gifset_m/laser3p_6.gif
/imgs/gif/gifset_m/laser3p_7.gif
/imgs/gif/gifset_m/laser3p_70.gif
/imgs/gif/gifset_m/laser3p_8.gif
/imgs/gif/gifset_m/laser3p_80.gif
/imgs/gif/gifset_m/laser3p_9.gif
/imgs/gif/gifset_m/laser3p_90.gif
/imgs/gif/gifset_m/laser3q.gif
/imgs/gif/gifset_m/laser3q_1.gif
/imgs/gif/gifset_m/laser3q_10.gif
/imgs/gif/gifset_m/laser3q_100.gif
/imgs/gif/gifset_m/laser3q_2.gif
/imgs/gif/gifset_m/laser3q_20.gif
/imgs/gif/gifset_m/laser3q_3.gif
/imgs/gif/gifset_m/laser3q_30.gif
/imgs/gif/gifset_m/laser3q_4.gif
/imgs/gif/gifset_m/laser3q_40.gif
/imgs/gif/gifset_m/laser3q_5.gif
/imgs/gif/gifset_m/laser3q_50.gif
/imgs/gif/gifset_m/laser3q_6.gif
/imgs/gif/gifset_m/laser3q_7.gif
/imgs/gif/gifset_m/laser3q_70.gif
/imgs/gif/gifset_m/laser3q_8.gif
/imgs/gif/gifset_m/laser3q_80.gif
/imgs/gif/gifset_m/laser3q_9.gif
/imgs/gif/gifset_m/laser3q_90.gif
/imgs/gif/gifset_m/meterbars.gif
/imgs/gif/gifset_m/meterbarsb.gif
/imgs/gif/gifset_m/meterbarsb_1.gif
/imgs/gif/gifset_m/meterbarsb_10.gif
/imgs/gif/gifset_m/meterbarsb_100.gif
/imgs/gif/gifset_m/meterbarsb_2.gif
/imgs/gif/gifset_m/meterbarsb_20.gif
/imgs/gif/gifset_m/meterbarsb_3.gif
/imgs/gif/gifset_m/meterbarsb_30.gif
/imgs/gif/gifset_m/meterbarsb_4.gif
/imgs/gif/gifset_m/meterbarsb_40.gif
/imgs/gif/gifset_m/meterbarsb_5.gif
/imgs/gif/gifset_m/meterbarsb_50.gif
/imgs/gif/gifset_m/meterbarsb_6.gif
/imgs/gif/gifset_m/meterbarsb_7.gif
/imgs/gif/gifset_m/meterbarsb_70.gif
/imgs/gif/gifset_m/meterbarsb_8.gif
/imgs/gif/gifset_m/meterbarsb_80.gif
/imgs/gif/gifset_m/meterbarsb_9.gif
/imgs/gif/gifset_m/meterbarsb_90.gif
/imgs/gif/gifset_m/meterbarsd.gif
/imgs/gif/gifset_m/meterbarsd_1.gif
/imgs/gif/gifset_m/meterbarsd_10.gif
/imgs/gif/gifset_m/meterbarsd_100.gif
/imgs/gif/gifset_m/meterbarsd_2.gif
/imgs/gif/gifset_m/meterbarsd_20.gif
/imgs/gif/gifset_m/meterbarsd_3.gif
/imgs/gif/gifset_m/meterbarsd_30.gif
/imgs/gif/gifset_m/meterbarsd_4.gif
/imgs/gif/gifset_m/meterbarsd_40.gif
/imgs/gif/gifset_m/meterbarsd_5.gif
/imgs/gif/gifset_m/meterbarsd_50.gif
/imgs/gif/gifset_m/meterbarsd_6.gif
/imgs/gif/gifset_m/meterbarsd_7.gif
/imgs/gif/gifset_m/meterbarsd_70.gif
/imgs/gif/gifset_m/meterbarsd_8.gif
/imgs/gif/gifset_m/meterbarsd_80.gif
/imgs/gif/gifset_m/meterbarsd_9.gif
/imgs/gif/gifset_m/meterbarsd_90.gif
/imgs/gif/gifset_m/meterbarsp.gif
/imgs/gif/gifset_m/meterbarsp_1.gif
/imgs/gif/gifset_m/meterbarsp_10.gif
/imgs/gif/gifset_m/meterbarsp_100.gif
/imgs/gif/gifset_m/meterbarsp_2.gif
/imgs/gif/gifset_m/meterbarsp_20.gif
/imgs/gif/gifset_m/meterbarsp_3.gif
/imgs/gif/gifset_m/meterbarsp_30.gif
/imgs/gif/gifset_m/meterbarsp_4.gif
/imgs/gif/gifset_m/meterbarsp_40.gif
/imgs/gif/gifset_m/meterbarsp_5.gif
/imgs/gif/gifset_m/meterbarsp_50.gif
/imgs/gif/gifset_m/meterbarsp_6.gif
/imgs/gif/gifset_m/meterbarsp_7.gif
/imgs/gif/gifset_m/meterbarsp_70.gif
/imgs/gif/gifset_m/meterbarsp_8.gif
/imgs/gif/gifset_m/meterbarsp_80.gif
/imgs/gif/gifset_m/meterbarsp_9.gif
/imgs/gif/gifset_m/meterbarsp_90.gif
/imgs/gif/gifset_m/meterbarsq.gif
/imgs/gif/gifset_m/meterbarsq_1.gif
/imgs/gif/gifset_m/meterbarsq_10.gif
/imgs/gif/gifset_m/meterbarsq_100.gif
/imgs/gif/gifset_m/meterbarsq_2.gif
/imgs/gif/gifset_m/meterbarsq_20.gif
/imgs/gif/gifset_m/meterbarsq_3.gif
/imgs/gif/gifset_m/meterbarsq_30.gif
/imgs/gif/gifset_m/meterbarsq_4.gif
/imgs/gif/gifset_m/meterbarsq_40.gif
/imgs/gif/gifset_m/meterbarsq_5.gif
/imgs/gif/gifset_m/meterbarsq_50.gif
/imgs/gif/gifset_m/meterbarsq_6.gif
/imgs/gif/gifset_m/meterbarsq_7.gif
/imgs/gif/gifset_m/meterbarsq_70.gif
/imgs/gif/gifset_m/meterbarsq_8.gif
/imgs/gif/gifset_m/meterbarsq_80.gif
/imgs/gif/gifset_m/meterbarsq_9.gif
/imgs/gif/gifset_m/meterbarsq_90.gif
/imgs/gif/gifset_m/meterdots.gif
/imgs/gif/gifset_m/meterdotsb.gif
/imgs/gif/gifset_m/meterdotsb_1.gif
/imgs/gif/gifset_m/meterdotsb_10.gif
/imgs/gif/gifset_m/meterdotsb_100.gif
/imgs/gif/gifset_m/meterdotsb_2.gif
/imgs/gif/gifset_m/meterdotsb_20.gif
/imgs/gif/gifset_m/meterdotsb_3.gif
/imgs/gif/gifset_m/meterdotsb_30.gif
/imgs/gif/gifset_m/meterdotsb_4.gif
/imgs/gif/gifset_m/meterdotsb_40.gif
/imgs/gif/gifset_m/meterdotsb_5.gif
/imgs/gif/gifset_m/meterdotsb_50.gif
/imgs/gif/gifset_m/meterdotsb_6.gif
/imgs/gif/gifset_m/meterdotsb_7.gif
/imgs/gif/gifset_m/meterdotsb_70.gif
/imgs/gif/gifset_m/meterdotsb_8.gif
/imgs/gif/gifset_m/meterdotsb_80.gif
/imgs/gif/gifset_m/meterdotsb_9.gif
/imgs/gif/gifset_m/meterdotsb_90.gif
/imgs/gif/gifset_m/meterdotsd.gif
/imgs/gif/gifset_m/meterdotsd_1.gif
/imgs/gif/gifset_m/meterdotsd_10.gif
/imgs/gif/gifset_m/meterdotsd_100.gif
/imgs/gif/gifset_m/meterdotsd_2.gif
/imgs/gif/gifset_m/meterdotsd_20.gif
/imgs/gif/gifset_m/meterdotsd_3.gif
/imgs/gif/gifset_m/meterdotsd_30.gif
/imgs/gif/gifset_m/meterdotsd_4.gif
/imgs/gif/gifset_m/meterdotsd_40.gif
/imgs/gif/gifset_m/meterdotsd_5.gif
/imgs/gif/gifset_m/meterdotsd_50.gif
/imgs/gif/gifset_m/meterdotsd_6.gif
/imgs/gif/gifset_m/meterdotsd_7.gif
/imgs/gif/gifset_m/meterdotsd_70.gif
/imgs/gif/gifset_m/meterdotsd_8.gif
/imgs/gif/gifset_m/meterdotsd_80.gif
/imgs/gif/gifset_m/meterdotsd_9.gif
/imgs/gif/gifset_m/meterdotsd_90.gif
/imgs/gif/gifset_m/meterdotsp.gif
/imgs/gif/gifset_m/meterdotsp_1.gif
/imgs/gif/gifset_m/meterdotsp_10.gif
/imgs/gif/gifset_m/meterdotsp_100.gif
/imgs/gif/gifset_m/meterdotsp_2.gif
/imgs/gif/gifset_m/meterdotsp_20.gif
/imgs/gif/gifset_m/meterdotsp_3.gif
/imgs/gif/gifset_m/meterdotsp_30.gif
/imgs/gif/gifset_m/meterdotsp_4.gif
/imgs/gif/gifset_m/meterdotsp_40.gif
/imgs/gif/gifset_m/meterdotsp_5.gif
/imgs/gif/gifset_m/meterdotsp_50.gif
/imgs/gif/gifset_m/meterdotsp_6.gif
/imgs/gif/gifset_m/meterdotsp_7.gif
/imgs/gif/gifset_m/meterdotsp_70.gif
/imgs/gif/gifset_m/meterdotsp_8.gif
/imgs/gif/gifset_m/meterdotsp_80.gif
/imgs/gif/gifset_m/meterdotsp_9.gif
/imgs/gif/gifset_m/meterdotsp_90.gif
/imgs/gif/gifset_m/meterdotsq.gif
/imgs/gif/gifset_m/meterdotsq_1.gif
/imgs/gif/gifset_m/meterdotsq_10.gif
/imgs/gif/gifset_m/meterdotsq_100.gif
/imgs/gif/gifset_m/meterdotsq_2.gif
/imgs/gif/gifset_m/meterdotsq_20.gif
/imgs/gif/gifset_m/meterdotsq_3.gif
/imgs/gif/gifset_m/meterdotsq_30.gif
/imgs/gif/gifset_m/meterdotsq_4.gif
/imgs/gif/gifset_m/meterdotsq_40.gif
/imgs/gif/gifset_m/meterdotsq_5.gif
/imgs/gif/gifset_m/meterdotsq_50.gif
/imgs/gif/gifset_m/meterdotsq_6.gif
/imgs/gif/gifset_m/meterdotsq_7.gif
/imgs/gif/gifset_m/meterdotsq_70.gif
/imgs/gif/gifset_m/meterdotsq_8.gif
/imgs/gif/gifset_m/meterdotsq_80.gif
/imgs/gif/gifset_m/meterdotsq_9.gif
/imgs/gif/gifset_m/meterdotsq_90.gif
/imgs/gif/gifset_r/firebubblesq_1.gif
/imgs/gif/gifset_r/firebubblesq_10.gif
/imgs/gif/gifset_r/firebubblesq_100.gif
/imgs/gif/gifset_r/firebubblesq_2.gif
/imgs/gif/gifset_r/firebubblesq_20.gif
/imgs/gif/gifset_r/firebubblesq_3.gif
/imgs/gif/gifset_r/firebubblesq_30.gif
/imgs/gif/gifset_r/firebubblesq_4.gif
/imgs/gif/gifset_r/firebubblesq_40.gif
/imgs/gif/gifset_r/firebubblesq_5.gif
/imgs/gif/gifset_r/firebubblesq_50.gif
/imgs/gif/gifset_r/firebubblesq_6.gif
/imgs/gif/gifset_r/firebubblesq_7.gif
/imgs/gif/gifset_r/firebubblesq_70.gif
/imgs/gif/gifset_r/firebubblesq_8.gif
/imgs/gif/gifset_r/firebubblesq_80.gif
/imgs/gif/gifset_r/firebubblesq_9.gif
/imgs/gif/gifset_r/firebubblesq_90.gif
/imgs/gif/gifset_r/penny.gif
/imgs/gif/gifset_r/pennyb.gif
/imgs/gif/gifset_r/pennyb_1.gif
/imgs/gif/gifset_r/pennyb_10.gif
/imgs/gif/gifset_r/pennyb_100.gif
/imgs/gif/gifset_r/pennyb_2.gif
/imgs/gif/gifset_r/pennyb_20.gif
/imgs/gif/gifset_r/pennyb_3.gif
/imgs/gif/gifset_r/pennyb_30.gif
/imgs/gif/gifset_r/pennyb_4.gif
/imgs/gif/gifset_r/pennyb_40.gif
/imgs/gif/gifset_r/pennyb_5.gif
/imgs/gif/gifset_r/pennyb_50.gif
/imgs/gif/gifset_r/pennyb_6.gif
/imgs/gif/gifset_r/pennyb_7.gif
/imgs/gif/gifset_r/pennyb_70.gif
/imgs/gif/gifset_r/pennyb_8.gif
/imgs/gif/gifset_r/pennyb_80.gif
/imgs/gif/gifset_r/pennyb_9.gif
/imgs/gif/gifset_r/pennyb_90.gif
/imgs/gif/gifset_r/pennyd.gif
/imgs/gif/gifset_r/pennyd_1.gif
/imgs/gif/gifset_r/pennyd_10.gif
/imgs/gif/gifset_r/pennyd_100.gif
/imgs/gif/gifset_r/pennyd_2.gif
/imgs/gif/gifset_r/pennyd_20.gif
/imgs/gif/gifset_r/pennyd_3.gif
/imgs/gif/gifset_r/pennyd_30.gif
/imgs/gif/gifset_r/pennyd_4.gif
/imgs/gif/gifset_r/pennyd_40.gif
/imgs/gif/gifset_r/pennyd_5.gif
/imgs/gif/gifset_r/pennyd_50.gif
/imgs/gif/gifset_r/pennyd_6.gif
/imgs/gif/gifset_r/pennyd_7.gif
/imgs/gif/gifset_r/pennyd_70.gif
/imgs/gif/gifset_r/pennyd_8.gif
/imgs/gif/gifset_r/pennyd_80.gif
/imgs/gif/gifset_r/pennyd_9.gif
/imgs/gif/gifset_r/pennyd_90.gif
/imgs/gif/gifset_r/pennyp.gif
/imgs/gif/gifset_r/pennyp_1.gif
/imgs/gif/gifset_r/pennyp_10.gif
/imgs/gif/gifset_r/pennyp_100.gif
/imgs/gif/gifset_r/pennyp_2.gif
/imgs/gif/gifset_r/pennyp_20.gif
/imgs/gif/gifset_r/pennyp_3.gif
/imgs/gif/gifset_r/pennyp_30.gif
/imgs/gif/gifset_r/pennyp_4.gif
/imgs/gif/gifset_r/pennyp_40.gif
/imgs/gif/gifset_r/pennyp_5.gif
/imgs/gif/gifset_r/pennyp_50.gif
/imgs/gif/gifset_r/pennyp_6.gif
/imgs/gif/gifset_r/pennyp_7.gif
/imgs/gif/gifset_r/pennyp_70.gif
/imgs/gif/gifset_r/pennyp_8.gif
/imgs/gif/gifset_r/pennyp_80.gif
/imgs/gif/gifset_r/pennyp_9.gif
/imgs/gif/gifset_r/pennyp_90.gif
/imgs/gif/gifset_r/pennyq.gif
/imgs/gif/gifset_r/pennyq_1.gif
/imgs/gif/gifset_r/pennyq_10.gif
/imgs/gif/gifset_r/pennyq_100.gif
/imgs/gif/gifset_r/pennyq_2.gif
/imgs/gif/gifset_r/pennyq_20.gif
/imgs/gif/gifset_r/pennyq_3.gif
/imgs/gif/gifset_r/pennyq_30.gif
/imgs/gif/gifset_r/pennyq_4.gif
/imgs/gif/gifset_r/pennyq_40.gif
/imgs/gif/gifset_r/pennyq_5.gif
/imgs/gif/gifset_r/pennyq_50.gif
/imgs/gif/gifset_r/pennyq_6.gif
/imgs/gif/gifset_r/pennyq_7.gif
/imgs/gif/gifset_r/pennyq_70.gif
/imgs/gif/gifset_r/pennyq_8.gif
/imgs/gif/gifset_r/pennyq_80.gif
/imgs/gif/gifset_r/pennyq_9.gif
/imgs/gif/gifset_r/pennyq_90.gif
/imgs/gif/gifset_r/ringsb_1.gif
/imgs/gif/gifset_r/ringsb_10.gif
/imgs/gif/gifset_r/ringsb_100.gif
/imgs/gif/gifset_r/ringsb_2.gif
/imgs/gif/gifset_r/ringsb_20.gif
/imgs/gif/gifset_r/ringsb_3.gif
/imgs/gif/gifset_r/ringsb_30.gif
/imgs/gif/gifset_r/ringsb_4.gif
/imgs/gif/gifset_r/ringsb_40.gif
/imgs/gif/gifset_r/ringsb_5.gif
/imgs/gif/gifset_r/ringsb_50.gif
/imgs/gif/gifset_r/ringsb_6.gif
/imgs/gif/gifset_r/ringsb_7.gif
/imgs/gif/gifset_r/ringsb_70.gif
/imgs/gif/gifset_r/ringsb_8.gif
/imgs/gif/gifset_r/ringsb_80.gif
/imgs/gif/gifset_r/ringsb_9.gif
/imgs/gif/gifset_r/ringsb_90.gif
/imgs/gif/gifset_r/ringsd_1.gif
/imgs/gif/gifset_r/ringsd_10.gif
/imgs/gif/gifset_r/ringsd_100.gif
/imgs/gif/gifset_r/ringsd_2.gif
/imgs/gif/gifset_r/ringsd_20.gif
/imgs/gif/gifset_r/ringsd_3.gif
/imgs/gif/gifset_r/ringsd_30.gif
/imgs/gif/gifset_r/ringsd_4.gif
/imgs/gif/gifset_r/ringsd_40.gif
/imgs/gif/gifset_r/ringsd_5.gif
/imgs/gif/gifset_r/ringsd_50.gif
/imgs/gif/gifset_r/ringsd_6.gif
/imgs/gif/gifset_r/ringsd_7.gif
/imgs/gif/gifset_r/ringsd_70.gif
/imgs/gif/gifset_r/ringsd_8.gif
/imgs/gif/gifset_r/ringsd_80.gif
/imgs/gif/gifset_r/ringsd_9.gif
/imgs/gif/gifset_r/ringsd_90.gif
/imgs/gif/gifset_r/ringsp_1.gif
/imgs/gif/gifset_r/ringsp_10.gif
/imgs/gif/gifset_r/ringsp_100.gif
/imgs/gif/gifset_r/ringsp_2.gif
/imgs/gif/gifset_r/ringsp_20.gif
/imgs/gif/gifset_r/ringsp_3.gif
/imgs/gif/gifset_r/ringsp_30.gif
/imgs/gif/gifset_r/ringsp_4.gif
/imgs/gif/gifset_r/ringsp_40.gif
/imgs/gif/gifset_r/ringsp_5.gif
/imgs/gif/gifset_r/ringsp_50.gif
/imgs/gif/gifset_r/ringsp_6.gif
/imgs/gif/gifset_r/ringsp_7.gif
/imgs/gif/gifset_r/ringsp_70.gif
/imgs/gif/gifset_r/ringsp_8.gif
/imgs/gif/gifset_r/ringsp_80.gif
/imgs/gif/gifset_r/ringsp_9.gif
/imgs/gif/gifset_r/ringsp_90.gif
/imgs/gif/gifset_r/ringsq_1.gif
/imgs/gif/gifset_r/ringsq_10.gif
/imgs/gif/gifset_r/ringsq_100.gif
/imgs/gif/gifset_r/ringsq_2.gif
/imgs/gif/gifset_r/ringsq_20.gif
/imgs/gif/gifset_r/ringsq_3.gif
/imgs/gif/gifset_r/ringsq_30.gif
/imgs/gif/gifset_r/ringsq_4.gif
/imgs/gif/gifset_r/ringsq_40.gif
/imgs/gif/gifset_r/ringsq_5.gif
/imgs/gif/gifset_r/ringsq_50.gif
/imgs/gif/gifset_r/ringsq_6.gif
/imgs/gif/gifset_r/ringsq_7.gif
/imgs/gif/gifset_r/ringsq_70.gif
/imgs/gif/gifset_r/ringsq_8.gif
/imgs/gif/gifset_r/ringsq_80.gif
/imgs/gif/gifset_r/ringsq_9.gif
/imgs/gif/gifset_r/ringsq_90.gif
/imgs/gif/gifset_r/rotate.gif
/imgs/gif/gifset_r/rotateb.gif
/imgs/gif/gifset_r/rotateb_1.gif
/imgs/gif/gifset_r/rotateb_10.gif
/imgs/gif/gifset_r/rotateb_100.gif
/imgs/gif/gifset_r/rotateb_2.gif
/imgs/gif/gifset_r/rotateb_20.gif
/imgs/gif/gifset_r/rotateb_3.gif
/imgs/gif/gifset_r/rotateb_30.gif
/imgs/gif/gifset_r/rotateb_4.gif
/imgs/gif/gifset_r/rotateb_40.gif
/imgs/gif/gifset_r/rotateb_5.gif
/imgs/gif/gifset_r/rotateb_50.gif
/imgs/gif/gifset_r/rotateb_6.gif
/imgs/gif/gifset_r/rotateb_7.gif
/imgs/gif/gifset_r/rotateb_70.gif
/imgs/gif/gifset_r/rotateb_8.gif
/imgs/gif/gifset_r/rotateb_80.gif
/imgs/gif/gifset_r/rotateb_9.gif
/imgs/gif/gifset_r/rotateb_90.gif
/imgs/gif/gifset_r/rotated.gif
/imgs/gif/gifset_r/rotated_1.gif
/imgs/gif/gifset_r/rotated_10.gif
/imgs/gif/gifset_r/rotated_100.gif
/imgs/gif/gifset_r/rotated_2.gif
/imgs/gif/gifset_r/rotated_20.gif
/imgs/gif/gifset_r/rotated_3.gif
/imgs/gif/gifset_r/rotated_30.gif
/imgs/gif/gifset_r/rotated_4.gif
/imgs/gif/gifset_r/rotated_40.gif
/imgs/gif/gifset_r/rotated_5.gif
/imgs/gif/gifset_r/rotated_50.gif
/imgs/gif/gifset_r/rotated_6.gif
/imgs/gif/gifset_r/rotated_7.gif
/imgs/gif/gifset_r/rotated_70.gif
/imgs/gif/gifset_r/rotated_8.gif
/imgs/gif/gifset_r/rotated_80.gif
/imgs/gif/gifset_r/rotated_9.gif
/imgs/gif/gifset_r/rotated_90.gif
/imgs/gif/gifset_r/rotatep.gif
/imgs/gif/gifset_r/rotatep_1.gif
/imgs/gif/gifset_r/rotatep_10.gif
/imgs/gif/gifset_r/rotatep_100.gif
/imgs/gif/gifset_r/rotatep_2.gif
/imgs/gif/gifset_r/rotatep_20.gif
/imgs/gif/gifset_r/rotatep_3.gif
/imgs/gif/gifset_r/rotatep_30.gif
/imgs/gif/gifset_r/rotatep_4.gif
/imgs/gif/gifset_r/rotatep_40.gif
/imgs/gif/gifset_r/rotatep_5.gif
/imgs/gif/gifset_r/rotatep_50.gif
/imgs/gif/gifset_r/rotatep_6.gif
/imgs/gif/gifset_r/rotatep_7.gif
/imgs/gif/gifset_r/rotatep_70.gif
/imgs/gif/gifset_r/rotatep_8.gif
/imgs/gif/gifset_r/rotatep_80.gif
/imgs/gif/gifset_r/rotatep_9.gif
/imgs/gif/gifset_r/rotatep_90.gif
/imgs/gif/gifset_r/rotateq.gif
/imgs/gif/gifset_r/rotateq_1.gif
/imgs/gif/gifset_r/rotateq_10.gif
/imgs/gif/gifset_r/rotateq_100.gif
/imgs/gif/gifset_r/rotateq_2.gif
/imgs/gif/gifset_r/rotateq_20.gif
/imgs/gif/gifset_r/rotateq_3.gif
/imgs/gif/gifset_r/rotateq_30.gif
/imgs/gif/gifset_r/rotateq_4.gif
/imgs/gif/gifset_r/rotateq_40.gif
/imgs/gif/gifset_r/rotateq_5.gif
/imgs/gif/gifset_r/rotateq_50.gif
/imgs/gif/gifset_r/rotateq_6.gif
/imgs/gif/gifset_r/rotateq_7.gif
/imgs/gif/gifset_r/rotateq_70.gif
/imgs/gif/gifset_r/rotateq_8.gif
/imgs/gif/gifset_r/rotateq_80.gif
/imgs/gif/gifset_r/rotateq_9.gif
/imgs/gif/gifset_r/rotateq_90.gif
/imgs/gif/gifset_t/soccorball.gif
/imgs/gif/gifset_t/soccorballb.gif
/imgs/gif/gifset_t/soccorballb_1.gif
/imgs/gif/gifset_t/soccorballb_10.gif
/imgs/gif/gifset_t/soccorballb_100.gif
/imgs/gif/gifset_t/soccorballb_2.gif
/imgs/gif/gifset_t/soccorballb_20.gif
/imgs/gif/gifset_t/soccorballb_3.gif
/imgs/gif/gifset_t/soccorballb_30.gif
/imgs/gif/gifset_t/soccorballb_4.gif
/imgs/gif/gifset_t/soccorballb_40.gif
/imgs/gif/gifset_t/soccorballb_5.gif
/imgs/gif/gifset_t/soccorballb_50.gif
/imgs/gif/gifset_t/soccorballb_6.gif
/imgs/gif/gifset_t/soccorballb_7.gif
/imgs/gif/gifset_t/soccorballb_70.gif
/imgs/gif/gifset_t/soccorballb_8.gif
/imgs/gif/gifset_t/soccorballb_80.gif
/imgs/gif/gifset_t/soccorballb_9.gif
/imgs/gif/gifset_t/soccorballb_90.gif
/imgs/gif/gifset_t/soccorballd.gif
/imgs/gif/gifset_t/soccorballd_1.gif
/imgs/gif/gifset_t/soccorballd_10.gif
/imgs/gif/gifset_t/soccorballd_100.gif
/imgs/gif/gifset_t/soccorballd_2.gif
/imgs/gif/gifset_t/soccorballd_20.gif
/imgs/gif/gifset_t/soccorballd_3.gif
/imgs/gif/gifset_t/soccorballd_30.gif
/imgs/gif/gifset_t/soccorballd_4.gif
/imgs/gif/gifset_t/soccorballd_40.gif
/imgs/gif/gifset_t/soccorballd_5.gif
/imgs/gif/gifset_t/soccorballd_50.gif
/imgs/gif/gifset_t/soccorballd_6.gif
/imgs/gif/gifset_t/soccorballd_7.gif
/imgs/gif/gifset_t/soccorballd_70.gif
/imgs/gif/gifset_t/soccorballd_8.gif
/imgs/gif/gifset_t/soccorballd_80.gif
/imgs/gif/gifset_t/soccorballd_9.gif
/imgs/gif/gifset_t/soccorballd_90.gif
/imgs/gif/gifset_t/soccorballp.gif
/imgs/gif/gifset_t/soccorballp_1.gif
/imgs/gif/gifset_t/soccorballp_10.gif
/imgs/gif/gifset_t/soccorballp_100.gif
/imgs/gif/gifset_t/soccorballp_2.gif
/imgs/gif/gifset_t/soccorballp_20.gif
/imgs/gif/gifset_t/soccorballp_3.gif
/imgs/gif/gifset_t/soccorballp_30.gif
/imgs/gif/gifset_t/soccorballp_4.gif
/imgs/gif/gifset_t/soccorballp_40.gif
/imgs/gif/gifset_t/soccorballp_5.gif
/imgs/gif/gifset_t/soccorballp_50.gif
/imgs/gif/gifset_t/soccorballp_6.gif
/imgs/gif/gifset_t/soccorballp_7.gif
/imgs/gif/gifset_t/soccorballp_70.gif
/imgs/gif/gifset_t/soccorballp_8.gif
/imgs/gif/gifset_t/soccorballp_80.gif
/imgs/gif/gifset_t/soccorballp_9.gif
/imgs/gif/gifset_t/soccorballp_90.gif
/imgs/gif/gifset_t/soccorballq.gif
/imgs/gif/gifset_t/soccorballq_1.gif
/imgs/gif/gifset_t/soccorballq_10.gif
/imgs/gif/gifset_t/soccorballq_100.gif
/imgs/gif/gifset_t/soccorballq_2.gif
/imgs/gif/gifset_t/soccorballq_20.gif
/imgs/gif/gifset_t/soccorballq_3.gif
/imgs/gif/gifset_t/soccorballq_30.gif
/imgs/gif/gifset_t/soccorballq_4.gif
/imgs/gif/gifset_t/soccorballq_40.gif
/imgs/gif/gifset_t/soccorballq_5.gif
/imgs/gif/gifset_t/soccorballq_50.gif
/imgs/gif/gifset_t/soccorballq_6.gif
/imgs/gif/gifset_t/soccorballq_7.gif
/imgs/gif/gifset_t/soccorballq_70.gif
/imgs/gif/gifset_t/soccorballq_8.gif
/imgs/gif/gifset_t/soccorballq_80.gif
/imgs/gif/gifset_t/soccorballq_9.gif
/imgs/gif/gifset_t/soccorballq_90.gif
/imgs/gif/gifset_t/sun.gif
/imgs/gif/gifset_t/sunb.gif
/imgs/gif/gifset_t/sunb_1.gif
/imgs/gif/gifset_t/sunb_10.gif
/imgs/gif/gifset_t/sunb_100.gif
/imgs/gif/gifset_t/sunb_2.gif
/imgs/gif/gifset_t/sunb_20.gif
/imgs/gif/gifset_t/sunb_3.gif
/imgs/gif/gifset_t/sunb_30.gif
/imgs/gif/gifset_t/sunb_4.gif
/imgs/gif/gifset_t/sunb_40.gif
/imgs/gif/gifset_t/sunb_5.gif
/imgs/gif/gifset_t/sunb_50.gif
/imgs/gif/gifset_t/sunb_6.gif
/imgs/gif/gifset_t/sunb_7.gif
/imgs/gif/gifset_t/sunb_70.gif
/imgs/gif/gifset_t/sunb_8.gif
/imgs/gif/gifset_t/sunb_80.gif
/imgs/gif/gifset_t/sunb_9.gif
/imgs/gif/gifset_t/sunb_90.gif
/imgs/gif/gifset_t/sund.gif
/imgs/gif/gifset_t/sund_1.gif
/imgs/gif/gifset_t/sund_10.gif
/imgs/gif/gifset_t/sund_100.gif
/imgs/gif/gifset_t/sund_2.gif
/imgs/gif/gifset_t/sund_20.gif
/imgs/gif/gifset_t/sund_3.gif
/imgs/gif/gifset_t/sund_30.gif
/imgs/gif/gifset_t/sund_4.gif
/imgs/gif/gifset_t/sund_40.gif
/imgs/gif/gifset_t/sund_5.gif
/imgs/gif/gifset_t/sund_50.gif
/imgs/gif/gifset_t/sund_6.gif
/imgs/gif/gifset_t/sund_7.gif
/imgs/gif/gifset_t/sund_70.gif
/imgs/gif/gifset_t/sund_8.gif
/imgs/gif/gifset_t/sund_80.gif
/imgs/gif/gifset_t/sund_9.gif
/imgs/gif/gifset_t/sund_90.gif
/imgs/gif/gifset_t/sunp.gif
/imgs/gif/gifset_t/sunp_1.gif
/imgs/gif/gifset_t/sunp_10.gif
/imgs/gif/gifset_t/sunp_100.gif
/imgs/gif/gifset_t/sunp_2.gif
/imgs/gif/gifset_t/sunp_20.gif
/imgs/gif/gifset_t/sunp_3.gif
/imgs/gif/gifset_t/sunp_30.gif
/imgs/gif/gifset_t/sunp_4.gif
/imgs/gif/gifset_t/sunp_40.gif
/imgs/gif/gifset_t/sunp_5.gif
/imgs/gif/gifset_t/sunp_50.gif
/imgs/gif/gifset_t/sunp_6.gif
/imgs/gif/gifset_t/sunp_7.gif
/imgs/gif/gifset_t/sunp_70.gif
/imgs/gif/gifset_t/sunp_8.gif
/imgs/gif/gifset_t/sunp_80.gif
/imgs/gif/gifset_t/sunp_9.gif
/imgs/gif/gifset_t/sunp_90.gif
/imgs/gif/gifset_t/sunq.gif
/imgs/gif/gifset_t/sunq_1.gif
/imgs/gif/gifset_t/sunq_10.gif
/imgs/gif/gifset_t/sunq_100.gif
/imgs/gif/gifset_t/sunq_2.gif
/imgs/gif/gifset_t/sunq_20.gif
/imgs/gif/gifset_t/sunq_3.gif
/imgs/gif/gifset_t/sunq_30.gif
/imgs/gif/gifset_t/sunq_4.gif
/imgs/gif/gifset_t/sunq_40.gif
/imgs/gif/gifset_t/sunq_5.gif
/imgs/gif/gifset_t/sunq_50.gif
/imgs/gif/gifset_t/sunq_6.gif
/imgs/gif/gifset_t/sunq_7.gif
/imgs/gif/gifset_t/sunq_70.gif
/imgs/gif/gifset_t/sunq_8.gif
/imgs/gif/gifset_t/sunq_80.gif
/imgs/gif/gifset_t/sunq_9.gif
/imgs/gif/gifset_t/sunq_90.gif
/imgs/gif/gifset_t/taz.gif
/imgs/gif/gifset_t/tazb.gif
/imgs/gif/gifset_t/tazb_1.gif
/imgs/gif/gifset_t/tazb_10.gif
/imgs/gif/gifset_t/tazb_100.gif
/imgs/gif/gifset_t/tazb_2.gif
/imgs/gif/gifset_t/tazb_20.gif
/imgs/gif/gifset_t/tazb_3.gif
/imgs/gif/gifset_t/tazb_30.gif
/imgs/gif/gifset_t/tazb_4.gif
/imgs/gif/gifset_t/tazb_40.gif
/imgs/gif/gifset_t/tazb_5.gif
/imgs/gif/gifset_t/tazb_50.gif
/imgs/gif/gifset_t/tazb_6.gif
/imgs/gif/gifset_t/tazb_7.gif
/imgs/gif/gifset_t/tazb_70.gif
/imgs/gif/gifset_t/tazb_8.gif
/imgs/gif/gifset_t/tazb_80.gif
/imgs/gif/gifset_t/tazb_9.gif
/imgs/gif/gifset_t/tazb_90.gif
/imgs/gif/gifset_t/tazd.gif
/imgs/gif/gifset_t/tazd_1.gif
/imgs/gif/gifset_t/tazd_10.gif
/imgs/gif/gifset_t/tazd_100.gif
/imgs/gif/gifset_t/tazd_2.gif
/imgs/gif/gifset_t/tazd_20.gif
/imgs/gif/gifset_t/tazd_3.gif
/imgs/gif/gifset_t/tazd_30.gif
/imgs/gif/gifset_t/tazd_4.gif
/imgs/gif/gifset_t/tazd_40.gif
/imgs/gif/gifset_t/tazd_5.gif
/imgs/gif/gifset_t/tazd_50.gif
/imgs/gif/gifset_t/tazd_6.gif
/imgs/gif/gifset_t/tazd_7.gif
/imgs/gif/gifset_t/tazd_70.gif
/imgs/gif/gifset_t/tazd_8.gif
/imgs/gif/gifset_t/tazd_80.gif
/imgs/gif/gifset_t/tazd_9.gif
/imgs/gif/gifset_t/tazd_90.gif
/imgs/gif/gifset_t/tazp.gif
/imgs/gif/gifset_t/tazp_1.gif
/imgs/gif/gifset_t/tazp_10.gif
/imgs/gif/gifset_t/tazp_100.gif
/imgs/gif/gifset_t/tazp_2.gif
/imgs/gif/gifset_t/tazp_20.gif
/imgs/gif/gifset_t/tazp_3.gif
/imgs/gif/gifset_t/tazp_30.gif
/imgs/gif/gifset_t/tazp_4.gif
/imgs/gif/gifset_t/tazp_40.gif
/imgs/gif/gifset_t/tazp_5.gif
/imgs/gif/gifset_t/tazp_50.gif
/imgs/gif/gifset_t/tazp_6.gif
/imgs/gif/gifset_t/tazp_7.gif
/imgs/gif/gifset_t/tazp_70.gif
/imgs/gif/gifset_t/tazp_8.gif
/imgs/gif/gifset_t/tazp_80.gif
/imgs/gif/gifset_t/tazp_9.gif
/imgs/gif/gifset_t/tazp_90.gif
/imgs/gif/gifset_t/tazq.gif
/imgs/gif/gifset_t/tazq_1.gif
/imgs/gif/gifset_t/tazq_10.gif
/imgs/gif/gifset_t/tazq_100.gif
/imgs/gif/gifset_t/tazq_2.gif
/imgs/gif/gifset_t/tazq_20.gif
/imgs/gif/gifset_t/tazq_3.gif
/imgs/gif/gifset_t/tazq_30.gif
/imgs/gif/gifset_t/tazq_4.gif
/imgs/gif/gifset_t/tazq_40.gif
/imgs/gif/gifset_t/tazq_5.gif
/imgs/gif/gifset_t/tazq_50.gif
/imgs/gif/gifset_t/tazq_6.gif
/imgs/gif/gifset_t/tazq_7.gif
/imgs/gif/gifset_t/tazq_70.gif
/imgs/gif/gifset_t/tazq_8.gif
/imgs/gif/gifset_t/tazq_80.gif
/imgs/gif/gifset_t/tazq_9.gif
/imgs/gif/gifset_t/tazq_90.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b1.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b1b.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b1b_1.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b1b_10.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b1b_100.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b1b_2.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b1b_20.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b1b_3.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b1b_30.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b1b_4.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b1b_40.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b1b_5.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b1b_50.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b1b_6.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b1b_7.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b1b_70.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b1b_8.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b1b_80.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b1b_9.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b1b_90.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b1d.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b1d_1.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b1d_10.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b1d_100.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b1d_2.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b1d_20.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b1d_3.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b1d_30.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b1d_4.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b1d_40.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b1d_5.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b1d_50.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b1d_6.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b1d_7.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b1d_70.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b1d_8.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b1d_80.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b1d_9.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b1d_90.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b1p.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b1p_1.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b1p_10.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b1p_100.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b1p_2.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b1p_20.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b1p_3.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b1p_30.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b1p_4.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b1p_40.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b1p_5.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b1p_50.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b1p_6.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b1p_7.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b1p_70.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b1p_8.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b1p_80.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b1p_9.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b1p_90.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b1q.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b1q_1.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b1q_10.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b1q_100.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b1q_2.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b1q_20.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b1q_3.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b1q_30.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b1q_4.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b1q_40.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b1q_5.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b1q_50.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b1q_6.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b1q_7.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b1q_70.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b1q_8.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b1q_80.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b1q_9.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b1q_90.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b2.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b2b.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b2b_1.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b2b_10.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b2b_100.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b2b_2.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b2b_20.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b2b_3.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b2b_30.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b2b_4.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b2b_40.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b2b_5.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b2b_50.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b2b_6.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b2b_7.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b2b_70.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b2b_8.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b2b_80.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b2b_9.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b2b_90.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b2d.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b2d_1.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b2d_10.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b2d_100.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b2d_2.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b2d_20.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b2d_3.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b2d_30.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b2d_4.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b2d_40.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b2d_5.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b2d_50.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b2d_6.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b2d_7.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b2d_70.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b2d_8.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b2d_80.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b2d_9.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b2d_90.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b2p.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b2p_1.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b2p_10.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b2p_100.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b2p_2.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b2p_20.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b2p_3.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b2p_30.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b2p_4.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b2p_40.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b2p_5.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b2p_50.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b2p_6.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b2p_7.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b2p_70.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b2p_8.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b2p_80.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b2p_9.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b2p_90.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b2q.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b2q_1.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b2q_10.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b2q_100.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b2q_2.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b2q_20.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b2q_3.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b2q_30.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b2q_4.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b2q_40.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b2q_5.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b2q_50.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b2q_6.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b2q_7.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b2q_70.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b2q_8.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b2q_80.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b2q_9.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b2q_90.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b3.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b3b.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b3b_1.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b3b_10.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b3b_100.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b3b_2.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b3b_20.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b3b_3.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b3b_30.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b3b_4.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b3b_40.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b3b_5.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b3b_50.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b3b_6.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b3b_7.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b3b_70.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b3b_8.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b3b_80.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b3b_9.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b3b_90.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b3d.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b3d_1.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b3d_10.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b3d_100.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b3d_2.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b3d_20.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b3d_3.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b3d_30.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b3d_4.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b3d_40.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b3d_5.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b3d_50.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b3d_6.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b3d_7.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b3d_70.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b3d_8.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b3d_80.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b3d_9.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b3d_90.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b3p.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b3p_1.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b3p_10.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b3p_100.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b3p_2.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b3p_20.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b3p_3.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b3p_30.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b3p_4.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b3p_40.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b3p_5.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b3p_50.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b3p_6.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b3p_7.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b3p_70.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b3p_8.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b3p_80.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b3p_9.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b3p_90.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b3q.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b3q_1.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b3q_10.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b3q_100.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b3q_2.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b3q_20.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b3q_3.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b3q_30.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b3q_4.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b3q_40.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b3q_5.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b3q_50.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b3q_6.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b3q_7.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b3q_70.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b3q_8.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b3q_80.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b3q_9.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b3q_90.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_kick.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_kickb.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_kickb_1.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_kickb_10.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_kickb_100.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_kickb_2.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_kickb_20.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_kickb_3.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_kickb_30.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_kickb_4.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_kickb_40.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_kickb_5.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_kickb_50.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_kickb_6.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_kickb_7.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_kickb_70.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_kickb_8.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_kickb_80.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_kickb_9.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_kickb_90.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_kickd.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_kickd_1.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_kickd_10.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_kickd_100.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_kickd_2.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_kickd_20.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_kickd_3.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_kickd_30.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_kickd_4.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_kickd_40.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_kickd_5.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_kickd_50.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_kickd_6.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_kickd_7.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_kickd_70.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_kickd_8.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_kickd_80.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_kickd_9.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_kickd_90.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_kickp.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_kickp_1.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_kickp_10.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_kickp_100.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_kickp_2.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_kickp_20.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_kickp_3.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_kickp_30.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_kickp_4.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_kickp_40.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_kickp_5.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_kickp_50.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_kickp_6.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_kickp_7.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_kickp_70.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_kickp_8.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_kickp_80.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_kickp_9.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_kickp_90.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_kickq.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_kickq_1.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_kickq_10.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_kickq_100.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_kickq_2.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_kickq_20.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_kickq_3.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_kickq_30.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_kickq_4.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_kickq_40.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_kickq_5.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_kickq_50.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_kickq_6.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_kickq_7.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_kickq_70.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_kickq_8.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_kickq_80.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_kickq_9.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_kickq_90.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_l.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_lb.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_lb_1.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_lb_10.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_lb_100.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_lb_2.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_lb_20.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_lb_3.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_lb_30.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_lb_4.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_lb_40.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_lb_5.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_lb_50.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_lb_6.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_lb_7.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_lb_70.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_lb_8.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_lb_80.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_lb_9.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_lb_90.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_ld.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_ld_1.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_ld_10.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_ld_100.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_ld_2.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_ld_20.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_ld_3.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_ld_30.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_ld_4.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_ld_40.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_ld_5.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_ld_50.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_ld_6.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_ld_7.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_ld_70.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_ld_8.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_ld_80.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_ld_9.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_ld_90.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_lp.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_lp_1.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_lp_10.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_lp_100.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_lp_2.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_lp_20.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_lp_3.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_lp_30.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_lp_4.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_lp_40.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_lp_5.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_lp_50.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_lp_6.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_lp_7.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_lp_70.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_lp_8.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_lp_80.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_lp_9.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_lp_90.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_lq.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_lq_1.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_lq_10.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_lq_100.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_lq_2.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_lq_20.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_lq_3.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_lq_30.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_lq_4.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_lq_40.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_lq_5.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_lq_50.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_lq_6.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_lq_7.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_lq_70.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_lq_8.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_lq_80.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_lq_9.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_lq_90.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w2.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w2b.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w2b_1.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w2b_10.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w2b_100.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w2b_2.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w2b_20.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w2b_3.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w2b_30.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w2b_4.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w2b_40.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w2b_5.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w2b_50.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w2b_6.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w2b_7.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w2b_70.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w2b_8.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w2b_80.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w2b_9.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w2b_90.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w2d.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w2d_1.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w2d_10.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w2d_100.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w2d_2.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w2d_20.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w2d_3.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w2d_30.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w2d_4.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w2d_40.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w2d_5.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w2d_50.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w2d_6.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w2d_7.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w2d_70.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w2d_8.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w2d_80.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w2d_9.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w2d_90.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w2p.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w2p_1.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w2p_10.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w2p_100.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w2p_2.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w2p_20.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w2p_3.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w2p_30.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w2p_4.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w2p_40.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w2p_5.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w2p_50.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w2p_6.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w2p_7.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w2p_70.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w2p_8.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w2p_80.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w2p_9.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w2p_90.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w2q.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w2q_1.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w2q_10.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w2q_100.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w2q_2.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w2q_20.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w2q_3.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w2q_30.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w2q_4.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w2q_40.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w2q_5.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w2q_50.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w2q_6.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w2q_7.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w2q_70.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w2q_8.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w2q_80.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w2q_9.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w2q_90.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w3.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w3b.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w3b_1.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w3b_10.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w3b_100.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w3b_2.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w3b_20.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w3b_3.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w3b_30.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w3b_4.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w3b_40.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w3b_5.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w3b_50.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w3b_6.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w3b_7.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w3b_70.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w3b_8.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w3b_80.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w3b_9.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w3b_90.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w3d.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w3d_1.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w3d_10.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w3d_100.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w3d_2.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w3d_20.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w3d_3.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w3d_30.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w3d_4.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w3d_40.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w3d_5.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w3d_50.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w3d_6.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w3d_7.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w3d_70.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w3d_8.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w3d_80.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w3d_9.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w3d_90.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w3p.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w3p_1.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w3p_10.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w3p_100.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w3p_2.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w3p_20.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w3p_3.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w3p_30.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w3p_4.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w3p_40.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w3p_5.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w3p_50.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w3p_6.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w3p_7.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w3p_70.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w3p_8.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w3p_80.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w3p_9.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w3p_90.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w3q.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w3q_1.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w3q_10.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w3q_100.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w3q_2.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w3q_20.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w3q_3.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w3q_30.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w3q_4.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w3q_40.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w3q_5.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w3q_50.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w3q_6.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w3q_7.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w3q_70.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w3q_8.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w3q_80.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w3q_9.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w3q_90.gif
/imgs/gif/gifset_trcx/trcx_szygirl_b4.gif
/imgs/gif/gifset_trcx/trcx_szygirl_b4b.gif
/imgs/gif/gifset_trcx/trcx_szygirl_b4b_1.gif
/imgs/gif/gifset_trcx/trcx_szygirl_b4b_10.gif
/imgs/gif/gifset_trcx/trcx_szygirl_b4b_100.gif
/imgs/gif/gifset_trcx/trcx_szygirl_b4b_2.gif
/imgs/gif/gifset_trcx/trcx_szygirl_b4b_20.gif
/imgs/gif/gifset_trcx/trcx_szygirl_b4b_3.gif
/imgs/gif/gifset_trcx/trcx_szygirl_b4b_30.gif
/imgs/gif/gifset_trcx/trcx_szygirl_b4b_4.gif
/imgs/gif/gifset_trcx/trcx_szygirl_b4b_40.gif
/imgs/gif/gifset_trcx/trcx_szygirl_b4b_5.gif
/imgs/gif/gifset_trcx/trcx_szygirl_b4b_50.gif
/imgs/gif/gifset_trcx/trcx_szygirl_b4b_6.gif
/imgs/gif/gifset_trcx/trcx_szygirl_b4b_7.gif
/imgs/gif/gifset_trcx/trcx_szygirl_b4b_70.gif
/imgs/gif/gifset_trcx/trcx_szygirl_b4b_8.gif
/imgs/gif/gifset_trcx/trcx_szygirl_b4b_80.gif
/imgs/gif/gifset_trcx/trcx_szygirl_b4b_9.gif
/imgs/gif/gifset_trcx/trcx_szygirl_b4b_90.gif
/imgs/gif/gifset_trcx/trcx_szygirl_b4d.gif
/imgs/gif/gifset_trcx/trcx_szygirl_b4d_1.gif
/imgs/gif/gifset_trcx/trcx_szygirl_b4d_10.gif
/imgs/gif/gifset_trcx/trcx_szygirl_b4d_100.gif
/imgs/gif/gifset_trcx/trcx_szygirl_b4d_2.gif
/imgs/gif/gifset_trcx/trcx_szygirl_b4d_20.gif
/imgs/gif/gifset_trcx/trcx_szygirl_b4d_3.gif
/imgs/gif/gifset_trcx/trcx_szygirl_b4d_30.gif
/imgs/gif/gifset_trcx/trcx_szygirl_b4d_4.gif
/imgs/gif/gifset_trcx/trcx_szygirl_b4d_40.gif
/imgs/gif/gifset_trcx/trcx_szygirl_b4d_5.gif
/imgs/gif/gifset_trcx/trcx_szygirl_b4d_50.gif
/imgs/gif/gifset_trcx/trcx_szygirl_b4d_6.gif
/imgs/gif/gifset_trcx/trcx_szygirl_b4d_7.gif
/imgs/gif/gifset_trcx/trcx_szygirl_b4d_70.gif
/imgs/gif/gifset_trcx/trcx_szygirl_b4d_8.gif
/imgs/gif/gifset_trcx/trcx_szygirl_b4d_80.gif
/imgs/gif/gifset_trcx/trcx_szygirl_b4d_9.gif
/imgs/gif/gifset_trcx/trcx_szygirl_b4d_90.gif
/imgs/gif/gifset_trcx/trcx_szygirl_b4p.gif
/imgs/gif/gifset_trcx/trcx_szygirl_b4p_1.gif
/imgs/gif/gifset_trcx/trcx_szygirl_b4p_10.gif
/imgs/gif/gifset_trcx/trcx_szygirl_b4p_100.gif
/imgs/gif/gifset_trcx/trcx_szygirl_b4p_2.gif
/imgs/gif/gifset_trcx/trcx_szygirl_b4p_20.gif
/imgs/gif/gifset_trcx/trcx_szygirl_b4p_3.gif
/imgs/gif/gifset_trcx/trcx_szygirl_b4p_30.gif
/imgs/gif/gifset_trcx/trcx_szygirl_b4p_4.gif
/imgs/gif/gifset_trcx/trcx_szygirl_b4p_40.gif
/imgs/gif/gifset_trcx/trcx_szygirl_b4p_5.gif
/imgs/gif/gifset_trcx/trcx_szygirl_b4p_50.gif
/imgs/gif/gifset_trcx/trcx_szygirl_b4p_6.gif
/imgs/gif/gifset_trcx/trcx_szygirl_b4p_7.gif
/imgs/gif/gifset_trcx/trcx_szygirl_b4p_70.gif
/imgs/gif/gifset_trcx/trcx_szygirl_b4p_8.gif
/imgs/gif/gifset_trcx/trcx_szygirl_b4p_80.gif
/imgs/gif/gifset_trcx/trcx_szygirl_b4p_9.gif
/imgs/gif/gifset_trcx/trcx_szygirl_b4p_90.gif
/imgs/gif/gifset_trcx/trcx_szygirl_b4q.gif
/imgs/gif/gifset_trcx/trcx_szygirl_b4q_1.gif
/imgs/gif/gifset_trcx/trcx_szygirl_b4q_10.gif
/imgs/gif/gifset_trcx/trcx_szygirl_b4q_100.gif
/imgs/gif/gifset_trcx/trcx_szygirl_b4q_2.gif
/imgs/gif/gifset_trcx/trcx_szygirl_b4q_20.gif
/imgs/gif/gifset_trcx/trcx_szygirl_b4q_3.gif
/imgs/gif/gifset_trcx/trcx_szygirl_b4q_30.gif
/imgs/gif/gifset_trcx/trcx_szygirl_b4q_4.gif
/imgs/gif/gifset_trcx/trcx_szygirl_b4q_40.gif
/imgs/gif/gifset_trcx/trcx_szygirl_b4q_5.gif
/imgs/gif/gifset_trcx/trcx_szygirl_b4q_50.gif
/imgs/gif/gifset_trcx/trcx_szygirl_b4q_6.gif
/imgs/gif/gifset_trcx/trcx_szygirl_b4q_7.gif
/imgs/gif/gifset_trcx/trcx_szygirl_b4q_70.gif
/imgs/gif/gifset_trcx/trcx_szygirl_b4q_8.gif
/imgs/gif/gifset_trcx/trcx_szygirl_b4q_80.gif
/imgs/gif/gifset_trcx/trcx_szygirl_b4q_9.gif
/imgs/gif/gifset_trcx/trcx_szygirl_b4q_90.gif
/imgs/gif/gifset_w/trophy.gif
/imgs/gif/gifset_w/trophyb.gif
/imgs/gif/gifset_w/trophyb_1.gif
/imgs/gif/gifset_w/trophyb_10.gif
/imgs/gif/gifset_w/trophyb_100.gif
/imgs/gif/gifset_w/trophyb_2.gif
/imgs/gif/gifset_w/trophyb_20.gif
/imgs/gif/gifset_w/trophyb_3.gif
/imgs/gif/gifset_w/trophyb_30.gif
/imgs/gif/gifset_w/trophyb_4.gif
/imgs/gif/gifset_w/trophyb_40.gif
/imgs/gif/gifset_w/trophyb_5.gif
/imgs/gif/gifset_w/trophyb_50.gif
/imgs/gif/gifset_w/trophyb_6.gif
/imgs/gif/gifset_w/trophyb_7.gif
/imgs/gif/gifset_w/trophyb_70.gif
/imgs/gif/gifset_w/trophyb_8.gif
/imgs/gif/gifset_w/trophyb_80.gif
/imgs/gif/gifset_w/trophyb_9.gif
/imgs/gif/gifset_w/trophyb_90.gif
/imgs/gif/gifset_w/trophyd.gif
/imgs/gif/gifset_w/trophyd_1.gif
/imgs/gif/gifset_w/trophyd_10.gif
/imgs/gif/gifset_w/trophyd_100.gif
/imgs/gif/gifset_w/trophyd_2.gif
/imgs/gif/gifset_w/trophyd_20.gif
/imgs/gif/gifset_w/trophyd_3.gif
/imgs/gif/gifset_w/trophyd_30.gif
/imgs/gif/gifset_w/trophyd_4.gif
/imgs/gif/gifset_w/trophyd_40.gif
/imgs/gif/gifset_w/trophyd_5.gif
/imgs/gif/gifset_w/trophyd_50.gif
/imgs/gif/gifset_w/trophyd_6.gif
/imgs/gif/gifset_w/trophyd_7.gif
/imgs/gif/gifset_w/trophyd_70.gif
/imgs/gif/gifset_w/trophyd_8.gif
/imgs/gif/gifset_w/trophyd_80.gif
/imgs/gif/gifset_w/trophyd_9.gif
/imgs/gif/gifset_w/trophyd_90.gif
/imgs/gif/gifset_w/trophyp.gif
/imgs/gif/gifset_w/trophyp_1.gif
/imgs/gif/gifset_w/trophyp_10.gif
/imgs/gif/gifset_w/trophyp_100.gif
/imgs/gif/gifset_w/trophyp_2.gif
/imgs/gif/gifset_w/trophyp_20.gif
/imgs/gif/gifset_w/trophyp_3.gif
/imgs/gif/gifset_w/trophyp_30.gif
/imgs/gif/gifset_w/trophyp_4.gif
/imgs/gif/gifset_w/trophyp_40.gif
/imgs/gif/gifset_w/trophyp_5.gif
/imgs/gif/gifset_w/trophyp_50.gif
/imgs/gif/gifset_w/trophyp_6.gif
/imgs/gif/gifset_w/trophyp_7.gif
/imgs/gif/gifset_w/trophyp_70.gif
/imgs/gif/gifset_w/trophyp_8.gif
/imgs/gif/gifset_w/trophyp_80.gif
/imgs/gif/gifset_w/trophyp_9.gif
/imgs/gif/gifset_w/trophyp_90.gif
/imgs/gif/gifset_w/trophyq.gif
/imgs/gif/gifset_w/trophyq_1.gif
/imgs/gif/gifset_w/trophyq_10.gif
/imgs/gif/gifset_w/trophyq_100.gif
/imgs/gif/gifset_w/trophyq_2.gif
/imgs/gif/gifset_w/trophyq_20.gif
/imgs/gif/gifset_w/trophyq_3.gif
/imgs/gif/gifset_w/trophyq_30.gif
/imgs/gif/gifset_w/trophyq_4.gif
/imgs/gif/gifset_w/trophyq_40.gif
/imgs/gif/gifset_w/trophyq_5.gif
/imgs/gif/gifset_w/trophyq_50.gif
/imgs/gif/gifset_w/trophyq_6.gif
/imgs/gif/gifset_w/trophyq_7.gif
/imgs/gif/gifset_w/trophyq_70.gif
/imgs/gif/gifset_w/trophyq_8.gif
/imgs/gif/gifset_w/trophyq_80.gif
/imgs/gif/gifset_w/trophyq_9.gif
/imgs/gif/gifset_w/trophyq_90.gif
/imgs/gif/gifset_w/warning.gif
/imgs/gif/gifset_w/warningb.gif
/imgs/gif/gifset_w/warningb_1.gif
/imgs/gif/gifset_w/warningb_10.gif
/imgs/gif/gifset_w/warningb_100.gif
/imgs/gif/gifset_w/warningb_2.gif
/imgs/gif/gifset_w/warningb_20.gif
/imgs/gif/gifset_w/warningb_3.gif
/imgs/gif/gifset_w/warningb_30.gif
/imgs/gif/gifset_w/warningb_4.gif
/imgs/gif/gifset_w/warningb_40.gif
/imgs/gif/gifset_w/warningb_5.gif
/imgs/gif/gifset_w/warningb_50.gif
/imgs/gif/gifset_w/warningb_6.gif
/imgs/gif/gifset_w/warningb_7.gif
/imgs/gif/gifset_w/warningb_70.gif
/imgs/gif/gifset_w/warningb_8.gif
/imgs/gif/gifset_w/warningb_80.gif
/imgs/gif/gifset_w/warningb_9.gif
/imgs/gif/gifset_w/warningb_90.gif
/imgs/gif/gifset_w/warningd.gif
/imgs/gif/gifset_w/warningd_1.gif
/imgs/gif/gifset_w/warningd_10.gif
/imgs/gif/gifset_w/warningd_100.gif
/imgs/gif/gifset_w/warningd_2.gif
/imgs/gif/gifset_w/warningd_20.gif
/imgs/gif/gifset_w/warningd_3.gif
/imgs/gif/gifset_w/warningd_30.gif
/imgs/gif/gifset_w/warningd_4.gif
/imgs/gif/gifset_w/warningd_40.gif
/imgs/gif/gifset_w/warningd_5.gif
/imgs/gif/gifset_w/warningd_50.gif
/imgs/gif/gifset_w/warningd_6.gif
/imgs/gif/gifset_w/warningd_7.gif
/imgs/gif/gifset_w/warningd_70.gif
/imgs/gif/gifset_w/warningd_8.gif
/imgs/gif/gifset_w/warningd_80.gif
/imgs/gif/gifset_w/warningd_9.gif
/imgs/gif/gifset_w/warningd_90.gif
/imgs/gif/gifset_w/warningp.gif
/imgs/gif/gifset_w/warningp_1.gif
/imgs/gif/gifset_w/warningp_10.gif
/imgs/gif/gifset_w/warningp_100.gif
/imgs/gif/gifset_w/warningp_2.gif
/imgs/gif/gifset_w/warningp_20.gif
/imgs/gif/gifset_w/warningp_3.gif
/imgs/gif/gifset_w/warningp_30.gif
/imgs/gif/gifset_w/warningp_4.gif
/imgs/gif/gifset_w/warningp_40.gif
/imgs/gif/gifset_w/warningp_5.gif
/imgs/gif/gifset_w/warningp_50.gif
/imgs/gif/gifset_w/warningp_6.gif
/imgs/gif/gifset_w/warningp_7.gif
/imgs/gif/gifset_w/warningp_70.gif
/imgs/gif/gifset_w/warningp_8.gif
/imgs/gif/gifset_w/warningp_80.gif
/imgs/gif/gifset_w/warningp_9.gif
/imgs/gif/gifset_w/warningp_90.gif
/imgs/gif/gifset_w/warningq.gif
/imgs/gif/gifset_w/warningq_1.gif
/imgs/gif/gifset_w/warningq_10.gif
/imgs/gif/gifset_w/warningq_100.gif
/imgs/gif/gifset_w/warningq_2.gif
/imgs/gif/gifset_w/warningq_20.gif
/imgs/gif/gifset_w/warningq_3.gif
/imgs/gif/gifset_w/warningq_30.gif
/imgs/gif/gifset_w/warningq_4.gif
/imgs/gif/gifset_w/warningq_40.gif
/imgs/gif/gifset_w/warningq_5.gif
/imgs/gif/gifset_w/warningq_50.gif
/imgs/gif/gifset_w/warningq_6.gif
/imgs/gif/gifset_w/warningq_7.gif
/imgs/gif/gifset_w/warningq_70.gif
/imgs/gif/gifset_w/warningq_8.gif
/imgs/gif/gifset_w/warningq_80.gif
/imgs/gif/gifset_w/warningq_9.gif
/imgs/gif/gifset_w/warningq_90.gif
/imgs/gif/gifset_w/welcome.gif
/imgs/gif/gifset_w/welcomeb.gif
/imgs/gif/gifset_w/welcomeb_1.gif
/imgs/gif/gifset_w/welcomeb_10.gif
/imgs/gif/gifset_w/welcomeb_100.gif
/imgs/gif/gifset_w/welcomeb_2.gif
/imgs/gif/gifset_w/welcomeb_20.gif
/imgs/gif/gifset_w/welcomeb_3.gif
/imgs/gif/gifset_w/welcomeb_30.gif
/imgs/gif/gifset_w/welcomeb_4.gif
/imgs/gif/gifset_w/welcomeb_40.gif
/imgs/gif/gifset_w/welcomeb_5.gif
/imgs/gif/gifset_w/welcomeb_50.gif
/imgs/gif/gifset_w/welcomeb_6.gif
/imgs/gif/gifset_w/welcomeb_7.gif
/imgs/gif/gifset_w/welcomeb_70.gif
/imgs/gif/gifset_w/welcomeb_8.gif
/imgs/gif/gifset_w/welcomeb_80.gif
/imgs/gif/gifset_w/welcomeb_9.gif
/imgs/gif/gifset_w/welcomeb_90.gif
/imgs/gif/gifset_w/welcomed.gif
/imgs/gif/gifset_w/welcomed_1.gif
/imgs/gif/gifset_w/welcomed_10.gif
/imgs/gif/gifset_w/welcomed_100.gif
/imgs/gif/gifset_w/welcomed_2.gif
/imgs/gif/gifset_w/welcomed_20.gif
/imgs/gif/gifset_w/welcomed_3.gif
/imgs/gif/gifset_w/welcomed_30.gif
/imgs/gif/gifset_w/welcomed_4.gif
/imgs/gif/gifset_w/welcomed_40.gif
/imgs/gif/gifset_w/welcomed_5.gif
/imgs/gif/gifset_w/welcomed_50.gif
/imgs/gif/gifset_w/welcomed_6.gif
/imgs/gif/gifset_w/welcomed_7.gif
/imgs/gif/gifset_w/welcomed_70.gif
/imgs/gif/gifset_w/welcomed_8.gif
/imgs/gif/gifset_w/welcomed_80.gif
/imgs/gif/gifset_w/welcomed_9.gif
/imgs/gif/gifset_w/welcomed_90.gif
/imgs/gif/gifset_w/welcomep.gif
/imgs/gif/gifset_w/welcomep_1.gif
/imgs/gif/gifset_w/welcomep_10.gif
/imgs/gif/gifset_w/welcomep_100.gif
/imgs/gif/gifset_w/welcomep_2.gif
/imgs/gif/gifset_w/welcomep_20.gif
/imgs/gif/gifset_w/welcomep_3.gif
/imgs/gif/gifset_w/welcomep_30.gif
/imgs/gif/gifset_w/welcomep_4.gif
/imgs/gif/gifset_w/welcomep_40.gif
/imgs/gif/gifset_w/welcomep_5.gif
/imgs/gif/gifset_w/welcomep_50.gif
/imgs/gif/gifset_w/welcomep_6.gif
/imgs/gif/gifset_w/welcomep_7.gif
/imgs/gif/gifset_w/welcomep_70.gif
/imgs/gif/gifset_w/welcomep_8.gif
/imgs/gif/gifset_w/welcomep_80.gif
/imgs/gif/gifset_w/welcomep_9.gif
/imgs/gif/gifset_w/welcomep_90.gif
/imgs/gif/gifset_w/welcomeq.gif
/imgs/gif/gifset_w/welcomeq_1.gif
/imgs/gif/gifset_w/welcomeq_10.gif
/imgs/gif/gifset_w/welcomeq_100.gif
/imgs/gif/gifset_w/welcomeq_2.gif
/imgs/gif/gifset_w/welcomeq_20.gif
/imgs/gif/gifset_w/welcomeq_3.gif
/imgs/gif/gifset_w/welcomeq_30.gif
/imgs/gif/gifset_w/welcomeq_4.gif
/imgs/gif/gifset_w/welcomeq_40.gif
/imgs/gif/gifset_w/welcomeq_5.gif
/imgs/gif/gifset_w/welcomeq_50.gif
/imgs/gif/gifset_w/welcomeq_6.gif
/imgs/gif/gifset_w/welcomeq_7.gif
/imgs/gif/gifset_w/welcomeq_70.gif
/imgs/gif/gifset_w/welcomeq_8.gif
/imgs/gif/gifset_w/welcomeq_80.gif
/imgs/gif/gifset_w/welcomeq_9.gif
/imgs/gif/gifset_w/welcomeq_90.gif
/imgs/gif/gifset_w/worksign.gif
/imgs/gif/gifset_w/worksignb.gif
/imgs/gif/gifset_w/worksignb_1.gif
/imgs/gif/gifset_w/worksignb_10.gif
/imgs/gif/gifset_w/worksignb_100.gif
/imgs/gif/gifset_w/worksignb_2.gif
/imgs/gif/gifset_w/worksignb_20.gif
/imgs/gif/gifset_w/worksignb_3.gif
/imgs/gif/gifset_w/worksignb_30.gif
/imgs/gif/gifset_w/worksignb_4.gif
/imgs/gif/gifset_w/worksignb_40.gif
/imgs/gif/gifset_w/worksignb_5.gif
/imgs/gif/gifset_w/worksignb_50.gif
/imgs/gif/gifset_w/worksignb_6.gif
/imgs/gif/gifset_w/worksignb_7.gif
/imgs/gif/gifset_w/worksignb_70.gif
/imgs/gif/gifset_w/worksignb_8.gif
/imgs/gif/gifset_w/worksignb_80.gif
/imgs/gif/gifset_w/worksignb_9.gif
/imgs/gif/gifset_w/worksignb_90.gif
/imgs/gif/gifset_w/worksignd.gif
/imgs/gif/gifset_w/worksignd_1.gif
/imgs/gif/gifset_w/worksignd_10.gif
/imgs/gif/gifset_w/worksignd_100.gif
/imgs/gif/gifset_w/worksignd_2.gif
/imgs/gif/gifset_w/worksignd_20.gif
/imgs/gif/gifset_w/worksignd_3.gif
/imgs/gif/gifset_w/worksignd_30.gif
/imgs/gif/gifset_w/worksignd_4.gif
/imgs/gif/gifset_w/worksignd_40.gif
/imgs/gif/gifset_w/worksignd_5.gif
/imgs/gif/gifset_w/worksignd_50.gif
/imgs/gif/gifset_w/worksignd_6.gif
/imgs/gif/gifset_w/worksignd_7.gif
/imgs/gif/gifset_w/worksignd_70.gif
/imgs/gif/gifset_w/worksignd_8.gif
/imgs/gif/gifset_w/worksignd_80.gif
/imgs/gif/gifset_w/worksignd_9.gif
/imgs/gif/gifset_w/worksignd_90.gif
/imgs/gif/gifset_w/worksignp.gif
/imgs/gif/gifset_w/worksignp_1.gif
/imgs/gif/gifset_w/worksignp_10.gif
/imgs/gif/gifset_w/worksignp_100.gif
/imgs/gif/gifset_w/worksignp_2.gif
/imgs/gif/gifset_w/worksignp_20.gif
/imgs/gif/gifset_w/worksignp_3.gif
/imgs/gif/gifset_w/worksignp_30.gif
/imgs/gif/gifset_w/worksignp_4.gif
/imgs/gif/gifset_w/worksignp_40.gif
/imgs/gif/gifset_w/worksignp_5.gif
/imgs/gif/gifset_w/worksignp_50.gif
/imgs/gif/gifset_w/worksignp_6.gif
/imgs/gif/gifset_w/worksignp_7.gif
/imgs/gif/gifset_w/worksignp_70.gif
/imgs/gif/gifset_w/worksignp_8.gif
/imgs/gif/gifset_w/worksignp_80.gif
/imgs/gif/gifset_w/worksignp_9.gif
/imgs/gif/gifset_w/worksignp_90.gif
/imgs/gif/gifset_w/worksignq.gif
/imgs/gif/gifset_w/worksignq_1.gif
/imgs/gif/gifset_w/worksignq_10.gif
/imgs/gif/gifset_w/worksignq_100.gif
/imgs/gif/gifset_w/worksignq_2.gif
/imgs/gif/gifset_w/worksignq_20.gif
/imgs/gif/gifset_w/worksignq_3.gif
/imgs/gif/gifset_w/worksignq_30.gif
/imgs/gif/gifset_w/worksignq_4.gif
/imgs/gif/gifset_w/worksignq_40.gif
/imgs/gif/gifset_w/worksignq_5.gif
/imgs/gif/gifset_w/worksignq_50.gif
/imgs/gif/gifset_w/worksignq_6.gif
/imgs/gif/gifset_w/worksignq_7.gif
/imgs/gif/gifset_w/worksignq_70.gif
/imgs/gif/gifset_w/worksignq_8.gif
/imgs/gif/gifset_w/worksignq_80.gif
/imgs/gif/gifset_w/worksignq_9.gif
/imgs/gif/gifset_w/worksignq_90.gif
/imgs/gif/giphy_dollars/giph_weight.gif
/imgs/gif/giphy_dollars/giphy._hands2gif.gif
/imgs/gif/giphy_dollars/giphy.gif
/imgs/gif/giphy_dollars/giphy001.gif
/imgs/gif/giphy_dollars/giphy002.gif
/imgs/gif/giphy_dollars/giphy003.gif
/imgs/gif/giphy_dollars/giphy006.gif
/imgs/gif/giphy_dollars/giphy_005.gif
/imgs/gif/giphy_dollars/giphy_armodillo.gif
/imgs/gif/giphy_dollars/giphy_arrors.gif
/imgs/gif/giphy_dollars/giphy_bitcoikn.gif
/imgs/gif/giphy_dollars/giphy_bounce.gif
/imgs/gif/giphy_dollars/giphy_circl30.gif
/imgs/gif/giphy_dollars/giphy_compassion.gif
/imgs/gif/giphy_dollars/giphy_dolla.gif
/imgs/gif/giphy_dollars/giphy_dollar.gif
/imgs/gif/giphy_dollars/giphy_dollar11.gif
/imgs/gif/giphy_dollars/giphy_dolrpool.gif
/imgs/gif/giphy_dollars/giphy_droll_wimsy.gif
/imgs/gif/giphy_dollars/giphy_expression.gif
/imgs/gif/giphy_dollars/giphy_getalawyer_horns.gif
/imgs/gif/giphy_dollars/giphy_go20.gif
/imgs/gif/giphy_dollars/giphy_go3.gif
/imgs/gif/giphy_dollars/giphy_gold.gif
/imgs/gif/giphy_dollars/giphy_gov.gif
/imgs/gif/giphy_dollars/giphy_graph2.gif
/imgs/gif/giphy_dollars/giphy_hallway.gif
/imgs/gif/giphy_dollars/giphy_hands.gif
/imgs/gif/giphy_dollars/giphy_hands2.gif
/imgs/gif/giphy_dollars/giphy_hugs.gif
/imgs/gif/giphy_dollars/giphy_kalidis.gif
/imgs/gif/giphy_dollars/giphy_kinetic.gif
/imgs/gif/giphy_dollars/giphy_konabus.gif
/imgs/gif/giphy_dollars/giphy_konabus_stickr.gif
/imgs/gif/giphy_dollars/giphy_kt30.gif
/imgs/gif/giphy_dollars/giphy_law.gif
/imgs/gif/giphy_dollars/giphy_law01.gif
/imgs/gif/giphy_dollars/giphy_law02.gif
/imgs/gif/giphy_dollars/giphy_letter.gif
/imgs/gif/giphy_dollars/giphy_littletipper.gif
/imgs/gif/giphy_dollars/giphy_makechange.gif
/imgs/gif/giphy_dollars/giphy_moneyclap.gif
/imgs/gif/giphy_dollars/giphy_moneyeye.gif
/imgs/gif/giphy_dollars/giphy_moneymachine.gif
/imgs/gif/giphy_dollars/giphy_moneymonkey.gif
/imgs/gif/giphy_dollars/giphy_moneyspiral.gif
/imgs/gif/giphy_dollars/giphy_monydog.gif
/imgs/gif/giphy_dollars/giphy_mouse/giph_phone04y.gif
/imgs/gif/giphy_dollars/giphy_mouse/giphy._nophonegif.gif
/imgs/gif/giphy_dollars/giphy_mouse/giphy.gif
/imgs/gif/giphy_dollars/giphy_mouse/giphy.gif_construction06.gif
/imgs/gif/giphy_dollars/giphy_mouse/giphy_constrion20.gif
/imgs/gif/giphy_dollars/giphy_mouse/giphy_construction01.gif
/imgs/gif/giphy_dollars/giphy_mouse/giphy_construction02.gif
/imgs/gif/giphy_dollars/giphy_mouse/giphy_construction03.gif
/imgs/gif/giphy_dollars/giphy_mouse/giphy_construction04.gif
/imgs/gif/giphy_dollars/giphy_mouse/giphy_construction08.gif
/imgs/gif/giphy_dollars/giphy_mouse/giphy_construction09.gif
/imgs/gif/giphy_dollars/giphy_mouse/giphy_construction11.gif
/imgs/gif/giphy_dollars/giphy_mouse/giphy_construction12.gif
/imgs/gif/giphy_dollars/giphy_mouse/giphy_construction15.gif
/imgs/gif/giphy_dollars/giphy_mouse/giphy_construction21.gif
/imgs/gif/giphy_dollars/giphy_mouse/giphy_construction25.gif
/imgs/gif/giphy_dollars/giphy_mouse/giphy_construction_10.gif
/imgs/gif/giphy_dollars/giphy_mouse/giphy_construction_dogs.gif
/imgs/gif/giphy_dollars/giphy_mouse/giphy_falling01.gif
/imgs/gif/giphy_dollars/giphy_mouse/giphy_falling02.gif
/imgs/gif/giphy_dollars/giphy_mouse/giphy_falling03.gif
/imgs/gif/giphy_dollars/giphy_mouse/giphy_falling04.gif
/imgs/gif/giphy_dollars/giphy_mouse/giphy_falling06.gif
/imgs/gif/giphy_dollars/giphy_mouse/giphy_falling07.gif
/imgs/gif/giphy_dollars/giphy_mouse/giphy_falling08.gif
/imgs/gif/giphy_dollars/giphy_mouse/giphy_falling09.gif
/imgs/gif/giphy_dollars/giphy_mouse/giphy_filecabinat.gif
/imgs/gif/giphy_dollars/giphy_mouse/giphy_focus10.gif
/imgs/gif/giphy_dollars/giphy_mouse/giphy_mouse01.gif
/imgs/gif/giphy_dollars/giphy_mouse/giphy_mouse02.gif
/imgs/gif/giphy_dollars/giphy_mouse/giphy_mouse03.gif
/imgs/gif/giphy_dollars/giphy_mouse/giphy_mouse06.gif
/imgs/gif/giphy_dollars/giphy_mouse/giphy_mouse_konabus.gif
/imgs/gif/giphy_dollars/giphy_mouse/giphy_phone05.gif
/imgs/gif/giphy_dollars/giphy_mouse/giphy_phone06.gif
/imgs/gif/giphy_dollars/giphy_mouse/giphy_snap.gif
/imgs/gif/giphy_dollars/giphy_mouse/giphyfu.gif
/imgs/gif/giphy_dollars/giphy_pano.gif
/imgs/gif/giphy_dollars/giphy_pencil.gif
/imgs/gif/giphy_dollars/giphy_phonepage.gif
/imgs/gif/giphy_dollars/giphy_presentermedia.gif
/imgs/gif/giphy_dollars/giphy_presentermedia2.gif
/imgs/gif/giphy_dollars/giphy_ropeup.gif
/imgs/gif/giphy_dollars/giphy_scrollstats.gif
/imgs/gif/giphy_dollars/giphy_trsansform.gif
/imgs/gif/giphy_dollars/giphy_typer.gif
/imgs/gif/giphy_dollars/giphy_verified.gif
/imgs/gif/giphy_dollars/giphy_water.gif
/imgs/gif/giphy_dollars/giphy_weaigh5.gif
/imgs/gif/giphy_dollars/giphy_weight3.gif
/imgs/gif/giphy_dollars/giphyarrowfire.gif
/imgs/gif/giphy_dollars/giphybuslt.gif
/imgs/gif/giphy_dollars/giphyfocuseyes.gif
/imgs/gif/giphy_dollars/giphygowave'.gif
/imgs/gif/giphy_dollars/giphygraph.gif
/imgs/gif/giphy_dollars/giphymoney_smerf.gif
/imgs/gif/giphy_dollars/giphytwist.gif
/imgs/gif/giphy_dollars/giphyvortex.gif
/imgs/gif/giphy_dollars/giphyweaight2.gif
/imgs/gif/giphy_view30.gif
/imgs/gif/iperms/giphy_army_cleanfun.gif
/imgs/gif/iperms/giphy_army_kiti.gif
/imgs/gif/iperms/giphy_army_marksync.gif
/imgs/gif/iperms/giphy_army_pushups_nohands.gif
/imgs/gif/iperms/giphy_army_seal_sparkle.gif
/imgs/gif/iperms/giphy_army_shake_salure.gif
/imgs/gif/iperms/giphy_army_tankroll.gif
/imgs/gif/iperms/giphy_armydance1.gif
/imgs/gif/iperms/giphy_armymarchn.gif
/imgs/gif/iperms/giphy_armytoon_late.gif
/imgs/gif/iperms/giphy_armywave.gif
/imgs/gif/iperms/giphy_armywave_barrel.gif
/imgs/gif/iperms/giphy_iperms.gif
/imgs/gif/iperms/giphy_iperms_bell.gif
/imgs/gif/iperms/giphy_iperms_strips.gif
/imgs/gif/kali/adfaf.gif
/imgs/gif/kali/kali16.gif
/imgs/gif/kali/kali2.gif
/imgs/gif/kali/kali25.gif
/imgs/gif/kali/kali3.gif
/imgs/gif/kali/kali4.gif
/imgs/gif/kali/kali5.gif
/imgs/gif/kali/kali8].gif
/imgs/gif/kali/kalid1.gif
/imgs/gif/kali/maskflash.gif
/imgs/gif/kali/staic20.gif
/imgs/gif/kali/static1.gif
/imgs/gif/kali/static3.gif
/imgs/gif/kali/static6.gif
/imgs/gif/kitiworks/giphy._kitiworks_read.gif
/imgs/gif/kitiworks/giphy_kiti_ipadfish.gif
/imgs/gif/kitiworks/giphy_kiti_purfect.gif
/imgs/gif/kitiworks/giphy_kitimail.gif
/imgs/gif/kitiworks/giphy_kitionline.gif
/imgs/gif/kitiworks/giphy_kitirunning.gif
/imgs/gif/kitiworks/giphy_kitiwork_bounce.gif
/imgs/gif/kitiworks/giphy_kitiworks_trail.gif
/imgs/gif/kitiworks/giphy_kitiwrites.gif
/imgs/gif/kitiworks/giphy_kocats.gif
/imgs/gif/kitiworks/giphy_news_kitiworks.gif
/imgs/gif/konabus/giphy_konabus10.gif
/imgs/gif/konabus/giphy_konabus11.gif
/imgs/gif/konabus/giphy_konabus13.gif
/imgs/gif/konabus/giphy_konabus14.gif
/imgs/gif/konabus/giphy_konabus20.gif
/imgs/gif/konabus/giphy_skullflowers.gif
/imgs/gif/konabus/giphy_vkonabus03.gif
/imgs/gif/konet/giphy_weave.gif
/imgs/gif/kt/giphy_finger_arat.gif
/imgs/gif/kt/giphy_funnywalking.gif
/imgs/gif/kt/giphy_gymtoss.gif
/imgs/gif/kt/giphy_hand2s.gif
/imgs/gif/kt/giphy_handhither_gloves.gif
/imgs/gif/kt/giphy_hands1.gif
/imgs/gif/kt/giphy_headwaves.gif
/imgs/gif/kt/giphy_homerhandflaling.gif
/imgs/gif/kt/giphy_kt01.gif
/imgs/gif/kt/giphy_kt02.gif
/imgs/gif/kt/giphy_kt03.gif
/imgs/gif/kt/giphy_notes20.gif
/imgs/gif/med/giphy_eyeline.gif
/imgs/gif/med/giphy_eyes_line.gif
/imgs/gif/med/giphy_eyeworms.gif
/imgs/gif/med/giphy_heart01.gif
/imgs/gif/med/giphy_heart02.gif
/imgs/gif/med/giphy_heart04.gif
/imgs/gif/med/giphy_heart06.gif
/imgs/gif/med/giphy_heart10.gif
/imgs/gif/med/giphy_heart11.gif
/imgs/gif/med/giphy_heart12.gif
/imgs/gif/med/giphy_heart13.gif
/imgs/gif/med/giphy_heart15.gif
/imgs/gif/med/giphy_heart16.gif
/imgs/gif/med/giphy_heart17.gif
/imgs/gif/med/giphy_heart18.gif
/imgs/gif/med/giphy_heart19.gif
/imgs/gif/med/giphy_heart20.gif
/imgs/gif/med/giphy_heart21.gif
/imgs/gif/med/giphy_heart22.gif
/imgs/gif/med/giphy_heart23.gif
/imgs/gif/med/giphy_heart24.gif
/imgs/gif/med/giphy_heart25.gif
/imgs/gif/med/giphy_heart26.gif
/imgs/gif/med/giphy_heart27.gif
/imgs/gif/med/giphy_heart28.gif
/imgs/gif/med/giphy_heart29.gif
/imgs/gif/mouse/giphy.gif
/imgs/gif/mouse/giphy_construction01.gif
/imgs/gif/mouse/giphy_construction02.gif
/imgs/gif/mouse/giphy_construction03.gif
/imgs/gif/mouse/giphy_construction04.gif
/imgs/gif/mouse/giphy_construction05.gif
/imgs/gif/mouse/giphy_construction06.gif
/imgs/gif/mouse/giphy_construction07.gif
/imgs/gif/mouse/giphy_construction08.gif
/imgs/gif/mouse/giphy_construction09.gif
/imgs/gif/mouse/giphy_construction10.gif
/imgs/gif/mouse/giphy_construction11.gif
/imgs/gif/mouse/giphy_construction12.gif
/imgs/gif/mouse/giphy_construction13.gif
/imgs/gif/mouse/giphy_construction14.gif
/imgs/gif/mouse/giphy_construction15.gif
/imgs/gif/mouse/giphy_falling01.gif
/imgs/gif/mouse/giphy_falling02.gif
/imgs/gif/mouse/giphy_falling03.gif
/imgs/gif/mouse/giphy_falling04.gif
/imgs/gif/mouse/giphy_falling06.gif
/imgs/gif/mouse/giphy_falling07.gif
/imgs/gif/mouse/giphy_falling08.gif
/imgs/gif/mouse/giphy_falling09.gif
/imgs/gif/mouse/giphy_filecabinat.gif
/imgs/gif/mouse/giphy_focus10.gif
/imgs/gif/mouse/giphy_fu.gif
/imgs/gif/mouse/giphy_mouse01.gif
/imgs/gif/mouse/giphy_mouse02.gif
/imgs/gif/mouse/giphy_mouse03.gif
/imgs/gif/mouse/giphy_mouse06.gif
/imgs/gif/mouse/giphy_mouse_konabus.gif
/imgs/gif/mouse/giphy_phone01.gif
/imgs/gif/mouse/giphy_phone04.gif
/imgs/gif/mouse/giphy_phone05.gif
/imgs/gif/mouse/giphy_phone06.gif
/imgs/gif/mouse/giphy_snap.gif
/imgs/gif/new.gif
/imgs/gif/notes/giphy_konabus16.gif
/imgs/gif/notes/giphy_kt10.gif
/imgs/gif/notes/giphy_notes00.gif
/imgs/gif/notes/giphy_notes01.gif
/imgs/gif/notes/giphy_notes02.gif
/imgs/gif/notes/giphy_notes03.gif
/imgs/gif/notes/giphy_notes04.gif
/imgs/gif/notes/giphy_notes05.gif
/imgs/gif/notes/giphy_notes06.gif
/imgs/gif/notes/giphy_notes07.gif
/imgs/gif/notes/giphy_notes08.gif
/imgs/gif/notes/giphy_notes09.gif
/imgs/gif/notes/giphy_notes10.gif
/imgs/gif/notes/giphy_notes11.gif
/imgs/gif/notes/giphy_notes13.gif
/imgs/gif/notes/giphy_notes15.gif
/imgs/gif/notes/giphy_notes16.gif
/imgs/gif/notes/giphy_notes18.gif
/imgs/gif/notes/giphy_notes19.gif
/imgs/gif/notes/giphy_notes19b.gif
/imgs/gif/notes/giphy_notes23.gif
/imgs/gif/notes/giphy_notes24.gif
/imgs/gif/notes/giphy_notes25.gif
/imgs/gif/notes/giphy_notes26.gif
/imgs/gif/notes/giphy_notes27.gif
/imgs/gif/orbs/balls3.gif
/imgs/gif/orbs/balls4.gif
/imgs/gif/orbs/ballsrainbow.gif
/imgs/gif/orbs/cub1.gif
/imgs/gif/orbs/dia3.gif
/imgs/gif/orbs/diam1.gif
/imgs/gif/orbs/godots.gif
/imgs/gif/orbs/godotss.gif
/imgs/gif/orbs/goripple.gif
/imgs/gif/orbs/helix1.gif
/imgs/gif/orbs/jellyfish.gif
/imgs/gif/orbs/kali11.gif
/imgs/gif/orbs/kali15.gif
/imgs/gif/orbs/kali20.gif
/imgs/gif/orbs/laki21.gif
/imgs/gif/orbs/orb1.gif
/imgs/gif/orbs/orb10.gif
/imgs/gif/orbs/orb11.gif
/imgs/gif/orbs/orb3.gif
/imgs/gif/orbs/orb43.gif
/imgs/gif/orbs/orb6.gif
/imgs/gif/orbs/orb8.gif
/imgs/gif/orbs/orbcryst_alpulse.gif
/imgs/gif/orbs/orbdrip.gif
/imgs/gif/orbs/orbrainbow.gif
/imgs/gif/orbs/orbring.gif
/imgs/gif/orbs/orbspiral.gif
/imgs/gif/orbs/ringcube.gif
/imgs/gif/orbs/rings.gif
/imgs/gif/orbs/rings2.gif
/imgs/gif/orbs/ringworm.gif
/imgs/gif/orbs/rubix.gif
/imgs/gif/orbs/soccorball.gif
/imgs/gif/orbs/sprayfountain.gif
/imgs/gif/orbs/sssfg.gif
/imgs/gif/pastryroad/cakelite.gif
/imgs/gif/pastryroad/giphy._crazycookgif.gif
/imgs/gif/pastryroad/giphy_canydrops.gif
/imgs/gif/pastryroad/giphy_honeydrip.gif
/imgs/gif/pastryroad/giphy_pastryroad_frosting.gif
/imgs/gif/pastryroad/giphy_pastryroad_mixer.gif
/imgs/gif/pastryroad/giphy_woohoo.gif
/imgs/gif/ring.gif
/imgs/gif/ringb.gif
/imgs/gif/ringd.gif
/imgs/gif/ringp.gif
/imgs/gif/ringq.gif
/imgs/gif/rings.gif
/imgs/gif/ringsb.gif
/imgs/gif/ringsd.gif
/imgs/gif/ringsp.gif
/imgs/gif/ringsq.gif
/imgs/gif/spacers/giphy_handkither.gif
/imgs/gif/spacers/giphy_jkwii_head.gif
/imgs/gif/spacers/giphy_jkwii_head2.gif
/imgs/gif/spacers/giphy_spacer_01.gif
/imgs/gif/spacers/giphy_spacer_02.gif
/imgs/gif/spacers/giphy_spacer_03.gif
/imgs/gif/spacers/giphy_spacer_04.gif
/imgs/gif/spacers/giphy_spacer_05.gif
/imgs/gif/spacers/giphy_spacer_07.gif
/imgs/gif/spacers/giphy_spacer_08.gif
/imgs/gif/spacers/giphy_spacer_09.gif
/imgs/gif/spacers/giphy_spacer_10.gif
/imgs/gif/spacers/giphy_spacer_11.gif
/imgs/gif/spacers/giphy_spacer_12.gif
/imgs/gif/spacers/giphy_spacer_13.gif
/imgs/gif/spacers/giphy_spacer_15.gif
/imgs/gif/spacers/giphy_spacer_17.gif
/imgs/gif/spacers/giphy_spacer_19.gif
/imgs/gif/spacers/giphy_spacer_20.gif
/imgs/gif/spacers/giphy_spacer_21.gif
/imgs/gif/spacers/giphy_spacer_22.gif
/imgs/gif/spacers/tn/tn_giphy_handkither.gif
/imgs/gif/spacers/tn/tn_giphy_jkwii_head.gif
/imgs/gif/spacers/tn/tn_giphy_jkwii_head2.gif
/imgs/gif/spacers/tn/tn_giphy_spacer_01.gif
/imgs/gif/spacers/tn/tn_giphy_spacer_02.gif
/imgs/gif/spacers/tn/tn_giphy_spacer_03.gif
/imgs/gif/spacers/tn/tn_giphy_spacer_04.gif
/imgs/gif/spacers/tn/tn_giphy_spacer_05.gif
/imgs/gif/spacers/tn/tn_giphy_spacer_07.gif
/imgs/gif/spacers/tn/tn_giphy_spacer_08.gif
/imgs/gif/spacers/tn/tn_giphy_spacer_09.gif
/imgs/gif/spacers/tn/tn_giphy_spacer_10.gif
/imgs/gif/spacers/tn/tn_giphy_spacer_11.gif
/imgs/gif/spacers/tn/tn_giphy_spacer_12.gif
/imgs/gif/spacers/tn/tn_giphy_spacer_13.gif
/imgs/gif/spacers/tn/tn_giphy_spacer_15.gif
/imgs/gif/spacers/tn/tn_giphy_spacer_17.gif
/imgs/gif/spacers/tn/tn_giphy_spacer_19.gif
/imgs/gif/spacers/tn/tn_giphy_spacer_20.gif
/imgs/gif/spacers/tn/tn_giphy_spacer_21.gif
/imgs/gif/spacers/tn/tn_giphy_spacer_22.gif
/imgs/gif/time/giph_time_ticktocky.gif
/imgs/gif/time/giphy+flag_fireworks.gif
/imgs/gif/time/giphy_circlenumbers.gif
/imgs/gif/time/giphy_kititail.gif
/imgs/gif/time/giphy_konabus_kitibong.gif
/imgs/gif/time/giphy_paperhandling.gif
/imgs/gif/time/giphy_recordtime.gif
/imgs/gif/time/giphy_time1.gif
/imgs/gif/time/giphy_time_1213.gif
/imgs/gif/time/giphy_time_clockrays.gif
/imgs/gif/time/giphy_time_clocks.gif
/imgs/gif/time/giphy_time_cubist.gif
/imgs/gif/time/giphy_time_cycle.gif
/imgs/gif/time/giphy_time_flywheel.gif
/imgs/gif/time/giphy_time_gears.gif
/imgs/gif/time/giphy_time_goo.gif
/imgs/gif/time/giphy_time_hotsand.gif
/imgs/gif/time/giphy_time_kiti_ticktail.gif
/imgs/gif/time/giphy_time_numbers.gif
/imgs/gif/time/giphy_time_running.gif
/imgs/gif/time/giphy_time_schedule.gif
/imgs/gif/time/giphy_time_silouette.gif
/imgs/gif/time/giphy_time_spinn.gif
/imgs/gif/time/giphy_time_spiral.gif
/imgs/gif/time/giphy_time_spiral_up.gif
/imgs/gif/time/giphy_time_strobe.gif
/imgs/gif/time/giphy_time_swingers.gif
/imgs/gif/time/giphy_time_toons.gif
/imgs/gif/time/giphy_time_up.gif
/imgs/gif/time/giphy_timebench.gif
/imgs/gif/time/giphy_timeferro.gif
/imgs/gif/time/giphy_timegirls.gif
/imgs/gif/time/giphy_timeguy.gif
/imgs/gif/time/giphy_timegym.gif
/imgs/gif/time/giphy_timeinky.gif
/imgs/gif/time/giphy_timerunning.gif
/imgs/gif/time/giphy_timespinner.gif
/imgs/gif/time/giphy_timespiral_gold.gif
/imgs/gif/time/giphy_yellowbird_lookin.gif
/imgs/gif/time/stoptheclock.gif
/imgs/gif/time/tn/tn_giph_time_ticktocky.gif
/imgs/gif/time/tn/tn_giphy+flag_fireworks.gif
/imgs/gif/time/tn/tn_giphy_circlenumbers.gif
/imgs/gif/time/tn/tn_giphy_kititail.gif
/imgs/gif/time/tn/tn_giphy_konabus_kitibong.gif
/imgs/gif/time/tn/tn_giphy_paperhandling.gif
/imgs/gif/time/tn/tn_giphy_recordtime.gif
/imgs/gif/time/tn/tn_giphy_time1.gif
/imgs/gif/time/tn/tn_giphy_time_1213.gif
/imgs/gif/time/tn/tn_giphy_time_clockrays.gif
/imgs/gif/time/tn/tn_giphy_time_clocks.gif
/imgs/gif/time/tn/tn_giphy_time_cubist.gif
/imgs/gif/time/tn/tn_giphy_time_cycle.gif
/imgs/gif/time/tn/tn_giphy_time_flywheel.gif
/imgs/gif/time/tn/tn_giphy_time_gears.gif
/imgs/gif/time/tn/tn_giphy_time_goo.gif
/imgs/gif/time/tn/tn_giphy_time_hotsand.gif
/imgs/gif/time/tn/tn_giphy_time_kiti_ticktail.gif
/imgs/gif/time/tn/tn_giphy_time_numbers.gif
/imgs/gif/time/tn/tn_giphy_time_running.gif
/imgs/gif/time/tn/tn_giphy_time_schedule.gif
/imgs/gif/time/tn/tn_giphy_time_silouette.gif
/imgs/gif/time/tn/tn_giphy_time_spinn.gif
/imgs/gif/time/tn/tn_giphy_time_spiral.gif
/imgs/gif/time/tn/tn_giphy_time_spiral_up.gif
/imgs/gif/time/tn/tn_giphy_time_strobe.gif
/imgs/gif/time/tn/tn_giphy_time_swingers.gif
/imgs/gif/time/tn/tn_giphy_time_toons.gif
/imgs/gif/time/tn/tn_giphy_time_up.gif
/imgs/gif/time/tn/tn_giphy_timebench.gif
/imgs/gif/time/tn/tn_giphy_timeferro.gif
/imgs/gif/time/tn/tn_giphy_timegirls.gif
/imgs/gif/time/tn/tn_giphy_timeguy.gif
/imgs/gif/time/tn/tn_giphy_timegym.gif
/imgs/gif/time/tn/tn_giphy_timeinky.gif
/imgs/gif/time/tn/tn_giphy_timerunning.gif
/imgs/gif/time/tn/tn_giphy_timespinner.gif
/imgs/gif/time/tn/tn_giphy_timespiral_gold.gif
/imgs/gif/time/tn/tn_giphy_yellowbird_lookin.gif
/imgs/gif/time/tn/tn_stoptheclock.gif
/imgs/gif/us/giph_jkwii_handglowy.gif
/imgs/gif/us/giph_jkwii_popcorny.gif
/imgs/gif/us/giph_us_snapshot.gif
/imgs/gif/us/giphy_alien_bio3.gif
/imgs/gif/us/giphy_alien_worms.gif
/imgs/gif/us/giphy_book_flipblank.gif
/imgs/gif/us/giphy_book_flipedge.gif
/imgs/gif/us/giphy_book_flipfast.gif
/imgs/gif/us/giphy_book_flipflat.gif
/imgs/gif/us/giphy_book_flipold.gif
/imgs/gif/us/giphy_books_shelf.gif
/imgs/gif/us/giphy_bugs_jaildoorsgif.gif
/imgs/gif/us/giphy_bugs_paper.gif
/imgs/gif/us/giphy_bugs_typer.gif
/imgs/gif/us/giphy_bugs_umbrellagif.gif
/imgs/gif/us/giphy_bugsmugs.gif
/imgs/gif/us/giphy_bulbfire.gif
/imgs/gif/us/giphy_byrdpucker_donutlaw_simpsons.gif
/imgs/gif/us/giphy_byrdpucker_hatgirls.gif
/imgs/gif/us/giphy_byrdpucker_horseheadsgif.gif
/imgs/gif/us/giphy_byrdpucker_scan.gif
/imgs/gif/us/giphy_circles_n_bbs.gif
/imgs/gif/us/giphy_coffee_drip.gif
/imgs/gif/us/giphy_coffee_steam.gif
/imgs/gif/us/giphy_demonhorns.gif
/imgs/gif/us/giphy_flagybanner.gif
/imgs/gif/us/giphy_flipbook.gif
/imgs/gif/us/giphy_flipbook2.gif
/imgs/gif/us/giphy_flipbook_glow.gif
/imgs/gif/us/giphy_flipbooks.gif
/imgs/gif/us/giphy_focus_eyeball_hivey.gif
/imgs/gif/us/giphy_g.gif
/imgs/gif/us/giphy_go_crystalcube.gif
/imgs/gif/us/giphy_gridpart.gif
/imgs/gif/us/giphy_jkwii_glance.gif
/imgs/gif/us/giphy_jkwii_handorb.gif
/imgs/gif/us/giphy_jkwii_headwave2.gif
/imgs/gif/us/giphy_k.gif
/imgs/gif/us/giphy_keyboard_onoff_handtoggle.gif
/imgs/gif/us/giphy_keyboard_round.gif
/imgs/gif/us/giphy_kids_arcstrollers.gif
/imgs/gif/us/giphy_kids_tinkerbel_block.gif
/imgs/gif/us/giphy_kids_tinkerbell_laughblock.gif
/imgs/gif/us/giphy_kids_tinkerbell_leafdoor.gif
/imgs/gif/us/giphy_kids_tinkerbell_stare.gif
/imgs/gif/us/giphy_konabus_bugs_rolln.gif
/imgs/gif/us/giphy_konabus_headsmokn.gif
/imgs/gif/us/giphy_konabus_mushrooms.gif
/imgs/gif/us/giphy_konabus_schrooms.gif
/imgs/gif/us/giphy_koswell50.gif
/imgs/gif/us/giphy_kou_elbowpipes.gif
/imgs/gif/us/giphy_kou_magnets1.gif
/imgs/gif/us/giphy_kou_mercury_steps.gif
/imgs/gif/us/giphy_kou_newschool100.gif
/imgs/gif/us/giphy_kou_science_pour.gif
/imgs/gif/us/giphy_med_headknock1.gif
/imgs/gif/us/giphy_med_heart.gif
/imgs/gif/us/giphy_med_teethgif.gif
/imgs/gif/us/giphy_mistspray.gif
/imgs/gif/us/giphy_news_bookworm.gif
/imgs/gif/us/giphy_news_phone.gif
/imgs/gif/us/giphy_news_presses.gif
/imgs/gif/us/giphy_news_slow.gif
/imgs/gif/us/giphy_news_toon.gif
/imgs/gif/us/giphy_orb7.gif
/imgs/gif/us/giphy_orb_caravan.gif
/imgs/gif/us/giphy_orb_coat.gif
/imgs/gif/us/giphy_orb_crystal.gif
/imgs/gif/us/giphy_orb_cubepulse.gif
/imgs/gif/us/giphy_orb_forward.gif
/imgs/gif/us/giphy_orb_glow.gif
/imgs/gif/us/giphy_orb_linear.gif
/imgs/gif/us/giphy_orb_outgif.gif
/imgs/gif/us/giphy_orb_particles.gif
/imgs/gif/us/giphy_orb_plasmagif.gif
/imgs/gif/us/giphy_orb_spirorbgif.gif
/imgs/gif/us/giphy_orb_static.gif
/imgs/gif/us/giphy_orb_wave.gif
/imgs/gif/us/giphy_orbs_birdseye.gif
/imgs/gif/us/giphy_pastryroad_layersgif.gif
/imgs/gif/us/giphy_pulse.gif
/imgs/gif/us/giphy_pulse_big.gif
/imgs/gif/us/giphy_pulse_cube.gif
/imgs/gif/us/giphy_ringshadows.gif
/imgs/gif/us/giphy_runningman_draw.gif
/imgs/gif/us/giphy_scene_medow_butterfly.gif
/imgs/gif/us/giphy_scene_medow_sky.gif
/imgs/gif/us/giphy_scene_moonpond.gif
/imgs/gif/us/giphy_scene_motiongallery.gif
/imgs/gif/us/giphy_slinky_treadmill.gif
/imgs/gif/us/giphy_spinner1.gif
/imgs/gif/us/giphy_spinner_dark.gif
/imgs/gif/us/giphy_time_platters.gif
/imgs/gif/us/giphy_us_alien_dancers.gif
/imgs/gif/us/giphy_us_babyheads.gif
/imgs/gif/us/giphy_us_ballhead2.gif
/imgs/gif/us/giphy_us_ballheads.gif
/imgs/gif/us/giphy_us_flirty1.gif
/imgs/gif/us/giphy_us_flirty2.gif
/imgs/gif/us/giphy_us_headblinkers.gif
/imgs/gif/us/giphy_us_headline.gif
/imgs/gif/us/giphy_us_headwave.gif
/imgs/gif/us/giphy_us_hive.gif
/imgs/gif/us/giphy_us_hive_walkers.gif
/imgs/gif/us/giphy_us_joggers.gif
/imgs/gif/us/giphy_us_pacer.gif
/imgs/gif/us/giphy_us_toons2.gif
/imgs/gif/us/giphy_us_touch1.gif
/imgs/gif/us/giphy_us_walkers.gif
/imgs/gif/us/giphy_woohoo_mickey.gif
/imgs/gif/us/giphy_xmastrees.gif
/imgs/gif/us/giphy_zensitter.gif
/imgs/gif/us/giphy_zoom_earth.gif
/imgs/gif/us/giphy_zoom_typos_fold.gif
/imgs/gif/us/tn/tn_giph_jkwii_handglowy.gif
/imgs/gif/us/tn/tn_giph_jkwii_popcorny.gif
/imgs/gif/us/tn/tn_giph_us_snapshot.gif
/imgs/gif/us/tn/tn_giphy_alien_bio3.gif
/imgs/gif/us/tn/tn_giphy_alien_worms.gif
/imgs/gif/us/tn/tn_giphy_book_flipblank.gif
/imgs/gif/us/tn/tn_giphy_book_flipedge.gif
/imgs/gif/us/tn/tn_giphy_book_flipfast.gif
/imgs/gif/us/tn/tn_giphy_book_flipflat.gif
/imgs/gif/us/tn/tn_giphy_book_flipold.gif
/imgs/gif/us/tn/tn_giphy_books_shelf.gif
/imgs/gif/us/tn/tn_giphy_bugs_jaildoorsgif.gif
/imgs/gif/us/tn/tn_giphy_bugs_paper.gif
/imgs/gif/us/tn/tn_giphy_bugs_typer.gif
/imgs/gif/us/tn/tn_giphy_bugs_umbrellagif.gif
/imgs/gif/us/tn/tn_giphy_bugsmugs.gif
/imgs/gif/us/tn/tn_giphy_bulbfire.gif
/imgs/gif/us/tn/tn_giphy_byrdpucker_donutlaw_simpsons.gif
/imgs/gif/us/tn/tn_giphy_byrdpucker_hatgirls.gif
/imgs/gif/us/tn/tn_giphy_byrdpucker_horseheadsgif.gif
/imgs/gif/us/tn/tn_giphy_byrdpucker_scan.gif
/imgs/gif/us/tn/tn_giphy_circles_n_bbs.gif
/imgs/gif/us/tn/tn_giphy_coffee_drip.gif
/imgs/gif/us/tn/tn_giphy_coffee_steam.gif
/imgs/gif/us/tn/tn_giphy_demonhorns.gif
/imgs/gif/us/tn/tn_giphy_flagybanner.gif
/imgs/gif/us/tn/tn_giphy_flipbook.gif
/imgs/gif/us/tn/tn_giphy_flipbook2.gif
/imgs/gif/us/tn/tn_giphy_flipbook_glow.gif
/imgs/gif/us/tn/tn_giphy_flipbooks.gif
/imgs/gif/us/tn/tn_giphy_focus_eyeball_hivey.gif
/imgs/gif/us/tn/tn_giphy_g.gif
/imgs/gif/us/tn/tn_giphy_go_crystalcube.gif
/imgs/gif/us/tn/tn_giphy_gridpart.gif
/imgs/gif/us/tn/tn_giphy_jkwii_glance.gif
/imgs/gif/us/tn/tn_giphy_jkwii_handorb.gif
/imgs/gif/us/tn/tn_giphy_jkwii_headwave2.gif
/imgs/gif/us/tn/tn_giphy_k.gif
/imgs/gif/us/tn/tn_giphy_keyboard_onoff_handtoggle.gif
/imgs/gif/us/tn/tn_giphy_keyboard_round.gif
/imgs/gif/us/tn/tn_giphy_kids_arcstrollers.gif
/imgs/gif/us/tn/tn_giphy_kids_tinkerbel_block.gif
/imgs/gif/us/tn/tn_giphy_kids_tinkerbell_laughblock.gif
/imgs/gif/us/tn/tn_giphy_kids_tinkerbell_leafdoor.gif
/imgs/gif/us/tn/tn_giphy_kids_tinkerbell_stare.gif
/imgs/gif/us/tn/tn_giphy_konabus_bugs_rolln.gif
/imgs/gif/us/tn/tn_giphy_konabus_headsmokn.gif
/imgs/gif/us/tn/tn_giphy_konabus_mushrooms.gif
/imgs/gif/us/tn/tn_giphy_konabus_schrooms.gif
/imgs/gif/us/tn/tn_giphy_koswell50.gif
/imgs/gif/us/tn/tn_giphy_kou_elbowpipes.gif
/imgs/gif/us/tn/tn_giphy_kou_magnets1.gif
/imgs/gif/us/tn/tn_giphy_kou_mercury_steps.gif
/imgs/gif/us/tn/tn_giphy_kou_newschool100.gif
/imgs/gif/us/tn/tn_giphy_kou_science_pour.gif
/imgs/gif/us/tn/tn_giphy_med_headknock1.gif
/imgs/gif/us/tn/tn_giphy_med_heart.gif
/imgs/gif/us/tn/tn_giphy_med_teethgif.gif
/imgs/gif/us/tn/tn_giphy_mistspray.gif
/imgs/gif/us/tn/tn_giphy_news_bookworm.gif
/imgs/gif/us/tn/tn_giphy_news_phone.gif
/imgs/gif/us/tn/tn_giphy_news_presses.gif
/imgs/gif/us/tn/tn_giphy_news_slow.gif
/imgs/gif/us/tn/tn_giphy_news_toon.gif
/imgs/gif/us/tn/tn_giphy_orb7.gif
/imgs/gif/us/tn/tn_giphy_orb_caravan.gif
/imgs/gif/us/tn/tn_giphy_orb_coat.gif
/imgs/gif/us/tn/tn_giphy_orb_crystal.gif
/imgs/gif/us/tn/tn_giphy_orb_cubepulse.gif
/imgs/gif/us/tn/tn_giphy_orb_forward.gif
/imgs/gif/us/tn/tn_giphy_orb_glow.gif
/imgs/gif/us/tn/tn_giphy_orb_linear.gif
/imgs/gif/us/tn/tn_giphy_orb_outgif.gif
/imgs/gif/us/tn/tn_giphy_orb_particles.gif
/imgs/gif/us/tn/tn_giphy_orb_plasmagif.gif
/imgs/gif/us/tn/tn_giphy_orb_spirorbgif.gif
/imgs/gif/us/tn/tn_giphy_orb_static.gif
/imgs/gif/us/tn/tn_giphy_orb_wave.gif
/imgs/gif/us/tn/tn_giphy_orbs_birdseye.gif
/imgs/gif/us/tn/tn_giphy_pastryroad_layersgif.gif
/imgs/gif/us/tn/tn_giphy_pulse.gif
/imgs/gif/us/tn/tn_giphy_pulse_big.gif
/imgs/gif/us/tn/tn_giphy_pulse_cube.gif
/imgs/gif/us/tn/tn_giphy_ringshadows.gif
/imgs/gif/us/tn/tn_giphy_runningman_draw.gif
/imgs/gif/us/tn/tn_giphy_scene_medow_butterfly.gif
/imgs/gif/us/tn/tn_giphy_scene_medow_sky.gif
/imgs/gif/us/tn/tn_giphy_scene_moonpond.gif
/imgs/gif/us/tn/tn_giphy_scene_motiongallery.gif
/imgs/gif/us/tn/tn_giphy_slinky_treadmill.gif
/imgs/gif/us/tn/tn_giphy_spinner1.gif
/imgs/gif/us/tn/tn_giphy_spinner_dark.gif
/imgs/gif/us/tn/tn_giphy_time_platters.gif
/imgs/gif/us/tn/tn_giphy_us_alien_dancers.gif
/imgs/gif/us/tn/tn_giphy_us_babyheads.gif
/imgs/gif/us/tn/tn_giphy_us_ballhead2.gif
/imgs/gif/us/tn/tn_giphy_us_ballheads.gif
/imgs/gif/us/tn/tn_giphy_us_flirty1.gif
/imgs/gif/us/tn/tn_giphy_us_flirty2.gif
/imgs/gif/us/tn/tn_giphy_us_headblinkers.gif
/imgs/gif/us/tn/tn_giphy_us_headline.gif
/imgs/gif/us/tn/tn_giphy_us_headwave.gif
/imgs/gif/us/tn/tn_giphy_us_hive.gif
/imgs/gif/us/tn/tn_giphy_us_hive_walkers.gif
/imgs/gif/us/tn/tn_giphy_us_joggers.gif
/imgs/gif/us/tn/tn_giphy_us_pacer.gif
/imgs/gif/us/tn/tn_giphy_us_toons2.gif
/imgs/gif/us/tn/tn_giphy_us_touch1.gif
/imgs/gif/us/tn/tn_giphy_us_walkers.gif
/imgs/gif/us/tn/tn_giphy_woohoo_mickey.gif
/imgs/gif/us/tn/tn_giphy_xmastrees.gif
/imgs/gif/us/tn/tn_giphy_zensitter.gif
/imgs/gif/us/tn/tn_giphy_zoom_earth.gif
/imgs/gif/us/tn/tn_giphy_zoom_typos_fold.gif
/imgs/gif/us_big/giph_us_touch_arms.gif
/imgs/gif/us_big/giphy_alien_bigdancer1.gif
/imgs/gif/us_big/giphy_alien_bigdancer2.gif
/imgs/gif/us_big/giphy_android_anatomy.gif
/imgs/gif/us_big/giphy_boxinbox.gif
/imgs/gif/us_big/giphy_faces2.gif
/imgs/gif/us_big/giphy_finger_team.gif
/imgs/gif/us_big/giphy_focus_android.gif
/imgs/gif/us_big/giphy_jkwii_finger.gif
/imgs/gif/us_big/giphy_jkwii_headwaves2.gif
/imgs/gif/us_big/giphy_keyboard_wavepanel.gif
/imgs/gif/us_big/giphy_kids_bouncedown.gif
/imgs/gif/us_big/giphy_konabus_exhale.gif
/imgs/gif/us_big/giphy_kou_magnet_arc.gif
/imgs/gif/us_big/giphy_kou_magnet_ring.gif
/imgs/gif/us_big/giphy_magnet_link.gif
/imgs/gif/us_big/giphy_med_alien_bio.gif
/imgs/gif/us_big/giphy_med_heart3.gif
/imgs/gif/us_big/giphy_med_implosion.gif
/imgs/gif/us_big/giphy_news_keaton_bignews.gif
/imgs/gif/us_big/giphy_orb_sandripple.gif
/imgs/gif/us_big/giphy_orb_square.gif
/imgs/gif/us_big/giphy_orb_static2.gif
/imgs/gif/us_big/giphy_orbs_concavering.gif
/imgs/gif/us_big/giphy_pastryroad_flipn.gif
/imgs/gif/us_big/giphy_spinner_copper.gif
/imgs/gif/us_big/giphy_us_ballhead_bouncers.gif
/imgs/gif/us_big/giphy_us_gooddeed.gif
/imgs/gif/us_big/giphy_us_hatshake.gif
/imgs/gif/us_big/giphy_us_meet_latex_portal.gif
/imgs/gif/us_big/giphy_us_morph1.gif
/imgs/gif/us_big/giphy_us_morph2.gif
/imgs/gif/us_big/giphy_us_sarandancer.gif
/imgs/gif/us_big/giphy_us_toons1.gif
/imgs/gif/us_big/giphy_zoom_bug.gif
/imgs/gif/view/giphy_us01.gif
/imgs/gif/view/giphy_view00.gif
/imgs/gif/view/giphy_view01.gif
/imgs/gif/view/giphy_view02.gif
/imgs/gif/view/giphy_view03.gif
/imgs/gif/view/giphy_view04.gif
/imgs/gif/view/giphy_view05.gif
/imgs/gif/view/giphy_view06.gif
/imgs/gif/view/giphy_view08.gif
/imgs/gif/view/giphy_view09.gif
/imgs/gif/view/giphy_view10.gif
/imgs/gif/view/giphy_view11.gif
/imgs/gif/view/giphy_view12.gif
/imgs/gif/view/giphy_view13.gif
/imgs/gif/view/giphy_view14.gif
/imgs/gif/view/giphy_view15y.gif
/imgs/gif/view/giphy_view16.gif
/imgs/gif/view/giphy_view17.gif
/imgs/gif/view/giphy_view19.gif
/imgs/gif/view/giphy_view20.gif
/imgs/gif/view/giphy_view21.gif
/imgs/gif/view/giphy_view22.gif
/imgs/gif/view/giphy_view25.gif
/imgs/gif/view/giphy_view26.gif
/imgs/gif/view/giphy_view27.gif
/imgs/gif/view/giphy_view28.gif
/imgs/gif/view/giphy_view29.gif
/imgs/gif/view/giphy_view30.gif
/imgs/gif/view/giphy_view31.gif
/imgs/gif/view/giphy_view32.gif
/imgs/gif/view/giphy_view33.gif
/imgs/gif/view/giphy_view34.gif
/imgs/gif/view/giphy_view35.gif
./pages/defford_boatb.jpg
./pages/donutvanlaw_but_wiis_still_here.jpg
./pages/donutvanlaw_but_wiis_still_here_300.jpg
./pages/donutvanlaw_but_wiis_still_hereb.jpg
./pages/fb_soul.jpg
./pages/floorplan.jpg
./pages/floorplan_jtf29-30.jpg
./pages/floorplan_jtf30-31.jpg
./pages/floorplan_jtfdc-jtf32b.jpg
./pages/floorplan_survey.jpg
./pages/gojs_doogymonitor_donutvanlaw_takings_all_took.jpg
./pages/gojs_doogymonitor_donutvanlaw_takings_all_tookb.jpg
./pages/Hessian_jagerb.jpg
./pages/HS32_policeppu.jpg
./pages/HS39_gannon_tree.jpg
./pages/HS4.jpg
./pages/IMG_0354b.jpg
./pages/IMG_0356b.jpg
./pages/IMG_0448_2.jpg
./pages/IMG_0449.jpg
./pages/IMG_0479b.jpg
./pages/IMG_0482b.jpg
./pages/IMG_0489.jpg
./pages/IMG_0497b.jpg
./pages/IMG_0498.jpg
./pages/IMG_0499.jpg
./pages/IMG_0506.jpg
./pages/IMG_0559.jpg
./pages/IMG_0596b.jpg
./pages/IMG_0612b.jpg
./pages/IMG_0641b.jpg
./pages/IMG_0648b.jpg
./pages/IMG_0711b.jpg
./pages/IMG_0712b.jpg
./pages/IMG_1361b.jpg
./pages/IMG_1554b.jpg
./pages/IMG_1557b.jpg
./pages/IMG_1722b.jpg
./pages/IMG_1730.jpg
./pages/IMG_1770b.jpg
./pages/IMG_1786.jpg
./pages/IMG_1915b.jpg
./pages/IMG_1933b.jpg
./pages/IMG_1953b.jpg
./pages/IMG_1956b.jpg
./pages/IMG_2030b.jpg
./pages/IMG_2122b.jpg
./pages/IMG_2124b.jpg
./pages/IMG_2132b.jpg
./pages/IMG_2133b.jpg
./pages/IMG_2332b.jpg
./pages/IMG_2336b.jpg
./pages/IMG_3077b.jpg
./pages/IMG_3087b.jpg
./pages/IMG_3090b.jpg
./pages/IMG_3158b.jpg
./pages/IMG_3162.jpg
./pages/IMG_3164.jpg
./pages/IMG_3203.jpg
./pages/IMG_3431.jpg
./pages/IMG_3485.jpg
./pages/IMG_3491.jpg
./pages/IMG_3702.jpg
./pages/IMG_3705.jpg
./pages/IMG_3709.jpg
./pages/IMG_3827b.jpg
./pages/IMG_3856b.jpg
./pages/IMG_3881b.jpg
./pages/IMG_3883b.jpg
./pages/IMG_3884b.jpg
./pages/IMG_3893.jpg
./pages/IMG_3989b.jpg
./pages/IMG_3994b.jpg
./pages/IMG_4001b.jpg
./pages/IMG_4002b.jpg
./pages/IMG_5047b.jpg
./pages/IMG_5048b.jpg
./pages/IMG_5053b.jpg
./pages/IMG_5061b.jpg
./pages/IMG_5327.jpg
./pages/IMG_5329b.jpg
./pages/IMG_5386b.jpg
./pages/IMG_5605b.jpg
./pages/IMG_5611_jtfdc_original_notrespassing_willbeprosecuted.jpg
./pages/IMG_6728.jpg
./pages/IMG_6737.jpg
./pages/IMG_7450.jpg
./pages/IMG_7495b.jpg
./pages/IMG_7600b.jpg
./pages/IMG_7615b.jpg
./pages/IMG_7636b.jpg
./pages/IMG_7639b.jpg
./pages/IMG_7836b.jpg
./pages/IMG_7856b.jpg
./pages/IMG_7874b.jpg
./pages/IMG_7875b.jpg
./pages/IMG_7882b.jpg
./pages/IMG_7935b.jpg
./pages/IMG_7957b.jpg
./pages/IMG_7958b.jpg
./pages/IMG_7959b.jpg
./pages/IMG_8080b.jpg
./pages/IMG_8150.jpg
./pages/IMG_8242b.jpg
./pages/IMG_8284b.jpg
./pages/IMG_8329.jpg
./pages/IMG_8424b.jpg
./pages/IMG_8429b.jpg
./pages/IMG_8441b.jpg
./pages/IMG_8450b.jpg
./pages/IMG_8451b.jpg
./pages/IMG_8453b.jpg
./pages/IMG_8461b.jpg
./pages/IMG_8954b.jpg
./pages/IMG_9437_trial3_judge_brown_summary_defense.jpg
./pages/jtf30_Christiantddb.jpg
./pages/jtf30_jackcam1b.jpg
./pages/jtf30_jackcam3b.jpg
./pages/jtf31_snap_20170123_187593_party_whitevan_stalkerb.jpg
./pages/jtf31_snap_20170123_187600_clownporch_partygame_harrassmentb.jpg
./pages/jtf32_doberwatchers_2of4b.jpg
./pages/jtf32_snap_20170123_187588b.jpg
./pages/jtf39_baily_autonomous_patrolb.jpg
./pages/jtfdc_byrdpuckers_dog-n-pony_club.jpg
./pages/jtfdc_jkwiifall_4_jtf31_fionab.jpg
./pages/jtfdc_jtf30_heirloom_mowerer_midnight_stalkaroundIMG_9408b.jpg
./pages/jtfdcr_page_002b.jpg
./pages/jtfdcr_page_005b.jpg
./pages/jtfdcr_page_007b.jpg
./pages/jtfdcr_page_008b.jpg
./pages/jtfdcr_page_009b.jpg
./pages/pagesfb_kudleware.jpg
./pages/screenshot_23968_2.jpg
./pages/screenshot_23979b.jpg
./pages/screenshot_24032b.jpg
./pages/screenshot_24033b.jpg
./pages/screenshot_24036b.jpg
./pages/screenshot_24127b.jpg
./pages/screenshot_24132b.jpg
./pages/snap_20170123_187559_jtfdc_kids_cycle_lapsb.jpg
./pages/snap_20170123_197539_jtfinc_turnaroundb.jpg
./pages/snap_20170123_197616_law_donovan_joann7_contactb.jpg
./pages/snap_20170123_197616b.jpg
./pages/snap_20170123_197661b.jpg
./pages/snap_20170123_197675b.jpg
./pages/snap_20170123_243690.jpg
./pages/snap_20170123_243691.jpg
./pages/tn_jtfdc_20160530_1327_byrd_trustee_threat.jpg
./pages/tn_jtfdc_20190509_1224_jkwii_police_officerbell.jpg
./pages/toposb.jpg
./pages/wood_postersb.jpg
./pages/zn_donutvanlaw_but_wiis_still_here.jpg



`;
			return(pagelist_pages.split("\n"));
			}

		function load_pagelist_chap1() {
//			alert( "BUGS_1000 load_pagelist_chap1" );
var pagelist_chap1 =
`pages/chap1/1.jpg
pages/chap1/2.jpg
pages/chap1/3.jpg
pages/chap1/4.jpg
pages/chap1/5.jpg
pages/chap1/6.jpg
pages/chap1/7.jpg
pages/chap1/8.jpg
pages/chap1/9.jpg
pages/chap1/10.jpg
pages/chap1/11.jpg
pages/chap1/12.jpg
pages/chap1/13.jpg
pages/chap1/14.jpg
pages/chap1/15.jpg
pages/chap1/16.jpg`;
			return( pagelist_chap1.split("\n") );
			}




		function load_pagelist_chap2() {
//			alert( "BUGS_1000 load_pagelist_chap2" );
var pagelist_chap2 =
`pages/chap2/1.jpg
pages/chap2/2.jpg
pages/chap2/3.jpg
pages/chap2/4.jpg
pages/chap2/5.jpg
pages/chap2/6.jpg
pages/chap2/7.jpg
pages/chap2/8.jpg
pages/chap2/9.jpg
pages/chap2/10.jpg
pages/chap2/11.jpg
pages/chap2/12.jpg
pages/chap2/13.jpg
pages/chap2/14.jpg
pages/chap2/16.jpg`;
			return( pagelist_chap2.split("\n") );
			}



		function load_pagelist_chap3() {
//			alert( "BUGS_1000 load_pagelist_chap3" );
var pagelist_chap3 =
`pages/chap3/1.jpg
pages/chap3/2.jpg
pages/chap3/3.jpg
pages/chap3/4.jpg
pages/chap3/5.jpg
pages/chap3/6.jpg
pages/chap3/7.jpg
pages/chap3/8.jpg
pages/chap3/9.jpg
pages/chap3/10.jpg
pages/chap3/11.jpg
pages/chap3/12.jpg
pages/chap3/13.jpg
pages/chap3/14.jpg
pages/chap3/16.jpg`;
			return( pagelist_chap3.split("\n") );
			}

		function load_pagelist_shoebox() {
//			alert( "BUGS_1000 load_shoebox" );
var pagelist_shoebox=
`shoebox/1.jpg
shoebox/2.jpg
shoebox/3.jpg
shoebox/4.jpg
shoebox/5.jpg
shoebox/6.jpg
shoebox/7.jpg
shoebox/8.jpg
shoebox/9.jpg
shoebox/10.jpg
shoebox/11.jpg
shoebox/12.jpg
shoebox/13.jpg
shoebox/14.jpg
/fb/jtfdcr/shoebox/10.jpg
/fb/jtfdcr/shoebox/2.jpg
/fb/jtfdcr/shoebox/20020322_090201_1414191.jpg
/fb/jtfdcr/shoebox/20020322_090301_1414194.jpg
/fb/jtfdcr/shoebox/20020323_182401_1424206.jpg
/fb/jtfdcr/shoebox/20020527_093501_1010103.jpg
/fb/jtfdcr/shoebox/20020527_093501_1010104.jpg
/fb/jtfdcr/shoebox/20020527_095501_1070715.jpg
/fb/jtfdcr/shoebox/20020527_095601_1070717.jpg
/fb/jtfdcr/shoebox/20020527_123401_1070728.jpg
/fb/jtfdcr/shoebox/20020527_123401_1070730.jpg
/fb/jtfdcr/shoebox/20020527_132401_1070735.jpg
/fb/jtfdcr/shoebox/20020527_140901_1070743.jpg
/fb/jtfdcr/shoebox/20020527_140901_1070744.jpg
/fb/jtfdcr/shoebox/20020527_140901_1070745.jpg
/fb/jtfdcr/shoebox/20020527_140901_1070746.jpg
/fb/jtfdcr/shoebox/20020623_180601_1090984.jpg
/fb/jtfdcr/shoebox/20021118_093601_1252573(1).jpg
/fb/jtfdcr/shoebox/20021118_093601_1252573.jpg
/fb/jtfdcr/shoebox/20021118_093601_1252574.jpg
/fb/jtfdcr/shoebox/20021118_093601_1252575.jpg
/fb/jtfdcr/shoebox/20021120_084701_1252600.jpg
/fb/jtfdcr/shoebox/20021122_113301_1272744.jpg
/fb/jtfdcr/shoebox/20021122_113301_1272746.jpg
/fb/jtfdcr/shoebox/20021130_100801_1282877.jpg
/fb/jtfdcr/shoebox/20021201_132601_1292972.jpg
/fb/jtfdcr/shoebox/20021201_132701_1292974.jpg
/fb/jtfdcr/shoebox/20021201_132701_jtfin.jpg
/fb/jtfdcr/shoebox/20021201_132801_1292980.jpg
/fb/jtfdcr/shoebox/20021201_132901_1292986.jpg
/fb/jtfdcr/shoebox/20021204_090301_1292995.jpg
/fb/jtfdcr/shoebox/20021204_104701_1303005.jpg
/fb/jtfdcr/shoebox/20021204_105501_1303010.jpg
/fb/jtfdcr/shoebox/20021204_161501_1303018.jpg
/fb/jtfdcr/shoebox/20021204_161501_1303019.jpg
/fb/jtfdcr/shoebox/20021204_163301_1303026.jpg
/fb/jtfdcr/shoebox/20021207_104801_1303064.jpg
/fb/jtfdcr/shoebox/20021207_105001_1303067.jpg
/fb/jtfdcr/shoebox/20021214_105101_1303095.jpg
/fb/jtfdcr/shoebox/20021215_150101_1313120.jpg
/fb/jtfdcr/shoebox/20021215_150101_1313121.jpg
/fb/jtfdcr/shoebox/20021215_150701_1313125.jpg
/fb/jtfdcr/shoebox/20021215_150801_1313128.jpg
/fb/jtfdcr/shoebox/20021225_105901_1313160.jpg
/fb/jtfdcr/shoebox/20050105_054001_1858560.jpg
/fb/jtfdcr/shoebox/20050105_054001_1858561.jpg
/fb/jtfdcr/shoebox/20050107_052201_1858570.jpg
/fb/jtfdcr/shoebox/20050107_052401_1858581.jpg
/fb/jtfdcr/shoebox/20050107_052401_1858585.jpg
/fb/jtfdcr/shoebox/20050107_052701_1858593.jpg
/fb/jtfdcr/shoebox/20050107_052701_1858594.jpg
/fb/jtfdcr/shoebox/20050107_052701_1858597.jpg
/fb/jtfdcr/shoebox/20050107_053401_1868638.jpg
/fb/jtfdcr/shoebox/20050108_044601_1868681.jpg
/fb/jtfdcr/shoebox/20050108_044601_1868684.jpg
/fb/jtfdcr/shoebox/20050109_031201_1878702.jpg
/fb/jtfdcr/shoebox/20070507_185501_1010108.jpg
/fb/jtfdcr/shoebox/20080905_182801_1373709.jpg
/fb/jtfdcr/shoebox/20080914_094801_1373727.jpg
/fb/jtfdcr/shoebox/20080927_092701_1373761.jpg
/fb/jtfdcr/shoebox/20080927_092701_1373762.jpg
/fb/jtfdcr/shoebox/20080927_092801_1373763.jpg
/fb/jtfdcr/shoebox/20080927_092801_1373764.jpg
/fb/jtfdcr/shoebox/20080927_092801_1373765.jpg
/fb/jtfdcr/shoebox/20080927_092801_1373766.jpg
/fb/jtfdcr/shoebox/20080927_092901_1373768.jpg
/fb/jtfdcr/shoebox/20080927_092901_1373769.jpg
/fb/jtfdcr/shoebox/20080927_095601_1373770.jpg
/fb/jtfdcr/shoebox/20090322_241401_1404085.jpg
/fb/jtfdcr/shoebox/20090322_241401_1404088.jpg
/fb/jtfdcr/shoebox/20090322_241401_1404089.jpg
/fb/jtfdcr/shoebox/20090425_142201_2464664.jpg
/fb/jtfdcr/shoebox/20090425_142301_2464670.jpg
/fb/jtfdcr/shoebox/20091002_160801_1474760.jpg
/fb/jtfdcr/shoebox/20091002_160801_1474761.jpg
/fb/jtfdcr/shoebox/20091002_160901_1474763.jpg
/fb/jtfdcr/shoebox/20091003_142401_1474777.jpg
/fb/jtfdcr/shoebox/20151221_011.jpg
/fb/jtfdcr/shoebox/20161007_jtflaw_001.jpg
/fb/jtfdcr/shoebox/20161007_jtflaw_064.jpg
/fb/jtfdcr/shoebox/20161007_jtflaw_065.jpg
/fb/jtfdcr/shoebox/20161007_jtflaw_066.jpg
/fb/jtfdcr/shoebox/220px-Once_Upon_A_Time_In_America1.jpg
/fb/jtfdcr/shoebox/220px-Uncle_Sam's_Thanksgiving_Dinner_(November_1869),_by_Thomas_Nast.jpg
/fb/jtfdcr/shoebox/220px-Uncle_Sam_Memorial_Statue,_Arlington,_MA_-_Samuel_Wilson.jpg
/fb/jtfdcr/shoebox/220px-Uncle_Sam_needs_that_extra_shovelful.jpg
/fb/jtfdcr/shoebox/3.jpg
/fb/jtfdcr/shoebox/4.jpg
/fb/jtfdcr/shoebox/5 not-so-obvious Finder features new Mac users might not know %7C MacYourself.jpg
/fb/jtfdcr/shoebox/5.jpg
/fb/jtfdcr/shoebox/5_yard_wagon.jpg
/fb/jtfdcr/shoebox/5hiMs.jpg
/fb/jtfdcr/shoebox/6.jpg
/fb/jtfdcr/shoebox/673120.jpg
/fb/jtfdcr/shoebox/6_driveway.jpg
/fb/jtfdcr/shoebox/7.jpg
/fb/jtfdcr/shoebox/7_court.jpg
/fb/jtfdcr/shoebox/8.jpg
/fb/jtfdcr/shoebox/9.jpg
/fb/jtfdcr/shoebox/9557_fiona_runs_201506_001.jpg
/fb/jtfdcr/shoebox/9557_fiona_runs_201506_002.jpg
/fb/jtfdcr/shoebox/9558_byrd_trustee_threat_201505_001.jpg
/fb/jtfdcr/shoebox/9558_byrd_trustee_threat_201505_002.jpg
/fb/jtfdcr/shoebox/9558_byrd_trustee_threat_201505_003.jpg
/fb/jtfdcr/shoebox/Create a thumbnail image every X seconds of the video – FFmpeg.jpg
/fb/jtfdcr/shoebox/Dragon-1.jpg
/fb/jtfdcr/shoebox/FL000001.jpg
/fb/jtfdcr/shoebox/FL000002.jpg
/fb/jtfdcr/shoebox/Hessian_jager.jpg
/fb/jtfdcr/shoebox/IMG_0001.jpg
/fb/jtfdcr/shoebox/IMG_0002.jpg
/fb/jtfdcr/shoebox/IMG_0004.jpg
/fb/jtfdcr/shoebox/IMG_0006.jpg
/fb/jtfdcr/shoebox/IMG_0007.jpg
/fb/jtfdcr/shoebox/IMG_0013.jpg
/fb/jtfdcr/shoebox/IMG_0080.jpg
/fb/jtfdcr/shoebox/IMG_0081.jpg
/fb/jtfdcr/shoebox/IMG_0120.jpg
/fb/jtfdcr/shoebox/IMG_0210.jpg
/fb/jtfdcr/shoebox/IMG_0212.jpg
/fb/jtfdcr/shoebox/IMG_3968.jpg
/fb/jtfdcr/shoebox/IMG_3969.jpg
/fb/jtfdcr/shoebox/IMG_3970_20150716_0618.jpg
/fb/jtfdcr/shoebox/IMG_3971_20150716_0623.jpg
/fb/jtfdcr/shoebox/IMG_3972.jpg
/fb/jtfdcr/shoebox/IMG_3972_20150716_0625.jpg
/fb/jtfdcr/shoebox/IMG_3973.jpg
/fb/jtfdcr/shoebox/IMG_3973_20150716_0630.jpg
/fb/jtfdcr/shoebox/IMG_3974.jpg
/fb/jtfdcr/shoebox/IMG_3974_20150716_0631.jpg
/fb/jtfdcr/shoebox/IMG_3975.jpg
/fb/jtfdcr/shoebox/IMG_3975_20150716_0631.jpg
/fb/jtfdcr/shoebox/IMG_3976.jpg
/fb/jtfdcr/shoebox/IMG_3976_20150716_0634.jpg
/fb/jtfdcr/shoebox/IMG_3977_20150716_0636.jpg
/fb/jtfdcr/shoebox/IMG_3978.jpg
/fb/jtfdcr/shoebox/IMG_3978_20150716_0636.jpg
/fb/jtfdcr/shoebox/IMG_3979.jpg
/fb/jtfdcr/shoebox/IMG_3979_20150716_0636.jpg
/fb/jtfdcr/shoebox/IMG_3980_20150716_0637.jpg
/fb/jtfdcr/shoebox/IMG_3981.jpg
/fb/jtfdcr/shoebox/IMG_3981_20150716_0637.jpg
/fb/jtfdcr/shoebox/IMG_3982.jpg
/fb/jtfdcr/shoebox/IMG_3982_20150716_0637.jpg
/fb/jtfdcr/shoebox/IMG_3983.jpg
/fb/jtfdcr/shoebox/IMG_3983_20150716_0637.jpg
/fb/jtfdcr/shoebox/IMG_3984.jpg
/fb/jtfdcr/shoebox/IMG_3984_20150716_0637.jpg
/fb/jtfdcr/shoebox/IMG_3985_20150716_0637.jpg
/fb/jtfdcr/shoebox/IMG_3986_20150716_0637.jpg
/fb/jtfdcr/shoebox/IMG_3987_20150716_0638.jpg
/fb/jtfdcr/shoebox/IMG_3988.jpg
/fb/jtfdcr/shoebox/IMG_3988_20150716_0644.jpg
/fb/jtfdcr/shoebox/IMG_3989.jpg
/fb/jtfdcr/shoebox/IMG_3989_20150716_0708.jpg
/fb/jtfdcr/shoebox/IMG_3994.jpg
/fb/jtfdcr/shoebox/IMG_5605.jpg
/fb/jtfdcr/shoebox/IMG_5611.jpg
/fb/jtfdcr/shoebox/IMG_5611_jtfdc_original_notrespassing_willbeprosecuted.jpg
/fb/jtfdcr/shoebox/IMG_9900.jpg
/fb/jtfdcr/shoebox/IS137avbnxkbpu0000000000.jpg
/fb/jtfdcr/shoebox/IS13v82nj0zuax0000000000.jpg
/fb/jtfdcr/shoebox/ISxrzpc0f6eb4x0000000000.jpg
/fb/jtfdcr/shoebox/Img_0033.jpg
/fb/jtfdcr/shoebox/Img_0034.jpg
/fb/jtfdcr/shoebox/JKassil-R1-010-3A.jpg
/fb/jtfdcr/shoebox/JULIA3.jpg
/fb/jtfdcr/shoebox/Michael_clayton.jpg
/fb/jtfdcr/shoebox/OLDPHONE.jpg
/fb/jtfdcr/shoebox/PASA01_1.jpg
/fb/jtfdcr/shoebox/PASA01_2.jpg
/fb/jtfdcr/shoebox/PASA01_3.jpg
/fb/jtfdcr/shoebox/Scan 1.jpg
/fb/jtfdcr/shoebox/Scan 2.jpg
/fb/jtfdcr/shoebox/Scan 3.jpg
/fb/jtfdcr/shoebox/Scan 4.jpg
/fb/jtfdcr/shoebox/Scan 5.jpg
/fb/jtfdcr/shoebox/Scan 6.jpg
/fb/jtfdcr/shoebox/Scan 7.jpg
/fb/jtfdcr/shoebox/adam_carshow_2012.jpg
/fb/jtfdcr/shoebox/adma_flash_20130420_162341.jpg
/fb/jtfdcr/shoebox/adma_flash_20130420_164330.jpg
/fb/jtfdcr/shoebox/adma_flash_20130420_164331.jpg
/fb/jtfdcr/shoebox/adma_flash_20130420_164333.jpg
/fb/jtfdcr/shoebox/alan_cohen_police_20151221_010.jpg
/fb/jtfdcr/shoebox/alan_w_cohen.jpg
/fb/jtfdcr/shoebox/amsterdam_bridges.jpg
/fb/jtfdcr/shoebox/amsterdam_rooftops.jpg
/fb/jtfdcr/shoebox/argonne.jpg
/fb/jtfdcr/shoebox/arrows.jpg
/fb/jtfdcr/shoebox/austrian.jpg
/fb/jtfdcr/shoebox/avatar5688_8.jpg
/fb/jtfdcr/shoebox/bavaria_lake_mountain.jpg
/fb/jtfdcr/shoebox/bavarian.jpg
/fb/jtfdcr/shoebox/bethany_english__cle.jpg
/fb/jtfdcr/shoebox/bethany_english_lutheran_cle_001.jpg
/fb/jtfdcr/shoebox/bethany_english_lutheran_cle_002.jpg
/fb/jtfdcr/shoebox/bethany_english_lutheran_cle_003.jpg
/fb/jtfdcr/shoebox/bethany_english_lutheran_cle_004.jpg
/fb/jtfdcr/shoebox/bethany_english_lutheran_cle_005.jpg
/fb/jtfdcr/shoebox/bethany_english_lutheran_cle_006.jpg
/fb/jtfdcr/shoebox/bethany_english_lutheran_cle_01.jpg
/fb/jtfdcr/shoebox/bg_noise1.jpg
/fb/jtfdcr/shoebox/bg_noise2.jpg
/fb/jtfdcr/shoebox/bg_noise3.jpg
/fb/jtfdcr/shoebox/bg_swoorl1.jpg
/fb/jtfdcr/shoebox/bg_swoorl2.jpg
/fb/jtfdcr/shoebox/big_snow.jpg
/fb/jtfdcr/shoebox/bigturtle.jpg
/fb/jtfdcr/shoebox/bigturtle_save.jpg
/fb/jtfdcr/shoebox/blackforest.jpg
/fb/jtfdcr/shoebox/blackforest_stroll.jpg
/fb/jtfdcr/shoebox/blurred.jpg
/fb/jtfdcr/shoebox/brothers4.jpg
/fb/jtfdcr/shoebox/cage.jpg
/fb/jtfdcr/shoebox/call_summary_29jamestown.jpg
/fb/jtfdcr/shoebox/call_summary_jamestown_pg1.jpg
/fb/jtfdcr/shoebox/call_summary_jamestown_pg2.jpg
/fb/jtfdcr/shoebox/call_summary_jamestown_pg3.jpg
/fb/jtfdcr/shoebox/castle.jpg
/fb/jtfdcr/shoebox/cfaa.jpg
/fb/jtfdcr/shoebox/chapel.jpg
/fb/jtfdcr/shoebox/code cartooning — Converting HTML5 Canvas Animation to GIF Animation....jpg
/fb/jtfdcr/shoebox/cohen_15403521_15445941_comb_151203.jpg
/fb/jtfdcr/shoebox/cohen_15403521_15445941_cont_160121.jpg
/fb/jtfdcr/shoebox/cohen_15403521_continued_151203.jpg
/fb/jtfdcr/shoebox/cohen_affidavit_records_151030.jpg
/fb/jtfdcr/shoebox/columbia.jpg
/fb/jtfdcr/shoebox/columbia_pw_adminiwii_ko2us.jpg
/fb/jtfdcr/shoebox/columbia_templet.jpg
/fb/jtfdcr/shoebox/columbiastahrartwork.jpg
/fb/jtfdcr/shoebox/danish_woman.jpg
/fb/jtfdcr/shoebox/defford_boat.jpg
/fb/jtfdcr/shoebox/defford_snow_fairy.jpg
/fb/jtfdcr/shoebox/denmark_window_view.jpg
/fb/jtfdcr/shoebox/doghead_video_003.jpg
/fb/jtfdcr/shoebox/doghead_video_005.jpg
/fb/jtfdcr/shoebox/doghead_video_012.jpg
/fb/jtfdcr/shoebox/doghead_video_015.jpg
/fb/jtfdcr/shoebox/door_locks_vienna.jpg
/fb/jtfdcr/shoebox/drinks.jpg
/fb/jtfdcr/shoebox/drinks2.jpg
/fb/jtfdcr/shoebox/emh_20160911_056.jpg
/fb/jtfdcr/shoebox/emh_20160911_057.jpg
/fb/jtfdcr/shoebox/emh_20160911_058.jpg
/fb/jtfdcr/shoebox/emh_20160911_059.jpg
/fb/jtfdcr/shoebox/emh_20160911_060.jpg
/fb/jtfdcr/shoebox/emma_and_dexter.jpg
/fb/jtfdcr/shoebox/family_est_-_with_birds_ce50b229-338b-4198-8722-3b4efff3aacf_grande.jpg
/fb/jtfdcr/shoebox/farkas_neopolean.jpg
/fb/jtfdcr/shoebox/fb_1.jpg
/fb/jtfdcr/shoebox/fb_byrdpucker_pages_1.jpg
/fb/jtfdcr/shoebox/fb_focus_pages_1.jpg
/fb/jtfdcr/shoebox/fb_gifs_pages_1.jpg
/fb/jtfdcr/shoebox/fb_go_pages_1.jpg
/fb/jtfdcr/shoebox/fb_gofunwii_pages_1.jpg
/fb/jtfdcr/shoebox/fb_imgs_1.jpg
/fb/jtfdcr/shoebox/fb_iperms_pages_1.jpg
/fb/jtfdcr/shoebox/fb_jak1_pages_1.jpg
/fb/jtfdcr/shoebox/fb_jak2_pages_1.jpg
/fb/jtfdcr/shoebox/fb_jtfdcr_pages_1.jpg
/fb/jtfdcr/shoebox/fb_kitiworks_maga_pages_zn1_1.jpg
/fb/jtfdcr/shoebox/fb_kitiworks_pages_1.jpg
/fb/jtfdcr/shoebox/fb_kitiworks_pages_orig_1.jpg
/fb/jtfdcr/shoebox/fb_kitiworks_pages_orig_zn1_1.jpg
/fb/jtfdcr/shoebox/fb_konabus_pages_1.jpg
/fb/jtfdcr/shoebox/fb_konet_pages_1.jpg
/fb/jtfdcr/shoebox/fb_law_law_law501_pages_1.jpg
/fb/jtfdcr/shoebox/fb_law_pages_1.jpg
/fb/jtfdcr/shoebox/fb_med_pages_1.jpg
/fb/jtfdcr/shoebox/fb_pages_1.jpg
/fb/jtfdcr/shoebox/fb_pages_broke_1.jpg
/fb/jtfdcr/shoebox/fb_pastryroad_athensfood_imgs_1.jpg
/fb/jtfdcr/shoebox/fb_smileworthy_wimsy_pages_1.jpg
/fb/jtfdcr/shoebox/fb_soul.jpg
/fb/jtfdcr/shoebox/fb_templets_basic_pages_1.jpg
/fb/jtfdcr/shoebox/fb_templets_maga_pages_1.jpg
/fb/jtfdcr/shoebox/fb_us_kdar_hotmax_pages_1.jpg
/fb/jtfdcr/shoebox/flagged_coffins.jpg
/fb/jtfdcr/shoebox/floyd_trouten.jpg
/fb/jtfdcr/shoebox/gavel.jpg
/fb/jtfdcr/shoebox/gavel_band.jpg
/fb/jtfdcr/shoebox/gold_frame.jpg
/fb/jtfdcr/shoebox/hall_guards.jpg
/fb/jtfdcr/shoebox/hall_window_watcher.jpg
/fb/jtfdcr/shoebox/hall_woman_park_knitting.jpg
/fb/jtfdcr/shoebox/heidleberg_tibet_painting.jpg
/fb/jtfdcr/shoebox/heidleberg_tibet_panel.jpg
/fb/jtfdcr/shoebox/history2.jpg
/fb/jtfdcr/shoebox/hrc2011a.jpg
/fb/jtfdcr/shoebox/hrc2011b.jpg
/fb/jtfdcr/shoebox/http___ko2.jpg
/fb/jtfdcr/shoebox/img001.jpg
/fb/jtfdcr/shoebox/img002.jpg
/fb/jtfdcr/shoebox/img375_rotkappechen_und_der_wolf.jpg
/fb/jtfdcr/shoebox/img376_dornroschen.jpg
/fb/jtfdcr/shoebox/img377_frau_holle.jpg
/fb/jtfdcr/shoebox/img378_madchen_mit_den_schwefelholzern.jpg
/fb/jtfdcr/shoebox/img381_otannenbaum.jpg
/fb/jtfdcr/shoebox/img_8262_2.jpg
/fb/jtfdcr/shoebox/img_8283_2.jpg
/fb/jtfdcr/shoebox/incrpt_1530736_citincident_150526_pg1.jpg
/fb/jtfdcr/shoebox/incrpt_1530736_citincident_150526_pg2.jpg
/fb/jtfdcr/shoebox/incrpt_1530736_citincident_150526_pg3.jpg
/fb/jtfdcr/shoebox/incrpt_1530736_citincident_150526_pg4.jpg
/fb/jtfdcr/shoebox/incrpt_1530736_citincident_150526_pg5.jpg
/fb/jtfdcr/shoebox/incrpt_1530736_citincident_150526_pg6.jpg
/fb/jtfdcr/shoebox/incrpt_1530736_citincident_150526_pg7.jpg
/fb/jtfdcr/shoebox/incrpt_1530736_citincident_150526_pg8.jpg
/fb/jtfdcr/shoebox/incrpt_1540352_martin_150716_pg1.jpg
/fb/jtfdcr/shoebox/incrpt_1540352_martin_150716_pg2.jpg
/fb/jtfdcr/shoebox/incrpt_1540352_martin_150716_pg3.jpg
/fb/jtfdcr/shoebox/incrpt_1544594_gardner_150807_pg1.jpg
/fb/jtfdcr/shoebox/incrpt_1544594_gardner_150807_pg2.jpg
/fb/jtfdcr/shoebox/incrpt_1552246_gardner_150919_pg1.jpg
/fb/jtfdcr/shoebox/incrpt_1552246_gardner_150919_pg2.jpg
/fb/jtfdcr/shoebox/incrpt_1552246_supplement1_gardner_150919_pg1.jpg
/fb/jtfdcr/shoebox/incrpt_1552326_gardner_150919_pg1.jpg
/fb/jtfdcr/shoebox/incrpt_1552326_gardner_150919_pg2.jpg
/fb/jtfdcr/shoebox/incrpt_1553710_martin_150928_pg1.jpg
/fb/jtfdcr/shoebox/incrpt_1553710_martin_150928_pg2.jpg
/fb/jtfdcr/shoebox/incrpt_1558386_gardner_151023_pg1.jpg
/fb/jtfdcr/shoebox/incrpt_1558386_gardner_151023_pg2.jpg
/fb/jtfdcr/shoebox/incrpt_descriptions_pg1.jpg
/fb/jtfdcr/shoebox/incrpt_descriptions_pg2.jpg
/fb/jtfdcr/shoebox/incrpt_descriptions_pg3.jpg
/fb/jtfdcr/shoebox/incrpt_descriptions_pg4.jpg
/fb/jtfdcr/shoebox/index.jpg
/fb/jtfdcr/shoebox/jaam.jpg
/fb/jtfdcr/shoebox/jak2b.jpg
/fb/jtfdcr/shoebox/jak3.jpg
/fb/jtfdcr/shoebox/jam_200710_07.jpg
/fb/jtfdcr/shoebox/jam_200710_08.jpg
/fb/jtfdcr/shoebox/jam_200710_10.jpg
/fb/jtfdcr/shoebox/jam_200710_11.jpg
/fb/jtfdcr/shoebox/jam_200710_12.jpg
/fb/jtfdcr/shoebox/jam_200710_24.jpg
/fb/jtfdcr/shoebox/jam_200710_25.jpg
/fb/jtfdcr/shoebox/jam_200710_26.jpg
/fb/jtfdcr/shoebox/jam_200710_27.jpg
/fb/jtfdcr/shoebox/jam_200710_28.jpg
/fb/jtfdcr/shoebox/jam_200710_29.jpg
/fb/jtfdcr/shoebox/jam_200710_30.jpg
/fb/jtfdcr/shoebox/jam_200710_31.jpg
/fb/jtfdcr/shoebox/jam_200710_32.jpg
/fb/jtfdcr/shoebox/jam_200710_33.jpg
/fb/jtfdcr/shoebox/jam_200710_34.jpg
/fb/jtfdcr/shoebox/jam_200710_40.jpg
/fb/jtfdcr/shoebox/jenna_and_josh.jpg
/fb/jtfdcr/shoebox/jenna_and_mom.jpg
/fb/jtfdcr/shoebox/jessie.jpg
/fb/jtfdcr/shoebox/jing2.jpg
/fb/jtfdcr/shoebox/jk_goodhair2.jpg
/fb/jtfdcr/shoebox/jk_ts_20120411_001.jpg
/fb/jtfdcr/shoebox/jk_ts_20120411_002.jpg
/fb/jtfdcr/shoebox/jk_ts_20120411_003.jpg
/fb/jtfdcr/shoebox/jk_ts_20120411_004.jpg
/fb/jtfdcr/shoebox/jk_ts_20120411_005.jpg
/fb/jtfdcr/shoebox/jk_ts_20120411_006.jpg
/fb/jtfdcr/shoebox/jk_ts_20120411_007.jpg
/fb/jtfdcr/shoebox/jk_ts_20120411_008.jpg
/fb/jtfdcr/shoebox/jk_ts_20120411_009.jpg
/fb/jtfdcr/shoebox/jk_ts_20120411_010.jpg
/fb/jtfdcr/shoebox/jk_ts_20120411_011.jpg
/fb/jtfdcr/shoebox/jk_ts_20120411_012.jpg
/fb/jtfdcr/shoebox/jk_ts_20120411_013.jpg
/fb/jtfdcr/shoebox/jk_ts_20120411_014.jpg
/fb/jtfdcr/shoebox/jk_ts_20120411_015.jpg
/fb/jtfdcr/shoebox/jk_ts_20120411_016.jpg
/fb/jtfdcr/shoebox/jk_ts_20120411_017.jpg
/fb/jtfdcr/shoebox/jkresume_1990_01.jpg
/fb/jtfdcr/shoebox/jkresume_1990_02.jpg
/fb/jtfdcr/shoebox/jkresume_1990_skillset.jpg
/fb/jtfdcr/shoebox/jkresume_2000_01.jpg
/fb/jtfdcr/shoebox/jkresume_2000_02.jpg
/fb/jtfdcr/shoebox/jkresume_2000_03.jpg
/fb/jtfdcr/shoebox/jkresume_2000_04.jpg
/fb/jtfdcr/shoebox/jkresume_2000_05.jpg
/fb/jtfdcr/shoebox/jkresume_2000_06.jpg
/fb/jtfdcr/shoebox/jkresume_2000_07.jpg
/fb/jtfdcr/shoebox/jkresume_2000_08.jpg
/fb/jtfdcr/shoebox/jkresume_2000_detail_buie.jpg
/fb/jtfdcr/shoebox/jkresume_2000_detail_bw.jpg
/fb/jtfdcr/shoebox/jkresume_2000_detail_konet.jpg
/fb/jtfdcr/shoebox/jkresume_2000_detail_preview.jpg
/fb/jtfdcr/shoebox/jkresume_2000_detail_sasc.jpg
/fb/jtfdcr/shoebox/jkwii4trusstee_tyipty.jpg
/fb/jtfdcr/shoebox/jkwii4trustee_byrdpucker_dog_n_pony_club.jpg
/fb/jtfdcr/shoebox/jkwii4trustee_dispute.jpg
/fb/jtfdcr/shoebox/jkwii4trustee_frontpage.jpg
/fb/jtfdcr/shoebox/jkwii4trustee_gallery.jpg
/fb/jtfdcr/shoebox/jkwii4trustee_greatmeet.jpg
/fb/jtfdcr/shoebox/jkwii4trustee_hero.jpg
/fb/jtfdcr/shoebox/jkwii4trustee_jkwii4trustee.jpg
/fb/jtfdcr/shoebox/jkwii4trustee_jskwiis.jpg
/fb/jtfdcr/shoebox/jkwii4trustee_meet.jpg
/fb/jtfdcr/shoebox/jkwii4trustee_portrait.jpg
/fb/jtfdcr/shoebox/jkwii4trustee_rightman_rightplace.jpg
/fb/jtfdcr/shoebox/jkwii4trustee_sheet_001.jpg
/fb/jtfdcr/shoebox/jkwii4trustee_sheet_002.jpg
/fb/jtfdcr/shoebox/jkwii4trustee_tippicanoe.jpg
/fb/jtfdcr/shoebox/jkwii4trustee_tyler2.jpg
/fb/jtfdcr/shoebox/jsk_jak1_bivins_visit.jpg
/fb/jtfdcr/shoebox/jsk_winecellar_Image395.jpg
/fb/jtfdcr/shoebox/jsk_winecellar_Image402.jpg
/fb/jtfdcr/shoebox/jskfam_shimfam_priest.jpg
/fb/jtfdcr/shoebox/jt38f_seagrists.jpg
/fb/jtfdcr/shoebox/jtf.jpg
/fb/jtfdcr/shoebox/jtf07.jpg
/fb/jtfdcr/shoebox/jtf08.jpg
/fb/jtfdcr/shoebox/jtf09.jpg
/fb/jtfdcr/shoebox/jtf10.jpg
/fb/jtfdcr/shoebox/jtf11.jpg
/fb/jtfdcr/shoebox/jtf14.jpg
/fb/jtfdcr/shoebox/jtf16.jpg
/fb/jtfdcr/shoebox/jtf17510.jpg
/fb/jtfdcr/shoebox/jtf17570.jpg
/fb/jtfdcr/shoebox/jtf21.jpg
/fb/jtfdcr/shoebox/jtf22.jpg
/fb/jtfdcr/shoebox/jtf23.jpg
/fb/jtfdcr/shoebox/jtf28.jpg
/fb/jtfdcr/shoebox/jtf28_defford_francis_20020527_140901.jpg
/fb/jtfdcr/shoebox/jtf28_defford_john_20020527_140901.jpg
/fb/jtfdcr/shoebox/jtf28_deffords_20020527_1324015.jpg
/fb/jtfdcr/shoebox/jtf28_desc_zillow.jpg
/fb/jtfdcr/shoebox/jtf28_desc_zillow2.jpg
/fb/jtfdcr/shoebox/jtf28_tractor_ongrass_parking.jpg
/fb/jtfdcr/shoebox/jtf28_zillow.jpg
/fb/jtfdcr/shoebox/jtf29.jpg
/fb/jtfdcr/shoebox/jtf29_door.jpg
/fb/jtfdcr/shoebox/jtf29_eagle_north.jpg
/fb/jtfdcr/shoebox/jtf29_eagle_south.jpg
/fb/jtfdcr/shoebox/jtf29_fencelet1.jpg
/fb/jtfdcr/shoebox/jtf29_fencelet2.jpg
/fb/jtfdcr/shoebox/jtf29_fencelet3.jpg
/fb/jtfdcr/shoebox/jtf29_fencelet3r.jpg
/fb/jtfdcr/shoebox/jtf29_fencelets.jpg
/fb/jtfdcr/shoebox/jtf29_fenclet2.jpg
/fb/jtfdcr/shoebox/jtf29_fiona_inyard_damage.jpg
/fb/jtfdcr/shoebox/jtf29_fiona_inyard_damage2.jpg
/fb/jtfdcr/shoebox/jtf29_frisbee.jpg
/fb/jtfdcr/shoebox/jtf29_highschool_frisbee.jpg
/fb/jtfdcr/shoebox/jtf29_jak1_carter.jpg
/fb/jtfdcr/shoebox/jtf29_kali.jpg
/fb/jtfdcr/shoebox/jtf29_logging01.jpg
/fb/jtfdcr/shoebox/jtf29_logging02.jpg
/fb/jtfdcr/shoebox/jtf29_logging03.jpg
/fb/jtfdcr/shoebox/jtf29_logging05.jpg
/fb/jtfdcr/shoebox/jtf29_mailbox.jpg
/fb/jtfdcr/shoebox/jtf29_saic_check.jpg
/fb/jtfdcr/shoebox/jtf29_sawhorse_stop.jpg
/fb/jtfdcr/shoebox/jtf29_sawhorsea.jpg
/fb/jtfdcr/shoebox/jtf29_soccerball1.jpg
/fb/jtfdcr/shoebox/jtf29_soccerball3.jpg
/fb/jtfdcr/shoebox/jtf29_soccerball4.jpg
/fb/jtfdcr/shoebox/jtf29_soccerball5.jpg
/fb/jtfdcr/shoebox/jtf29_soccerball_big.jpg
/fb/jtfdcr/shoebox/jtf29_umbrella.jpg
/fb/jtfdcr/shoebox/jtf29_valintines_invoice_day_find.jpg
/fb/jtfdcr/shoebox/jtf29_van.jpg
/fb/jtfdcr/shoebox/jtf29_wagon.jpg
/fb/jtfdcr/shoebox/jtf29_wagon1.jpg
/fb/jtfdcr/shoebox/jtf29_wagon_jtf30_logging.jpg
/fb/jtfdcr/shoebox/jtf29_webcam1.jpg
/fb/jtfdcr/shoebox/jtf29_webcam1b.jpg
/fb/jtfdcr/shoebox/jtf29_webcam1c.jpg
/fb/jtfdcr/shoebox/jtf29_webcam2.jpg
/fb/jtfdcr/shoebox/jtf30..jpg
/fb/jtfdcr/shoebox/jtf30_cliffshed_sinkhole_drain.jpg
/fb/jtfdcr/shoebox/jtf30_jackie_martin.jpg
/fb/jtfdcr/shoebox/jtf30_jackie_martin2.jpg
/fb/jtfdcr/shoebox/jtf30_jackie_martin3.jpg
/fb/jtfdcr/shoebox/jtf30_jackie_martin4.jpg
/fb/jtfdcr/shoebox/jtf30_sinkhole_draine.jpg
/fb/jtfdcr/shoebox/jtf30_zillow_bar.jpg
/fb/jtfdcr/shoebox/jtf30_zillow_desc.jpg
/fb/jtfdcr/shoebox/jtf30_zillow_desc1.jpg
/fb/jtfdcr/shoebox/jtf30_zillow_desc2.jpg
/fb/jtfdcr/shoebox/jtf30_zillow_desc4.jpg
/fb/jtfdcr/shoebox/jtf30_zillow_desc_sunroom.jpg
/fb/jtfdcr/shoebox/jtf30_zillow_kitchen.jpg
/fb/jtfdcr/shoebox/jtf31-32.jpg
/fb/jtfdcr/shoebox/jtf31.jpg
/fb/jtfdcr/shoebox/jtf31_fiona_autonoumus_patrol.jpg
/fb/jtfdcr/shoebox/jtf31_fiona_lease_waiver.jpg
/fb/jtfdcr/shoebox/jtf31_fiona_runs_201506_001.jpg
/fb/jtfdcr/shoebox/jtf31_fiona_runs_201506_002.jpg
/fb/jtfdcr/shoebox/jtf31_snap_20170123_187589_noparking_party_sign.jpg
/fb/jtfdcr/shoebox/jtf31_snap_20170123_187593_party_whitevan_stalker.jpg
/fb/jtfdcr/shoebox/jtf31_snap_20170123_187594+party_whitevan_stalker_9uv667_plates.jpg
/fb/jtfdcr/shoebox/jtf31_snap_20170123_187594+party_whitevan_stalker_middlefingure.jpg
/fb/jtfdcr/shoebox/jtf31_snap_20170123_187594+party_whitevan_stalker_profile2.jpg
/fb/jtfdcr/shoebox/jtf31_snap_20170123_187600_clownporch_partygame_harrassment.jpg
/fb/jtfdcr/shoebox/jtf31_snap_20170123_187600_clownporch_partygame_harrassment2.jpg
/fb/jtfdcr/shoebox/jtf31_takings.jpg
/fb/jtfdcr/shoebox/jtf32.jpg
/fb/jtfdcr/shoebox/jtf32_doberwatchers_2of4.jpg
/fb/jtfdcr/shoebox/jtf32_donovan_doberhome.jpg
/fb/jtfdcr/shoebox/jtf32_pre_jtf3120021201_132901_1292986.jpg
/fb/jtfdcr/shoebox/jtf32_snap_20170123_187587.jpg
/fb/jtfdcr/shoebox/jtf32_snap_20170123_187588.jpg
/fb/jtfdcr/shoebox/jtf35.jpg
/fb/jtfdcr/shoebox/jtf36.jpg
/fb/jtfdcr/shoebox/jtf37.jpg
/fb/jtfdcr/shoebox/jtf38.jpg
/fb/jtfdcr/shoebox/jtf38_elvis2_autonomous_patrol.jpg
/fb/jtfdcr/shoebox/jtf39.jpg
/fb/jtfdcr/shoebox/jtf39_baily_autonomous_patrol.jpg
/fb/jtfdcr/shoebox/jtf44.jpg
/fb/jtfdcr/shoebox/jtf44_front.jpg
/fb/jtfdcr/shoebox/jtf_29-30.jpg
/fb/jtfdcr/shoebox/jtf_34509.jpg
/fb/jtfdcr/shoebox/jtf_35155.jpg
/fb/jtfdcr/shoebox/jtf_601jtfdc_courtcircle.jpg
/fb/jtfdcr/shoebox/jtf_byrd.jpg
/fb/jtfdcr/shoebox/jtf_byrd_coral.jpg
/fb/jtfdcr/shoebox/jtf_byrd_north.jpg
/fb/jtfdcr/shoebox/jtf_corner_ne.jpg
/fb/jtfdcr/shoebox/jtf_mental_1_001.jpg
/fb/jtfdcr/shoebox/jtf_mental_1_002.jpg
/fb/jtfdcr/shoebox/jtf_mental_1_003.jpg
/fb/jtfdcr/shoebox/jtf_n.jpg
/fb/jtfdcr/shoebox/jtf_ne.jpg
/fb/jtfdcr/shoebox/jtf_ne_zillow.jpg
/fb/jtfdcr/shoebox/jtf_north_zillow.jpg
/fb/jtfdcr/shoebox/jtf_nw_31-34.jpg
/fb/jtfdcr/shoebox/jtf_right.jpg
/fb/jtfdcr/shoebox/jtf_topus_001.jpg
/fb/jtfdcr/shoebox/jtf_topus_002.jpg
/fb/jtfdcr/shoebox/jtfarms_contacts_01.jpg
/fb/jtfdcr/shoebox/jtfarms_contacts_02.jpg
/fb/jtfdcr/shoebox/jtfarms_contacts_03.jpg
/fb/jtfdcr/shoebox/jtfd_north.jpg
/fb/jtfdcr/shoebox/jtfdc-north.jpg
/fb/jtfdcr/shoebox/jtfdc-north_medow.jpg
/fb/jtfdcr/shoebox/jtfdc.jpg
/fb/jtfdcr/shoebox/jtfdc28_gazebo_lights_nocam.jpg
/fb/jtfdcr/shoebox/jtfdc29_backyard_logging.jpg
/fb/jtfdcr/shoebox/jtfdc29_eagle_north.jpg
/fb/jtfdcr/shoebox/jtfdc29_fenclet1_auctiontape.jpg
/fb/jtfdcr/shoebox/jtfdc29_fenclet2_auctiontape.jpg
/fb/jtfdcr/shoebox/jtfdc29_fenclets12_seazed.jpg
/fb/jtfdcr/shoebox/jtfdc29_log5463.jpg
/fb/jtfdcr/shoebox/jtfdc29_log5474.jpg
/fb/jtfdcr/shoebox/jtfdc_1of100_manufactured_police_calls.jpg
/fb/jtfdcr/shoebox/jtfdc_2001.jpg
/fb/jtfdcr/shoebox/jtfdc_29-30.jpg
/fb/jtfdcr/shoebox/jtfdc_29-30_topos.jpg
/fb/jtfdcr/shoebox/jtfdc_300.jpg
/fb/jtfdcr/shoebox/jtfdc_barn.jpg
/fb/jtfdcr/shoebox/jtfdc_barn_jtfdc29.jpg
/fb/jtfdcr/shoebox/jtfdc_before_jtf31.jpg
/fb/jtfdcr/shoebox/jtfdc_corner.jpg
/fb/jtfdcr/shoebox/jtfdc_corner_wide.jpg
/fb/jtfdcr/shoebox/jtfdc_courtcircle.jpg
/fb/jtfdcr/shoebox/jtfdc_eagles_sawhorse_fencelets.jpg
/fb/jtfdcr/shoebox/jtfdc_easment.jpg
/fb/jtfdcr/shoebox/jtfdc_gazebo_e.jpg
/fb/jtfdcr/shoebox/jtfdc_gazebo_n_jtf30.jpg
/fb/jtfdcr/shoebox/jtfdc_gazebo_ne.jpg
/fb/jtfdcr/shoebox/jtfdc_gazebo_ne_jtf31.jpg
/fb/jtfdcr/shoebox/jtfdc_gazebo_nw_jtf30.jpg
/fb/jtfdcr/shoebox/jtfdc_gazebo_se_jtf28.jpg
/fb/jtfdcr/shoebox/jtfdc_gazebo_sse_jtf28.jpg
/fb/jtfdcr/shoebox/jtfdc_gazebo_sw.jpg
/fb/jtfdcr/shoebox/jtfdc_greater.jpg
/fb/jtfdcr/shoebox/jtfdc_imgmap.jpg
/fb/jtfdcr/shoebox/jtfdc_jtf28_property_stake.jpg
/fb/jtfdcr/shoebox/jtfdc_jtf30-28_scheming.jpg
/fb/jtfdcr/shoebox/jtfdc_jtf30_heirloom_mowerer_midnight_stalkaroundIMG_9408.jpg
/fb/jtfdcr/shoebox/jtfdc_jtf30_shed_sinkhole_drain.jpg
/fb/jtfdcr/shoebox/jtfdc_jtf31_easment_blockade.jpg
/fb/jtfdcr/shoebox/jtfdc_jtf31_fiona_fleefall.jpg
/fb/jtfdcr/shoebox/jtfdc_jtf31_party_entertainment_jkwii_ngcupIMG_9409.jpg
/fb/jtfdcr/shoebox/jtfdc_kidb_back.jpg
/fb/jtfdcr/shoebox/jtfdc_kidb_front.jpg
/fb/jtfdcr/shoebox/jtfdc_kidc_back.jpg
/fb/jtfdcr/shoebox/jtfdc_kidc_front.jpg
/fb/jtfdcr/shoebox/jtfdc_kidp_back.jpg
/fb/jtfdcr/shoebox/jtfdc_kidp_front.jpg
/fb/jtfdcr/shoebox/jtfdc_kids3_back.jpg
/fb/jtfdcr/shoebox/jtfdc_kids3_front.jpg
/fb/jtfdcr/shoebox/jtfdc_kids_IMG_8424.jpg
/fb/jtfdcr/shoebox/jtfdc_kouIMG_8561.jpg
/fb/jtfdcr/shoebox/jtfdc_mailman_refused_deliver.jpg
/fb/jtfdcr/shoebox/jtfdc_meados_souixpassage.jpg
/fb/jtfdcr/shoebox/jtfdc_meadow.jpg
/fb/jtfdcr/shoebox/jtfdc_parcels copy.jpg
/fb/jtfdcr/shoebox/jtfdc_parcels.jpg
/fb/jtfdcr/shoebox/jtfdc_police.jpg
/fb/jtfdcr/shoebox/jtfdc_police_straf_20170123_16224.jpg
/fb/jtfdcr/shoebox/jtfdc_pre_jtf31.jpg
/fb/jtfdcr/shoebox/jtfdc_private_court_since_1979_viewin.jpg
/fb/jtfdcr/shoebox/jtfdc_sawhorse.jpg
/fb/jtfdcr/shoebox/jtfdc_sawhorse2.jpg
/fb/jtfdcr/shoebox/jtfdc_sawhorse_a.jpg
/fb/jtfdcr/shoebox/jtfdc_sawhorse_exit.jpg
/fb/jtfdcr/shoebox/jtfdc_sawhorse_jak3.jpg
/fb/jtfdcr/shoebox/jtfdc_sawhorse_stop_out.jpg
/fb/jtfdcr/shoebox/jtfdc_sawhorse_stopsign.jpg
/fb/jtfdcr/shoebox/jtfdc_sawhorse_winter.jpg
/fb/jtfdcr/shoebox/jtfdc_shared_barn.jpg
/fb/jtfdcr/shoebox/jtfdc_souixpassage.jpg
/fb/jtfdcr/shoebox/jtfdc_south.jpg
/fb/jtfdcr/shoebox/jtfdc_sw_jtf21.jpg
/fb/jtfdcr/shoebox/jtfdc_theater.jpg
/fb/jtfdcr/shoebox/jtfdc_townhall_noticeIMG_8560.jpg
/fb/jtfdcr/shoebox/jtfdc_updown_passage.jpg
/fb/jtfdcr/shoebox/jtfdc_updown_passage_jtf31.jpg
/fb/jtfdcr/shoebox/jtfdcr2.jpg
/fb/jtfdcr/shoebox/jtfdcr_page_001.jpg
/fb/jtfdcr/shoebox/jtfdcr_page_002.jpg
/fb/jtfdcr/shoebox/jtfdcr_page_003.jpg
/fb/jtfdcr/shoebox/jtfdcr_page_003b.jpg
/fb/jtfdcr/shoebox/jtfdcr_page_004.jpg
/fb/jtfdcr/shoebox/jtfdcr_page_005.jpg
/fb/jtfdcr/shoebox/jtfdcr_page_006.jpg
/fb/jtfdcr/shoebox/jtfdcr_page_007.jpg
/fb/jtfdcr/shoebox/jtfdcr_page_008.jpg
/fb/jtfdcr/shoebox/jtfdcr_page_008b.jpg
/fb/jtfdcr/shoebox/jtfdcr_page_009.jpg
/fb/jtfdcr/shoebox/jtfdcr_page_010.jpg
/fb/jtfdcr/shoebox/jtfdcr_page_011.jpg
/fb/jtfdcr/shoebox/jtfdcr_page_011b.jpg
/fb/jtfdcr/shoebox/jtfdcr_page_012.jpg
/fb/jtfdcr/shoebox/jtfdcr_page_013.jpg
/fb/jtfdcr/shoebox/jtfdcsouth.jpg
/fb/jtfdcr/shoebox/jtfinc.jpg
/fb/jtfdcr/shoebox/jtfinc_potholes.jpg
/fb/jtfdcr/shoebox/jtfinc_vs_jtf29jk_ 2.jpg
/fb/jtfdcr/shoebox/jtfinc_vs_jtf29jk_ 3.jpg
/fb/jtfdcr/shoebox/jtfinc_vs_jtf29jk_ 4.jpg
/fb/jtfdcr/shoebox/jtfinc_vs_jtf29jk_ 5.jpg
/fb/jtfdcr/shoebox/jtfinc_vs_jtf29jk_ 6.jpg
/fb/jtfdcr/shoebox/jtfinc_vs_jtf29jk_.jpg
/fb/jtfdcr/shoebox/julius_mocsari_001.jpg
/fb/jtfdcr/shoebox/ka_cornelia_harry_63.jpg
/fb/jtfdcr/shoebox/ka_jtfd29_title_01.jpg
/fb/jtfdcr/shoebox/ka_jtfd29_title_02.jpg
/fb/jtfdcr/shoebox/ka_jtfd29_title_03.jpg
/fb/jtfdcr/shoebox/ka_jtfd29_title_04.jpg
/fb/jtfdcr/shoebox/ka_jtfd29_title_05.jpg
/fb/jtfdcr/shoebox/ka_jtfd29_title_06.jpg
/fb/jtfdcr/shoebox/ka_jtfd29_title_07.jpg
/fb/jtfdcr/shoebox/ka_jtfd29_title_08.jpg
/fb/jtfdcr/shoebox/ka_jtfd29_title_09.jpg
/fb/jtfdcr/shoebox/ka_jtfd29_title_10.jpg
/fb/jtfdcr/shoebox/ka_jtfd29_title_11.jpg
/fb/jtfdcr/shoebox/karl_smekal_.jpg
/fb/jtfdcr/shoebox/karl_smekal_001.jpg
/fb/jtfdcr/shoebox/karl_smekal_002.jpg
/fb/jtfdcr/shoebox/karl_smekal_003.jpg
/fb/jtfdcr/shoebox/karl_smekal_004.jpg
/fb/jtfdcr/shoebox/karl_smekal_005.jpg
/fb/jtfdcr/shoebox/karl_smekal_006.jpg
/fb/jtfdcr/shoebox/karl_smekal_007.jpg
/fb/jtfdcr/shoebox/karl_smekal_008.jpg
/fb/jtfdcr/shoebox/karl_smekal_009.jpg
/fb/jtfdcr/shoebox/karl_smekal_010.jpg
/fb/jtfdcr/shoebox/karl_smekal_011.jpg
/fb/jtfdcr/shoebox/karl_smekal_012.jpg
/fb/jtfdcr/shoebox/karl_smekal_013.jpg
/fb/jtfdcr/shoebox/karl_smekal_014.jpg
/fb/jtfdcr/shoebox/karl_smekal_015.jpg
/fb/jtfdcr/shoebox/karl_smekal_016.jpg
/fb/jtfdcr/shoebox/karl_smekal_017.jpg
/fb/jtfdcr/shoebox/karl_smekal_018.jpg
/fb/jtfdcr/shoebox/karl_smekal_019.jpg
/fb/jtfdcr/shoebox/karl_smekal_020.jpg
/fb/jtfdcr/shoebox/karl_smekal_021.jpg
/fb/jtfdcr/shoebox/karl_smekal_022.jpg
/fb/jtfdcr/shoebox/karl_smekal_023.jpg
/fb/jtfdcr/shoebox/karl_smekal_024.jpg
/fb/jtfdcr/shoebox/karl_smekal_025.jpg
/fb/jtfdcr/shoebox/karl_smekal_026.jpg
/fb/jtfdcr/shoebox/karl_smekal_027.jpg
/fb/jtfdcr/shoebox/karl_smekal_028.jpg
/fb/jtfdcr/shoebox/karl_smekal_029.jpg
/fb/jtfdcr/shoebox/karl_smekal_030.jpg
/fb/jtfdcr/shoebox/karl_smekal_031.jpg
/fb/jtfdcr/shoebox/karl_smekal_032.jpg
/fb/jtfdcr/shoebox/karl_smekal_033.jpg
/fb/jtfdcr/shoebox/karl_smekal_034.jpg
/fb/jtfdcr/shoebox/karl_smekal_035.jpg
/fb/jtfdcr/shoebox/karl_smekal_036.jpg
/fb/jtfdcr/shoebox/karl_smekal_037.jpg
/fb/jtfdcr/shoebox/karl_smekal_038.jpg
/fb/jtfdcr/shoebox/karl_smekal_039.jpg
/fb/jtfdcr/shoebox/karl_smekal_040.jpg
/fb/jtfdcr/shoebox/karl_smekal_041.jpg
/fb/jtfdcr/shoebox/karl_smekal_042.jpg
/fb/jtfdcr/shoebox/karl_smekal_043.jpg
/fb/jtfdcr/shoebox/karl_smekal_044.jpg
/fb/jtfdcr/shoebox/karl_smekal_045.jpg
/fb/jtfdcr/shoebox/karl_smekal_046.jpg
/fb/jtfdcr/shoebox/karl_smekal_047.jpg
/fb/jtfdcr/shoebox/karl_smekal_048.jpg
/fb/jtfdcr/shoebox/karl_smekal_049.jpg
/fb/jtfdcr/shoebox/karl_smekal_050.jpg
/fb/jtfdcr/shoebox/karl_smekal_051.jpg
/fb/jtfdcr/shoebox/karl_smekal_052.jpg
/fb/jtfdcr/shoebox/karl_smekal_053.jpg
/fb/jtfdcr/shoebox/karl_smekal_054.jpg
/fb/jtfdcr/shoebox/karl_smekal_055.jpg
/fb/jtfdcr/shoebox/karl_smekal_056.jpg
/fb/jtfdcr/shoebox/karl_smekal_057.jpg
/fb/jtfdcr/shoebox/karl_smekal_058.jpg
/fb/jtfdcr/shoebox/karl_smekal_059.jpg
/fb/jtfdcr/shoebox/karl_smekal_060.jpg
/fb/jtfdcr/shoebox/karl_smekal_061.jpg
/fb/jtfdcr/shoebox/karl_smekal_062.jpg
/fb/jtfdcr/shoebox/karl_smekal_063.jpg
/fb/jtfdcr/shoebox/karl_smekal_064.jpg
/fb/jtfdcr/shoebox/karl_smekal_065.jpg
/fb/jtfdcr/shoebox/karl_smekal_066.jpg
/fb/jtfdcr/shoebox/karl_smekal_067.jpg
/fb/jtfdcr/shoebox/karl_smekal_068.jpg
/fb/jtfdcr/shoebox/karl_smekal_069.jpg
/fb/jtfdcr/shoebox/karl_smekal_070.jpg
/fb/jtfdcr/shoebox/karl_smekal_071.jpg
/fb/jtfdcr/shoebox/karl_smekal_072.jpg
/fb/jtfdcr/shoebox/karl_smekal_073.jpg
/fb/jtfdcr/shoebox/karl_smekal_074.jpg
/fb/jtfdcr/shoebox/karl_smekal_075.jpg
/fb/jtfdcr/shoebox/karl_smekal_076.jpg
/fb/jtfdcr/shoebox/karl_smekal_077.jpg
/fb/jtfdcr/shoebox/karl_smekal_078.jpg
/fb/jtfdcr/shoebox/karl_smekal_079.jpg
/fb/jtfdcr/shoebox/karl_smekal_080.jpg
/fb/jtfdcr/shoebox/karl_smekal_081.jpg
/fb/jtfdcr/shoebox/karl_smekal_082.jpg
/fb/jtfdcr/shoebox/karl_smekal_083.jpg
/fb/jtfdcr/shoebox/karl_smekal_084.jpg
/fb/jtfdcr/shoebox/karl_smekal_085.jpg
/fb/jtfdcr/shoebox/karl_smekal_086.jpg
/fb/jtfdcr/shoebox/karl_smekal_087.jpg
/fb/jtfdcr/shoebox/karl_smekal_088.jpg
/fb/jtfdcr/shoebox/karl_smekal_089.jpg
/fb/jtfdcr/shoebox/karl_smekal_090.jpg
/fb/jtfdcr/shoebox/karl_smekal_091.jpg
/fb/jtfdcr/shoebox/karl_smekal_092.jpg
/fb/jtfdcr/shoebox/karl_smekal_093.jpg
/fb/jtfdcr/shoebox/karl_smekal_094.jpg
/fb/jtfdcr/shoebox/karl_smekal_095.jpg
/fb/jtfdcr/shoebox/karl_smekal_096.jpg
/fb/jtfdcr/shoebox/karl_smekal_097.jpg
/fb/jtfdcr/shoebox/karl_smekal_098.jpg
/fb/jtfdcr/shoebox/karl_smekal_099.jpg
/fb/jtfdcr/shoebox/karl_smekal_100.jpg
/fb/jtfdcr/shoebox/karl_smekal_101.jpg
/fb/jtfdcr/shoebox/karl_smekal_102.jpg
/fb/jtfdcr/shoebox/karl_smekal_103.jpg
/fb/jtfdcr/shoebox/karl_smekal_104.jpg
/fb/jtfdcr/shoebox/karl_smekal_105.jpg
/fb/jtfdcr/shoebox/karl_smekal_106.jpg
/fb/jtfdcr/shoebox/karl_smekal_107.jpg
/fb/jtfdcr/shoebox/karl_smekal_108.jpg
/fb/jtfdcr/shoebox/karl_smekal_109.jpg
/fb/jtfdcr/shoebox/karl_smekal_110.jpg
/fb/jtfdcr/shoebox/karl_smekal_111.jpg
/fb/jtfdcr/shoebox/karl_smekal_112.jpg
/fb/jtfdcr/shoebox/karl_smekal_113.jpg
/fb/jtfdcr/shoebox/karl_smekal_114.jpg
/fb/jtfdcr/shoebox/karl_smekal_115.jpg
/fb/jtfdcr/shoebox/karl_smekal_116.jpg
/fb/jtfdcr/shoebox/karl_smekal_117.jpg
/fb/jtfdcr/shoebox/karl_smekal_118.jpg
/fb/jtfdcr/shoebox/karl_smekal_119.jpg
/fb/jtfdcr/shoebox/karl_smekal_120.jpg
/fb/jtfdcr/shoebox/karl_smekal_121.jpg
/fb/jtfdcr/shoebox/karl_smekal_122.jpg
/fb/jtfdcr/shoebox/karl_smekal_123.jpg
/fb/jtfdcr/shoebox/karl_smekal_124.jpg
/fb/jtfdcr/shoebox/karl_smekal_125.jpg
/fb/jtfdcr/shoebox/karl_smekal_126.jpg
/fb/jtfdcr/shoebox/karl_smekal_127.jpg
/fb/jtfdcr/shoebox/karl_smekal_128.jpg
/fb/jtfdcr/shoebox/karl_smekal_129.jpg
/fb/jtfdcr/shoebox/karl_smekal_130.jpg
/fb/jtfdcr/shoebox/karl_smekal_131.jpg
/fb/jtfdcr/shoebox/karl_smekal_132.jpg
/fb/jtfdcr/shoebox/karl_smekal_133.jpg
/fb/jtfdcr/shoebox/karl_smekal_134.jpg
/fb/jtfdcr/shoebox/karl_smekal_135.jpg
/fb/jtfdcr/shoebox/karl_smekal_136.jpg
/fb/jtfdcr/shoebox/karl_smekal_137.jpg
/fb/jtfdcr/shoebox/karl_smekal_138.jpg
/fb/jtfdcr/shoebox/karl_smekal_139.jpg
/fb/jtfdcr/shoebox/karl_smekal_140.jpg
/fb/jtfdcr/shoebox/karl_smekal_141.jpg
/fb/jtfdcr/shoebox/karl_smekal_142.jpg
/fb/jtfdcr/shoebox/karl_smekal_143.jpg
/fb/jtfdcr/shoebox/karl_smekal_144.jpg
/fb/jtfdcr/shoebox/karl_smekal_145.jpg
/fb/jtfdcr/shoebox/karl_smekal_146.jpg
/fb/jtfdcr/shoebox/karl_smekal_147.jpg
/fb/jtfdcr/shoebox/karl_smekal_148.jpg
/fb/jtfdcr/shoebox/karl_smekal_149.jpg
/fb/jtfdcr/shoebox/karl_smekal_150.jpg
/fb/jtfdcr/shoebox/ko.jpg
/fb/jtfdcr/shoebox/ko0_us_down.jpg
/fb/jtfdcr/shoebox/ko_mo_labor_201302a.jpg
/fb/jtfdcr/shoebox/ko_mo_labor_201302b.jpg
/fb/jtfdcr/shoebox/ko_saic_check_20130215.jpg
/fb/jtfdcr/shoebox/konet_hack_screen.jpg
/fb/jtfdcr/shoebox/konet_inv_saic2.jpg
/fb/jtfdcr/shoebox/konet_invoice_fy-pp_yyyymmdd-yyyymmdd-1.jpg
/fb/jtfdcr/shoebox/konet_invoice_fy-pp_yyyymmdd-yyyymmdd.jpg
/fb/jtfdcr/shoebox/konet_invoice_saic.jpg
/fb/jtfdcr/shoebox/ky_pineville_forestry_camp.jpg
/fb/jtfdcr/shoebox/ky_pineville_forestry_camp_desc.jpg
/fb/jtfdcr/shoebox/ladyj_alabaster.jpg
/fb/jtfdcr/shoebox/ladyj_amazon.jpg
/fb/jtfdcr/shoebox/ladyj_brass.jpg
/fb/jtfdcr/shoebox/ladyj_bronze.jpg
/fb/jtfdcr/shoebox/ladyj_clingyclothes.jpg
/fb/jtfdcr/shoebox/ladyj_glide.jpg
/fb/jtfdcr/shoebox/ladyj_horns.jpg
/fb/jtfdcr/shoebox/ladyj_onhi.jpg
/fb/jtfdcr/shoebox/ladyj_silouette.jpg
/fb/jtfdcr/shoebox/ladyj_statue.jpg
/fb/jtfdcr/shoebox/ladyj_sword.jpg
/fb/jtfdcr/shoebox/ladyj_zen.jpg
/fb/jtfdcr/shoebox/loader.jpg
/fb/jtfdcr/shoebox/logo_jtf.jpg
/fb/jtfdcr/shoebox/marlins_jacket.jpg
/fb/jtfdcr/shoebox/mocsari_julius_memorial.jpg
/fb/jtfdcr/shoebox/mozart_aviary.jpg
/fb/jtfdcr/shoebox/mrs_ford_psychicreader.jpg
/fb/jtfdcr/shoebox/mrs_ford_psychicreader2.jpg
/fb/jtfdcr/shoebox/oldpeople1.jpg
/fb/jtfdcr/shoebox/unclesam.jpg
/fb/jtfdcr/shoebox/unclesam_templet.jpg
/fb/jtfdcr/shoebox/waxpaper.jpg
/fb/jtfdcr/shoebox/wood_posters.jpg
/fb/jtfdcr/shoebox/woodcarver_blackforest.jpg
/fb/jtfdcr/shoebox/woodcarvershop_blackforest.jpg `;
			return(pagelist_shoebox.split("\n"));
			}


		function load_pagelist_imgs() {
//			alert( "BUGS_1000 load_page_list_jtfdcr_imgs" );
var pagelist_imgs=
`imgs/1.jpg
imgs/2.jpg
imgs/3.jpg
imgs/4.jpg
imgs/5.jpg
imgs/6.jpg
imgs/7.jpg
imgs/8.jpg
imgs/9.jpg
imgs/10.jpg
imgs/11.jpg
imgs/12.jpg
imgs/13.jpg
imgs/14.jpg
imgs/15.jpg
imgs/16.jpg `;
			return(pagelist_imgs.split("\n"));
			}
		</script>

	<script id="script load_pagelist_i" >
		function load_pagelist_i() {
var pagelist_i = `
i/1.jpg
i/2.jpg
i/3.jpg
i/4.jpg
i/5.jpg
i/6.jpg
i/7.jpg
i/8.jpg
i/9.jpg
i/10.jpg
i/11.jpg
i/12.jpg
i/13.jpg
i/14.jpg
i/15.jpg
i/16.jpg`;
			return(pagelist_i.split("\n"));
			}
		</script>



	<script id="script_load_pagelist_ajaks" >
		function load_pagelist_ajaks(ajaks) {
			alert( "BUGS_1212 load_pagelist_ajaks ajaks="+ajaks );
			ajaks="fb.txt";
			if(! linkcheck(ajaks)) { return(""); }
			alert( "BUGS_1213 load_pagelist_ajaks ajaks="+ajaks );

			var pages = new Array();
			var pages_len=0;
			var j=0;
			var xhttp = new XMLHttpRequest();
			xhttp.onreadystatechange = function() {
				if (this.readyState == 4 && this.status == 200) {
					var ajaxtext=this.responseText;
					var j=0;
					var htmout = "";
					var pagelist = new Array();
					pagelist = ajaxtext.split("\n");
					alert( "BUGS_1710 load_ajaks() ajaks="+ajaks+" pagelist="+pagelist);
					
					var pagelist_len = pagelist.length;
//					document.getElementById("div_load_ajaks").innerHTML = this.responseText; 
					document.getElementById("div_load_ajaks").innerHTML = ajaxtext; 
//					document.getElementById("div_load_ajaks").innerHTML = pagelist; 
//					document.getElementById("div_load_ajaks").innerHTML = htmout+ajaxtext; 
//					loadApp();
//					fbload();
					alert( "BUGS_1580 ajaxlines="+ajaxlines pagelist_len="+pagelist_len );
					return( ajaxlines );
					}
				};
			xhttp.open("GET", ajaks, true);
			xhttp.send();
			}
		</script>

	<script id="script_load_pagelist_default">
		function load_pagelist_default() {
			var pages = new Array();
			var pages_len=0;
			var j=0;

//			alert( "BUGS_1250 load_pages_default pages_len="+pages_len+" href="+href );
var pagelist_default =`
-rw-r--r--||1|konet||staff||376756|Jul|28||2013|pages_default/0.jpg
-rw-r--r--||1|konet||staff||376756|Jul|28||2013|pages_default/1.jpg
-rw-r--r--||1|konet||staff||376756|Jul|28||2013|pages_default/2.jpg
-rw-r--r--||1|konet||staff||376756|Jul|28||2013|pages_default/3.jpg
-rw-r--r--||1|konet||staff||376756|Jul|28||2013|pages_default/4.jpg
pages_default/5.jpg
pages_default/6.jpg
pages_default/7.jpg
pages_default/8.jpg
pages_default/9.jpg
pages_default/10.jpg
pages_default/11.jpg
pages_default/12.jpg
pages_default/13.jpg
pages_default/14.jpg
pages_default/15.jpg
pages_default/16.jpg`;
`;
			return( pagelist_default.split("\n"));
			}
			</script>



	<script id="script_load_pagelist" >
		function load_pagelist() {

			var pages = new Array();
			var pages_len=0;
			var j=0; var k=0;

			var pages_default = new Array();
			var pages_go = new Array();
			var pages_jtfdcr_pages = new Array();
			var pages_jtfdcr_imgs = new Array();

//			var ajaks = "fb_imgs.txt";	
//			pages = load_pagelist_ajaks(ajaks);
//			pages = load_pagelist_default();

//			pages= load_pagelist_head();
//			pages= load_pagelist_pages();
//			pages= load_pagelist_imgs();
//			pages= load_pagelist_i();
//			pages= load_pagelist_go();
//			pages= load_pagelist_tail();


			pagelist_head = load_pagelist_head();
			pagelist_pages = load_pagelist_pages();
			pagelist_chap1 = load_pagelist_chap1();
			pagelist_chap2 = load_pagelist_chap2();
			pagelist_chap3 = load_pagelist_chap3();
			pagelist_shoebox = load_pagelist_shoebox();
//			pagelist_imgs = load_pagelist_imgs();
			pagelist_i = load_pagelist_i();
			pagelist_go = load_pagelist_go();
			pagelist_tail = load_pagelist_tail();
//			var ajaks="fb.txt";
//			var pagelist_ajaks = load_pagelist_ajaks(ajaks);

//			pages = pagelist_head.concat(pagelist_pages, pagelist_chap1, pagelist_chap2, pagelist_chap3, pagelist_imgs, pagelist_i, pagelist_go,pagelist_tail );
//			pages = pagelist_head.concat(pagelist_pages, pagelist_chap1, pagelist_chap2, pagelist_chap3, pagelist_go,pagelist_tail );
			pages = pagelist_pages.concat(pagelist_chap1, pagelist_chap2, pagelist_chap3, pagelist_go,pagelist_tail );
			pages_len=pages.length;
			pages_len=pages.length;

//			alert( "BUGS_1290 pages_len="+pages_len+" pages="+pages );


//			alert( "BUGS_1180 load_pagelist_default len="+pages_len+" pages="+pages )
//			alert( "BUGS_1180 load_pagelist_go len="+pages_len+" pages="+pages )
//			alert( "BUGS_1180 load_pagelist_pages len="+pages_len+" pages="+pages )
//			alert( "BUGS_1180 load_pagelist_default len="+pages_len+" pages="+pages )


//			var htmout="";
//			for( j=0;j<pages_len;j++) {
//				htmout += "bugs_1100 j="+j+" len="+pages_len+" page="+pages[j]+"<br>\n";
//				}
//			document.write(htmout);
//			alert( "BUGS_1200 ="+htmout );

//			alert( "BUGS_1200 load_pagelist pages_len="+pages_len+" pages="+pages );
			return( pages );
			}
		</script>



	<script id="script_load_pagelist_go" >
		function load_pagelist_go(args) {
			var j=0;
//			var href = window.location.href;
//			alert( "BUGS_825 load_pages pages_len="+pages_len+" href="+href );
var pagelist_go = `
-rw-r--r--||1|konet||staff||376756|Jul|28||2013|pages/0.jpg
-rw-r--r--||1|konet||staff||376756|Jul|28||2013|pages/1.jpg
-rw-r--r--||1|konet||staff||376756|Jul|28||2013|pages/2.jpg
-rw-r--r--||1|konet||staff||376756|Jul|28||2013|pages/3.jpg
-rw-r--r--||1|konet||staff||376756|Jul|28||2013|pages/4.jpg
-rw-r--r--||1|konet||staff||376756|Jul|28||2013|pages/5.jpg
-rw-r--r--||1|konet||staff||376756|Jul|28||2013|pages/6.jpg
-rw-r--r--||1|konet||staff||376756|Jul|28||2013|pages/7.jpg
-rw-r--r--||1|konet||staff||376756|Jul|28||2013|pages/8.jpg
-rw-r--r--||1|konet||staff||376756|Jul|28||2013|pages/9.jpg
-rw-r--r--||1|konet||staff||376756|Jul|28||2013|pages/10.jpg
-rw-r--r--||1|konet||staff||376756|Jul|28||2013|pages/11.jpg
-rw-r--r--||1|konet||staff||376756|Jul|28||2013|pages/12.jpg
-rw-r--r--||1|konet||staff||376756|Jul|28||2013|pages/13.jpg
-rw-r--r--||1|konet||staff||376756|Jul|28||2013|pages/14.jpg
-rw-r--r--||1|konet||staff||376756|Jul|28||2013|pages/15.jpg
-rw-r--r--||1|konet||staff||376756|Jul|28||2013|pages/16.jpg
-rw-r--r--||1|konet||staff||376756|Jul|28||2013|pages/18.jpg
-rw-r--r--||1|konet||staff||376756|Jul|28||2013|pages/19.jpg
-rw-r--r--||1|konet||staff||376756|Jul|28||2013|pages/20.jpg
-rw-r--r--||1|konet||staff||376756|Jul|28||2013|pages/21.jpg
-rw-r--r--||1|konet||staff||376756|Jul|28||2013|pages/22.jpg
-rw-r--r--||1|konet||staff||376756|Jul|28||2013|pages/23.jpg
-rw-r--r--||1|konet||staff||376756|Jul|28||2013|pages/24.jpg
-rw-r--r--||1|konet||staff||376756|Jul|28||2013|pages/25.jpg
-rw-r--r--||1|konet||staff||376756|Jul|28||2013|pages/26.jpg
-rw-r--r--||1|konet||staff||376756|Jul|28||2013|/kb/books/go/go_attack_defense/pages/img357.jpg
-rw-r--r--||1|konet||staff||306856|Jul|28||2013|/kb/books/go/go_attack_defense/pages/img358.jpg
-rw-r--r--||1|konet||staff||199193|Jul|28||2013|/kb/books/go/go_attack_defense/pages/img359.jpg
-rw-r--r--||1|konet||staff||443996|Jul|28||2013|/kb/books/go/go_attack_defense/pages/img360.jpg
-rw-r--r--||1|konet||staff||629176|Jul|28||2013|/kb/books/go/go_attack_defense/pages/img361.jpg
-rw-r--r--||1|konet||staff||544038|Jul|28||2013|/kb/books/go/go_attack_defense/pages/img362.jpg
-rw-r--r--||1|konet||staff||941797|Jul|28||2013|/kb/books/go/go_attack_defense/pages/img363.jpg
-rw-r--r--||1|konet||staff||850031|Jul|28||2013|/kb/books/go/go_attack_defense/pages/img364.jpg
-rw-r--r--||1|konet||staff||876319|Jul|28||2013|/kb/books/go/go_attack_defense/pages/img365.jpg
-rw-r--r--||1|konet||staff||880519|Jul|28||2013|/kb/books/go/go_attack_defense/pages/img366.jpg
-rw-r--r--||1|konet||staff||376756|Jul|28||2013|/kb/books/go/go_attack_defense/pages/img357.jpg
-rw-r--r--||1|konet||staff||306856|Jul|28||2013|/kb/books/go/go_attack_defense/pages/img358.jpg
-rw-r--r--||1|konet||staff||199193|Jul|28||2013|/kb/books/go/go_attack_defense/pages/img359.jpg
-rw-r--r--||1|konet||staff||443996|Jul|28||2013|/kb/books/go/go_attack_defense/pages/img360.jpg
-rw-r--r--||1|konet||staff||629176|Jul|28||2013|/kb/books/go/go_attack_defense/pages/img361.jpg
-rw-r--r--||1|konet||staff||544038|Jul|28||2013|/kb/books/go/go_attack_defense/pages/img362.jpg
-rw-r--r--||1|konet||staff||941797|Jul|28||2013|/kb/books/go/go_attack_defense/pages/img363.jpg
-rw-r--r--||1|konet||staff||850031|Jul|28||2013|/kb/books/go/go_attack_defense/pages/img364.jpg
-rw-r--r--||1|konet||staff||876319|Jul|28||2013|/kb/books/go/go_attack_defense/pages/img365.jpg
-rw-r--r--||1|konet||staff||880519|Jul|28||2013|/kb/books/go/go_attack_defense/pages/img366.jpg
-rw-r--r--||1|konet||staff||896620|Jul|28||2013|/kb/books/go/go_attack_defense/pages/img367.jpg
-rw-r--r--||1|konet||staff||730786|Jul|28||2013|/kb/books/go/go_attack_defense/pages/img368.jpg
-rw-r--r--||1|konet||staff||801242|Jul|28||2013|/kb/books/go/go_attack_defense/pages/img369.jpg
-rw-r--r--||1|konet||staff||883588|Jul|28||2013|/kb/books/go/go_attack_defense/pages/img370.jpg
-rw-r--r--||1|konet||staff||845856|Jul|28||2013|/kb/books/go/go_attack_defense/pages/img371.jpg
-rw-r--r--||1|konet||staff||784457|Jul|28||2013|/kb/books/go/go_attack_defense/pages/img372.jpg
-rw-r--r--||1|konet||staff||843127|Jul|28||2013|/kb/books/go/go_attack_defense/pages/img373.jpg
-rw-r--r--||1|konet||staff||906461|Jul|28||2013|/kb/books/go/go_attack_defense/pages/img374.jpg
-rw-r--r--||1|konet||staff||752928|Jul|28||2013|/kb/books/go/go_attack_defense/pages/img375.jpg
-rw-r--r--||1|konet||staff||791260|Jul|28||2013|/kb/books/go/go_attack_defense/pages/img376.jpg
-rw-r--r--||1|konet||staff||964508|Jul|28||2013|/kb/books/go/go_attack_defense/pages/img377.jpg
-rw-r--r--||1|konet||staff||828964|Jul|28||2013|/kb/books/go/go_attack_defense/pages/img378.jpg
-rw-r--r--||1|konet||staff||873941|Jul|28||2013|/kb/books/go/go_attack_defense/pages/img379.jpg
-rw-r--r--||1|konet||staff||915688|Jul|28||2013|/kb/books/go/go_attack_defense/pages/img380.jpg
-rw-r--r--||1|konet||staff||761790|Jul|28||2013|/kb/books/go/go_attack_defense/pages/img381.jpg
-rw-r--r--||1|konet||staff||845370|Jul|28||2013|/kb/books/go/go_attack_defense/pages/img382.jpg
-rw-r--r--||1|konet||staff||856490|Jul|28||2013|/kb/books/go/go_attack_defense/pages/img383.jpg
-rw-r--r--||1|konet||staff||671068|Jul|28||2013|/kb/books/go/go_attack_defense/pages/img384.jpg
-rw-r--r--||1|konet||staff||743307|Jul|28||2013|/kb/books/go/go_attack_defense/pages/img385.jpg
-rw-r--r--||1|konet||staff||792125|Jul|28||2013|/kb/books/go/go_attack_defense/pages/img386.jpg
-rw-r--r--||1|konet||staff||851995|Jul|28||2013|/kb/books/go/go_attack_defense/pages/img387.jpg
-rw-r--r--||1|konet||staff||817621|Jul|28||2013|/kb/books/go/go_attack_defense/pages/img388.jpg
-rw-r--r--||1|konet||staff||899107|Jul|28||2013|/kb/books/go/go_attack_defense/pages/img389.jpg
-rw-r--r--||1|konet||staff||945623|Jul|28||2013|/kb/books/go/go_attack_defense/pages/img390.jpg
-rw-r--r--||1|konet||staff||956754|Jul|28||2013|/kb/books/go/go_attack_defense/pages/img391.jpg
-rw-r--r--||1|konet||staff||995889|Jul|29||2013|/kb/books/go/go_attack_defense/pages/img392.jpg
-rw-r--r--||1|konet||staff||924368|Jul|29||2013|/kb/books/go/go_attack_defense/pages/img393.jpg
-rw-r--r--||1|konet||staff||824827|Jul|29||2013|/kb/books/go/go_attack_defense/pages/img394.jpg
-rw-r--r--||1|konet||staff||862378|Jul|29||2013|/kb/books/go/go_attack_defense/pages/img395.jpg
-rw-r--r--||1|konet||staff||883043|Jul|29||2013|/kb/books/go/go_attack_defense/pages/img396.jpg
-rw-r--r--||1|konet||staff||834414|Jul|29||2013|/kb/books/go/go_attack_defense/pages/img397.jpg
-rw-r--r--||1|konet||staff||772918|Jul|29||2013|/kb/books/go/go_attack_defense/pages/img398.jpg
-rw-r--r--||1|konet||staff||699001|Jul|29||2013|/kb/books/go/go_attack_defense/pages/img399.jpg
-rw-r--r--||1|konet||staff||862577|Jul|29||2013|/kb/books/go/go_attack_defense/pages/img400.jpg
-rw-r--r--||1|konet||staff||859470|Jul|29||2013|/kb/books/go/go_attack_defense/pages/img401.jpg
-rw-r--r--||1|konet||staff||898820|Jul|29||2013|/kb/books/go/go_attack_defense/pages/img402.jpg
-rw-r--r--||1|konet||staff||911795|Jul|29||2013|/kb/books/go/go_attack_defense/pages/img403.jpg
-rw-r--r--||1|konet||staff||682827|Jul|29||2013|/kb/books/go/go_attack_defense/pages/img404.jpg
-rw-r--r--||1|konet||staff||748989|Jul|29||2013|/kb/books/go/go_attack_defense/pages/img405.jpg
-rw-r--r--||1|konet||staff||756089|Jul|29||2013|/kb/books/go/go_attack_defense/pages/img406.jpg
-rw-r--r--||1|konet||staff||947742|Jul|29||2013|/kb/books/go/go_attack_defense/pages/img407.jpg
-rw-r--r--||1|konet||staff||876865|Jul|29||2013|/kb/books/go/go_attack_defense/pages/img408.jpg
-rw-r--r--||1|konet||staff||939929|Jul|29||2013|/kb/books/go/go_attack_defense/pages/img409.jpg
-rw-r--r--||1|konet||staff||857484|Jul|29||2013|/kb/books/go/go_attack_defense/pages/img410.jpg
-rw-r--r--||1|konet||staff||856924|Jul|29||2013|/kb/books/go/go_attack_defense/pages/img411.jpg
-rw-r--r--||1|konet||staff||869657|Jul|29||2013|/kb/books/go/go_attack_defense/pages/img412.jpg
-rw-r--r--||1|konet||staff||890809|Jul|29||2013|/kb/books/go/go_attack_defense/pages/img413.jpg
-rw-r--r--||1|konet||staff||881101|Jul|29||2013|/kb/books/go/go_attack_defense/pages/img414.jpg
-rw-r--r--||1|konet||staff||860242|Jul|29||2013|/kb/books/go/go_attack_defense/pages/img415.jpg
-rw-r--r--||1|konet||staff||867133|Jul|29||2013|/kb/books/go/go_attack_defense/pages/img416.jpg
-rw-r--r--||1|konet||staff||831861|Jul|29||2013|/kb/books/go/go_attack_defense/pages/img417.jpg
-rw-r--r--||1|konet||staff||825595|Jul|29||2013|/kb/books/go/go_attack_defense/pages/img418.jpg
-rw-r--r--||1|konet||staff||679496|Jul|29||2013|/kb/books/go/go_attack_defense/pages/img419.jpg
-rw-r--r--||1|konet||staff||810751|Jul|29||2013|/kb/books/go/go_attack_defense/pages/img420.jpg
-rw-r--r--||1|konet||staff||790732|Jul|29||2013|/kb/books/go/go_attack_defense/pages/img421.jpg
-rw-r--r--||1|konet||staff||845998|Jul|29||2013|/kb/books/go/go_attack_defense/pages/img422.jpg
-rw-r--r--||1|konet||staff||745726|Jul|29||2013|/kb/books/go/go_attack_defense/pages/img423.jpg
-rw-r--r--||1|konet||staff||794258|Jul|29||2013|/kb/books/go/go_attack_defense/pages/img424.jpg
-rw-r--r--||1|konet||staff||620484|Jul|26||2013|/kb/books/go/go_attack_defense/pages/index.jpg
-rw-r--r--||1|konet||staff||376756|Jul|28||2013|/kb/books/go/go_attack_defense/pages/tn/tn_img357.jpg
-rw-r--r--||1|konet||staff||306856|Jul|28||2013|/kb/books/go/go_attack_defense/pages/tn/tn_img358.jpg
-rw-r--r--||1|konet||staff||199193|Jul|28||2013|/kb/books/go/go_attack_defense/pages/tn/tn_img359.jpg
-rw-r--r--||1|konet||staff||443996|Jul|28||2013|/kb/books/go/go_attack_defense/pages/tn/tn_img360.jpg
-rw-r--r--||1|konet||staff||629176|Jul|28||2013|/kb/books/go/go_attack_defense/pages/tn/tn_img361.jpg
-rw-r--r--||1|konet||staff||544038|Jul|28||2013|/kb/books/go/go_attack_defense/pages/tn/tn_img362.jpg
-rw-r--r--||1|konet||staff||941797|Jul|28||2013|/kb/books/go/go_attack_defense/pages/tn/tn_img363.jpg
-rw-r--r--||1|konet||staff||850031|Jul|28||2013|/kb/books/go/go_attack_defense/pages/tn/tn_img364.jpg
-rw-r--r--||1|konet||staff||876319|Jul|28||2013|/kb/books/go/go_attack_defense/pages/tn/tn_img365.jpg
-rw-r--r--||1|konet||staff||880519|Jul|28||2013|/kb/books/go/go_attack_defense/pages/tn/tn_img366.jpg
-rw-r--r--||1|konet||staff||896620|Jul|28||2013|/kb/books/go/go_attack_defense/pages/tn/tn_img367.jpg
-rw-r--r--||1|konet||staff||730786|Jul|28||2013|/kb/books/go/go_attack_defense/pages/tn/tn_img368.jpg
-rw-r--r--||1|konet||staff||801242|Jul|28||2013|/kb/books/go/go_attack_defense/pages/tn/tn_img369.jpg
-rw-r--r--||1|konet||staff||883588|Jul|28||2013|/kb/books/go/go_attack_defense/pages/tn/tn_img370.jpg
-rw-r--r--||1|konet||staff||845856|Jul|28||2013|/kb/books/go/go_attack_defense/pages/tn/tn_img371.jpg
-rw-r--r--||1|konet||staff||784457|Jul|28||2013|/kb/books/go/go_attack_defense/pages/tn/tn_img372.jpg
-rw-r--r--||1|konet||staff||843127|Jul|28||2013|/kb/books/go/go_attack_defense/pages/tn/tn_img373.jpg
-rw-r--r--||1|konet||staff||906461|Jul|28||2013|/kb/books/go/go_attack_defense/pages/tn/tn_img374.jpg
-rw-r--r--||1|konet||staff||752928|Jul|28||2013|/kb/books/go/go_attack_defense/pages/tn/tn_img375.jpg
-rw-r--r--||1|konet||staff||791260|Jul|28||2013|/kb/books/go/go_attack_defense/pages/tn/tn_img376.jpg
-rw-r--r--||1|konet||staff||964508|Jul|28||2013|/kb/books/go/go_attack_defense/pages/tn/tn_img377.jpg
-rw-r--r--||1|konet||staff||828964|Jul|28||2013|/kb/books/go/go_attack_defense/pages/tn/tn_img378.jpg
-rw-r--r--||1|konet||staff||873941|Jul|28||2013|/kb/books/go/go_attack_defense/pages/tn/tn_img379.jpg
-rw-r--r--||1|konet||staff||915688|Jul|28||2013|/kb/books/go/go_attack_defense/pages/tn/tn_img380.jpg
-rw-r--r--||1|konet||staff||761790|Jul|28||2013|/kb/books/go/go_attack_defense/pages/tn/tn_img381.jpg
-rw-r--r--||1|konet||staff||845370|Jul|28||2013|/kb/books/go/go_attack_defense/pages/tn/tn_img382.jpg
-rw-r--r--||1|konet||staff||856490|Jul|28||2013|/kb/books/go/go_attack_defense/pages/tn/tn_img383.jpg
-rw-r--r--||1|konet||staff||671068|Jul|28||2013|/kb/books/go/go_attack_defense/pages/tn/tn_img384.jpg
-rw-r--r--||1|konet||staff||743307|Jul|28||2013|/kb/books/go/go_attack_defense/pages/tn/tn_img385.jpg
-rw-r--r--||1|konet||staff||792125|Jul|28||2013|/kb/books/go/go_attack_defense/pages/tn/tn_img386.jpg
-rw-r--r--||1|konet||staff||851995|Jul|28||2013|/kb/books/go/go_attack_defense/pages/tn/tn_img387.jpg
-rw-r--r--||1|konet||staff||817621|Jul|28||2013|/kb/books/go/go_attack_defense/pages/tn/tn_img388.jpg
-rw-r--r--||1|konet||staff||899107|Jul|28||2013|/kb/books/go/go_attack_defense/pages/tn/tn_img389.jpg
-rw-r--r--||1|konet||staff||945623|Jul|28||2013|/kb/books/go/go_attack_defense/pages/tn/tn_img390.jpg
-rw-r--r--||1|konet||staff||956754|Jul|28||2013|/kb/books/go/go_attack_defense/pages/tn/tn_img391.jpg
-rw-r--r--||1|konet||staff||995889|Jul|29||2013|/kb/books/go/go_attack_defense/pages/tn/tn_img392.jpg
-rw-r--r--||1|konet||staff||924368|Jul|29||2013|/kb/books/go/go_attack_defense/pages/tn/tn_img393.jpg
-rw-r--r--||1|konet||staff||824827|Jul|29||2013|/kb/books/go/go_attack_defense/pages/tn/tn_img394.jpg
-rw-r--r--||1|konet||staff||862378|Jul|29||2013|/kb/books/go/go_attack_defense/pages/tn/tn_img395.jpg
-rw-r--r--||1|konet||staff||883043|Jul|29||2013|/kb/books/go/go_attack_defense/pages/tn/tn_img396.jpg
-rw-r--r--||1|konet||staff||834414|Jul|29||2013|/kb/books/go/go_attack_defense/pages/tn/tn_img397.jpg
-rw-r--r--||1|konet||staff||772918|Jul|29||2013|/kb/books/go/go_attack_defense/pages/tn/tn_img398.jpg
-rw-r--r--||1|konet||staff||699001|Jul|29||2013|/kb/books/go/go_attack_defense/pages/tn/tn_img399.jpg
-rw-r--r--||1|konet||staff||862577|Jul|29||2013|/kb/books/go/go_attack_defense/pages/tn/tn_img400.jpg
-rw-r--r--||1|konet||staff||859470|Jul|29||2013|/kb/books/go/go_attack_defense/pages/tn/tn_img401.jpg
-rw-r--r--||1|konet||staff||898820|Jul|29||2013|/kb/books/go/go_attack_defense/pages/tn/tn_img402.jpg
-rw-r--r--||1|konet||staff||911795|Jul|29||2013|/kb/books/go/go_attack_defense/pages/tn/tn_img403.jpg
-rw-r--r--||1|konet||staff||682827|Jul|29||2013|/kb/books/go/go_attack_defense/pages/tn/tn_img404.jpg
-rw-r--r--||1|konet||staff||748989|Jul|29||2013|/kb/books/go/go_attack_defense/pages/tn/tn_img405.jpg
-rw-r--r--||1|konet||staff||756089|Jul|29||2013|/kb/books/go/go_attack_defense/pages/tn/tn_img406.jpg
-rw-r--r--||1|konet||staff||947742|Jul|29||2013|/kb/books/go/go_attack_defense/pages/tn/tn_img407.jpg
-rw-r--r--||1|konet||staff||876865|Jul|29||2013|/kb/books/go/go_attack_defense/pages/tn/tn_img408.jpg
-rw-r--r--||1|konet||staff||939929|Jul|29||2013|/kb/books/go/go_attack_defense/pages/tn/tn_img409.jpg
-rw-r--r--||1|konet||staff||857484|Jul|29||2013|/kb/books/go/go_attack_defense/pages/tn/tn_img410.jpg
-rw-r--r--||1|konet||staff||856924|Jul|29||2013|/kb/books/go/go_attack_defense/pages/tn/tn_img411.jpg
-rw-r--r--||1|konet||staff||869657|Jul|29||2013|/kb/books/go/go_attack_defense/pages/tn/tn_img412.jpg
-rw-r--r--||1|konet||staff||890809|Jul|29||2013|/kb/books/go/go_attack_defense/pages/tn/tn_img413.jpg
-rw-r--r--||1|konet||staff||881101|Jul|29||2013|/kb/books/go/go_attack_defense/pages/tn/tn_img414.jpg
-rw-r--r--||1|konet||staff||860242|Jul|29||2013|/kb/books/go/go_attack_defense/pages/tn/tn_img415.jpg
-rw-r--r--||1|konet||staff||867133|Jul|29||2013|/kb/books/go/go_attack_defense/pages/tn/tn_img416.jpg
-rw-r--r--||1|konet||staff||831861|Jul|29||2013|/kb/books/go/go_attack_defense/pages/tn/tn_img417.jpg
-rw-r--r--||1|konet||staff||825595|Jul|29||2013|/kb/books/go/go_attack_defense/pages/tn/tn_img418.jpg
-rw-r--r--||1|konet||staff||679496|Jul|29||2013|/kb/books/go/go_attack_defense/pages/tn/tn_img419.jpg
-rw-r--r--||1|konet||staff||810751|Jul|29||2013|/kb/books/go/go_attack_defense/pages/tn/tn_img420.jpg
-rw-r--r--||1|konet||staff||790732|Jul|29||2013|/kb/books/go/go_attack_defense/pages/tn/tn_img421.jpg
-rw-r--r--||1|konet||staff||845998|Jul|29||2013|/kb/books/go/go_attack_defense/pages/tn/tn_img422.jpg
-rw-r--r--||1|konet||staff||745726|Jul|29||2013|/kb/books/go/go_attack_defense/pages/tn/tn_img423.jpg
-rw-r--r--||1|konet||staff||794258|Jul|29||2013|/kb/books/go/go_attack_defense/pages/tn/tn_img424.jpg
-rw-r--r--||1|konet||staff||620484|Jul|26||2013|/kb/books/go/go_attack_defense/pages/tn/tn_index.jpg
-rw-r--r--||1|konet||staff||1006441|Jul|26||2013|/kb/books/go/go_basics/pages/img023.jpg
-rw-r--r--||1|konet||staff||1047128|Jul|26||2013|/kb/books/go/go_basics/pages/img024.jpg
-rw-r--r--||1|konet||staff||1053967|Jul|26||2013|/kb/books/go/go_basics/pages/img025.jpg
-rw-r--r--||1|konet||staff||1014446|Jul|26||2013|/kb/books/go/go_basics/pages/img026.jpg
-rw-r--r--||1|konet||staff||1026767|Jul|26||2013|/kb/books/go/go_basics/pages/img027.jpg
-rw-r--r--||1|konet||staff||791176|Jul|26||2013|/kb/books/go/go_basics/pages/img028.jpg
-rw-r--r--||1|konet||staff||813175|Jul|26||2013|/kb/books/go/go_basics/pages/img029.jpg
-rw-r--r--||1|konet||staff||924714|Jul|26||2013|/kb/books/go/go_basics/pages/img030.jpg
-rw-r--r--||1|konet||staff||905403|Jul|26||2013|/kb/books/go/go_basics/pages/img031.jpg
-rw-r--r--||1|konet||staff||888119|Jul|26||2013|/kb/books/go/go_basics/pages/img032.jpg
-rw-r--r--||1|konet||staff||1055638|Jul|26||2013|/kb/books/go/go_basics/pages/img033.jpg
-rw-r--r--||1|konet||staff||915998|Jul|26||2013|/kb/books/go/go_basics/pages/img034.jpg
-rw-r--r--||1|konet||staff||837152|Jul|26||2013|/kb/books/go/go_basics/pages/img035.jpg
-rw-r--r--||1|konet||staff||837128|Jul|26||2013|/kb/books/go/go_basics/pages/img036.jpg
-rw-r--r--||1|konet||staff||1089939|Jul|26||2013|/kb/books/go/go_basics/pages/img037.jpg
-rw-r--r--||1|konet||staff||784389|Jul|26||2013|/kb/books/go/go_basics/pages/img038.jpg
-rw-r--r--||1|konet||staff||889289|Jul|26||2013|/kb/books/go/go_basics/pages/img039.jpg
-rw-r--r--||1|konet||staff||969966|Jul|26||2013|/kb/books/go/go_basics/pages/img040.jpg
-rw-r--r--||1|konet||staff||919829|Jul|26||2013|/kb/books/go/go_basics/pages/img041.jpg
-rw-r--r--||1|konet||staff||1002672|Jul|26||2013|/kb/books/go/go_basics/pages/img042.jpg
-rw-r--r--||1|konet||staff||717797|Jul|26||2013|/kb/books/go/go_basics/pages/img043.jpg
-rw-r--r--||1|konet||staff||768692|Jul|26||2013|/kb/books/go/go_basics/pages/img044.jpg
-rw-r--r--||1|konet||staff||952072|Jul|26||2013|/kb/books/go/go_basics/pages/img045.jpg
-rw-r--r--||1|konet||staff||696825|Jul|26||2013|/kb/books/go/go_basics/pages/img046.jpg
-rw-r--r--||1|konet||staff||332310|Jul|26||2013|/kb/books/go/go_basics/pages/img047.jpg
-rw-r--r--||1|konet||staff||445300|Jul|26||2013|/kb/books/go/go_basics/pages/img048.jpg
-rw-r--r--||1|konet||staff||620484|Jul|26||2013|/kb/books/go/go_basics/pages/img049.jpg
-rw-r--r--||1|konet||staff||1006441|Jul|26||2013|/kb/books/go/go_basics/pages/tn/tn_img023.jpg
-rw-r--r--||1|konet||staff||1047128|Jul|26||2013|/kb/books/go/go_basics/pages/tn/tn_img024.jpg
-rw-r--r--||1|konet||staff||1053967|Jul|26||2013|/kb/books/go/go_basics/pages/tn/tn_img025.jpg
-rw-r--r--||1|konet||staff||1014446|Jul|26||2013|/kb/books/go/go_basics/pages/tn/tn_img026.jpg
-rw-r--r--||1|konet||staff||1026767|Jul|26||2013|/kb/books/go/go_basics/pages/tn/tn_img027.jpg
-rw-r--r--||1|konet||staff||791176|Jul|26||2013|/kb/books/go/go_basics/pages/tn/tn_img028.jpg
-rw-r--r--||1|konet||staff||813175|Jul|26||2013|/kb/books/go/go_basics/pages/tn/tn_img029.jpg
-rw-r--r--||1|konet||staff||924714|Jul|26||2013|/kb/books/go/go_basics/pages/tn/tn_img030.jpg
-rw-r--r--||1|konet||staff||905403|Jul|26||2013|/kb/books/go/go_basics/pages/tn/tn_img031.jpg
-rw-r--r--||1|konet||staff||888119|Jul|26||2013|/kb/books/go/go_basics/pages/tn/tn_img032.jpg
-rw-r--r--||1|konet||staff||1055638|Jul|26||2013|/kb/books/go/go_basics/pages/tn/tn_img033.jpg
-rw-r--r--||1|konet||staff||915998|Jul|26||2013|/kb/books/go/go_basics/pages/tn/tn_img034.jpg
-rw-r--r--||1|konet||staff||837152|Jul|26||2013|/kb/books/go/go_basics/pages/tn/tn_img035.jpg
-rw-r--r--||1|konet||staff||837128|Jul|26||2013|/kb/books/go/go_basics/pages/tn/tn_img036.jpg
-rw-r--r--||1|konet||staff||1089939|Jul|26||2013|/kb/books/go/go_basics/pages/tn/tn_img037.jpg
-rw-r--r--||1|konet||staff||784389|Jul|26||2013|/kb/books/go/go_basics/pages/tn/tn_img038.jpg
-rw-r--r--||1|konet||staff||889289|Jul|26||2013|/kb/books/go/go_basics/pages/tn/tn_img039.jpg
-rw-r--r--||1|konet||staff||969966|Jul|26||2013|/kb/books/go/go_basics/pages/tn/tn_img040.jpg
-rw-r--r--||1|konet||staff||919829|Jul|26||2013|/kb/books/go/go_basics/pages/tn/tn_img041.jpg
-rw-r--r--||1|konet||staff||1002672|Jul|26||2013|/kb/books/go/go_basics/pages/tn/tn_img042.jpg
-rw-r--r--||1|konet||staff||717797|Jul|26||2013|/kb/books/go/go_basics/pages/tn/tn_img043.jpg
-rw-r--r--||1|konet||staff||768692|Jul|26||2013|/kb/books/go/go_basics/pages/tn/tn_img044.jpg
-rw-r--r--||1|konet||staff||952072|Jul|26||2013|/kb/books/go/go_basics/pages/tn/tn_img045.jpg
-rw-r--r--||1|konet||staff||696825|Jul|26||2013|/kb/books/go/go_basics/pages/tn/tn_img046.jpg
-rw-r--r--||1|konet||staff||332310|Jul|26||2013|/kb/books/go/go_basics/pages/tn/tn_img047.jpg
-rw-r--r--||1|konet||staff||445300|Jul|26||2013|/kb/books/go/go_basics/pages/tn/tn_img048.jpg
-rw-r--r--||1|konet||staff||620484|Jul|26||2013|/kb/books/go/go_basics/pages/tn/tn_img049.jpg
-rw-r--r--||1|konet||staff||358516|Jul|26||2013|/kb/books/go/go_equipment/pages/img050.jpg
-rw-r--r--||1|konet||staff||516648|Jul|26||2013|/kb/books/go/go_equipment/pages/img051.jpg
-rw-r--r--||1|konet||staff||791156|Jul|26||2013|/kb/books/go/go_equipment/pages/img052.jpg
-rw-r--r--||1|konet||staff||486725|Jul|26||2013|/kb/books/go/go_equipment/pages/img053.jpg
-rw-r--r--||1|konet||staff||948089|Jul|26||2013|/kb/books/go/go_equipment/pages/img054.jpg
-rw-r--r--||1|konet||staff||1033406|Jul|26||2013|/kb/books/go/go_equipment/pages/img055.jpg
-rw-r--r--||1|konet||staff||687569|Jul|26||2013|/kb/books/go/go_equipment/pages/img056.jpg
-rw-r--r--||1|konet||staff||1065658|Jul|26||2013|/kb/books/go/go_equipment/pages/img057.jpg
-rw-r--r--||1|konet||staff||857686|Jul|26||2013|/kb/books/go/go_equipment/pages/img058.jpg
-rw-r--r--||1|konet||staff||603590|Apr|14||2013|/kb/books/go/go_equipment/pages/img061.jpg
-rw-r--r--||1|konet||staff||1374190|Apr|14||2013|/kb/books/go/go_equipment/pages/img062.jpg
-rw-r--r--||1|konet||staff||976954|Apr|14||2013|/kb/books/go/go_equipment/pages/img063.jpg
-rw-r--r--||1|konet||staff||592214|Apr|14||2013|/kb/books/go/go_equipment/pages/img064.jpg
-rw-r--r--||1|konet||staff||390273|Apr|14||2013|/kb/books/go/go_equipment/pages/img065.jpg
-rw-r--r--||1|konet||staff||1340886|Apr|14||2013|/kb/books/go/go_equipment/pages/img066.jpg
-rw-r--r--||1|konet||staff||807810|Apr|14||2013|/kb/books/go/go_equipment/pages/img067.jpg
-rw-r--r--||1|konet||staff||537637|Apr|14||2013|/kb/books/go/go_equipment/pages/img068.jpg
-rw-r--r--||1|konet||staff||358516|Jul|26||2013|/kb/books/go/go_equipment/pages/tn/tn_img050.jpg
-rw-r--r--||1|konet||staff||516648|Jul|26||2013|/kb/books/go/go_equipment/pages/tn/tn_img051.jpg
-rw-r--r--||1|konet||staff||791156|Jul|26||2013|/kb/books/go/go_equipment/pages/tn/tn_img052.jpg
-rw-r--r--||1|konet||staff||486725|Jul|26||2013|/kb/books/go/go_equipment/pages/tn/tn_img053.jpg
-rw-r--r--||1|konet||staff||948089|Jul|26||2013|/kb/books/go/go_equipment/pages/tn/tn_img054.jpg
-rw-r--r--||1|konet||staff||1033406|Jul|26||2013|/kb/books/go/go_equipment/pages/tn/tn_img055.jpg
-rw-r--r--||1|konet||staff||687569|Jul|26||2013|/kb/books/go/go_equipment/pages/tn/tn_img056.jpg
-rw-r--r--||1|konet||staff||1065658|Jul|26||2013|/kb/books/go/go_equipment/pages/tn/tn_img057.jpg
-rw-r--r--||1|konet||staff||857686|Jul|26||2013|/kb/books/go/go_equipment/pages/tn/tn_img058.jpg
-rw-r--r--||1|konet||staff||603590|Apr|14||2013|/kb/books/go/go_equipment/pages/tn/tn_img061.jpg
-rw-r--r--||1|konet||staff||1374190|Apr|14||2013|/kb/books/go/go_equipment/pages/tn/tn_img062.jpg
-rw-r--r--||1|konet||staff||976954|Apr|14||2013|/kb/books/go/go_equipment/pages/tn/tn_img063.jpg
-rw-r--r--||1|konet||staff||592214|Apr|14||2013|/kb/books/go/go_equipment/pages/tn/tn_img064.jpg
-rw-r--r--||1|konet||staff||390273|Apr|14||2013|/kb/books/go/go_equipment/pages/tn/tn_img065.jpg
-rw-r--r--||1|konet||staff||1340886|Apr|14||2013|/kb/books/go/go_equipment/pages/tn/tn_img066.jpg
-rw-r--r--||1|konet||staff||807810|Apr|14||2013|/kb/books/go/go_equipment/pages/tn/tn_img067.jpg
-rw-r--r--||1|konet||staff||537637|Apr|14||2013|/kb/books/go/go_equipment/pages/tn/tn_img068.jpg
-rw-r--r--||1|konet||staff||964295|Jul|26||2013|/kb/books/go/go_joseki/pages/img070.jpg
-rw-r--r--||1|konet||staff||951817|Jul|26||2013|/kb/books/go/go_joseki/pages/img071.jpg
-rw-r--r--||1|konet||staff||854354|Jul|26||2013|/kb/books/go/go_joseki/pages/img072.jpg
-rw-r--r--||1|konet||staff||904237|Jul|26||2013|/kb/books/go/go_joseki/pages/img073.jpg
-rw-r--r--||1|konet||staff||808049|Jul|26||2013|/kb/books/go/go_joseki/pages/img074.jpg
-rw-r--r--||1|konet||staff||899297|Jul|26||2013|/kb/books/go/go_joseki/pages/img075.jpg
-rw-r--r--||1|konet||staff||907623|Jul|26||2013|/kb/books/go/go_joseki/pages/img076.jpg
-rw-r--r--||1|konet||staff||759807|Jul|26||2013|/kb/books/go/go_joseki/pages/img077.jpg
-rw-r--r--||1|konet||staff||1058618|Jul|26||2013|/kb/books/go/go_joseki/pages/img078.jpg
-rw-r--r--||1|konet||staff||1097406|Jul|26||2013|/kb/books/go/go_joseki/pages/img079.jpg
-rw-r--r--||1|konet||staff||1071509|Jul|26||2013|/kb/books/go/go_joseki/pages/img080.jpg
-rw-r--r--||1|konet||staff||1222293|Jul|26||2013|/kb/books/go/go_joseki/pages/img081.jpg
-rw-r--r--||1|konet||staff||809594|Jul|26||2013|/kb/books/go/go_joseki/pages/img082.jpg
-rw-r--r--||1|konet||staff||976407|Jul|26||2013|/kb/books/go/go_joseki/pages/img083.jpg
-rw-r--r--||1|konet||staff||1107226|Jul|26||2013|/kb/books/go/go_joseki/pages/img084.jpg
-rw-r--r--||1|konet||staff||1026899|Jul|26||2013|/kb/books/go/go_joseki/pages/img085.jpg
-rw-r--r--||1|konet||staff||1024022|Jul|26||2013|/kb/books/go/go_joseki/pages/img086.jpg
-rw-r--r--||1|konet||staff||1029782|Jul|26||2013|/kb/books/go/go_joseki/pages/img087.jpg
-rw-r--r--||1|konet||staff||1051070|Jul|26||2013|/kb/books/go/go_joseki/pages/img088.jpg
-rw-r--r--||1|konet||staff||956297|Jul|26||2013|/kb/books/go/go_joseki/pages/img089.jpg
-rw-r--r--||1|konet||staff||1037967|Jul|26||2013|/kb/books/go/go_joseki/pages/img090.jpg
-rw-r--r--||1|konet||staff||1019427|Jul|26||2013|/kb/books/go/go_joseki/pages/img091.jpg
-rw-r--r--||1|konet||staff||1106972|Jul|26||2013|/kb/books/go/go_joseki/pages/img092.jpg
-rw-r--r--||1|konet||staff||1110897|Jul|26||2013|/kb/books/go/go_joseki/pages/img093.jpg
-rw-r--r--||1|konet||staff||1073256|Jul|26||2013|/kb/books/go/go_joseki/pages/img094.jpg
-rw-r--r--||1|konet||staff||867457|Jul|27||2013|/kb/books/go/go_joseki/pages/img095.jpg
-rw-r--r--||1|konet||staff||1093950|Jul|27||2013|/kb/books/go/go_joseki/pages/img096.jpg
-rw-r--r--||1|konet||staff||1215177|Jul|27||2013|/kb/books/go/go_joseki/pages/img097.jpg
-rw-r--r--||1|konet||staff||1126591|Jul|27||2013|/kb/books/go/go_joseki/pages/img098.jpg
-rw-r--r--||1|konet||staff||1146058|Jul|27||2013|/kb/books/go/go_joseki/pages/img099.jpg
-rw-r--r--||1|konet||staff||998658|Jul|27||2013|/kb/books/go/go_joseki/pages/img100.jpg
-rw-r--r--||1|konet||staff||950064|Jul|27||2013|/kb/books/go/go_joseki/pages/img101.jpg
-rw-r--r--||1|konet||staff||1113709|Jul|27||2013|/kb/books/go/go_joseki/pages/img102.jpg
-rw-r--r--||1|konet||staff||1073193|Jul|27||2013|/kb/books/go/go_joseki/pages/img103.jpg
-rw-r--r--||1|konet||staff||965100|Jul|27||2013|/kb/books/go/go_joseki/pages/img104.jpg
-rw-r--r--||1|konet||staff||967947|Jul|27||2013|/kb/books/go/go_joseki/pages/img105.jpg
-rw-r--r--||1|konet||staff||1053408|Jul|27||2013|/kb/books/go/go_joseki/pages/img106.jpg
-rw-r--r--||1|konet||staff||1108979|Jul|27||2013|/kb/books/go/go_joseki/pages/img107.jpg
-rw-r--r--||1|konet||staff||993497|Jul|27||2013|/kb/books/go/go_joseki/pages/img108.jpg
-rw-r--r--||1|konet||staff||970885|Jul|27||2013|/kb/books/go/go_joseki/pages/img109.jpg
-rw-r--r--||1|konet||staff||1053854|Jul|27||2013|/kb/books/go/go_joseki/pages/img110.jpg
-rw-r--r--||1|konet||staff||984744|Jul|27||2013|/kb/books/go/go_joseki/pages/img111.jpg
-rw-r--r--||1|konet||staff||1053819|Jul|27||2013|/kb/books/go/go_joseki/pages/img112.jpg
-rw-r--r--||1|konet||staff||1187421|Jul|27||2013|/kb/books/go/go_joseki/pages/img113.jpg
-rw-r--r--||1|konet||staff||964581|Jul|27||2013|/kb/books/go/go_joseki/pages/img114.jpg
-rw-r--r--||1|konet||staff||978287|Jul|27||2013|/kb/books/go/go_joseki/pages/img115.jpg
-rw-r--r--||1|konet||staff||917482|Jul|27||2013|/kb/books/go/go_joseki/pages/img116.jpg
-rw-r--r--||1|konet||staff||991987|Jul|27||2013|/kb/books/go/go_joseki/pages/img117.jpg
-rw-r--r--||1|konet||staff||898921|Jul|27||2013|/kb/books/go/go_joseki/pages/img118.jpg
-rw-r--r--||1|konet||staff||1012220|Jul|27||2013|/kb/books/go/go_joseki/pages/img119.jpg
-rw-r--r--||1|konet||staff||1072925|Jul|27||2013|/kb/books/go/go_joseki/pages/img120.jpg
-rw-r--r--||1|konet||staff||872746|Jul|27||2013|/kb/books/go/go_joseki/pages/img121.jpg
-rw-r--r--||1|konet||staff||866500|Jul|27||2013|/kb/books/go/go_joseki/pages/img122.jpg
-rw-r--r--||1|konet||staff||1009773|Jul|27||2013|/kb/books/go/go_joseki/pages/img123.jpg
-rw-r--r--||1|konet||staff||968391|Jul|27||2013|/kb/books/go/go_joseki/pages/img124.jpg
-rw-r--r--||1|konet||staff||703303|Jul|27||2013|/kb/books/go/go_joseki/pages/img125.jpg
-rw-r--r--||1|konet||staff||950503|Jul|27||2013|/kb/books/go/go_joseki/pages/img126.jpg
-rw-r--r--||1|konet||staff||998706|Jul|27||2013|/kb/books/go/go_joseki/pages/img127.jpg
-rw-r--r--||1|konet||staff||873116|Jul|27||2013|/kb/books/go/go_joseki/pages/img128.jpg
-rw-r--r--||1|konet||staff||821432|Jul|27||2013|/kb/books/go/go_joseki/pages/img129.jpg
-rw-r--r--||1|konet||staff||825088|Jul|27||2013|/kb/books/go/go_joseki/pages/img130.jpg
-rw-r--r--||1|konet||staff||896338|Jul|27||2013|/kb/books/go/go_joseki/pages/img131.jpg
-rw-r--r--||1|konet||staff||963585|Jul|27||2013|/kb/books/go/go_joseki/pages/img132.jpg
-rw-r--r--||1|konet||staff||983883|Jul|27||2013|/kb/books/go/go_joseki/pages/img133.jpg
-rw-r--r--||1|konet||staff||873892|Jul|27||2013|/kb/books/go/go_joseki/pages/img134.jpg
-rw-r--r--||1|konet||staff||769739|Jul|27||2013|/kb/books/go/go_joseki/pages/img135.jpg
-rw-r--r--||1|konet||staff||713637|Jul|27||2013|/kb/books/go/go_joseki/pages/img136.jpg
-rw-r--r--||1|konet||staff||584476|Jul|27||2013|/kb/books/go/go_joseki/pages/img137.jpg
-rw-r--r--||1|konet||staff||909033|Jul|27||2013|/kb/books/go/go_joseki/pages/img138.jpg
-rw-r--r--||1|konet||staff||1022877|Jul|27||2013|/kb/books/go/go_joseki/pages/img139.jpg
-rw-r--r--||1|konet||staff||744019|Jul|27||2013|/kb/books/go/go_joseki/pages/img140.jpg
-rw-r--r--||1|konet||staff||166301|Jul|27||2013|/kb/books/go/go_joseki/pages/img141.jpg
-rw-r--r--||1|konet||staff||404802|Jul|27||2013|/kb/books/go/go_joseki/pages/img142.jpg
-rw-r--r--||1|konet||staff||536562|Jul|27||2013|/kb/books/go/go_joseki/pages/img143.jpg
-rw-r--r--||1|konet||staff||964295|Jul|26||2013|/kb/books/go/go_joseki/pages/tn/tn_img070.jpg
-rw-r--r--||1|konet||staff||951817|Jul|26||2013|/kb/books/go/go_joseki/pages/tn/tn_img071.jpg
-rw-r--r--||1|konet||staff||854354|Jul|26||2013|/kb/books/go/go_joseki/pages/tn/tn_img072.jpg
-rw-r--r--||1|konet||staff||904237|Jul|26||2013|/kb/books/go/go_joseki/pages/tn/tn_img073.jpg
-rw-r--r--||1|konet||staff||808049|Jul|26||2013|/kb/books/go/go_joseki/pages/tn/tn_img074.jpg
-rw-r--r--||1|konet||staff||899297|Jul|26||2013|/kb/books/go/go_joseki/pages/tn/tn_img075.jpg
-rw-r--r--||1|konet||staff||907623|Jul|26||2013|/kb/books/go/go_joseki/pages/tn/tn_img076.jpg
-rw-r--r--||1|konet||staff||759807|Jul|26||2013|/kb/books/go/go_joseki/pages/tn/tn_img077.jpg
-rw-r--r--||1|konet||staff||1058618|Jul|26||2013|/kb/books/go/go_joseki/pages/tn/tn_img078.jpg
-rw-r--r--||1|konet||staff||1097406|Jul|26||2013|/kb/books/go/go_joseki/pages/tn/tn_img079.jpg
-rw-r--r--||1|konet||staff||1071509|Jul|26||2013|/kb/books/go/go_joseki/pages/tn/tn_img080.jpg
-rw-r--r--||1|konet||staff||1222293|Jul|26||2013|/kb/books/go/go_joseki/pages/tn/tn_img081.jpg
-rw-r--r--||1|konet||staff||809594|Jul|26||2013|/kb/books/go/go_joseki/pages/tn/tn_img082.jpg
-rw-r--r--||1|konet||staff||976407|Jul|26||2013|/kb/books/go/go_joseki/pages/tn/tn_img083.jpg
-rw-r--r--||1|konet||staff||1107226|Jul|26||2013|/kb/books/go/go_joseki/pages/tn/tn_img084.jpg
-rw-r--r--||1|konet||staff||1026899|Jul|26||2013|/kb/books/go/go_joseki/pages/tn/tn_img085.jpg
-rw-r--r--||1|konet||staff||1024022|Jul|26||2013|/kb/books/go/go_joseki/pages/tn/tn_img086.jpg
-rw-r--r--||1|konet||staff||1029782|Jul|26||2013|/kb/books/go/go_joseki/pages/tn/tn_img087.jpg
-rw-r--r--||1|konet||staff||1051070|Jul|26||2013|/kb/books/go/go_joseki/pages/tn/tn_img088.jpg
-rw-r--r--||1|konet||staff||956297|Jul|26||2013|/kb/books/go/go_joseki/pages/tn/tn_img089.jpg
-rw-r--r--||1|konet||staff||1037967|Jul|26||2013|/kb/books/go/go_joseki/pages/tn/tn_img090.jpg
-rw-r--r--||1|konet||staff||1019427|Jul|26||2013|/kb/books/go/go_joseki/pages/tn/tn_img091.jpg
-rw-r--r--||1|konet||staff||1106972|Jul|26||2013|/kb/books/go/go_joseki/pages/tn/tn_img092.jpg
-rw-r--r--||1|konet||staff||1110897|Jul|26||2013|/kb/books/go/go_joseki/pages/tn/tn_img093.jpg
-rw-r--r--||1|konet||staff||1073256|Jul|26||2013|/kb/books/go/go_joseki/pages/tn/tn_img094.jpg
-rw-r--r--||1|konet||staff||867457|Jul|27||2013|/kb/books/go/go_joseki/pages/tn/tn_img095.jpg
-rw-r--r--||1|konet||staff||1093950|Jul|27||2013|/kb/books/go/go_joseki/pages/tn/tn_img096.jpg
-rw-r--r--||1|konet||staff||1215177|Jul|27||2013|/kb/books/go/go_joseki/pages/tn/tn_img097.jpg
-rw-r--r--||1|konet||staff||1126591|Jul|27||2013|/kb/books/go/go_joseki/pages/tn/tn_img098.jpg
-rw-r--r--||1|konet||staff||1146058|Jul|27||2013|/kb/books/go/go_joseki/pages/tn/tn_img099.jpg
-rw-r--r--||1|konet||staff||998658|Jul|27||2013|/kb/books/go/go_joseki/pages/tn/tn_img100.jpg
-rw-r--r--||1|konet||staff||950064|Jul|27||2013|/kb/books/go/go_joseki/pages/tn/tn_img101.jpg
-rw-r--r--||1|konet||staff||1113709|Jul|27||2013|/kb/books/go/go_joseki/pages/tn/tn_img102.jpg
-rw-r--r--||1|konet||staff||1073193|Jul|27||2013|/kb/books/go/go_joseki/pages/tn/tn_img103.jpg
-rw-r--r--||1|konet||staff||965100|Jul|27||2013|/kb/books/go/go_joseki/pages/tn/tn_img104.jpg
-rw-r--r--||1|konet||staff||967947|Jul|27||2013|/kb/books/go/go_joseki/pages/tn/tn_img105.jpg
-rw-r--r--||1|konet||staff||1053408|Jul|27||2013|/kb/books/go/go_joseki/pages/tn/tn_img106.jpg
-rw-r--r--||1|konet||staff||1108979|Jul|27||2013|/kb/books/go/go_joseki/pages/tn/tn_img107.jpg
-rw-r--r--||1|konet||staff||993497|Jul|27||2013|/kb/books/go/go_joseki/pages/tn/tn_img108.jpg
-rw-r--r--||1|konet||staff||970885|Jul|27||2013|/kb/books/go/go_joseki/pages/tn/tn_img109.jpg
-rw-r--r--||1|konet||staff||1053854|Jul|27||2013|/kb/books/go/go_joseki/pages/tn/tn_img110.jpg
-rw-r--r--||1|konet||staff||984744|Jul|27||2013|/kb/books/go/go_joseki/pages/tn/tn_img111.jpg
-rw-r--r--||1|konet||staff||1053819|Jul|27||2013|/kb/books/go/go_joseki/pages/tn/tn_img112.jpg
-rw-r--r--||1|konet||staff||1187421|Jul|27||2013|/kb/books/go/go_joseki/pages/tn/tn_img113.jpg
-rw-r--r--||1|konet||staff||964581|Jul|27||2013|/kb/books/go/go_joseki/pages/tn/tn_img114.jpg
-rw-r--r--||1|konet||staff||978287|Jul|27||2013|/kb/books/go/go_joseki/pages/tn/tn_img115.jpg
-rw-r--r--||1|konet||staff||917482|Jul|27||2013|/kb/books/go/go_joseki/pages/tn/tn_img116.jpg
-rw-r--r--||1|konet||staff||991987|Jul|27||2013|/kb/books/go/go_joseki/pages/tn/tn_img117.jpg
-rw-r--r--||1|konet||staff||898921|Jul|27||2013|/kb/books/go/go_joseki/pages/tn/tn_img118.jpg
-rw-r--r--||1|konet||staff||1012220|Jul|27||2013|/kb/books/go/go_joseki/pages/tn/tn_img119.jpg
-rw-r--r--||1|konet||staff||1072925|Jul|27||2013|/kb/books/go/go_joseki/pages/tn/tn_img120.jpg
-rw-r--r--||1|konet||staff||872746|Jul|27||2013|/kb/books/go/go_joseki/pages/tn/tn_img121.jpg
-rw-r--r--||1|konet||staff||866500|Jul|27||2013|/kb/books/go/go_joseki/pages/tn/tn_img122.jpg
-rw-r--r--||1|konet||staff||1009773|Jul|27||2013|/kb/books/go/go_joseki/pages/tn/tn_img123.jpg
-rw-r--r--||1|konet||staff||968391|Jul|27||2013|/kb/books/go/go_joseki/pages/tn/tn_img124.jpg
-rw-r--r--||1|konet||staff||703303|Jul|27||2013|/kb/books/go/go_joseki/pages/tn/tn_img125.jpg
-rw-r--r--||1|konet||staff||950503|Jul|27||2013|/kb/books/go/go_joseki/pages/tn/tn_img126.jpg
-rw-r--r--||1|konet||staff||998706|Jul|27||2013|/kb/books/go/go_joseki/pages/tn/tn_img127.jpg
-rw-r--r--||1|konet||staff||873116|Jul|27||2013|/kb/books/go/go_joseki/pages/tn/tn_img128.jpg
-rw-r--r--||1|konet||staff||821432|Jul|27||2013|/kb/books/go/go_joseki/pages/tn/tn_img129.jpg
-rw-r--r--||1|konet||staff||825088|Jul|27||2013|/kb/books/go/go_joseki/pages/tn/tn_img130.jpg
-rw-r--r--||1|konet||staff||896338|Jul|27||2013|/kb/books/go/go_joseki/pages/tn/tn_img131.jpg
-rw-r--r--||1|konet||staff||963585|Jul|27||2013|/kb/books/go/go_joseki/pages/tn/tn_img132.jpg
-rw-r--r--||1|konet||staff||983883|Jul|27||2013|/kb/books/go/go_joseki/pages/tn/tn_img133.jpg
-rw-r--r--||1|konet||staff||873892|Jul|27||2013|/kb/books/go/go_joseki/pages/tn/tn_img134.jpg
-rw-r--r--||1|konet||staff||769739|Jul|27||2013|/kb/books/go/go_joseki/pages/tn/tn_img135.jpg
-rw-r--r--||1|konet||staff||713637|Jul|27||2013|/kb/books/go/go_joseki/pages/tn/tn_img136.jpg
-rw-r--r--||1|konet||staff||584476|Jul|27||2013|/kb/books/go/go_joseki/pages/tn/tn_img137.jpg
-rw-r--r--||1|konet||staff||909033|Jul|27||2013|/kb/books/go/go_joseki/pages/tn/tn_img138.jpg
-rw-r--r--||1|konet||staff||1022877|Jul|27||2013|/kb/books/go/go_joseki/pages/tn/tn_img139.jpg
-rw-r--r--||1|konet||staff||744019|Jul|27||2013|/kb/books/go/go_joseki/pages/tn/tn_img140.jpg
-rw-r--r--||1|konet||staff||166301|Jul|27||2013|/kb/books/go/go_joseki/pages/tn/tn_img141.jpg
-rw-r--r--||1|konet||staff||404802|Jul|27||2013|/kb/books/go/go_joseki/pages/tn/tn_img142.jpg
-rw-r--r--||1|konet||staff||536562|Jul|27||2013|/kb/books/go/go_joseki/pages/tn/tn_img143.jpg
-rw-r--r--||1|konet||staff||437291|Jul|28||2013|/kb/books/go/go_middlegame/pages/img183.jpg
-rw-r--r--||1|konet||staff||525694|Jul|28||2013|/kb/books/go/go_middlegame/pages/img184.jpg
-rw-r--r--||1|konet||staff||653806|Jul|28||2013|/kb/books/go/go_middlegame/pages/img185.jpg
-rw-r--r--||1|konet||staff||841874|Jul|28||2013|/kb/books/go/go_middlegame/pages/img186.jpg
-rw-r--r--||1|konet||staff||783850|Jul|28||2013|/kb/books/go/go_middlegame/pages/img187.jpg
-rw-r--r--||1|konet||staff||759335|Jul|28||2013|/kb/books/go/go_middlegame/pages/img188.jpg
-rw-r--r--||1|konet||staff||777431|Jul|28||2013|/kb/books/go/go_middlegame/pages/img189.jpg
-rw-r--r--||1|konet||staff||621857|Jul|28||2013|/kb/books/go/go_middlegame/pages/img190.jpg
-rw-r--r--||1|konet||staff||621065|Jul|28||2013|/kb/books/go/go_middlegame/pages/img213.jpg
-rw-r--r--||1|konet||staff||660424|Jul|28||2013|/kb/books/go/go_middlegame/pages/img214.jpg
-rw-r--r--||1|konet||staff||640766|Jul|28||2013|/kb/books/go/go_middlegame/pages/img215.jpg
-rw-r--r--||1|konet||staff||701699|Jul|28||2013|/kb/books/go/go_middlegame/pages/img216.jpg
-rw-r--r--||1|konet||staff||684817|Jul|28||2013|/kb/books/go/go_middlegame/pages/img217.jpg
-rw-r--r--||1|konet||staff||693628|Jul|28||2013|/kb/books/go/go_middlegame/pages/img218.jpg
-rw-r--r--||1|konet||staff||652074|Jul|28||2013|/kb/books/go/go_middlegame/pages/img219.jpg
-rw-r--r--||1|konet||staff||665520|Jul|28||2013|/kb/books/go/go_middlegame/pages/img220.jpg
-rw-r--r--||1|konet||staff||664979|Jul|28||2013|/kb/books/go/go_middlegame/pages/img221.jpg
-rw-r--r--||1|konet||staff||420880|Jul|28||2013|/kb/books/go/go_middlegame/pages/img222.jpg
-rw-r--r--||1|konet||staff||653179|Jul|28||2013|/kb/books/go/go_middlegame/pages/img223.jpg
-rw-r--r--||1|konet||staff||631018|Jul|28||2013|/kb/books/go/go_middlegame/pages/img224.jpg
-rw-r--r--||1|konet||staff||614888|Jul|28||2013|/kb/books/go/go_middlegame/pages/img225.jpg
-rw-r--r--||1|konet||staff||635578|Jul|28||2013|/kb/books/go/go_middlegame/pages/img226.jpg
-rw-r--r--||1|konet||staff||664987|Jul|28||2013|/kb/books/go/go_middlegame/pages/img227.jpg
-rw-r--r--||1|konet||staff||494882|Jul|28||2013|/kb/books/go/go_middlegame/pages/img228.jpg
-rw-r--r--||1|konet||staff||755517|Jul|28||2013|/kb/books/go/go_middlegame/pages/img229.jpg
-rw-r--r--||1|konet||staff||746024|Jul|28||2013|/kb/books/go/go_middlegame/pages/img230.jpg
-rw-r--r--||1|konet||staff||740563|Jul|28||2013|/kb/books/go/go_middlegame/pages/img231.jpg
-rw-r--r--||1|konet||staff||720673|Jul|28||2013|/kb/books/go/go_middlegame/pages/img232.jpg
-rw-r--r--||1|konet||staff||641901|Jul|28||2013|/kb/books/go/go_middlegame/pages/img233.jpg
-rw-r--r--||1|konet||staff||681172|Jul|28||2013|/kb/books/go/go_middlegame/pages/img234.jpg
-rw-r--r--||1|konet||staff||681621|Jul|28||2013|/kb/books/go/go_middlegame/pages/img235.jpg
-rw-r--r--||1|konet||staff||699626|Jul|28||2013|/kb/books/go/go_middlegame/pages/img236.jpg
-rw-r--r--||1|konet||staff||692405|Jul|28||2013|/kb/books/go/go_middlegame/pages/img237.jpg
-rw-r--r--||1|konet||staff||675217|Jul|28||2013|/kb/books/go/go_middlegame/pages/img238.jpg
-rw-r--r--||1|konet||staff||637166|Jul|28||2013|/kb/books/go/go_middlegame/pages/img239.jpg
-rw-r--r--||1|konet||staff||638038|Jul|28||2013|/kb/books/go/go_middlegame/pages/img240.jpg
-rw-r--r--||1|konet||staff||746258|Jul|28||2013|/kb/books/go/go_middlegame/pages/img241.jpg
-rw-r--r--||1|konet||staff||697934|Jul|28||2013|/kb/books/go/go_middlegame/pages/img242.jpg
-rw-r--r--||1|konet||staff||680670|Jul|28||2013|/kb/books/go/go_middlegame/pages/img243.jpg
-rw-r--r--||1|konet||staff||666127|Jul|28||2013|/kb/books/go/go_middlegame/pages/img244.jpg
-rw-r--r--||1|konet||staff||703644|Jul|28||2013|/kb/books/go/go_middlegame/pages/img245.jpg
-rw-r--r--||1|konet||staff||674102|Jul|28||2013|/kb/books/go/go_middlegame/pages/img246.jpg
-rw-r--r--||1|konet||staff||684526|Jul|28||2013|/kb/books/go/go_middlegame/pages/img247.jpg
-rw-r--r--||1|konet||staff||648526|Jul|28||2013|/kb/books/go/go_middlegame/pages/img248.jpg
-rw-r--r--||1|konet||staff||728614|Jul|28||2013|/kb/books/go/go_middlegame/pages/img249.jpg
-rw-r--r--||1|konet||staff||663415|Jul|28||2013|/kb/books/go/go_middlegame/pages/img250.jpg
-rw-r--r--||1|konet||staff||694657|Jul|28||2013|/kb/books/go/go_middlegame/pages/img251.jpg
-rw-r--r--||1|konet||staff||673729|Jul|28||2013|/kb/books/go/go_middlegame/pages/img252.jpg
-rw-r--r--||1|konet||staff||663575|Jul|28||2013|/kb/books/go/go_middlegame/pages/img253.jpg
-rw-r--r--||1|konet||staff||464991|Jul|28||2013|/kb/books/go/go_middlegame/pages/img254.jpg
-rw-r--r--||1|konet||staff||756849|Jul|28||2013|/kb/books/go/go_middlegame/pages/img255.jpg
-rw-r--r--||1|konet||staff||761547|Jul|28||2013|/kb/books/go/go_middlegame/pages/img256.jpg
-rw-r--r--||1|konet||staff||801070|Jul|28||2013|/kb/books/go/go_middlegame/pages/img257.jpg
-rw-r--r--||1|konet||staff||739075|Jul|28||2013|/kb/books/go/go_middlegame/pages/img258.jpg
-rw-r--r--||1|konet||staff||787189|Jul|28||2013|/kb/books/go/go_middlegame/pages/img259.jpg
-rw-r--r--||1|konet||staff||729433|Jul|28||2013|/kb/books/go/go_middlegame/pages/img260.jpg
-rw-r--r--||1|konet||staff||793385|Jul|28||2013|/kb/books/go/go_middlegame/pages/img261.jpg
-rw-r--r--||1|konet||staff||756141|Jul|28||2013|/kb/books/go/go_middlegame/pages/img262.jpg
-rw-r--r--||1|konet||staff||779572|Jul|28||2013|/kb/books/go/go_middlegame/pages/img263.jpg
-rw-r--r--||1|konet||staff||759079|Jul|28||2013|/kb/books/go/go_middlegame/pages/img264.jpg
-rw-r--r--||1|konet||staff||738282|Jul|28||2013|/kb/books/go/go_middlegame/pages/img265.jpg
-rw-r--r--||1|konet||staff||814029|Jul|28||2013|/kb/books/go/go_middlegame/pages/img266.jpg
-rw-r--r--||1|konet||staff||833386|Jul|28||2013|/kb/books/go/go_middlegame/pages/img267.jpg
-rw-r--r--||1|konet||staff||188285|Jul|28||2013|/kb/books/go/go_middlegame/pages/img268.jpg
-rw-r--r--||1|konet||staff||369506|Jul|28||2013|/kb/books/go/go_middlegame/pages/img269.jpg
-rw-r--r--||1|konet||staff||384764|Jul|28||2013|/kb/books/go/go_middlegame/pages/img270.jpg
-rw-r--r--||1|konet||staff||547382|Jul|28||2013|/kb/books/go/go_middlegame/pages/img271.jpg
-rw-r--r--||1|konet||staff||647343|Jul|28||2013|/kb/books/go/go_middlegame/pages/img272.jpg
-rw-r--r--||1|konet||staff||1070171|Jul|28||2013|/kb/books/go/go_middlegame/pages/img273.jpg
-rw-r--r--||1|konet||staff||1188408|Jul|28||2013|/kb/books/go/go_middlegame/pages/img274.jpg
-rw-r--r--||1|konet||staff||315266|Jul|28||2013|/kb/books/go/go_middlegame/pages/img275.jpg
-rw-r--r--||1|konet||staff||299360|Jul|28||2013|/kb/books/go/go_middlegame/pages/img276.jpg
-rw-r--r--||1|konet||staff||707195|Jul|28||2013|/kb/books/go/go_middlegame/pages/img277.jpg
-rw-r--r--||1|konet||staff||872457|Jul|28||2013|/kb/books/go/go_middlegame/pages/img278.jpg
-rw-r--r--||1|konet||staff||959051|Jul|28||2013|/kb/books/go/go_middlegame/pages/img279.jpg
-rw-r--r--||1|konet||staff||920879|Jul|28||2013|/kb/books/go/go_middlegame/pages/img280.jpg
-rw-r--r--||1|konet||staff||926630|Jul|28||2013|/kb/books/go/go_middlegame/pages/img281.jpg
-rw-r--r--||1|konet||staff||1034689|Jul|28||2013|/kb/books/go/go_middlegame/pages/img282.jpg
-rw-r--r--||1|konet||staff||341434|Jul|25||2013|/kb/books/go/go_middlegame/pages/img283.jpg
-rw-r--r--||1|konet||staff||1211055|Jul|25||2013|/kb/books/go/go_middlegame/pages/img284.jpg
-rw-r--r--||1|konet||staff||437291|Jul|28||2013|/kb/books/go/go_middlegame/pages/tn/tn_img183.jpg
-rw-r--r--||1|konet||staff||525694|Jul|28||2013|/kb/books/go/go_middlegame/pages/tn/tn_img184.jpg
-rw-r--r--||1|konet||staff||653806|Jul|28||2013|/kb/books/go/go_middlegame/pages/tn/tn_img185.jpg
-rw-r--r--||1|konet||staff||841874|Jul|28||2013|/kb/books/go/go_middlegame/pages/tn/tn_img186.jpg
-rw-r--r--||1|konet||staff||783850|Jul|28||2013|/kb/books/go/go_middlegame/pages/tn/tn_img187.jpg
-rw-r--r--||1|konet||staff||759335|Jul|28||2013|/kb/books/go/go_middlegame/pages/tn/tn_img188.jpg
-rw-r--r--||1|konet||staff||777431|Jul|28||2013|/kb/books/go/go_middlegame/pages/tn/tn_img189.jpg
-rw-r--r--||1|konet||staff||621857|Jul|28||2013|/kb/books/go/go_middlegame/pages/tn/tn_img190.jpg
-rw-r--r--||1|konet||staff||621065|Jul|28||2013|/kb/books/go/go_middlegame/pages/tn/tn_img213.jpg
-rw-r--r--||1|konet||staff||660424|Jul|28||2013|/kb/books/go/go_middlegame/pages/tn/tn_img214.jpg
-rw-r--r--||1|konet||staff||640766|Jul|28||2013|/kb/books/go/go_middlegame/pages/tn/tn_img215.jpg
-rw-r--r--||1|konet||staff||701699|Jul|28||2013|/kb/books/go/go_middlegame/pages/tn/tn_img216.jpg
-rw-r--r--||1|konet||staff||684817|Jul|28||2013|/kb/books/go/go_middlegame/pages/tn/tn_img217.jpg
-rw-r--r--||1|konet||staff||693628|Jul|28||2013|/kb/books/go/go_middlegame/pages/tn/tn_img218.jpg
-rw-r--r--||1|konet||staff||652074|Jul|28||2013|/kb/books/go/go_middlegame/pages/tn/tn_img219.jpg
-rw-r--r--||1|konet||staff||665520|Jul|28||2013|/kb/books/go/go_middlegame/pages/tn/tn_img220.jpg
-rw-r--r--||1|konet||staff||664979|Jul|28||2013|/kb/books/go/go_middlegame/pages/tn/tn_img221.jpg
-rw-r--r--||1|konet||staff||420880|Jul|28||2013|/kb/books/go/go_middlegame/pages/tn/tn_img222.jpg
-rw-r--r--||1|konet||staff||653179|Jul|28||2013|/kb/books/go/go_middlegame/pages/tn/tn_img223.jpg
-rw-r--r--||1|konet||staff||631018|Jul|28||2013|/kb/books/go/go_middlegame/pages/tn/tn_img224.jpg
-rw-r--r--||1|konet||staff||614888|Jul|28||2013|/kb/books/go/go_middlegame/pages/tn/tn_img225.jpg
-rw-r--r--||1|konet||staff||635578|Jul|28||2013|/kb/books/go/go_middlegame/pages/tn/tn_img226.jpg
-rw-r--r--||1|konet||staff||664987|Jul|28||2013|/kb/books/go/go_middlegame/pages/tn/tn_img227.jpg
-rw-r--r--||1|konet||staff||494882|Jul|28||2013|/kb/books/go/go_middlegame/pages/tn/tn_img228.jpg
-rw-r--r--||1|konet||staff||755517|Jul|28||2013|/kb/books/go/go_middlegame/pages/tn/tn_img229.jpg
-rw-r--r--||1|konet||staff||746024|Jul|28||2013|/kb/books/go/go_middlegame/pages/tn/tn_img230.jpg
-rw-r--r--||1|konet||staff||740563|Jul|28||2013|/kb/books/go/go_middlegame/pages/tn/tn_img231.jpg
-rw-r--r--||1|konet||staff||720673|Jul|28||2013|/kb/books/go/go_middlegame/pages/tn/tn_img232.jpg
-rw-r--r--||1|konet||staff||641901|Jul|28||2013|/kb/books/go/go_middlegame/pages/tn/tn_img233.jpg
-rw-r--r--||1|konet||staff||681172|Jul|28||2013|/kb/books/go/go_middlegame/pages/tn/tn_img234.jpg
-rw-r--r--||1|konet||staff||681621|Jul|28||2013|/kb/books/go/go_middlegame/pages/tn/tn_img235.jpg
-rw-r--r--||1|konet||staff||699626|Jul|28||2013|/kb/books/go/go_middlegame/pages/tn/tn_img236.jpg
-rw-r--r--||1|konet||staff||692405|Jul|28||2013|/kb/books/go/go_middlegame/pages/tn/tn_img237.jpg
-rw-r--r--||1|konet||staff||675217|Jul|28||2013|/kb/books/go/go_middlegame/pages/tn/tn_img238.jpg
-rw-r--r--||1|konet||staff||637166|Jul|28||2013|/kb/books/go/go_middlegame/pages/tn/tn_img239.jpg
-rw-r--r--||1|konet||staff||638038|Jul|28||2013|/kb/books/go/go_middlegame/pages/tn/tn_img240.jpg
-rw-r--r--||1|konet||staff||746258|Jul|28||2013|/kb/books/go/go_middlegame/pages/tn/tn_img241.jpg
-rw-r--r--||1|konet||staff||697934|Jul|28||2013|/kb/books/go/go_middlegame/pages/tn/tn_img242.jpg
-rw-r--r--||1|konet||staff||680670|Jul|28||2013|/kb/books/go/go_middlegame/pages/tn/tn_img243.jpg
-rw-r--r--||1|konet||staff||666127|Jul|28||2013|/kb/books/go/go_middlegame/pages/tn/tn_img244.jpg
-rw-r--r--||1|konet||staff||703644|Jul|28||2013|/kb/books/go/go_middlegame/pages/tn/tn_img245.jpg
-rw-r--r--||1|konet||staff||674102|Jul|28||2013|/kb/books/go/go_middlegame/pages/tn/tn_img246.jpg
-rw-r--r--||1|konet||staff||684526|Jul|28||2013|/kb/books/go/go_middlegame/pages/tn/tn_img247.jpg
-rw-r--r--||1|konet||staff||648526|Jul|28||2013|/kb/books/go/go_middlegame/pages/tn/tn_img248.jpg
-rw-r--r--||1|konet||staff||728614|Jul|28||2013|/kb/books/go/go_middlegame/pages/tn/tn_img249.jpg
-rw-r--r--||1|konet||staff||663415|Jul|28||2013|/kb/books/go/go_middlegame/pages/tn/tn_img250.jpg
-rw-r--r--||1|konet||staff||694657|Jul|28||2013|/kb/books/go/go_middlegame/pages/tn/tn_img251.jpg
-rw-r--r--||1|konet||staff||673729|Jul|28||2013|/kb/books/go/go_middlegame/pages/tn/tn_img252.jpg
-rw-r--r--||1|konet||staff||663575|Jul|28||2013|/kb/books/go/go_middlegame/pages/tn/tn_img253.jpg
-rw-r--r--||1|konet||staff||464991|Jul|28||2013|/kb/books/go/go_middlegame/pages/tn/tn_img254.jpg
-rw-r--r--||1|konet||staff||756849|Jul|28||2013|/kb/books/go/go_middlegame/pages/tn/tn_img255.jpg
-rw-r--r--||1|konet||staff||761547|Jul|28||2013|/kb/books/go/go_middlegame/pages/tn/tn_img256.jpg
-rw-r--r--||1|konet||staff||801070|Jul|28||2013|/kb/books/go/go_middlegame/pages/tn/tn_img257.jpg
-rw-r--r--||1|konet||staff||739075|Jul|28||2013|/kb/books/go/go_middlegame/pages/tn/tn_img258.jpg
-rw-r--r--||1|konet||staff||787189|Jul|28||2013|/kb/books/go/go_middlegame/pages/tn/tn_img259.jpg
-rw-r--r--||1|konet||staff||729433|Jul|28||2013|/kb/books/go/go_middlegame/pages/tn/tn_img260.jpg
-rw-r--r--||1|konet||staff||793385|Jul|28||2013|/kb/books/go/go_middlegame/pages/tn/tn_img261.jpg
-rw-r--r--||1|konet||staff||756141|Jul|28||2013|/kb/books/go/go_middlegame/pages/tn/tn_img262.jpg
-rw-r--r--||1|konet||staff||779572|Jul|28||2013|/kb/books/go/go_middlegame/pages/tn/tn_img263.jpg
-rw-r--r--||1|konet||staff||759079|Jul|28||2013|/kb/books/go/go_middlegame/pages/tn/tn_img264.jpg
-rw-r--r--||1|konet||staff||738282|Jul|28||2013|/kb/books/go/go_middlegame/pages/tn/tn_img265.jpg
-rw-r--r--||1|konet||staff||814029|Jul|28||2013|/kb/books/go/go_middlegame/pages/tn/tn_img266.jpg
-rw-r--r--||1|konet||staff||833386|Jul|28||2013|/kb/books/go/go_middlegame/pages/tn/tn_img267.jpg
-rw-r--r--||1|konet||staff||188285|Jul|28||2013|/kb/books/go/go_middlegame/pages/tn/tn_img268.jpg
-rw-r--r--||1|konet||staff||369506|Jul|28||2013|/kb/books/go/go_middlegame/pages/tn/tn_img269.jpg
-rw-r--r--||1|konet||staff||384764|Jul|28||2013|/kb/books/go/go_middlegame/pages/tn/tn_img270.jpg
-rw-r--r--||1|konet||staff||547382|Jul|28||2013|/kb/books/go/go_middlegame/pages/tn/tn_img271.jpg
-rw-r--r--||1|konet||staff||647343|Jul|28||2013|/kb/books/go/go_middlegame/pages/tn/tn_img272.jpg
-rw-r--r--||1|konet||staff||1070171|Jul|28||2013|/kb/books/go/go_middlegame/pages/tn/tn_img273.jpg
-rw-r--r--||1|konet||staff||1188408|Jul|28||2013|/kb/books/go/go_middlegame/pages/tn/tn_img274.jpg
-rw-r--r--||1|konet||staff||315266|Jul|28||2013|/kb/books/go/go_middlegame/pages/tn/tn_img275.jpg
-rw-r--r--||1|konet||staff||299360|Jul|28||2013|/kb/books/go/go_middlegame/pages/tn/tn_img276.jpg
-rw-r--r--||1|konet||staff||707195|Jul|28||2013|/kb/books/go/go_middlegame/pages/tn/tn_img277.jpg
-rw-r--r--||1|konet||staff||872457|Jul|28||2013|/kb/books/go/go_middlegame/pages/tn/tn_img278.jpg
-rw-r--r--||1|konet||staff||959051|Jul|28||2013|/kb/books/go/go_middlegame/pages/tn/tn_img279.jpg
-rw-r--r--||1|konet||staff||920879|Jul|28||2013|/kb/books/go/go_middlegame/pages/tn/tn_img280.jpg
-rw-r--r--||1|konet||staff||926630|Jul|28||2013|/kb/books/go/go_middlegame/pages/tn/tn_img281.jpg
-rw-r--r--||1|konet||staff||1034689|Jul|28||2013|/kb/books/go/go_middlegame/pages/tn/tn_img282.jpg
-rw-r--r--||1|konet||staff||341434|Jul|25||2013|/kb/books/go/go_middlegame/pages/tn/tn_img283.jpg
-rw-r--r--||1|konet||staff||1211055|Jul|25||2013|/kb/books/go/go_middlegame/pages/tn/tn_img284.jpg
-rw-r--r--||1|konet||staff||1053658|Jul|25||2013|/kb/books/go/go_strategy/pages/img285.jpg
-rw-r--r--||1|konet||staff||336909|Jul|25||2013|/kb/books/go/go_strategy/pages/img286.jpg
-rw-r--r--||1|konet||staff||354099|Jul|25||2013|/kb/books/go/go_strategy/pages/img287.jpg
-rw-r--r--||1|konet||staff||409400|Jul|25||2013|/kb/books/go/go_strategy/pages/img288.jpg
-rw-r--r--||1|konet||staff||417952|Jul|25||2013|/kb/books/go/go_strategy/pages/img289.jpg
-rw-r--r--||1|konet||staff||690620|Jul|25||2013|/kb/books/go/go_strategy/pages/img290.jpg
-rw-r--r--||1|konet||staff||845711|Jul|25||2013|/kb/books/go/go_strategy/pages/img291.jpg
-rw-r--r--||1|konet||staff||1028081|Jul|25||2013|/kb/books/go/go_strategy/pages/img292.jpg
-rw-r--r--||1|konet||staff||1126342|Jul|25||2013|/kb/books/go/go_strategy/pages/img293.jpg
-rw-r--r--||1|konet||staff||1106874|Jul|25||2013|/kb/books/go/go_strategy/pages/img294.jpg
-rw-r--r--||1|konet||staff||1054403|Jul|25||2013|/kb/books/go/go_strategy/pages/img295.jpg
-rw-r--r--||1|konet||staff||1120631|Jul|25||2013|/kb/books/go/go_strategy/pages/img296.jpg
-rw-r--r--||1|konet||staff||756489|Jul|25||2013|/kb/books/go/go_strategy/pages/img297.jpg
-rw-r--r--||1|konet||staff||1084236|Jul|25||2013|/kb/books/go/go_strategy/pages/img298.jpg
-rw-r--r--||1|konet||staff||1067948|Jul|25||2013|/kb/books/go/go_strategy/pages/img299.jpg
-rw-r--r--||1|konet||staff||979594|Jul|25||2013|/kb/books/go/go_strategy/pages/img300.jpg
-rw-r--r--||1|konet||staff||1045182|Jul|25||2013|/kb/books/go/go_strategy/pages/img301.jpg
-rw-r--r--||1|konet||staff||901610|Jul|25||2013|/kb/books/go/go_strategy/pages/img302.jpg
-rw-r--r--||1|konet||staff||918985|Jul|25||2013|/kb/books/go/go_strategy/pages/img303.jpg
-rw-r--r--||1|konet||staff||862420|Jul|25||2013|/kb/books/go/go_strategy/pages/img304.jpg
-rw-r--r--||1|konet||staff||886557|Jul|25||2013|/kb/books/go/go_strategy/pages/img305.jpg
-rw-r--r--||1|konet||staff||787507|Jul|25||2013|/kb/books/go/go_strategy/pages/img306.jpg
-rw-r--r--||1|konet||staff||911463|Jul|25||2013|/kb/books/go/go_strategy/pages/img307.jpg
-rw-r--r--||1|konet||staff||965161|Jul|25||2013|/kb/books/go/go_strategy/pages/img308.jpg
-rw-r--r--||1|konet||staff||973577|Jul|25||2013|/kb/books/go/go_strategy/pages/img309.jpg
-rw-r--r--||1|konet||staff||888001|Jul|25||2013|/kb/books/go/go_strategy/pages/img310.jpg
-rw-r--r--||1|konet||staff||786913|Jul|25||2013|/kb/books/go/go_strategy/pages/img311.jpg
-rw-r--r--||1|konet||staff||963093|Jul|25||2013|/kb/books/go/go_strategy/pages/img312.jpg
-rw-r--r--||1|konet||staff||1189822|Jul|25||2013|/kb/books/go/go_strategy/pages/img313.jpg
-rw-r--r--||1|konet||staff||877732|Jul|25||2013|/kb/books/go/go_strategy/pages/img314.jpg
-rw-r--r--||1|konet||staff||849270|Jul|25||2013|/kb/books/go/go_strategy/pages/img315.jpg
-rw-r--r--||1|konet||staff||963161|Jul|25||2013|/kb/books/go/go_strategy/pages/img316.jpg
-rw-r--r--||1|konet||staff||507750|Jul|25||2013|/kb/books/go/go_strategy/pages/img317.jpg
-rw-r--r--||1|konet||staff||930132|Jul|26||2013|/kb/books/go/go_strategy/pages/img318.jpg
-rw-r--r--||1|konet||staff||862631|Jul|26||2013|/kb/books/go/go_strategy/pages/img319.jpg
-rw-r--r--||1|konet||staff||2584516|Jul|26||2013|/kb/books/go/go_strategy/pages/img319_rot.jpg
-rw-r--r--||1|konet||staff||907770|Jul|26||2013|/kb/books/go/go_strategy/pages/img320.jpg
-rw-r--r--||1|konet||staff||1074018|Jul|26||2013|/kb/books/go/go_strategy/pages/img321.jpg
-rw-r--r--||1|konet||staff||985358|Jul|26||2013|/kb/books/go/go_strategy/pages/img322.jpg
-rw-r--r--||1|konet||staff||955316|Jul|26||2013|/kb/books/go/go_strategy/pages/img323.jpg
-rw-r--r--||1|konet||staff||1048619|Jul|26||2013|/kb/books/go/go_strategy/pages/img324.jpg
-rw-r--r--||1|konet||staff||1013385|Jul|26||2013|/kb/books/go/go_strategy/pages/img325.jpg
-rw-r--r--||1|konet||staff||1091971|Jul|26||2013|/kb/books/go/go_strategy/pages/img326.jpg
-rw-r--r--||1|konet||staff||801231|Jul|26||2013|/kb/books/go/go_strategy/pages/img327.jpg
-rw-r--r--||1|konet||staff||845582|Jul|26||2013|/kb/books/go/go_strategy/pages/img328.jpg
-rw-r--r--||1|konet||staff||931676|Jul|26||2013|/kb/books/go/go_strategy/pages/img329.jpg
-rw-r--r--||1|konet||staff||1068374|Jul|26||2013|/kb/books/go/go_strategy/pages/img330.jpg
-rw-r--r--||1|konet||staff||836404|Jul|26||2013|/kb/books/go/go_strategy/pages/img331.jpg
-rw-r--r--||1|konet||staff||1002956|Jul|26||2013|/kb/books/go/go_strategy/pages/img332.jpg
-rw-r--r--||1|konet||staff||858923|Jul|26||2013|/kb/books/go/go_strategy/pages/img333.jpg
-rw-r--r--||1|konet||staff||904910|Jul|26||2013|/kb/books/go/go_strategy/pages/img334.jpg
-rw-r--r--||1|konet||staff||905806|Jul|28||2013|/kb/books/go/go_strategy/pages/img335.jpg
-rw-r--r--||1|konet||staff||1032145|Jul|28||2013|/kb/books/go/go_strategy/pages/img336.jpg
-rw-r--r--||1|konet||staff||927378|Jul|28||2013|/kb/books/go/go_strategy/pages/img337.jpg
-rw-r--r--||1|konet||staff||1021816|Jul|28||2013|/kb/books/go/go_strategy/pages/img338.jpg
-rw-r--r--||1|konet||staff||1007963|Jul|28||2013|/kb/books/go/go_strategy/pages/img339.jpg
-rw-r--r--||1|konet||staff||1087169|Jul|28||2013|/kb/books/go/go_strategy/pages/img340.jpg
-rw-r--r--||1|konet||staff||907719|Jul|28||2013|/kb/books/go/go_strategy/pages/img341.jpg
-rw-r--r--||1|konet||staff||1017200|Jul|28||2013|/kb/books/go/go_strategy/pages/img342.jpg
-rw-r--r--||1|konet||staff||1008372|Jul|28||2013|/kb/books/go/go_strategy/pages/img343.jpg
-rw-r--r--||1|konet||staff||904314|Jul|28||2013|/kb/books/go/go_strategy/pages/img344.jpg
-rw-r--r--||1|konet||staff||865407|Jul|28||2013|/kb/books/go/go_strategy/pages/img345.jpg
-rw-r--r--||1|konet||staff||936444|Jul|28||2013|/kb/books/go/go_strategy/pages/img346.jpg
-rw-r--r--||1|konet||staff||1098851|Jul|28||2013|/kb/books/go/go_strategy/pages/img347.jpg
-rw-r--r--||1|konet||staff||1136515|Jul|28||2013|/kb/books/go/go_strategy/pages/img348.jpg
-rw-r--r--||1|konet||staff||1181254|Jul|28||2013|/kb/books/go/go_strategy/pages/img349.jpg
-rw-r--r--||1|konet||staff||826651|Jul|28||2013|/kb/books/go/go_strategy/pages/img350.jpg
-rw-r--r--||1|konet||staff||605881|Jul|28||2013|/kb/books/go/go_strategy/pages/img351.jpg
-rw-r--r--||1|konet||staff||695558|Jul|28||2013|/kb/books/go/go_strategy/pages/img352.jpg
-rw-r--r--||1|konet||staff||166542|Jul|28||2013|/kb/books/go/go_strategy/pages/img353.jpg
-rw-r--r--||1|konet||staff||147900|Jul|28||2013|/kb/books/go/go_strategy/pages/img354.jpg
-rw-r--r--||1|konet||staff||216814|Jul|28||2013|/kb/books/go/go_strategy/pages/img355.jpg
-rw-r--r--||1|konet||staff||224027|Jul|28||2013|/kb/books/go/go_strategy/pages/img356.jpg
-rw-r--r--||1|konet||staff||1053658|Jul|25||2013|/kb/books/go/go_strategy/pages/tn/tn_img285.jpg
-rw-r--r--||1|konet||staff||336909|Jul|25||2013|/kb/books/go/go_strategy/pages/tn/tn_img286.jpg
-rw-r--r--||1|konet||staff||354099|Jul|25||2013|/kb/books/go/go_strategy/pages/tn/tn_img287.jpg
-rw-r--r--||1|konet||staff||409400|Jul|25||2013|/kb/books/go/go_strategy/pages/tn/tn_img288.jpg
-rw-r--r--||1|konet||staff||417952|Jul|25||2013|/kb/books/go/go_strategy/pages/tn/tn_img289.jpg
-rw-r--r--||1|konet||staff||690620|Jul|25||2013|/kb/books/go/go_strategy/pages/tn/tn_img290.jpg
-rw-r--r--||1|konet||staff||845711|Jul|25||2013|/kb/books/go/go_strategy/pages/tn/tn_img291.jpg
-rw-r--r--||1|konet||staff||1028081|Jul|25||2013|/kb/books/go/go_strategy/pages/tn/tn_img292.jpg
-rw-r--r--||1|konet||staff||1126342|Jul|25||2013|/kb/books/go/go_strategy/pages/tn/tn_img293.jpg
-rw-r--r--||1|konet||staff||1106874|Jul|25||2013|/kb/books/go/go_strategy/pages/tn/tn_img294.jpg
-rw-r--r--||1|konet||staff||1054403|Jul|25||2013|/kb/books/go/go_strategy/pages/tn/tn_img295.jpg
-rw-r--r--||1|konet||staff||1120631|Jul|25||2013|/kb/books/go/go_strategy/pages/tn/tn_img296.jpg
-rw-r--r--||1|konet||staff||756489|Jul|25||2013|/kb/books/go/go_strategy/pages/tn/tn_img297.jpg
-rw-r--r--||1|konet||staff||1084236|Jul|25||2013|/kb/books/go/go_strategy/pages/tn/tn_img298.jpg
-rw-r--r--||1|konet||staff||1067948|Jul|25||2013|/kb/books/go/go_strategy/pages/tn/tn_img299.jpg
-rw-r--r--||1|konet||staff||979594|Jul|25||2013|/kb/books/go/go_strategy/pages/tn/tn_img300.jpg
-rw-r--r--||1|konet||staff||1045182|Jul|25||2013|/kb/books/go/go_strategy/pages/tn/tn_img301.jpg
-rw-r--r--||1|konet||staff||901610|Jul|25||2013|/kb/books/go/go_strategy/pages/tn/tn_img302.jpg
-rw-r--r--||1|konet||staff||918985|Jul|25||2013|/kb/books/go/go_strategy/pages/tn/tn_img303.jpg
-rw-r--r--||1|konet||staff||862420|Jul|25||2013|/kb/books/go/go_strategy/pages/tn/tn_img304.jpg
-rw-r--r--||1|konet||staff||886557|Jul|25||2013|/kb/books/go/go_strategy/pages/tn/tn_img305.jpg
-rw-r--r--||1|konet||staff||787507|Jul|25||2013|/kb/books/go/go_strategy/pages/tn/tn_img306.jpg
-rw-r--r--||1|konet||staff||911463|Jul|25||2013|/kb/books/go/go_strategy/pages/tn/tn_img307.jpg
-rw-r--r--||1|konet||staff||965161|Jul|25||2013|/kb/books/go/go_strategy/pages/tn/tn_img308.jpg
-rw-r--r--||1|konet||staff||973577|Jul|25||2013|/kb/books/go/go_strategy/pages/tn/tn_img309.jpg
-rw-r--r--||1|konet||staff||888001|Jul|25||2013|/kb/books/go/go_strategy/pages/tn/tn_img310.jpg
-rw-r--r--||1|konet||staff||786913|Jul|25||2013|/kb/books/go/go_strategy/pages/tn/tn_img311.jpg
-rw-r--r--||1|konet||staff||963093|Jul|25||2013|/kb/books/go/go_strategy/pages/tn/tn_img312.jpg
-rw-r--r--||1|konet||staff||1189822|Jul|25||2013|/kb/books/go/go_strategy/pages/tn/tn_img313.jpg
-rw-r--r--||1|konet||staff||877732|Jul|25||2013|/kb/books/go/go_strategy/pages/tn/tn_img314.jpg
-rw-r--r--||1|konet||staff||849270|Jul|25||2013|/kb/books/go/go_strategy/pages/tn/tn_img315.jpg
-rw-r--r--||1|konet||staff||963161|Jul|25||2013|/kb/books/go/go_strategy/pages/tn/tn_img316.jpg
-rw-r--r--||1|konet||staff||507750|Jul|25||2013|/kb/books/go/go_strategy/pages/tn/tn_img317.jpg
-rw-r--r--||1|konet||staff||930132|Jul|26||2013|/kb/books/go/go_strategy/pages/tn/tn_img318.jpg
-rw-r--r--||1|konet||staff||862631|Jul|26||2013|/kb/books/go/go_strategy/pages/tn/tn_img319.jpg
-rw-r--r--||1|konet||staff||2584516|Jul|26||2013|/kb/books/go/go_strategy/pages/tn/tn_img319_rot.jpg
-rw-r--r--||1|konet||staff||907770|Jul|26||2013|/kb/books/go/go_strategy/pages/tn/tn_img320.jpg
-rw-r--r--||1|konet||staff||1074018|Jul|26||2013|/kb/books/go/go_strategy/pages/tn/tn_img321.jpg
-rw-r--r--||1|konet||staff||985358|Jul|26||2013|/kb/books/go/go_strategy/pages/tn/tn_img322.jpg
-rw-r--r--||1|konet||staff||955316|Jul|26||2013|/kb/books/go/go_strategy/pages/tn/tn_img323.jpg
-rw-r--r--||1|konet||staff||1048619|Jul|26||2013|/kb/books/go/go_strategy/pages/tn/tn_img324.jpg
-rw-r--r--||1|konet||staff||1013385|Jul|26||2013|/kb/books/go/go_strategy/pages/tn/tn_img325.jpg
-rw-r--r--||1|konet||staff||1091971|Jul|26||2013|/kb/books/go/go_strategy/pages/tn/tn_img326.jpg
-rw-r--r--||1|konet||staff||801231|Jul|26||2013|/kb/books/go/go_strategy/pages/tn/tn_img327.jpg
-rw-r--r--||1|konet||staff||845582|Jul|26||2013|/kb/books/go/go_strategy/pages/tn/tn_img328.jpg
-rw-r--r--||1|konet||staff||931676|Jul|26||2013|/kb/books/go/go_strategy/pages/tn/tn_img329.jpg
-rw-r--r--||1|konet||staff||1068374|Jul|26||2013|/kb/books/go/go_strategy/pages/tn/tn_img330.jpg
-rw-r--r--||1|konet||staff||836404|Jul|26||2013|/kb/books/go/go_strategy/pages/tn/tn_img331.jpg
-rw-r--r--||1|konet||staff||1002956|Jul|26||2013|/kb/books/go/go_strategy/pages/tn/tn_img332.jpg
-rw-r--r--||1|konet||staff||858923|Jul|26||2013|/kb/books/go/go_strategy/pages/tn/tn_img333.jpg
-rw-r--r--||1|konet||staff||904910|Jul|26||2013|/kb/books/go/go_strategy/pages/tn/tn_img334.jpg
-rw-r--r--||1|konet||staff||905806|Jul|28||2013|/kb/books/go/go_strategy/pages/tn/tn_img335.jpg
-rw-r--r--||1|konet||staff||1032145|Jul|28||2013|/kb/books/go/go_strategy/pages/tn/tn_img336.jpg
-rw-r--r--||1|konet||staff||927378|Jul|28||2013|/kb/books/go/go_strategy/pages/tn/tn_img337.jpg
-rw-r--r--||1|konet||staff||1021816|Jul|28||2013|/kb/books/go/go_strategy/pages/tn/tn_img338.jpg
-rw-r--r--||1|konet||staff||1007963|Jul|28||2013|/kb/books/go/go_strategy/pages/tn/tn_img339.jpg
-rw-r--r--||1|konet||staff||1087169|Jul|28||2013|/kb/books/go/go_strategy/pages/tn/tn_img340.jpg
-rw-r--r--||1|konet||staff||907719|Jul|28||2013|/kb/books/go/go_strategy/pages/tn/tn_img341.jpg
-rw-r--r--||1|konet||staff||1017200|Jul|28||2013|/kb/books/go/go_strategy/pages/tn/tn_img342.jpg
-rw-r--r--||1|konet||staff||1008372|Jul|28||2013|/kb/books/go/go_strategy/pages/tn/tn_img343.jpg
-rw-r--r--||1|konet||staff||904314|Jul|28||2013|/kb/books/go/go_strategy/pages/tn/tn_img344.jpg
-rw-r--r--||1|konet||staff||865407|Jul|28||2013|/kb/books/go/go_strategy/pages/tn/tn_img345.jpg
-rw-r--r--||1|konet||staff||936444|Jul|28||2013|/kb/books/go/go_strategy/pages/tn/tn_img346.jpg
-rw-r--r--||1|konet||staff||1098851|Jul|28||2013|/kb/books/go/go_strategy/pages/tn/tn_img347.jpg
-rw-r--r--||1|konet||staff||1136515|Jul|28||2013|/kb/books/go/go_strategy/pages/tn/tn_img348.jpg
-rw-r--r--||1|konet||staff||1181254|Jul|28||2013|/kb/books/go/go_strategy/pages/tn/tn_img349.jpg
-rw-r--r--||1|konet||staff||826651|Jul|28||2013|/kb/books/go/go_strategy/pages/tn/tn_img350.jpg
-rw-r--r--||1|konet||staff||605881|Jul|28||2013|/kb/books/go/go_strategy/pages/tn/tn_img351.jpg
-rw-r--r--||1|konet||staff||695558|Jul|28||2013|/kb/books/go/go_strategy/pages/tn/tn_img352.jpg
-rw-r--r--||1|konet||staff||166542|Jul|28||2013|/kb/books/go/go_strategy/pages/tn/tn_img353.jpg
-rw-r--r--||1|konet||staff||147900|Jul|28||2013|/kb/books/go/go_strategy/pages/tn/tn_img354.jpg
-rw-r--r--||1|konet||staff||216814|Jul|28||2013|/kb/books/go/go_strategy/pages/tn/tn_img355.jpg
-rw-r--r--||1|konet||staff||224027|Jul|28||2013|/kb/books/go/go_strategy/pages/tn/tn_img356.jpg
-rw-r--r--||1|konet||staff||313740|Jul|27||2013|/kb/books/go/go_tesuji/pages/img144.jpg
-rw-r--r--||1|konet||staff||534933|Jul|27||2013|/kb/books/go/go_tesuji/pages/img145.jpg
-rw-r--r--||1|konet||staff||637566|Jul|27||2013|/kb/books/go/go_tesuji/pages/img146.jpg
-rw-r--r--||1|konet||staff||883337|Jul|27||2013|/kb/books/go/go_tesuji/pages/img147.jpg
-rw-r--r--||1|konet||staff||910842|Jul|27||2013|/kb/books/go/go_tesuji/pages/img148.jpg
-rw-r--r--||1|konet||staff||547960|Jul|27||2013|/kb/books/go/go_tesuji/pages/img149.jpg
-rw-r--r--||1|konet||staff||511374|Jul|27||2013|/kb/books/go/go_tesuji/pages/img150.jpg
-rw-r--r--||1|konet||staff||309376|Jul|27||2013|/kb/books/go/go_tesuji/pages/img151.jpg
-rw-r--r--||1|konet||staff||712605|Jul|27||2013|/kb/books/go/go_tesuji/pages/img152.jpg
-rw-r--r--||1|konet||staff||610951|Jul|27||2013|/kb/books/go/go_tesuji/pages/img153.jpg
-rw-r--r--||1|konet||staff||579887|Apr|15||2013|/kb/books/go/go_tesuji/pages/img154.jpg
-rw-r--r--||1|konet||staff||205822|Apr|15||2013|/kb/books/go/go_tesuji/pages/img155.jpg
-rw-r--r--||1|konet||staff||506775|Apr|15||2013|/kb/books/go/go_tesuji/pages/img156.jpg
-rw-r--r--||1|konet||staff||554846|Apr|15||2013|/kb/books/go/go_tesuji/pages/img157.jpg
-rw-r--r--||1|konet||staff||267323|Apr|15||2013|/kb/books/go/go_tesuji/pages/img158.jpg
-rw-r--r--||1|konet||staff||328954|Apr|15||2013|/kb/books/go/go_tesuji/pages/img159.jpg
-rw-r--r--||1|konet||staff||378242|Apr|15||2013|/kb/books/go/go_tesuji/pages/img160.jpg
-rw-r--r--||1|konet||staff||726846|Jul|27||2013|/kb/books/go/go_tesuji/pages/img161.jpg
-rw-r--r--||1|konet||staff||725448|Jul|27||2013|/kb/books/go/go_tesuji/pages/img162.jpg
-rw-r--r--||1|konet||staff||687696|Jul|27||2013|/kb/books/go/go_tesuji/pages/img163.jpg
-rw-r--r--||1|konet||staff||717765|Jul|27||2013|/kb/books/go/go_tesuji/pages/img164.jpg
-rw-r--r--||1|konet||staff||527036|Jul|27||2013|/kb/books/go/go_tesuji/pages/img165.jpg
-rw-r--r--||1|konet||staff||706619|Jul|27||2013|/kb/books/go/go_tesuji/pages/img166.jpg
-rw-r--r--||1|konet||staff||742105|Jul|27||2013|/kb/books/go/go_tesuji/pages/img167.jpg
-rw-r--r--||1|konet||staff||797265|Jul|27||2013|/kb/books/go/go_tesuji/pages/img168.jpg
-rw-r--r--||1|konet||staff||760087|Jul|27||2013|/kb/books/go/go_tesuji/pages/img169.jpg
-rw-r--r--||1|konet||staff||657636|Jul|27||2013|/kb/books/go/go_tesuji/pages/img170.jpg
-rw-r--r--||1|konet||staff||755147|Jul|28||2013|/kb/books/go/go_tesuji/pages/img171.jpg
-rw-r--r--||1|konet||staff||645677|Jul|28||2013|/kb/books/go/go_tesuji/pages/img172.jpg
-rw-r--r--||1|konet||staff||696265|Jul|28||2013|/kb/books/go/go_tesuji/pages/img173.jpg
-rw-r--r--||1|konet||staff||712791|Jul|28||2013|/kb/books/go/go_tesuji/pages/img174.jpg
-rw-r--r--||1|konet||staff||717123|Jul|28||2013|/kb/books/go/go_tesuji/pages/img175.jpg
-rw-r--r--||1|konet||staff||652155|Jul|28||2013|/kb/books/go/go_tesuji/pages/img176.jpg
-rw-r--r--||1|konet||staff||813062|Jul|28||2013|/kb/books/go/go_tesuji/pages/img177.jpg
-rw-r--r--||1|konet||staff||685220|Jul|28||2013|/kb/books/go/go_tesuji/pages/img178.jpg
-rw-r--r--||1|konet||staff||599655|Jul|28||2013|/kb/books/go/go_tesuji/pages/img179.jpg
-rw-r--r--||1|konet||staff||621916|Jul|28||2013|/kb/books/go/go_tesuji/pages/img180.jpg
-rw-r--r--||1|konet||staff||511956|Jul|28||2013|/kb/books/go/go_tesuji/pages/img181.jpg
-rw-r--r--||1|konet||staff||510349|Jul|28||2013|/kb/books/go/go_tesuji/pages/img182.jpg
-rw-r--r--||1|konet||staff||755147|Jul|28||2013|/kb/books/go/go_tesuji/pages/img171.jpg
-rw-r--r--||1|konet||staff||645677|Jul|28||2013|/kb/books/go/go_tesuji/pages/img172.jpg
-rw-r--r--||1|konet||staff||696265|Jul|28||2013|/kb/books/go/go_tesuji/pages/img173.jpg
-rw-r--r--||1|konet||staff||712791|Jul|28||2013|/kb/books/go/go_tesuji/pages/img174.jpg
-rw-r--r--||1|konet||staff||717123|Jul|28||2013|/kb/books/go/go_tesuji/pages/img175.jpg
-rw-r--r--||1|konet||staff||652155|Jul|28||2013|/kb/books/go/go_tesuji/pages/img176.jpg
-rw-r--r--||1|konet||staff||813062|Jul|28||2013|/kb/books/go/go_tesuji/pages/img177.jpg
-rw-r--r--||1|konet||staff||685220|Jul|28||2013|/kb/books/go/go_tesuji/pages/img178.jpg
-rw-r--r--||1|konet||staff||599655|Jul|28||2013|/kb/books/go/go_tesuji/pages/img179.jpg
-rw-r--r--||1|konet||staff||621916|Jul|28||2013|/kb/books/go/go_tesuji/pages/img180.jpg
-rw-r--r--||1|konet||staff||511956|Jul|28||2013|/kb/books/go/go_tesuji/pages/img181.jpg
-rw-r--r--||1|konet||staff||510349|Jul|28||2013|/kb/books/go/go_tesuji/pages/img182.jpg`;

//			pagelist_go_len=pagelist_go.length;
//			alert( "BUGS_830 load_pages pagelist_go_len="+pageslist_go_len+" pagelist_go="+pagelist_go );
//			window.pages=pages;
//			alert( "BUGS_840 load_pages pages_len="+pages_len+" window.pages1="+window.pages[1] );
			return( pagelist_go.split("\n") );
			}
		</script>






	<script id="script_load_pagelist_tail">
		function load_pagelist_tail() {
var pagelist_tail = 
`pages/tail/1.jpg
pages/tail/2.jpg
pages/tail/3.jpg
pages/tail/4.jpg
pages/tail/5.jpg
pages/tail/6.jpg
pages/tail/7.jpg
pages/tail/8.jpg
pages/tail/9.jpg
pages/tail/10.jpg
pages/tail/11.jpg
pages/tail/12.jpg
pages/tail/13.jpg
pages/tail/14.jpg
pages/tail/15.jpg
pages/tail/16.jpg`;
			return( pagelist_tail.split("\n"));
			}
		</script>






	<script id="script_load_pages_bugs" >
		var pages = new Array();
		var window.pages = new Array();
		var pages_len = 0;
		var j=0;

		function load_pages_bugs() {
//			alert( "BUGS_850 load_pages_bugs" );
			alert( "BUGS_850 load_pages_bugs pages="+pages );
			var  pages = new Array();
			var pages_len=0;
			var j=0;


			pages[j++] = "-rw-r--r--||1|konet||staff||376756|Jul|28||2013|/kb/books/go/go_attack_defense/pages/img357.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||306856|Jul|28||2013|/kb/books/go/go_attack_defense/pages/img358.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||199193|Jul|28||2013|/kb/books/go/go_attack_defense/pages/img359.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||443996|Jul|28||2013|/kb/books/go/go_attack_defense/pages/img360.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||629176|Jul|28||2013|/kb/books/go/go_attack_defense/pages/img361.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||544038|Jul|28||2013|/kb/books/go/go_attack_defense/pages/img362.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||941797|Jul|28||2013|/kb/books/go/go_attack_defense/pages/img363.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||850031|Jul|28||2013|/kb/books/go/go_attack_defense/pages/img364.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||876319|Jul|28||2013|/kb/books/go/go_attack_defense/pages/img365.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||880519|Jul|28||2013|/kb/books/go/go_attack_defense/pages/img366.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||896620|Jul|28||2013|/kb/books/go/go_attack_defense/pages/img367.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||730786|Jul|28||2013|/kb/books/go/go_attack_defense/pages/img368.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||801242|Jul|28||2013|/kb/books/go/go_attack_defense/pages/img369.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||883588|Jul|28||2013|/kb/books/go/go_attack_defense/pages/img370.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||845856|Jul|28||2013|/kb/books/go/go_attack_defense/pages/img371.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||784457|Jul|28||2013|/kb/books/go/go_attack_defense/pages/img372.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||843127|Jul|28||2013|/kb/books/go/go_attack_defense/pages/img373.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||906461|Jul|28||2013|/kb/books/go/go_attack_defense/pages/img374.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||752928|Jul|28||2013|/kb/books/go/go_attack_defense/pages/img375.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||791260|Jul|28||2013|/kb/books/go/go_attack_defense/pages/img376.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||964508|Jul|28||2013|/kb/books/go/go_attack_defense/pages/img377.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||828964|Jul|28||2013|/kb/books/go/go_attack_defense/pages/img378.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||873941|Jul|28||2013|/kb/books/go/go_attack_defense/pages/img379.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||915688|Jul|28||2013|/kb/books/go/go_attack_defense/pages/img380.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||761790|Jul|28||2013|/kb/books/go/go_attack_defense/pages/img381.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||845370|Jul|28||2013|/kb/books/go/go_attack_defense/pages/img382.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||856490|Jul|28||2013|/kb/books/go/go_attack_defense/pages/img383.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||671068|Jul|28||2013|/kb/books/go/go_attack_defense/pages/img384.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||743307|Jul|28||2013|/kb/books/go/go_attack_defense/pages/img385.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||792125|Jul|28||2013|/kb/books/go/go_attack_defense/pages/img386.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||851995|Jul|28||2013|/kb/books/go/go_attack_defense/pages/img387.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||817621|Jul|28||2013|/kb/books/go/go_attack_defense/pages/img388.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||899107|Jul|28||2013|/kb/books/go/go_attack_defense/pages/img389.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||945623|Jul|28||2013|/kb/books/go/go_attack_defense/pages/img390.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||956754|Jul|28||2013|/kb/books/go/go_attack_defense/pages/img391.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||995889|Jul|29||2013|/kb/books/go/go_attack_defense/pages/img392.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||924368|Jul|29||2013|/kb/books/go/go_attack_defense/pages/img393.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||824827|Jul|29||2013|/kb/books/go/go_attack_defense/pages/img394.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||862378|Jul|29||2013|/kb/books/go/go_attack_defense/pages/img395.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||883043|Jul|29||2013|/kb/books/go/go_attack_defense/pages/img396.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||834414|Jul|29||2013|/kb/books/go/go_attack_defense/pages/img397.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||772918|Jul|29||2013|/kb/books/go/go_attack_defense/pages/img398.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||699001|Jul|29||2013|/kb/books/go/go_attack_defense/pages/img399.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||862577|Jul|29||2013|/kb/books/go/go_attack_defense/pages/img400.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||859470|Jul|29||2013|/kb/books/go/go_attack_defense/pages/img401.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||898820|Jul|29||2013|/kb/books/go/go_attack_defense/pages/img402.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||911795|Jul|29||2013|/kb/books/go/go_attack_defense/pages/img403.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||682827|Jul|29||2013|/kb/books/go/go_attack_defense/pages/img404.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||748989|Jul|29||2013|/kb/books/go/go_attack_defense/pages/img405.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||756089|Jul|29||2013|/kb/books/go/go_attack_defense/pages/img406.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||947742|Jul|29||2013|/kb/books/go/go_attack_defense/pages/img407.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||876865|Jul|29||2013|/kb/books/go/go_attack_defense/pages/img408.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||939929|Jul|29||2013|/kb/books/go/go_attack_defense/pages/img409.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||857484|Jul|29||2013|/kb/books/go/go_attack_defense/pages/img410.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||856924|Jul|29||2013|/kb/books/go/go_attack_defense/pages/img411.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||869657|Jul|29||2013|/kb/books/go/go_attack_defense/pages/img412.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||890809|Jul|29||2013|/kb/books/go/go_attack_defense/pages/img413.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||881101|Jul|29||2013|/kb/books/go/go_attack_defense/pages/img414.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||860242|Jul|29||2013|/kb/books/go/go_attack_defense/pages/img415.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||867133|Jul|29||2013|/kb/books/go/go_attack_defense/pages/img416.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||831861|Jul|29||2013|/kb/books/go/go_attack_defense/pages/img417.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||825595|Jul|29||2013|/kb/books/go/go_attack_defense/pages/img418.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||679496|Jul|29||2013|/kb/books/go/go_attack_defense/pages/img419.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||810751|Jul|29||2013|/kb/books/go/go_attack_defense/pages/img420.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||790732|Jul|29||2013|/kb/books/go/go_attack_defense/pages/img421.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||845998|Jul|29||2013|/kb/books/go/go_attack_defense/pages/img422.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||745726|Jul|29||2013|/kb/books/go/go_attack_defense/pages/img423.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||794258|Jul|29||2013|/kb/books/go/go_attack_defense/pages/img424.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||620484|Jul|26||2013|/kb/books/go/go_attack_defense/pages/index.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||376756|Jul|28||2013|/kb/books/go/go_attack_defense/pages/tn/tn_img357.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||306856|Jul|28||2013|/kb/books/go/go_attack_defense/pages/tn/tn_img358.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||199193|Jul|28||2013|/kb/books/go/go_attack_defense/pages/tn/tn_img359.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||443996|Jul|28||2013|/kb/books/go/go_attack_defense/pages/tn/tn_img360.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||629176|Jul|28||2013|/kb/books/go/go_attack_defense/pages/tn/tn_img361.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||544038|Jul|28||2013|/kb/books/go/go_attack_defense/pages/tn/tn_img362.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||941797|Jul|28||2013|/kb/books/go/go_attack_defense/pages/tn/tn_img363.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||850031|Jul|28||2013|/kb/books/go/go_attack_defense/pages/tn/tn_img364.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||876319|Jul|28||2013|/kb/books/go/go_attack_defense/pages/tn/tn_img365.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||880519|Jul|28||2013|/kb/books/go/go_attack_defense/pages/tn/tn_img366.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||896620|Jul|28||2013|/kb/books/go/go_attack_defense/pages/tn/tn_img367.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||730786|Jul|28||2013|/kb/books/go/go_attack_defense/pages/tn/tn_img368.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||801242|Jul|28||2013|/kb/books/go/go_attack_defense/pages/tn/tn_img369.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||883588|Jul|28||2013|/kb/books/go/go_attack_defense/pages/tn/tn_img370.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||845856|Jul|28||2013|/kb/books/go/go_attack_defense/pages/tn/tn_img371.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||784457|Jul|28||2013|/kb/books/go/go_attack_defense/pages/tn/tn_img372.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||843127|Jul|28||2013|/kb/books/go/go_attack_defense/pages/tn/tn_img373.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||906461|Jul|28||2013|/kb/books/go/go_attack_defense/pages/tn/tn_img374.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||752928|Jul|28||2013|/kb/books/go/go_attack_defense/pages/tn/tn_img375.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||791260|Jul|28||2013|/kb/books/go/go_attack_defense/pages/tn/tn_img376.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||964508|Jul|28||2013|/kb/books/go/go_attack_defense/pages/tn/tn_img377.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||828964|Jul|28||2013|/kb/books/go/go_attack_defense/pages/tn/tn_img378.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||873941|Jul|28||2013|/kb/books/go/go_attack_defense/pages/tn/tn_img379.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||915688|Jul|28||2013|/kb/books/go/go_attack_defense/pages/tn/tn_img380.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||761790|Jul|28||2013|/kb/books/go/go_attack_defense/pages/tn/tn_img381.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||845370|Jul|28||2013|/kb/books/go/go_attack_defense/pages/tn/tn_img382.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||856490|Jul|28||2013|/kb/books/go/go_attack_defense/pages/tn/tn_img383.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||671068|Jul|28||2013|/kb/books/go/go_attack_defense/pages/tn/tn_img384.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||743307|Jul|28||2013|/kb/books/go/go_attack_defense/pages/tn/tn_img385.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||792125|Jul|28||2013|/kb/books/go/go_attack_defense/pages/tn/tn_img386.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||851995|Jul|28||2013|/kb/books/go/go_attack_defense/pages/tn/tn_img387.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||817621|Jul|28||2013|/kb/books/go/go_attack_defense/pages/tn/tn_img388.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||899107|Jul|28||2013|/kb/books/go/go_attack_defense/pages/tn/tn_img389.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||945623|Jul|28||2013|/kb/books/go/go_attack_defense/pages/tn/tn_img390.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||956754|Jul|28||2013|/kb/books/go/go_attack_defense/pages/tn/tn_img391.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||995889|Jul|29||2013|/kb/books/go/go_attack_defense/pages/tn/tn_img392.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||924368|Jul|29||2013|/kb/books/go/go_attack_defense/pages/tn/tn_img393.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||824827|Jul|29||2013|/kb/books/go/go_attack_defense/pages/tn/tn_img394.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||862378|Jul|29||2013|/kb/books/go/go_attack_defense/pages/tn/tn_img395.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||883043|Jul|29||2013|/kb/books/go/go_attack_defense/pages/tn/tn_img396.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||834414|Jul|29||2013|/kb/books/go/go_attack_defense/pages/tn/tn_img397.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||772918|Jul|29||2013|/kb/books/go/go_attack_defense/pages/tn/tn_img398.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||699001|Jul|29||2013|/kb/books/go/go_attack_defense/pages/tn/tn_img399.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||862577|Jul|29||2013|/kb/books/go/go_attack_defense/pages/tn/tn_img400.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||859470|Jul|29||2013|/kb/books/go/go_attack_defense/pages/tn/tn_img401.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||898820|Jul|29||2013|/kb/books/go/go_attack_defense/pages/tn/tn_img402.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||911795|Jul|29||2013|/kb/books/go/go_attack_defense/pages/tn/tn_img403.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||682827|Jul|29||2013|/kb/books/go/go_attack_defense/pages/tn/tn_img404.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||748989|Jul|29||2013|/kb/books/go/go_attack_defense/pages/tn/tn_img405.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||756089|Jul|29||2013|/kb/books/go/go_attack_defense/pages/tn/tn_img406.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||947742|Jul|29||2013|/kb/books/go/go_attack_defense/pages/tn/tn_img407.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||876865|Jul|29||2013|/kb/books/go/go_attack_defense/pages/tn/tn_img408.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||939929|Jul|29||2013|/kb/books/go/go_attack_defense/pages/tn/tn_img409.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||857484|Jul|29||2013|/kb/books/go/go_attack_defense/pages/tn/tn_img410.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||856924|Jul|29||2013|/kb/books/go/go_attack_defense/pages/tn/tn_img411.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||869657|Jul|29||2013|/kb/books/go/go_attack_defense/pages/tn/tn_img412.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||890809|Jul|29||2013|/kb/books/go/go_attack_defense/pages/tn/tn_img413.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||881101|Jul|29||2013|/kb/books/go/go_attack_defense/pages/tn/tn_img414.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||860242|Jul|29||2013|/kb/books/go/go_attack_defense/pages/tn/tn_img415.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||867133|Jul|29||2013|/kb/books/go/go_attack_defense/pages/tn/tn_img416.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||831861|Jul|29||2013|/kb/books/go/go_attack_defense/pages/tn/tn_img417.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||825595|Jul|29||2013|/kb/books/go/go_attack_defense/pages/tn/tn_img418.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||679496|Jul|29||2013|/kb/books/go/go_attack_defense/pages/tn/tn_img419.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||810751|Jul|29||2013|/kb/books/go/go_attack_defense/pages/tn/tn_img420.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||790732|Jul|29||2013|/kb/books/go/go_attack_defense/pages/tn/tn_img421.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||845998|Jul|29||2013|/kb/books/go/go_attack_defense/pages/tn/tn_img422.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||745726|Jul|29||2013|/kb/books/go/go_attack_defense/pages/tn/tn_img423.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||794258|Jul|29||2013|/kb/books/go/go_attack_defense/pages/tn/tn_img424.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||620484|Jul|26||2013|/kb/books/go/go_attack_defense/pages/tn/tn_index.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||1006441|Jul|26||2013|/kb/books/go/go_basics/pages/img023.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||1047128|Jul|26||2013|/kb/books/go/go_basics/pages/img024.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||1053967|Jul|26||2013|/kb/books/go/go_basics/pages/img025.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||1014446|Jul|26||2013|/kb/books/go/go_basics/pages/img026.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||1026767|Jul|26||2013|/kb/books/go/go_basics/pages/img027.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||791176|Jul|26||2013|/kb/books/go/go_basics/pages/img028.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||813175|Jul|26||2013|/kb/books/go/go_basics/pages/img029.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||924714|Jul|26||2013|/kb/books/go/go_basics/pages/img030.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||905403|Jul|26||2013|/kb/books/go/go_basics/pages/img031.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||888119|Jul|26||2013|/kb/books/go/go_basics/pages/img032.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||1055638|Jul|26||2013|/kb/books/go/go_basics/pages/img033.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||915998|Jul|26||2013|/kb/books/go/go_basics/pages/img034.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||837152|Jul|26||2013|/kb/books/go/go_basics/pages/img035.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||837128|Jul|26||2013|/kb/books/go/go_basics/pages/img036.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||1089939|Jul|26||2013|/kb/books/go/go_basics/pages/img037.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||784389|Jul|26||2013|/kb/books/go/go_basics/pages/img038.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||889289|Jul|26||2013|/kb/books/go/go_basics/pages/img039.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||969966|Jul|26||2013|/kb/books/go/go_basics/pages/img040.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||919829|Jul|26||2013|/kb/books/go/go_basics/pages/img041.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||1002672|Jul|26||2013|/kb/books/go/go_basics/pages/img042.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||717797|Jul|26||2013|/kb/books/go/go_basics/pages/img043.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||768692|Jul|26||2013|/kb/books/go/go_basics/pages/img044.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||952072|Jul|26||2013|/kb/books/go/go_basics/pages/img045.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||696825|Jul|26||2013|/kb/books/go/go_basics/pages/img046.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||332310|Jul|26||2013|/kb/books/go/go_basics/pages/img047.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||445300|Jul|26||2013|/kb/books/go/go_basics/pages/img048.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||620484|Jul|26||2013|/kb/books/go/go_basics/pages/img049.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||1006441|Jul|26||2013|/kb/books/go/go_basics/pages/tn/tn_img023.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||1047128|Jul|26||2013|/kb/books/go/go_basics/pages/tn/tn_img024.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||1053967|Jul|26||2013|/kb/books/go/go_basics/pages/tn/tn_img025.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||1014446|Jul|26||2013|/kb/books/go/go_basics/pages/tn/tn_img026.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||1026767|Jul|26||2013|/kb/books/go/go_basics/pages/tn/tn_img027.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||791176|Jul|26||2013|/kb/books/go/go_basics/pages/tn/tn_img028.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||813175|Jul|26||2013|/kb/books/go/go_basics/pages/tn/tn_img029.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||924714|Jul|26||2013|/kb/books/go/go_basics/pages/tn/tn_img030.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||905403|Jul|26||2013|/kb/books/go/go_basics/pages/tn/tn_img031.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||888119|Jul|26||2013|/kb/books/go/go_basics/pages/tn/tn_img032.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||1055638|Jul|26||2013|/kb/books/go/go_basics/pages/tn/tn_img033.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||915998|Jul|26||2013|/kb/books/go/go_basics/pages/tn/tn_img034.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||837152|Jul|26||2013|/kb/books/go/go_basics/pages/tn/tn_img035.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||837128|Jul|26||2013|/kb/books/go/go_basics/pages/tn/tn_img036.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||1089939|Jul|26||2013|/kb/books/go/go_basics/pages/tn/tn_img037.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||784389|Jul|26||2013|/kb/books/go/go_basics/pages/tn/tn_img038.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||889289|Jul|26||2013|/kb/books/go/go_basics/pages/tn/tn_img039.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||969966|Jul|26||2013|/kb/books/go/go_basics/pages/tn/tn_img040.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||919829|Jul|26||2013|/kb/books/go/go_basics/pages/tn/tn_img041.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||1002672|Jul|26||2013|/kb/books/go/go_basics/pages/tn/tn_img042.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||717797|Jul|26||2013|/kb/books/go/go_basics/pages/tn/tn_img043.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||768692|Jul|26||2013|/kb/books/go/go_basics/pages/tn/tn_img044.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||952072|Jul|26||2013|/kb/books/go/go_basics/pages/tn/tn_img045.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||696825|Jul|26||2013|/kb/books/go/go_basics/pages/tn/tn_img046.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||332310|Jul|26||2013|/kb/books/go/go_basics/pages/tn/tn_img047.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||445300|Jul|26||2013|/kb/books/go/go_basics/pages/tn/tn_img048.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||620484|Jul|26||2013|/kb/books/go/go_basics/pages/tn/tn_img049.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||358516|Jul|26||2013|/kb/books/go/go_equipment/pages/img050.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||516648|Jul|26||2013|/kb/books/go/go_equipment/pages/img051.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||791156|Jul|26||2013|/kb/books/go/go_equipment/pages/img052.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||486725|Jul|26||2013|/kb/books/go/go_equipment/pages/img053.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||948089|Jul|26||2013|/kb/books/go/go_equipment/pages/img054.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||1033406|Jul|26||2013|/kb/books/go/go_equipment/pages/img055.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||687569|Jul|26||2013|/kb/books/go/go_equipment/pages/img056.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||1065658|Jul|26||2013|/kb/books/go/go_equipment/pages/img057.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||857686|Jul|26||2013|/kb/books/go/go_equipment/pages/img058.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||603590|Apr|14||2013|/kb/books/go/go_equipment/pages/img061.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||1374190|Apr|14||2013|/kb/books/go/go_equipment/pages/img062.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||976954|Apr|14||2013|/kb/books/go/go_equipment/pages/img063.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||592214|Apr|14||2013|/kb/books/go/go_equipment/pages/img064.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||390273|Apr|14||2013|/kb/books/go/go_equipment/pages/img065.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||1340886|Apr|14||2013|/kb/books/go/go_equipment/pages/img066.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||807810|Apr|14||2013|/kb/books/go/go_equipment/pages/img067.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||537637|Apr|14||2013|/kb/books/go/go_equipment/pages/img068.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||358516|Jul|26||2013|/kb/books/go/go_equipment/pages/tn/tn_img050.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||516648|Jul|26||2013|/kb/books/go/go_equipment/pages/tn/tn_img051.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||791156|Jul|26||2013|/kb/books/go/go_equipment/pages/tn/tn_img052.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||486725|Jul|26||2013|/kb/books/go/go_equipment/pages/tn/tn_img053.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||948089|Jul|26||2013|/kb/books/go/go_equipment/pages/tn/tn_img054.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||1033406|Jul|26||2013|/kb/books/go/go_equipment/pages/tn/tn_img055.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||687569|Jul|26||2013|/kb/books/go/go_equipment/pages/tn/tn_img056.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||1065658|Jul|26||2013|/kb/books/go/go_equipment/pages/tn/tn_img057.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||857686|Jul|26||2013|/kb/books/go/go_equipment/pages/tn/tn_img058.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||603590|Apr|14||2013|/kb/books/go/go_equipment/pages/tn/tn_img061.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||1374190|Apr|14||2013|/kb/books/go/go_equipment/pages/tn/tn_img062.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||976954|Apr|14||2013|/kb/books/go/go_equipment/pages/tn/tn_img063.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||592214|Apr|14||2013|/kb/books/go/go_equipment/pages/tn/tn_img064.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||390273|Apr|14||2013|/kb/books/go/go_equipment/pages/tn/tn_img065.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||1340886|Apr|14||2013|/kb/books/go/go_equipment/pages/tn/tn_img066.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||807810|Apr|14||2013|/kb/books/go/go_equipment/pages/tn/tn_img067.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||537637|Apr|14||2013|/kb/books/go/go_equipment/pages/tn/tn_img068.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||964295|Jul|26||2013|/kb/books/go/go_joseki/pages/img070.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||951817|Jul|26||2013|/kb/books/go/go_joseki/pages/img071.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||854354|Jul|26||2013|/kb/books/go/go_joseki/pages/img072.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||904237|Jul|26||2013|/kb/books/go/go_joseki/pages/img073.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||808049|Jul|26||2013|/kb/books/go/go_joseki/pages/img074.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||899297|Jul|26||2013|/kb/books/go/go_joseki/pages/img075.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||907623|Jul|26||2013|/kb/books/go/go_joseki/pages/img076.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||759807|Jul|26||2013|/kb/books/go/go_joseki/pages/img077.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||1058618|Jul|26||2013|/kb/books/go/go_joseki/pages/img078.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||1097406|Jul|26||2013|/kb/books/go/go_joseki/pages/img079.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||1071509|Jul|26||2013|/kb/books/go/go_joseki/pages/img080.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||1222293|Jul|26||2013|/kb/books/go/go_joseki/pages/img081.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||809594|Jul|26||2013|/kb/books/go/go_joseki/pages/img082.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||976407|Jul|26||2013|/kb/books/go/go_joseki/pages/img083.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||1107226|Jul|26||2013|/kb/books/go/go_joseki/pages/img084.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||1026899|Jul|26||2013|/kb/books/go/go_joseki/pages/img085.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||1024022|Jul|26||2013|/kb/books/go/go_joseki/pages/img086.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||1029782|Jul|26||2013|/kb/books/go/go_joseki/pages/img087.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||1051070|Jul|26||2013|/kb/books/go/go_joseki/pages/img088.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||956297|Jul|26||2013|/kb/books/go/go_joseki/pages/img089.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||1037967|Jul|26||2013|/kb/books/go/go_joseki/pages/img090.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||1019427|Jul|26||2013|/kb/books/go/go_joseki/pages/img091.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||1106972|Jul|26||2013|/kb/books/go/go_joseki/pages/img092.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||1110897|Jul|26||2013|/kb/books/go/go_joseki/pages/img093.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||1073256|Jul|26||2013|/kb/books/go/go_joseki/pages/img094.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||867457|Jul|27||2013|/kb/books/go/go_joseki/pages/img095.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||1093950|Jul|27||2013|/kb/books/go/go_joseki/pages/img096.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||1215177|Jul|27||2013|/kb/books/go/go_joseki/pages/img097.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||1126591|Jul|27||2013|/kb/books/go/go_joseki/pages/img098.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||1146058|Jul|27||2013|/kb/books/go/go_joseki/pages/img099.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||998658|Jul|27||2013|/kb/books/go/go_joseki/pages/img100.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||950064|Jul|27||2013|/kb/books/go/go_joseki/pages/img101.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||1113709|Jul|27||2013|/kb/books/go/go_joseki/pages/img102.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||1073193|Jul|27||2013|/kb/books/go/go_joseki/pages/img103.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||965100|Jul|27||2013|/kb/books/go/go_joseki/pages/img104.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||967947|Jul|27||2013|/kb/books/go/go_joseki/pages/img105.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||1053408|Jul|27||2013|/kb/books/go/go_joseki/pages/img106.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||1108979|Jul|27||2013|/kb/books/go/go_joseki/pages/img107.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||993497|Jul|27||2013|/kb/books/go/go_joseki/pages/img108.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||970885|Jul|27||2013|/kb/books/go/go_joseki/pages/img109.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||1053854|Jul|27||2013|/kb/books/go/go_joseki/pages/img110.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||984744|Jul|27||2013|/kb/books/go/go_joseki/pages/img111.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||1053819|Jul|27||2013|/kb/books/go/go_joseki/pages/img112.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||1187421|Jul|27||2013|/kb/books/go/go_joseki/pages/img113.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||964581|Jul|27||2013|/kb/books/go/go_joseki/pages/img114.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||978287|Jul|27||2013|/kb/books/go/go_joseki/pages/img115.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||917482|Jul|27||2013|/kb/books/go/go_joseki/pages/img116.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||991987|Jul|27||2013|/kb/books/go/go_joseki/pages/img117.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||898921|Jul|27||2013|/kb/books/go/go_joseki/pages/img118.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||1012220|Jul|27||2013|/kb/books/go/go_joseki/pages/img119.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||1072925|Jul|27||2013|/kb/books/go/go_joseki/pages/img120.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||872746|Jul|27||2013|/kb/books/go/go_joseki/pages/img121.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||866500|Jul|27||2013|/kb/books/go/go_joseki/pages/img122.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||1009773|Jul|27||2013|/kb/books/go/go_joseki/pages/img123.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||968391|Jul|27||2013|/kb/books/go/go_joseki/pages/img124.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||703303|Jul|27||2013|/kb/books/go/go_joseki/pages/img125.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||950503|Jul|27||2013|/kb/books/go/go_joseki/pages/img126.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||998706|Jul|27||2013|/kb/books/go/go_joseki/pages/img127.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||873116|Jul|27||2013|/kb/books/go/go_joseki/pages/img128.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||821432|Jul|27||2013|/kb/books/go/go_joseki/pages/img129.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||825088|Jul|27||2013|/kb/books/go/go_joseki/pages/img130.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||896338|Jul|27||2013|/kb/books/go/go_joseki/pages/img131.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||963585|Jul|27||2013|/kb/books/go/go_joseki/pages/img132.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||983883|Jul|27||2013|/kb/books/go/go_joseki/pages/img133.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||873892|Jul|27||2013|/kb/books/go/go_joseki/pages/img134.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||769739|Jul|27||2013|/kb/books/go/go_joseki/pages/img135.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||713637|Jul|27||2013|/kb/books/go/go_joseki/pages/img136.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||584476|Jul|27||2013|/kb/books/go/go_joseki/pages/img137.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||909033|Jul|27||2013|/kb/books/go/go_joseki/pages/img138.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||1022877|Jul|27||2013|/kb/books/go/go_joseki/pages/img139.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||744019|Jul|27||2013|/kb/books/go/go_joseki/pages/img140.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||166301|Jul|27||2013|/kb/books/go/go_joseki/pages/img141.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||404802|Jul|27||2013|/kb/books/go/go_joseki/pages/img142.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||536562|Jul|27||2013|/kb/books/go/go_joseki/pages/img143.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||964295|Jul|26||2013|/kb/books/go/go_joseki/pages/tn/tn_img070.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||951817|Jul|26||2013|/kb/books/go/go_joseki/pages/tn/tn_img071.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||854354|Jul|26||2013|/kb/books/go/go_joseki/pages/tn/tn_img072.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||904237|Jul|26||2013|/kb/books/go/go_joseki/pages/tn/tn_img073.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||808049|Jul|26||2013|/kb/books/go/go_joseki/pages/tn/tn_img074.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||899297|Jul|26||2013|/kb/books/go/go_joseki/pages/tn/tn_img075.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||907623|Jul|26||2013|/kb/books/go/go_joseki/pages/tn/tn_img076.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||759807|Jul|26||2013|/kb/books/go/go_joseki/pages/tn/tn_img077.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||1058618|Jul|26||2013|/kb/books/go/go_joseki/pages/tn/tn_img078.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||1097406|Jul|26||2013|/kb/books/go/go_joseki/pages/tn/tn_img079.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||1071509|Jul|26||2013|/kb/books/go/go_joseki/pages/tn/tn_img080.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||1222293|Jul|26||2013|/kb/books/go/go_joseki/pages/tn/tn_img081.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||809594|Jul|26||2013|/kb/books/go/go_joseki/pages/tn/tn_img082.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||976407|Jul|26||2013|/kb/books/go/go_joseki/pages/tn/tn_img083.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||1107226|Jul|26||2013|/kb/books/go/go_joseki/pages/tn/tn_img084.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||1026899|Jul|26||2013|/kb/books/go/go_joseki/pages/tn/tn_img085.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||1024022|Jul|26||2013|/kb/books/go/go_joseki/pages/tn/tn_img086.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||1029782|Jul|26||2013|/kb/books/go/go_joseki/pages/tn/tn_img087.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||1051070|Jul|26||2013|/kb/books/go/go_joseki/pages/tn/tn_img088.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||956297|Jul|26||2013|/kb/books/go/go_joseki/pages/tn/tn_img089.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||1037967|Jul|26||2013|/kb/books/go/go_joseki/pages/tn/tn_img090.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||1019427|Jul|26||2013|/kb/books/go/go_joseki/pages/tn/tn_img091.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||1106972|Jul|26||2013|/kb/books/go/go_joseki/pages/tn/tn_img092.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||1110897|Jul|26||2013|/kb/books/go/go_joseki/pages/tn/tn_img093.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||1073256|Jul|26||2013|/kb/books/go/go_joseki/pages/tn/tn_img094.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||867457|Jul|27||2013|/kb/books/go/go_joseki/pages/tn/tn_img095.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||1093950|Jul|27||2013|/kb/books/go/go_joseki/pages/tn/tn_img096.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||1215177|Jul|27||2013|/kb/books/go/go_joseki/pages/tn/tn_img097.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||1126591|Jul|27||2013|/kb/books/go/go_joseki/pages/tn/tn_img098.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||1146058|Jul|27||2013|/kb/books/go/go_joseki/pages/tn/tn_img099.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||998658|Jul|27||2013|/kb/books/go/go_joseki/pages/tn/tn_img100.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||950064|Jul|27||2013|/kb/books/go/go_joseki/pages/tn/tn_img101.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||1113709|Jul|27||2013|/kb/books/go/go_joseki/pages/tn/tn_img102.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||1073193|Jul|27||2013|/kb/books/go/go_joseki/pages/tn/tn_img103.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||965100|Jul|27||2013|/kb/books/go/go_joseki/pages/tn/tn_img104.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||967947|Jul|27||2013|/kb/books/go/go_joseki/pages/tn/tn_img105.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||1053408|Jul|27||2013|/kb/books/go/go_joseki/pages/tn/tn_img106.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||1108979|Jul|27||2013|/kb/books/go/go_joseki/pages/tn/tn_img107.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||993497|Jul|27||2013|/kb/books/go/go_joseki/pages/tn/tn_img108.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||970885|Jul|27||2013|/kb/books/go/go_joseki/pages/tn/tn_img109.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||1053854|Jul|27||2013|/kb/books/go/go_joseki/pages/tn/tn_img110.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||984744|Jul|27||2013|/kb/books/go/go_joseki/pages/tn/tn_img111.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||1053819|Jul|27||2013|/kb/books/go/go_joseki/pages/tn/tn_img112.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||1187421|Jul|27||2013|/kb/books/go/go_joseki/pages/tn/tn_img113.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||964581|Jul|27||2013|/kb/books/go/go_joseki/pages/tn/tn_img114.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||978287|Jul|27||2013|/kb/books/go/go_joseki/pages/tn/tn_img115.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||917482|Jul|27||2013|/kb/books/go/go_joseki/pages/tn/tn_img116.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||991987|Jul|27||2013|/kb/books/go/go_joseki/pages/tn/tn_img117.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||898921|Jul|27||2013|/kb/books/go/go_joseki/pages/tn/tn_img118.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||1012220|Jul|27||2013|/kb/books/go/go_joseki/pages/tn/tn_img119.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||1072925|Jul|27||2013|/kb/books/go/go_joseki/pages/tn/tn_img120.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||872746|Jul|27||2013|/kb/books/go/go_joseki/pages/tn/tn_img121.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||866500|Jul|27||2013|/kb/books/go/go_joseki/pages/tn/tn_img122.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||1009773|Jul|27||2013|/kb/books/go/go_joseki/pages/tn/tn_img123.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||968391|Jul|27||2013|/kb/books/go/go_joseki/pages/tn/tn_img124.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||703303|Jul|27||2013|/kb/books/go/go_joseki/pages/tn/tn_img125.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||950503|Jul|27||2013|/kb/books/go/go_joseki/pages/tn/tn_img126.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||998706|Jul|27||2013|/kb/books/go/go_joseki/pages/tn/tn_img127.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||873116|Jul|27||2013|/kb/books/go/go_joseki/pages/tn/tn_img128.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||821432|Jul|27||2013|/kb/books/go/go_joseki/pages/tn/tn_img129.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||825088|Jul|27||2013|/kb/books/go/go_joseki/pages/tn/tn_img130.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||896338|Jul|27||2013|/kb/books/go/go_joseki/pages/tn/tn_img131.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||963585|Jul|27||2013|/kb/books/go/go_joseki/pages/tn/tn_img132.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||983883|Jul|27||2013|/kb/books/go/go_joseki/pages/tn/tn_img133.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||873892|Jul|27||2013|/kb/books/go/go_joseki/pages/tn/tn_img134.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||769739|Jul|27||2013|/kb/books/go/go_joseki/pages/tn/tn_img135.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||713637|Jul|27||2013|/kb/books/go/go_joseki/pages/tn/tn_img136.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||584476|Jul|27||2013|/kb/books/go/go_joseki/pages/tn/tn_img137.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||909033|Jul|27||2013|/kb/books/go/go_joseki/pages/tn/tn_img138.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||1022877|Jul|27||2013|/kb/books/go/go_joseki/pages/tn/tn_img139.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||744019|Jul|27||2013|/kb/books/go/go_joseki/pages/tn/tn_img140.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||166301|Jul|27||2013|/kb/books/go/go_joseki/pages/tn/tn_img141.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||404802|Jul|27||2013|/kb/books/go/go_joseki/pages/tn/tn_img142.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||536562|Jul|27||2013|/kb/books/go/go_joseki/pages/tn/tn_img143.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||437291|Jul|28||2013|/kb/books/go/go_middlegame/pages/img183.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||525694|Jul|28||2013|/kb/books/go/go_middlegame/pages/img184.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||653806|Jul|28||2013|/kb/books/go/go_middlegame/pages/img185.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||841874|Jul|28||2013|/kb/books/go/go_middlegame/pages/img186.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||783850|Jul|28||2013|/kb/books/go/go_middlegame/pages/img187.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||759335|Jul|28||2013|/kb/books/go/go_middlegame/pages/img188.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||777431|Jul|28||2013|/kb/books/go/go_middlegame/pages/img189.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||621857|Jul|28||2013|/kb/books/go/go_middlegame/pages/img190.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||621065|Jul|28||2013|/kb/books/go/go_middlegame/pages/img213.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||660424|Jul|28||2013|/kb/books/go/go_middlegame/pages/img214.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||640766|Jul|28||2013|/kb/books/go/go_middlegame/pages/img215.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||701699|Jul|28||2013|/kb/books/go/go_middlegame/pages/img216.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||684817|Jul|28||2013|/kb/books/go/go_middlegame/pages/img217.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||693628|Jul|28||2013|/kb/books/go/go_middlegame/pages/img218.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||652074|Jul|28||2013|/kb/books/go/go_middlegame/pages/img219.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||665520|Jul|28||2013|/kb/books/go/go_middlegame/pages/img220.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||664979|Jul|28||2013|/kb/books/go/go_middlegame/pages/img221.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||420880|Jul|28||2013|/kb/books/go/go_middlegame/pages/img222.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||653179|Jul|28||2013|/kb/books/go/go_middlegame/pages/img223.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||631018|Jul|28||2013|/kb/books/go/go_middlegame/pages/img224.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||614888|Jul|28||2013|/kb/books/go/go_middlegame/pages/img225.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||635578|Jul|28||2013|/kb/books/go/go_middlegame/pages/img226.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||664987|Jul|28||2013|/kb/books/go/go_middlegame/pages/img227.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||494882|Jul|28||2013|/kb/books/go/go_middlegame/pages/img228.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||755517|Jul|28||2013|/kb/books/go/go_middlegame/pages/img229.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||746024|Jul|28||2013|/kb/books/go/go_middlegame/pages/img230.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||740563|Jul|28||2013|/kb/books/go/go_middlegame/pages/img231.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||720673|Jul|28||2013|/kb/books/go/go_middlegame/pages/img232.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||641901|Jul|28||2013|/kb/books/go/go_middlegame/pages/img233.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||681172|Jul|28||2013|/kb/books/go/go_middlegame/pages/img234.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||681621|Jul|28||2013|/kb/books/go/go_middlegame/pages/img235.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||699626|Jul|28||2013|/kb/books/go/go_middlegame/pages/img236.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||692405|Jul|28||2013|/kb/books/go/go_middlegame/pages/img237.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||675217|Jul|28||2013|/kb/books/go/go_middlegame/pages/img238.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||637166|Jul|28||2013|/kb/books/go/go_middlegame/pages/img239.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||638038|Jul|28||2013|/kb/books/go/go_middlegame/pages/img240.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||746258|Jul|28||2013|/kb/books/go/go_middlegame/pages/img241.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||697934|Jul|28||2013|/kb/books/go/go_middlegame/pages/img242.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||680670|Jul|28||2013|/kb/books/go/go_middlegame/pages/img243.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||666127|Jul|28||2013|/kb/books/go/go_middlegame/pages/img244.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||703644|Jul|28||2013|/kb/books/go/go_middlegame/pages/img245.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||674102|Jul|28||2013|/kb/books/go/go_middlegame/pages/img246.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||684526|Jul|28||2013|/kb/books/go/go_middlegame/pages/img247.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||648526|Jul|28||2013|/kb/books/go/go_middlegame/pages/img248.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||728614|Jul|28||2013|/kb/books/go/go_middlegame/pages/img249.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||663415|Jul|28||2013|/kb/books/go/go_middlegame/pages/img250.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||694657|Jul|28||2013|/kb/books/go/go_middlegame/pages/img251.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||673729|Jul|28||2013|/kb/books/go/go_middlegame/pages/img252.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||663575|Jul|28||2013|/kb/books/go/go_middlegame/pages/img253.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||464991|Jul|28||2013|/kb/books/go/go_middlegame/pages/img254.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||756849|Jul|28||2013|/kb/books/go/go_middlegame/pages/img255.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||761547|Jul|28||2013|/kb/books/go/go_middlegame/pages/img256.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||801070|Jul|28||2013|/kb/books/go/go_middlegame/pages/img257.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||739075|Jul|28||2013|/kb/books/go/go_middlegame/pages/img258.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||787189|Jul|28||2013|/kb/books/go/go_middlegame/pages/img259.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||729433|Jul|28||2013|/kb/books/go/go_middlegame/pages/img260.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||793385|Jul|28||2013|/kb/books/go/go_middlegame/pages/img261.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||756141|Jul|28||2013|/kb/books/go/go_middlegame/pages/img262.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||779572|Jul|28||2013|/kb/books/go/go_middlegame/pages/img263.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||759079|Jul|28||2013|/kb/books/go/go_middlegame/pages/img264.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||738282|Jul|28||2013|/kb/books/go/go_middlegame/pages/img265.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||814029|Jul|28||2013|/kb/books/go/go_middlegame/pages/img266.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||833386|Jul|28||2013|/kb/books/go/go_middlegame/pages/img267.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||188285|Jul|28||2013|/kb/books/go/go_middlegame/pages/img268.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||369506|Jul|28||2013|/kb/books/go/go_middlegame/pages/img269.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||384764|Jul|28||2013|/kb/books/go/go_middlegame/pages/img270.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||547382|Jul|28||2013|/kb/books/go/go_middlegame/pages/img271.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||647343|Jul|28||2013|/kb/books/go/go_middlegame/pages/img272.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||1070171|Jul|28||2013|/kb/books/go/go_middlegame/pages/img273.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||1188408|Jul|28||2013|/kb/books/go/go_middlegame/pages/img274.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||315266|Jul|28||2013|/kb/books/go/go_middlegame/pages/img275.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||299360|Jul|28||2013|/kb/books/go/go_middlegame/pages/img276.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||707195|Jul|28||2013|/kb/books/go/go_middlegame/pages/img277.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||872457|Jul|28||2013|/kb/books/go/go_middlegame/pages/img278.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||959051|Jul|28||2013|/kb/books/go/go_middlegame/pages/img279.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||920879|Jul|28||2013|/kb/books/go/go_middlegame/pages/img280.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||926630|Jul|28||2013|/kb/books/go/go_middlegame/pages/img281.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||1034689|Jul|28||2013|/kb/books/go/go_middlegame/pages/img282.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||341434|Jul|25||2013|/kb/books/go/go_middlegame/pages/img283.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||1211055|Jul|25||2013|/kb/books/go/go_middlegame/pages/img284.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||437291|Jul|28||2013|/kb/books/go/go_middlegame/pages/tn/tn_img183.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||525694|Jul|28||2013|/kb/books/go/go_middlegame/pages/tn/tn_img184.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||653806|Jul|28||2013|/kb/books/go/go_middlegame/pages/tn/tn_img185.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||841874|Jul|28||2013|/kb/books/go/go_middlegame/pages/tn/tn_img186.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||783850|Jul|28||2013|/kb/books/go/go_middlegame/pages/tn/tn_img187.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||759335|Jul|28||2013|/kb/books/go/go_middlegame/pages/tn/tn_img188.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||777431|Jul|28||2013|/kb/books/go/go_middlegame/pages/tn/tn_img189.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||621857|Jul|28||2013|/kb/books/go/go_middlegame/pages/tn/tn_img190.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||621065|Jul|28||2013|/kb/books/go/go_middlegame/pages/tn/tn_img213.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||660424|Jul|28||2013|/kb/books/go/go_middlegame/pages/tn/tn_img214.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||640766|Jul|28||2013|/kb/books/go/go_middlegame/pages/tn/tn_img215.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||701699|Jul|28||2013|/kb/books/go/go_middlegame/pages/tn/tn_img216.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||684817|Jul|28||2013|/kb/books/go/go_middlegame/pages/tn/tn_img217.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||693628|Jul|28||2013|/kb/books/go/go_middlegame/pages/tn/tn_img218.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||652074|Jul|28||2013|/kb/books/go/go_middlegame/pages/tn/tn_img219.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||665520|Jul|28||2013|/kb/books/go/go_middlegame/pages/tn/tn_img220.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||664979|Jul|28||2013|/kb/books/go/go_middlegame/pages/tn/tn_img221.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||420880|Jul|28||2013|/kb/books/go/go_middlegame/pages/tn/tn_img222.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||653179|Jul|28||2013|/kb/books/go/go_middlegame/pages/tn/tn_img223.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||631018|Jul|28||2013|/kb/books/go/go_middlegame/pages/tn/tn_img224.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||614888|Jul|28||2013|/kb/books/go/go_middlegame/pages/tn/tn_img225.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||635578|Jul|28||2013|/kb/books/go/go_middlegame/pages/tn/tn_img226.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||664987|Jul|28||2013|/kb/books/go/go_middlegame/pages/tn/tn_img227.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||494882|Jul|28||2013|/kb/books/go/go_middlegame/pages/tn/tn_img228.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||755517|Jul|28||2013|/kb/books/go/go_middlegame/pages/tn/tn_img229.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||746024|Jul|28||2013|/kb/books/go/go_middlegame/pages/tn/tn_img230.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||740563|Jul|28||2013|/kb/books/go/go_middlegame/pages/tn/tn_img231.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||720673|Jul|28||2013|/kb/books/go/go_middlegame/pages/tn/tn_img232.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||641901|Jul|28||2013|/kb/books/go/go_middlegame/pages/tn/tn_img233.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||681172|Jul|28||2013|/kb/books/go/go_middlegame/pages/tn/tn_img234.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||681621|Jul|28||2013|/kb/books/go/go_middlegame/pages/tn/tn_img235.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||699626|Jul|28||2013|/kb/books/go/go_middlegame/pages/tn/tn_img236.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||692405|Jul|28||2013|/kb/books/go/go_middlegame/pages/tn/tn_img237.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||675217|Jul|28||2013|/kb/books/go/go_middlegame/pages/tn/tn_img238.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||637166|Jul|28||2013|/kb/books/go/go_middlegame/pages/tn/tn_img239.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||638038|Jul|28||2013|/kb/books/go/go_middlegame/pages/tn/tn_img240.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||746258|Jul|28||2013|/kb/books/go/go_middlegame/pages/tn/tn_img241.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||697934|Jul|28||2013|/kb/books/go/go_middlegame/pages/tn/tn_img242.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||680670|Jul|28||2013|/kb/books/go/go_middlegame/pages/tn/tn_img243.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||666127|Jul|28||2013|/kb/books/go/go_middlegame/pages/tn/tn_img244.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||703644|Jul|28||2013|/kb/books/go/go_middlegame/pages/tn/tn_img245.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||674102|Jul|28||2013|/kb/books/go/go_middlegame/pages/tn/tn_img246.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||684526|Jul|28||2013|/kb/books/go/go_middlegame/pages/tn/tn_img247.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||648526|Jul|28||2013|/kb/books/go/go_middlegame/pages/tn/tn_img248.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||728614|Jul|28||2013|/kb/books/go/go_middlegame/pages/tn/tn_img249.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||663415|Jul|28||2013|/kb/books/go/go_middlegame/pages/tn/tn_img250.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||694657|Jul|28||2013|/kb/books/go/go_middlegame/pages/tn/tn_img251.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||673729|Jul|28||2013|/kb/books/go/go_middlegame/pages/tn/tn_img252.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||663575|Jul|28||2013|/kb/books/go/go_middlegame/pages/tn/tn_img253.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||464991|Jul|28||2013|/kb/books/go/go_middlegame/pages/tn/tn_img254.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||756849|Jul|28||2013|/kb/books/go/go_middlegame/pages/tn/tn_img255.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||761547|Jul|28||2013|/kb/books/go/go_middlegame/pages/tn/tn_img256.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||801070|Jul|28||2013|/kb/books/go/go_middlegame/pages/tn/tn_img257.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||739075|Jul|28||2013|/kb/books/go/go_middlegame/pages/tn/tn_img258.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||787189|Jul|28||2013|/kb/books/go/go_middlegame/pages/tn/tn_img259.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||729433|Jul|28||2013|/kb/books/go/go_middlegame/pages/tn/tn_img260.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||793385|Jul|28||2013|/kb/books/go/go_middlegame/pages/tn/tn_img261.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||756141|Jul|28||2013|/kb/books/go/go_middlegame/pages/tn/tn_img262.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||779572|Jul|28||2013|/kb/books/go/go_middlegame/pages/tn/tn_img263.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||759079|Jul|28||2013|/kb/books/go/go_middlegame/pages/tn/tn_img264.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||738282|Jul|28||2013|/kb/books/go/go_middlegame/pages/tn/tn_img265.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||814029|Jul|28||2013|/kb/books/go/go_middlegame/pages/tn/tn_img266.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||833386|Jul|28||2013|/kb/books/go/go_middlegame/pages/tn/tn_img267.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||188285|Jul|28||2013|/kb/books/go/go_middlegame/pages/tn/tn_img268.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||369506|Jul|28||2013|/kb/books/go/go_middlegame/pages/tn/tn_img269.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||384764|Jul|28||2013|/kb/books/go/go_middlegame/pages/tn/tn_img270.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||547382|Jul|28||2013|/kb/books/go/go_middlegame/pages/tn/tn_img271.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||647343|Jul|28||2013|/kb/books/go/go_middlegame/pages/tn/tn_img272.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||1070171|Jul|28||2013|/kb/books/go/go_middlegame/pages/tn/tn_img273.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||1188408|Jul|28||2013|/kb/books/go/go_middlegame/pages/tn/tn_img274.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||315266|Jul|28||2013|/kb/books/go/go_middlegame/pages/tn/tn_img275.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||299360|Jul|28||2013|/kb/books/go/go_middlegame/pages/tn/tn_img276.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||707195|Jul|28||2013|/kb/books/go/go_middlegame/pages/tn/tn_img277.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||872457|Jul|28||2013|/kb/books/go/go_middlegame/pages/tn/tn_img278.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||959051|Jul|28||2013|/kb/books/go/go_middlegame/pages/tn/tn_img279.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||920879|Jul|28||2013|/kb/books/go/go_middlegame/pages/tn/tn_img280.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||926630|Jul|28||2013|/kb/books/go/go_middlegame/pages/tn/tn_img281.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||1034689|Jul|28||2013|/kb/books/go/go_middlegame/pages/tn/tn_img282.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||341434|Jul|25||2013|/kb/books/go/go_middlegame/pages/tn/tn_img283.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||1211055|Jul|25||2013|/kb/books/go/go_middlegame/pages/tn/tn_img284.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||1053658|Jul|25||2013|/kb/books/go/go_strategy/pages/img285.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||336909|Jul|25||2013|/kb/books/go/go_strategy/pages/img286.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||354099|Jul|25||2013|/kb/books/go/go_strategy/pages/img287.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||409400|Jul|25||2013|/kb/books/go/go_strategy/pages/img288.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||417952|Jul|25||2013|/kb/books/go/go_strategy/pages/img289.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||690620|Jul|25||2013|/kb/books/go/go_strategy/pages/img290.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||845711|Jul|25||2013|/kb/books/go/go_strategy/pages/img291.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||1028081|Jul|25||2013|/kb/books/go/go_strategy/pages/img292.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||1126342|Jul|25||2013|/kb/books/go/go_strategy/pages/img293.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||1106874|Jul|25||2013|/kb/books/go/go_strategy/pages/img294.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||1054403|Jul|25||2013|/kb/books/go/go_strategy/pages/img295.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||1120631|Jul|25||2013|/kb/books/go/go_strategy/pages/img296.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||756489|Jul|25||2013|/kb/books/go/go_strategy/pages/img297.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||1084236|Jul|25||2013|/kb/books/go/go_strategy/pages/img298.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||1067948|Jul|25||2013|/kb/books/go/go_strategy/pages/img299.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||979594|Jul|25||2013|/kb/books/go/go_strategy/pages/img300.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||1045182|Jul|25||2013|/kb/books/go/go_strategy/pages/img301.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||901610|Jul|25||2013|/kb/books/go/go_strategy/pages/img302.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||918985|Jul|25||2013|/kb/books/go/go_strategy/pages/img303.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||862420|Jul|25||2013|/kb/books/go/go_strategy/pages/img304.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||886557|Jul|25||2013|/kb/books/go/go_strategy/pages/img305.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||787507|Jul|25||2013|/kb/books/go/go_strategy/pages/img306.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||911463|Jul|25||2013|/kb/books/go/go_strategy/pages/img307.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||965161|Jul|25||2013|/kb/books/go/go_strategy/pages/img308.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||973577|Jul|25||2013|/kb/books/go/go_strategy/pages/img309.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||888001|Jul|25||2013|/kb/books/go/go_strategy/pages/img310.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||786913|Jul|25||2013|/kb/books/go/go_strategy/pages/img311.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||963093|Jul|25||2013|/kb/books/go/go_strategy/pages/img312.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||1189822|Jul|25||2013|/kb/books/go/go_strategy/pages/img313.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||877732|Jul|25||2013|/kb/books/go/go_strategy/pages/img314.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||849270|Jul|25||2013|/kb/books/go/go_strategy/pages/img315.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||963161|Jul|25||2013|/kb/books/go/go_strategy/pages/img316.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||507750|Jul|25||2013|/kb/books/go/go_strategy/pages/img317.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||930132|Jul|26||2013|/kb/books/go/go_strategy/pages/img318.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||862631|Jul|26||2013|/kb/books/go/go_strategy/pages/img319.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||2584516|Jul|26||2013|/kb/books/go/go_strategy/pages/img319_rot.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||907770|Jul|26||2013|/kb/books/go/go_strategy/pages/img320.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||1074018|Jul|26||2013|/kb/books/go/go_strategy/pages/img321.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||985358|Jul|26||2013|/kb/books/go/go_strategy/pages/img322.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||955316|Jul|26||2013|/kb/books/go/go_strategy/pages/img323.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||1048619|Jul|26||2013|/kb/books/go/go_strategy/pages/img324.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||1013385|Jul|26||2013|/kb/books/go/go_strategy/pages/img325.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||1091971|Jul|26||2013|/kb/books/go/go_strategy/pages/img326.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||801231|Jul|26||2013|/kb/books/go/go_strategy/pages/img327.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||845582|Jul|26||2013|/kb/books/go/go_strategy/pages/img328.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||931676|Jul|26||2013|/kb/books/go/go_strategy/pages/img329.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||1068374|Jul|26||2013|/kb/books/go/go_strategy/pages/img330.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||836404|Jul|26||2013|/kb/books/go/go_strategy/pages/img331.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||1002956|Jul|26||2013|/kb/books/go/go_strategy/pages/img332.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||858923|Jul|26||2013|/kb/books/go/go_strategy/pages/img333.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||904910|Jul|26||2013|/kb/books/go/go_strategy/pages/img334.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||905806|Jul|28||2013|/kb/books/go/go_strategy/pages/img335.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||1032145|Jul|28||2013|/kb/books/go/go_strategy/pages/img336.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||927378|Jul|28||2013|/kb/books/go/go_strategy/pages/img337.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||1021816|Jul|28||2013|/kb/books/go/go_strategy/pages/img338.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||1007963|Jul|28||2013|/kb/books/go/go_strategy/pages/img339.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||1087169|Jul|28||2013|/kb/books/go/go_strategy/pages/img340.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||907719|Jul|28||2013|/kb/books/go/go_strategy/pages/img341.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||1017200|Jul|28||2013|/kb/books/go/go_strategy/pages/img342.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||1008372|Jul|28||2013|/kb/books/go/go_strategy/pages/img343.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||904314|Jul|28||2013|/kb/books/go/go_strategy/pages/img344.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||865407|Jul|28||2013|/kb/books/go/go_strategy/pages/img345.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||936444|Jul|28||2013|/kb/books/go/go_strategy/pages/img346.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||1098851|Jul|28||2013|/kb/books/go/go_strategy/pages/img347.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||1136515|Jul|28||2013|/kb/books/go/go_strategy/pages/img348.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||1181254|Jul|28||2013|/kb/books/go/go_strategy/pages/img349.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||826651|Jul|28||2013|/kb/books/go/go_strategy/pages/img350.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||605881|Jul|28||2013|/kb/books/go/go_strategy/pages/img351.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||695558|Jul|28||2013|/kb/books/go/go_strategy/pages/img352.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||166542|Jul|28||2013|/kb/books/go/go_strategy/pages/img353.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||147900|Jul|28||2013|/kb/books/go/go_strategy/pages/img354.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||216814|Jul|28||2013|/kb/books/go/go_strategy/pages/img355.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||224027|Jul|28||2013|/kb/books/go/go_strategy/pages/img356.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||1053658|Jul|25||2013|/kb/books/go/go_strategy/pages/tn/tn_img285.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||336909|Jul|25||2013|/kb/books/go/go_strategy/pages/tn/tn_img286.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||354099|Jul|25||2013|/kb/books/go/go_strategy/pages/tn/tn_img287.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||409400|Jul|25||2013|/kb/books/go/go_strategy/pages/tn/tn_img288.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||417952|Jul|25||2013|/kb/books/go/go_strategy/pages/tn/tn_img289.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||690620|Jul|25||2013|/kb/books/go/go_strategy/pages/tn/tn_img290.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||845711|Jul|25||2013|/kb/books/go/go_strategy/pages/tn/tn_img291.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||1028081|Jul|25||2013|/kb/books/go/go_strategy/pages/tn/tn_img292.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||1126342|Jul|25||2013|/kb/books/go/go_strategy/pages/tn/tn_img293.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||1106874|Jul|25||2013|/kb/books/go/go_strategy/pages/tn/tn_img294.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||1054403|Jul|25||2013|/kb/books/go/go_strategy/pages/tn/tn_img295.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||1120631|Jul|25||2013|/kb/books/go/go_strategy/pages/tn/tn_img296.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||756489|Jul|25||2013|/kb/books/go/go_strategy/pages/tn/tn_img297.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||1084236|Jul|25||2013|/kb/books/go/go_strategy/pages/tn/tn_img298.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||1067948|Jul|25||2013|/kb/books/go/go_strategy/pages/tn/tn_img299.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||979594|Jul|25||2013|/kb/books/go/go_strategy/pages/tn/tn_img300.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||1045182|Jul|25||2013|/kb/books/go/go_strategy/pages/tn/tn_img301.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||901610|Jul|25||2013|/kb/books/go/go_strategy/pages/tn/tn_img302.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||918985|Jul|25||2013|/kb/books/go/go_strategy/pages/tn/tn_img303.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||862420|Jul|25||2013|/kb/books/go/go_strategy/pages/tn/tn_img304.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||886557|Jul|25||2013|/kb/books/go/go_strategy/pages/tn/tn_img305.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||787507|Jul|25||2013|/kb/books/go/go_strategy/pages/tn/tn_img306.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||911463|Jul|25||2013|/kb/books/go/go_strategy/pages/tn/tn_img307.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||965161|Jul|25||2013|/kb/books/go/go_strategy/pages/tn/tn_img308.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||973577|Jul|25||2013|/kb/books/go/go_strategy/pages/tn/tn_img309.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||888001|Jul|25||2013|/kb/books/go/go_strategy/pages/tn/tn_img310.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||786913|Jul|25||2013|/kb/books/go/go_strategy/pages/tn/tn_img311.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||963093|Jul|25||2013|/kb/books/go/go_strategy/pages/tn/tn_img312.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||1189822|Jul|25||2013|/kb/books/go/go_strategy/pages/tn/tn_img313.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||877732|Jul|25||2013|/kb/books/go/go_strategy/pages/tn/tn_img314.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||849270|Jul|25||2013|/kb/books/go/go_strategy/pages/tn/tn_img315.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||963161|Jul|25||2013|/kb/books/go/go_strategy/pages/tn/tn_img316.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||507750|Jul|25||2013|/kb/books/go/go_strategy/pages/tn/tn_img317.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||930132|Jul|26||2013|/kb/books/go/go_strategy/pages/tn/tn_img318.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||862631|Jul|26||2013|/kb/books/go/go_strategy/pages/tn/tn_img319.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||2584516|Jul|26||2013|/kb/books/go/go_strategy/pages/tn/tn_img319_rot.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||907770|Jul|26||2013|/kb/books/go/go_strategy/pages/tn/tn_img320.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||1074018|Jul|26||2013|/kb/books/go/go_strategy/pages/tn/tn_img321.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||985358|Jul|26||2013|/kb/books/go/go_strategy/pages/tn/tn_img322.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||955316|Jul|26||2013|/kb/books/go/go_strategy/pages/tn/tn_img323.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||1048619|Jul|26||2013|/kb/books/go/go_strategy/pages/tn/tn_img324.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||1013385|Jul|26||2013|/kb/books/go/go_strategy/pages/tn/tn_img325.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||1091971|Jul|26||2013|/kb/books/go/go_strategy/pages/tn/tn_img326.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||801231|Jul|26||2013|/kb/books/go/go_strategy/pages/tn/tn_img327.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||845582|Jul|26||2013|/kb/books/go/go_strategy/pages/tn/tn_img328.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||931676|Jul|26||2013|/kb/books/go/go_strategy/pages/tn/tn_img329.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||1068374|Jul|26||2013|/kb/books/go/go_strategy/pages/tn/tn_img330.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||836404|Jul|26||2013|/kb/books/go/go_strategy/pages/tn/tn_img331.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||1002956|Jul|26||2013|/kb/books/go/go_strategy/pages/tn/tn_img332.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||858923|Jul|26||2013|/kb/books/go/go_strategy/pages/tn/tn_img333.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||904910|Jul|26||2013|/kb/books/go/go_strategy/pages/tn/tn_img334.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||905806|Jul|28||2013|/kb/books/go/go_strategy/pages/tn/tn_img335.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||1032145|Jul|28||2013|/kb/books/go/go_strategy/pages/tn/tn_img336.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||927378|Jul|28||2013|/kb/books/go/go_strategy/pages/tn/tn_img337.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||1021816|Jul|28||2013|/kb/books/go/go_strategy/pages/tn/tn_img338.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||1007963|Jul|28||2013|/kb/books/go/go_strategy/pages/tn/tn_img339.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||1087169|Jul|28||2013|/kb/books/go/go_strategy/pages/tn/tn_img340.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||907719|Jul|28||2013|/kb/books/go/go_strategy/pages/tn/tn_img341.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||1017200|Jul|28||2013|/kb/books/go/go_strategy/pages/tn/tn_img342.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||1008372|Jul|28||2013|/kb/books/go/go_strategy/pages/tn/tn_img343.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||904314|Jul|28||2013|/kb/books/go/go_strategy/pages/tn/tn_img344.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||865407|Jul|28||2013|/kb/books/go/go_strategy/pages/tn/tn_img345.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||936444|Jul|28||2013|/kb/books/go/go_strategy/pages/tn/tn_img346.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||1098851|Jul|28||2013|/kb/books/go/go_strategy/pages/tn/tn_img347.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||1136515|Jul|28||2013|/kb/books/go/go_strategy/pages/tn/tn_img348.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||1181254|Jul|28||2013|/kb/books/go/go_strategy/pages/tn/tn_img349.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||826651|Jul|28||2013|/kb/books/go/go_strategy/pages/tn/tn_img350.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||605881|Jul|28||2013|/kb/books/go/go_strategy/pages/tn/tn_img351.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||695558|Jul|28||2013|/kb/books/go/go_strategy/pages/tn/tn_img352.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||166542|Jul|28||2013|/kb/books/go/go_strategy/pages/tn/tn_img353.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||147900|Jul|28||2013|/kb/books/go/go_strategy/pages/tn/tn_img354.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||216814|Jul|28||2013|/kb/books/go/go_strategy/pages/tn/tn_img355.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||224027|Jul|28||2013|/kb/books/go/go_strategy/pages/tn/tn_img356.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||313740|Jul|27||2013|/kb/books/go/go_tesuji/pages/img144.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||534933|Jul|27||2013|/kb/books/go/go_tesuji/pages/img145.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||637566|Jul|27||2013|/kb/books/go/go_tesuji/pages/img146.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||883337|Jul|27||2013|/kb/books/go/go_tesuji/pages/img147.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||910842|Jul|27||2013|/kb/books/go/go_tesuji/pages/img148.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||547960|Jul|27||2013|/kb/books/go/go_tesuji/pages/img149.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||511374|Jul|27||2013|/kb/books/go/go_tesuji/pages/img150.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||309376|Jul|27||2013|/kb/books/go/go_tesuji/pages/img151.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||712605|Jul|27||2013|/kb/books/go/go_tesuji/pages/img152.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||610951|Jul|27||2013|/kb/books/go/go_tesuji/pages/img153.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||579887|Apr|15||2013|/kb/books/go/go_tesuji/pages/img154.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||205822|Apr|15||2013|/kb/books/go/go_tesuji/pages/img155.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||506775|Apr|15||2013|/kb/books/go/go_tesuji/pages/img156.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||554846|Apr|15||2013|/kb/books/go/go_tesuji/pages/img157.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||267323|Apr|15||2013|/kb/books/go/go_tesuji/pages/img158.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||328954|Apr|15||2013|/kb/books/go/go_tesuji/pages/img159.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||378242|Apr|15||2013|/kb/books/go/go_tesuji/pages/img160.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||726846|Jul|27||2013|/kb/books/go/go_tesuji/pages/img161.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||725448|Jul|27||2013|/kb/books/go/go_tesuji/pages/img162.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||687696|Jul|27||2013|/kb/books/go/go_tesuji/pages/img163.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||717765|Jul|27||2013|/kb/books/go/go_tesuji/pages/img164.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||527036|Jul|27||2013|/kb/books/go/go_tesuji/pages/img165.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||706619|Jul|27||2013|/kb/books/go/go_tesuji/pages/img166.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||742105|Jul|27||2013|/kb/books/go/go_tesuji/pages/img167.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||797265|Jul|27||2013|/kb/books/go/go_tesuji/pages/img168.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||760087|Jul|27||2013|/kb/books/go/go_tesuji/pages/img169.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||657636|Jul|27||2013|/kb/books/go/go_tesuji/pages/img170.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||755147|Jul|28||2013|/kb/books/go/go_tesuji/pages/img171.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||645677|Jul|28||2013|/kb/books/go/go_tesuji/pages/img172.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||696265|Jul|28||2013|/kb/books/go/go_tesuji/pages/img173.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||712791|Jul|28||2013|/kb/books/go/go_tesuji/pages/img174.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||717123|Jul|28||2013|/kb/books/go/go_tesuji/pages/img175.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||652155|Jul|28||2013|/kb/books/go/go_tesuji/pages/img176.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||813062|Jul|28||2013|/kb/books/go/go_tesuji/pages/img177.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||685220|Jul|28||2013|/kb/books/go/go_tesuji/pages/img178.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||599655|Jul|28||2013|/kb/books/go/go_tesuji/pages/img179.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||621916|Jul|28||2013|/kb/books/go/go_tesuji/pages/img180.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||511956|Jul|28||2013|/kb/books/go/go_tesuji/pages/img181.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||510349|Jul|28||2013|/kb/books/go/go_tesuji/pages/img182.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||313740|Jul|27||2013|/kb/books/go/go_tesuji/pages/tn/tn_img144.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||534933|Jul|27||2013|/kb/books/go/go_tesuji/pages/tn/tn_img145.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||637566|Jul|27||2013|/kb/books/go/go_tesuji/pages/tn/tn_img146.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||883337|Jul|27||2013|/kb/books/go/go_tesuji/pages/tn/tn_img147.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||910842|Jul|27||2013|/kb/books/go/go_tesuji/pages/tn/tn_img148.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||547960|Jul|27||2013|/kb/books/go/go_tesuji/pages/tn/tn_img149.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||511374|Jul|27||2013|/kb/books/go/go_tesuji/pages/tn/tn_img150.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||309376|Jul|27||2013|/kb/books/go/go_tesuji/pages/tn/tn_img151.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||712605|Jul|27||2013|/kb/books/go/go_tesuji/pages/tn/tn_img152.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||610951|Jul|27||2013|/kb/books/go/go_tesuji/pages/tn/tn_img153.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||579887|Apr|15||2013|/kb/books/go/go_tesuji/pages/tn/tn_img154.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||205822|Apr|15||2013|/kb/books/go/go_tesuji/pages/tn/tn_img155.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||506775|Apr|15||2013|/kb/books/go/go_tesuji/pages/tn/tn_img156.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||554846|Apr|15||2013|/kb/books/go/go_tesuji/pages/tn/tn_img157.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||267323|Apr|15||2013|/kb/books/go/go_tesuji/pages/tn/tn_img158.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||328954|Apr|15||2013|/kb/books/go/go_tesuji/pages/tn/tn_img159.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||378242|Apr|15||2013|/kb/books/go/go_tesuji/pages/tn/tn_img160.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||726846|Jul|27||2013|/kb/books/go/go_tesuji/pages/tn/tn_img161.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||725448|Jul|27||2013|/kb/books/go/go_tesuji/pages/tn/tn_img162.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||687696|Jul|27||2013|/kb/books/go/go_tesuji/pages/tn/tn_img163.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||717765|Jul|27||2013|/kb/books/go/go_tesuji/pages/tn/tn_img164.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||527036|Jul|27||2013|/kb/books/go/go_tesuji/pages/tn/tn_img165.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||706619|Jul|27||2013|/kb/books/go/go_tesuji/pages/tn/tn_img166.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||742105|Jul|27||2013|/kb/books/go/go_tesuji/pages/tn/tn_img167.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||797265|Jul|27||2013|/kb/books/go/go_tesuji/pages/tn/tn_img168.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||760087|Jul|27||2013|/kb/books/go/go_tesuji/pages/tn/tn_img169.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||657636|Jul|27||2013|/kb/books/go/go_tesuji/pages/tn/tn_img170.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||755147|Jul|28||2013|/kb/books/go/go_tesuji/pages/tn/tn_img171.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||645677|Jul|28||2013|/kb/books/go/go_tesuji/pages/tn/tn_img172.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||696265|Jul|28||2013|/kb/books/go/go_tesuji/pages/tn/tn_img173.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||712791|Jul|28||2013|/kb/books/go/go_tesuji/pages/tn/tn_img174.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||717123|Jul|28||2013|/kb/books/go/go_tesuji/pages/tn/tn_img175.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||652155|Jul|28||2013|/kb/books/go/go_tesuji/pages/tn/tn_img176.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||813062|Jul|28||2013|/kb/books/go/go_tesuji/pages/tn/tn_img177.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||685220|Jul|28||2013|/kb/books/go/go_tesuji/pages/tn/tn_img178.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||599655|Jul|28||2013|/kb/books/go/go_tesuji/pages/tn/tn_img179.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||621916|Jul|28||2013|/kb/books/go/go_tesuji/pages/tn/tn_img180.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||511956|Jul|28||2013|/kb/books/go/go_tesuji/pages/tn/tn_img181.jpg";
			pages[j++] = "-rw-r--r--||1|konet||staff||510349|Jul|28||2013|/kb/books/go/go_tesuji/pages/tn/tn_img182.jpg";

			pages_len = pages.length;
			alert( "BUGS_1611 lslat_kb_books_go.js pages="+pages+" pages_len="+pages_len );
//			alert( "BUGS_1612 lslat_kb_books_go.js window.pages="+window.pages );
			return( pages );
			}
			</script>

	<script id="script_thumbnails">
		function load_thumbnails(pages) {
			alert( "BUGS_2500 load_thumbnails" );
//			var pages = new Array();
			var pages_len = 0;
			var j = 0; var k=0;
			var htmout = "";
//			pages = load_pages();
			pages_len = pages.length;
			j=1;
			htmout += '<ul>';
			htmout += '<li class="i">';
			htmout += '	<img src="pages/tn/tn_'+j+'.png" width="76" height="100" class="page-1">';
			htmout += ' <span>1</span>';
			htmout += '	</li>';

			for( j = 2; j<pages_len; j=j+2 ) {
				k=j+1;
				htmout += '<li class="d">';
				htmout += '<img src="pages/tn/tn_'+j+'.png" width="76" height="100" class="page-2">';
				htmout += '<img src="pages/tn/tn_'+k+'.png" width="76" height="100" class="page-3">';
				htmout += '<span>'+j+"-"+k+'</span>';
				htmout += '</li>';
				}

			htmout += '<li class="i">';
			htmout += '	<img src="pages/tn/tn_'+j+'.png" width="76" height="100" class="page-'+j+'">';
			htmout += '	<span>'+j+'</span>';
			htmout += '	</li>';
			htmout += '<ul>';
			alert( "BUGS_2432 htmout="+htmout );

			var div_thumbnails = document.getElementById('div_thumbnails');
			div_thumbnails.innerHTML = htmout;
			return(htmout);
			}
		</script>


		<script id="script_random_int" >
			function random_int(max,min) {
				min = Math.ceil(min);
				max = Math.floor(max);
				return Math.floor(Math.random() * (max - min + 1)) + min;	
				}

//			random_kolink()
			</script>

		<script id="script_random_imglnk">
			function random_imglink(){
				var myimgs=new Array()
//specify random imgs below. You can have as many as you wish
				myimgs[1]="/imgs/bg/bg_frax_ribbon.jpg"
				myimgs[2]="/imgs/bg/bg_frax_thorn.jpg"
				myimgs[3]="/imgs/bg/bg_newton05b.jpg"
				myimgs[4]="/imgs/bg/bg_frax_thorn.jpg"
				myimgs[5]="/imgs/bg/bg_frax_thorn.jpg"
				myimgs[6]="/imgs/bg/bg_newton04bw.gif"
				myimgs[7]="/imgs/bg/bg_newton05b.png"
				myimgs[8]="/imgs/bg/bg_newton05b.png"
				myimgs[9]="/imgs/bg/bg_newton05b.png"

				var ry=Math.floor(Math.random()*myimgs.length)
				if (ry==0) ry=1
				document.write('<img src="'+myimgs[ry]+'" border=0 height=200>')
				}
//			random_imglink()
//			random_imglink()
//			random_imglink()
			</script>'





	<script id="script_startup">
		function startup1(args) {
//			var href=window.location.href;
//			alert( "BUGS_2580 script_startup href="+href );
//			var host=window.location.host;
//			var pathname=window.location.pathname;
//			var search=window.location.search;
//			url_default="fb.json";
//			alert( "BUGS_2591 url_default="+url_default );
//			var replaced =  pathname.replace(/(^\.+|\.+$)/mg, '');
//			if( pathname.endsWith(".htm")) {
//			url_default=pathname.replace(".html",".json" );
//			alert( "BUGS_2595 url_default="+url_default );
			}
		else {
			url_default=pathname.replace(".html",".php" );
//			alert( "BUGS_2596 url_default="+url_default );
			}
		url=url_default;
// bugs		if( search.search("?")) {
// bugs			url=search.replace("?","");
// bugs			}

//			alert( "BUGS_2600 href="+href+" url="+url );
			}
		</script>
		

	<script id="script_startup_fb" >
		var pagelist = new Array();
		var pagelist_len = 0;
		var ajaks = "";
		var j = 0;

		var pagelist_default = new Array();
		var pagelist_head = new Array();
		var pagelist_pages = new Array();
		var pagelist_imgs = new Array();
		var pagelist_i = new Array();
		var pagelist_go = new Array();
		var pagelist_tail = new Array();
		var pagelist_ajax = new Array();
	
		var pagelist_default_len = pagelist_default.length;
		var pagelist_head_len = pagelist_head.length;
		var pagelist_pages_len =  pagelist_pages.length;
		var pagelist_imgs_len =  pagelist_imgs.length;
		var pagelist_i_len =  pagelist_i.length;
		var pagelist_go_len =  pagelist_go.length;
		var pagelist_tail_len =  pagelist_tail.length;
		var pagelist_ajax_len =  pagelist_ajax.length;
	
//		alert( "BUGS_3001 pagelist_default_len="+pagelist_default_len+" pagelist_default="+pagelist_default );
//		alert( "BUGS_3002 pagelist_head_len="+pagelist_head_len+" pagelist_head="+pagelist_head );
//		alert( "BUGS_3003 pagelist_pages_len="+pagelist_pages_len+" pagelist_pages="+pagelist_pages );
//		alert( "BUGS_3004 pagelist_imgs_len="+pagelist_imgs_len+" pagelist_imgs="+pagelist_imgs );
//		alert( "BUGS_3005 pagelist_i_len="+pagelist_i_len+" pagelist_i="+pagelist_i );
//		alert( "BUGS_3006 pagelist_go_len="+pagelist_go_len+" pagelist_go="+pagelist_go );
//		alert( "BUGS_3007 pagelist_tail_len="+pagelist_tail_len+" pagelist_tail="+pagelist_tail );
//		alert( "BUGS_3008 pagelist_ajaks_len="+pagelist_ajaks_len+" pagelist_ajaks="+pagelist_ajaks );

		function startup_fb(args) {
			jaxurl=args;
			alert( "BUGS_6800 startup1 args="+args );
			var jaxurl_default="fb.txt";
			if(linkcheck(jaxurl)) {
				alert( "BUGS_6811 ___FOUND jaxurl="+jaxurl );
			else  {
				alert( "BUGS_6811 NOTFOUND jaxurl="+jaxurl );
				}
//			var href = window.location.href;
//			alert( "BUGS_2620 startup href="+href );
//			var pagelist = new Array();
//			var pagelist_len=0;
//			var ajaks = "";
			var j = 0;
			var htmout = "";


			pagelist = load_pagelist();
			pagelist_len=pagelist.length;
//			alert( "BUGS_3100 pagelist_len="+pagelist_len+" pagelist="+pagelist);

			pagelist_head = load_pagelist_head();
			pagelist_head_len = pagelist_head.length;
//			alert( "BUGS_3101 pagelist_head_len="+pagelist_head_len+" pagelist_head="+pagelist_head );

			pagelist_pages = load_pagelist_pages();
			pagelist_pages_len = pagelist_pages.length;
//			alert( "BUGS_3102 pagelist_pages_len="+pagelist_pages_len+" pagelist_pages="+pagelist_pages );

			pagelist_imgs = load_pagelist_imgs();
			pagelist_imgs_len = pagelist_imgs.length;
//			alert( "BUGS_3103 pagelist_imgs_len="+pagelist_imgs_len+" pagelist_imgs="+pagelist_imgs );

			pagelist_i = load_pagelist_i();
			pagelist_i_len = pagelist_i.length;
//			alert( "BUGS_3104 pagelist_i_len="+pagelist_i_len+" pagelist_i="+pagelist_i );

			pagelist_go = load_pagelist_go();
			pagelist_go_len = pagelist_go.length;
//			alert( "BUGS_3105 pagelist_go_len="+pagelist_go_len+" pagelist_go="+pagelist_go );

			pagelist_tail = load_pagelist_tail();
			pagelist_tail_len = pagelist_tail.length;
//			alert( "BUGS_3106 pagelist_tail_len="+pagelist_tail_len+" pagelist_tail="+pagelist_tail );

			var pagelist_ajaks = new Array();
			var pagelist_ajaks_len = 0;
			var ajaks="fb.txt";
//			alert( "BUGS_3107a ajaks="+ajaks );
//			pagelist_ajaks = load_pagelist_ajaks(ajaks);
//			alert( "BUGS_3107b ajaks="+ajaks );
//			pagelist_ajaks_len = pagelist_ajaks.length;
//			alert( "BUGS_3107c pagelist_ajaks_len="+pagelist_ajaks_len+" pagelist_ajaks="+pagelist_ajaks );

//			pagelist = pagelist.concat( pagelist_head );
//			pagelist = pagelist.concat( pagelist_pages );
//			pagelist = pagelist.concat( pagelist_imgs );
//			pagelist = pagelist.concat( pagelist_i );
//			pagelist = pagelist.concat( pagelist_go );
//			pagelist = pagelist.concat( pagelist_tail );
//			pagelist = pagelist.concat( pagelist_ajaks );
//			pagelist = pagelist_head.concat(pagelist_go, pagelist_pages,pagelist_imgs,pagelist_i,pagelist_go,pagelist_tail );
			pagelist = pagelist_go;
			pagelist = pagelist_pages;
			pagelist = pagelist_imgs;
			pagelist_len=pagelist.length;

//			alert( "BUGS_3200 pagelist_len="+pagelist_len+" pagelist="+pagelist);
//			alert( "BUGS_2577 startup pages_len="+pages_len );
//			load_thumbnails(pages);
//			html_tn(pages);
//			alert( "BUGS_2588 startup htmout="+htmout );
//			alert( "BUGS_2581 startup pages_len="+pages_len+"  pages="+pages );
//			window.pages = pages;
//			alert( "BUGS_1650 startup pages_len="+pages_len+"  window.pages="+window.pages );
			return("");
		</script>

	<script id="script_html_tn" >
		function html_tn(pagelist) {
			var pagelist_len = 0;
			var j = 0; var k=0;
			var htmout = "";
//			pagelist = load_pagelist();
			pagelist_len = pagelist.length;
			j=1;
			htmout += '<ul>';
			htmout += '<li class="i">';
			htmout += '	<img src="pages/tn/tn_'+j+'.png" width="76" height="100" class="page-1">';
			htmout += ' <span>1</span>';
			htmout += '	</li>';

//			for( j = 2; j<pagelist_len; j=j+2 ) {
			for( j = 2; j<600; j=j+2 ) {
				k=j+1;
				htmout += '<li class="d">';
				htmout += '<img src="pages/tn/tn_'+j+'.png" width="76" height="100" class="page-2">';
				htmout += '<img src="pages/tn/tn_'+k+'.png" width="76" height="100" class="page-3">';
				htmout += '<span>'+j+"-"+k+'</span>';
				htmout += '</li>';
				}

			htmout += '<li class="i">';
			htmout += '	<img src="pages/tn/tn_'+j+'.png" width="76" height="100" class="page-'+j+'">';
			htmout += '	<span>'+j+'</span>';
			htmout += '	</li>';
			htmout += '<ul>';
//			alert( "BUGS_2432 htmout="+htmout );

//			var div_tn = document.getElementById('div_tn');
//			div_tn.innerHTML = htmout;

//			alert( "BUGS_2600 html_tn pages_len="+pages_len+" htmout="+htmout );
//			var div_tn = document.getElementbyID("div_tn");
//			document.getElementById('div_tn').insertAdjacentHTML("beforebegin", htmout )
//			div_tn.insertAdjacentHTML('beforeend', htmout);
//			document.write(htmout);
			return(htmout);
			}
		</script>

	<script id="script_utils">
		var execTest = function (str) {
			return /([^\\]+)$/.exec(str)[1];
			}
		var splitTest = function (str) {
			return str.split('\\').pop().split('/').pop();
			}
		</script>




	<style id="style_body_scroll">
		body{ overflow-y:scroll; }
		</style>

	<script id="script_filecheck" >
		function filecheck(url) {
			if(url) {
				var req = new XMLHttpRequest();
				req.open('GET', url, false);
				req.send();
				return req.status==200;
				} 
			else {
				return false;
				}
			}
		</script>

	<script id="script_imgcheck" >
		function imgcheck(url) {
			var img = new Image();
			img.src = url;
			return img.height != 0;
			}
		</script>

	<script id="script_linkcheck" >
		function linkcheck(url) {
			var http = new XMLHttpRequest();
			http.open('HEAD', url, false);
			http.send();
			return http.status!=404;
			}
		</script>

	<script id="script_urlexists" >
		function UrlExists(url) {
			var http = new XMLHttpRequest();
			http.open('HEAD', url, false);
			http.send();
			return http.status!=404;
			}
		</script>

		<script id="script_jax1" >
			function jax1(url) {
				alert( "MSG_11970 jax1 url="+url );
				return("jax1\njax2\njax3" );
				}
			</script>	

		<script id="script_jax2" >
//			function jax2(jaxurl) {
//				alert( "BUGS_12360 jax jaxurl="+jaxurl );
//				$.ajax({
//					url: jaxurl,
//					context: document.body,
//					success: function(responseText) {
//						alert( "BUGS_12661 jax len="+responseText.split("\n").length+"  responseText="+responseText );
////						kolists['jax'] = responseText;
//						alert( "BUGS_12667 jax kolists_jtfdcr="+kolists['jtfdcr'] );
//						}
//					});
//				}
			</script>

	<script id="script_kolists" type="text/javascript">
			var kolists = new Array();
			var divids = "";
//		`	kolists[''] = '';
			divids = 'alloff toggle allon <br> hl av bb dd fb fs pn sl <br> tl tm us yt zm <br> jtfdcr jtfdc jtfinc <br> head body memes kov tail';
			kolists['divids'] = divids;
//			kolists['divids'] = 'alloff toggle allon <br> hl av bb dd fb fs pn sl tl tm yt zm <br> jtfdcr jtfdc jtfinc <br> head body memes kov tail';
			 
			kolists['default'] = 'pages/1.jpg\npages/2.jpg\npages/3.jpg';
			kolists['jax'] = 'jax/pages/1.jpg\njax/pages/2.jpg\njax/pages/3.jpg';
//			kolists['jax'] = kolists['default'];
			kolists['fb'] = '/fb/pages/1.jpg\n/fb/pages/2.jpg\n/fb/pages/3.jpg';
			kolists['av'] = '/fb/pages/2.jpg\n/fb/jtfdcr/pages/2.jpg\n/fb/jtfdcr/pages/3.jpg';
			kolists['pn'] = '/fb/pages/3.jpg\n/fb/jtfdcr/pages/2.jpg\n/fb/jtfdcr/pages/3.jpg';
			kolists['sl'] = '/fb/pages/4.jpg\n/fb/jtfdcr/pages/2.jpg\n/fb/jtfdcr/pages/3.jpg';
			kolists['tl'] = '/fb/pages/5.jpg\n/fb/jtfdcr/pages/2.jpg\n/fb/jtfdcr/pages/3.jpg';
			kolists['us'] = 'us|link\nus0|uslink0\nus1|uslink1\nus2|uslink2\nus3|uslink3';
			kolists['yt'] = '/fb/pages/6.jpg\n/fb/jtfdcr/pages/2.jpg\n/fb/jtfdcr/pages/3.jpg';
			kolists['zm'] = '/fb/pages/7.jpg\n/fb/jtfdcr/pages/2.jpg\n/fb/jtfdcr/pages/3.jpg';
			kolists['konet'] = '/fb/konet/pages/1.jpg\n/fb/konet/pages/2.jpg\n/fb/konet/pages/3.jpg';
			kolists['iperms'] = '/fb/iperms/pages/1.jpg\n/fb/iperms/pages/2.jpg\n/fb/iperms/pages/3.jpg';
			kolists['jtfdcr'] = '/fb/jtfdcr/pages/1.jpg\n/fb/jtfdcr/pages/2.jpg\n/fb/jtfdcr/pages/3.jpg';

kolists['imgs_jukebox'] = `
/imgs/imgs_jukebox/giphy_us_20.gif
/imgs/imgs_jukebox/jukebox_00.jpg
/imgs/imgs_jukebox/jukebox_01.jpg
/imgs/imgs_jukebox/jukebox_02.jpg
/imgs/imgs_jukebox/jukebox_03.jpg
/imgs/imgs_jukebox/jukebox_05.jpg
/imgs/imgs_jukebox/jukebox_06.jpg
/imgs/imgs_jukebox/jukebox_07.jpg
/imgs/imgs_jukebox/jukebox_08.jpg
/imgs/imgs_jukebox/jukebox_10.jpg
/imgs/imgs_jukebox/jukebox_12.jpg
/imgs/imgs_jukebox/jukebox_14.jpg
/imgs/imgs_jukebox/jukebox_20.gif
/imgs/imgs_jukebox/jukebox_shuttle.gif
/imgs/imgs_jukebox/jukebox_vintage.gif
/imgs/imgs_jukebox/radio02.jpg
/imgs/imgs_jukebox/radio03.jpg
/imgs/imgs_jukebox/radio04.jpg
/imgs/imgs_jukebox/radio06.jpg
/imgs/imgs_jukebox/radio08.jpg
/imgs/imgs_jukebox/radio09.jpg
/imgs/imgs_jukebox/radio10.jpg
/imgs/imgs_jukebox/radio_wave.gif
/imgs/imgs_jukebox/radiowave2.gif
/imgs/imgs_jukebox/record_01.gif
/imgs/imgs_jukebox/record_02.gif
/imgs/imgs_jukebox/record_03.gif
/imgs/imgs_jukebox/record_04.gif
/imgs/imgs_jukebox/record_05.gif
/imgs/imgs_jukebox/record_06.gif
/imgs/imgs_jukebox/record_08.gif
/imgs/imgs_jukebox/record_089gif.gif
/imgs/imgs_jukebox/records_bins.gif
`;	







kolists['blobs'] = `
ka12|wheat|burlywood|brown|50|/yt/imgs/yt_quinn.png
ka21|yellow|orange|pink|25|/yt/imgs/yt_polly.png
ko0|pink|yellow|red|1|/yt/imgs/yt_paityn.png
ko1|brown|tan|black|2|/yt/imgs/yt_black.png
ko2|tan|brown|white|3|/yt/imgs/yt_carter.png
iperms|wheat|burlywood|brown|50|/yt/imgs/yt_quinn.png
konet|linen|darkslategray|gray|50|/imgs/btn/btn_501law.png
law|linen|darkslategray|gray|10|/imgs/btn/btn_501law.png
law_tc|linen|darkslategray|gray|20|/imgs/btn/btn_501law.png
law_tc_kk|linen|darkslategray|gray|50|/imgs/btn/btn_501law.png
# /imgs/btn/btn_501law.png
# /imgs/btn/btn_dolleylaw.png
# /imgs/btn/btn_paityn.png
# /imgs/btn/btn_carter.png
# /imgs/btn/btn_blake.png
jkwii|blue|red|black|5|/imgs/btn/btn_jkwii.png
skwii|blue|red|black|5|/imgs/btn/btn_skwii.png
jak1|blue|red|black|5|/imgs/btn/btn_jak1.png
jak2|blue|red|black|5|/imgs/btn/btn_jak2.png
jak3|blue|red|black|5|/imgs/btn/btn_jak3.png
`;

kolists['sounds'] = `
/gm/sounds/bubbles.mp3
/gm/sounds/giggle_explosion.mp3
/gm/sounds/explosion.wav
/gm/sounds/shoot.wav
/gm/sounds/space_explosion.wav
/gm/sounds/space_shoot.wav
/gm/sounds/giggle_explosion.wav
/gm/sounds/giggle_shoot.mp3
/gm/sounds/giggle_shoot.wav
/gm/sounds/explosion.mp3
/gm/sounds/shoot.mp3
/gm/sounds/space_explosion.mp3
/gm/sounds/space_shoot.mp3
/gm/sounds/giggle_explosion.mp3
/gm/sounds/alarm.mp3
/gm/sounds/apprehensive.mp3
/gm/sounds/aww.mp3
/gm/sounds/ballbounce-172648817.mp3
/gm/sounds/bat_taps.mp3
/gm/sounds/beach_talking_teens.mp3
/gm/sounds/beep.mp3
/gm/sounds/bells.mp3
/gm/sounds/bird_in_Rain.mp3
/gm/sounds/birds_after_rain.mp3
/gm/sounds/bleep.mp3
/gm/sounds/bluejay.mp3
/gm/sounds/bluejay_call2.mp3
/gm/sounds/bounce.mp3
/gm/sounds/breathing.mp3
/gm/sounds/bubbles.mp3
/gm/sounds/bump_large.mp3
/gm/sounds/busy.mp3
/gm/sounds/canadian_geese.mp3
/gm/sounds/cashregister.mp3
/gm/sounds/catch.mp3
/gm/sounds/chain_fence_jump.mp3
/gm/sounds/chains_spooky.mp3
/gm/sounds/charge.mp3
/gm/sounds/charge_2.mp3
/gm/sounds/cheer.mp3
/gm/sounds/chord.mp3
/gm/sounds/clap_stomp.mp3
/gm/sounds/click2.mp3
/gm/sounds/computer_error.mp3
/gm/sounds/cork.mp3
/gm/sounds/countdown.mp3
/gm/sounds/crow.mp3
/gm/sounds/crowd.mp3
/gm/sounds/crumpling.mp3
/gm/sounds/cymbal.mp3
/gm/sounds/day_sunny.mp3
/gm/sounds/demon_girls_mockingbird_hi.mp3
/gm/sounds/digging_in.mp3
/gm/sounds/dooropen.mp3
/gm/sounds/doorslam.mp3
/gm/sounds/drop_fork.mp3
/gm/sounds/dropped_bat.mp3
/gm/sounds/duck_mallard.mp3
/gm/sounds/duck_mallard_quack.mp3
/gm/sounds/duck_pissed.mp3
/gm/sounds/earthquake.mp3
/gm/sounds/exclamation.mp3
/gm/sounds/exhale.mp3
/gm/sounds/explosion.mp3
/gm/sounds/falcon.mp3
/gm/sounds/fall.mp3
/gm/sounds/farm.mp3
/gm/sounds/field.mp3
/gm/sounds/flipflop.mp3
/gm/sounds/frog.mp3
/gm/sounds/fryingpan_hit.mp3
/gm/sounds/fryingpan_impact.mp3
/gm/sounds/giggle.mp3
/gm/sounds/giggle_funny_kid.mp3
/gm/sounds/giggle_kid.mp3
/gm/sounds/gong.mp3
/gm/sounds/hit.mp3
/gm/sounds/horned_owl.mp3
/gm/sounds/laugh_goofy.mp3
/gm/sounds/laugh_monster.mp3
/gm/sounds/laughing_kookaburra_birds.mp3
/gm/sounds/lets_go.mp3
/gm/sounds/mars_attacks.mp3
/gm/sounds/meadowlark.mp3
/gm/sounds/meoutake.mp3
/gm/sounds/merlin.mp3
/gm/sounds/moan.mp3
/gm/sounds/panica.mp3
/gm/sounds/parots_talking.mp3
/gm/sounds/phaser.mp3
/gm/sounds/phone.mp3
/gm/sounds/ping.mp3
/gm/sounds/pterodactyl_screech.mp3
/gm/sounds/rainstorm_april_45m.mp3
/gm/sounds/rooster_crow.mp3
/gm/sounds/sewing_machine.mp3
/gm/sounds/shampoo_hair.mp3
/gm/sounds/shoot.mp3
/gm/sounds/sigh.mp3
/gm/sounds/sigh_female.mp3
/gm/sounds/sigh_heavy.mp3
/gm/sounds/sigh_little_girl.mp3
/gm/sounds/siren_tornado.mp3
/gm/sounds/skipping_cd.mp3
/gm/sounds/slide.mp3
/gm/sounds/slip.mp3
/gm/sounds/slip_bananapeel.mp3
/gm/sounds/slip_strange.mp3
/gm/sounds/sonar.mp3
/gm/sounds/sonar_ping.mp3
/gm/sounds/space_explosion.mp3
/gm/sounds/space_shoot.mp3
/gm/sounds/spli_funny.mp3
/gm/sounds/starting_pistol.mp3
/gm/sounds/suspense_climactic.mp3
/gm/sounds/termites_and_ants.mp3
/gm/sounds/tree_fall_small.mp3
/gm/sounds/walking_snow.mp3
/gm/sounds/warbling_vireo.mp3
/gm/sounds/whoosh.mp3
/gm/sounds/whoosh_pitch.mp3
/gm/sounds/yahoo.mp3
/gm/sounds/bounce.wav
/gm/sounds/explosion.wav
/gm/sounds/shoot.wav
/gm/sounds/space_explosion.wav
/gm/sounds/space_shoot.wav
/gm/sounds/giggle_shoot.mp3
`;

kolists['mp3'] = `
/kb/mp3/bavaria/bavaria04a.mp3
/kb/mp3/bavaria/bavaria04b.mp3
/kb/mp3/bavaria/bavaria06a.mp3
/kb/mp3/bavaria/bavaria_01_b02.mp3
/kb/mp3/bavaria/bavaria_03_b12.mp3
/kb/mp3/bavaria/bavaria_04_b13.mp3
/kb/mp3/bavaria/bavaria_a15.mp3
/kb/mp3/bavaria/bavaria_a17.mp3
/kb/mp3/bavaria/bavaria_b01.mp3
/kb/mp3/bavaria/bavaria_b05.mp3
/kb/mp3/bavaria/bavaria_b09.mp3
/kb/mp3/bavaria/bavaria_b10.mp3
/kb/mp3/bavaria/bavaria_b18.mp3
/kb/mp3/dj_ethnic/dj_ethnic_barry_sisters-fargess_mich_nit.mp3
/kb/mp3/dj_ethnic/dj_ethnic_barry_sisters-ja_mein_liebe_tochter.mp3
/kb/mp3/dj_ethnic/dj_ethnic_barry_sisters-papirossen.mp3
/kb/mp3/dj_ethnic/dj_ethnic_barry_sisters-tum_balalaika.mp3
/kb/mp3/dj_ethnic/dj_ethnic_eli_eli.mp3
/kb/mp3/dj_ethnic/dj_ethnic_kibbutz_wedding.mp3
/kb/mp3/dj_ethnic/dj_ethnic_meshuggeneh-rumania.mp3
/kb/mp3/dj_ethnic/dj_ethnic_russian_gypsy_balalaika.mp3
/kb/mp3/dj_ethnic/dj_ethnic_tumalalaika-herschel_bernardi.mp3
/kb/mp3/doris_day/danny_kaye-inchworm.mp3
/kb/mp3/doris_day/danny_kaye-thumbelina.mp3
/kb/mp3/doris_day/debbie_reynolds-tammy.mp3
/kb/mp3/doris_day/doris_day-buttons_and_bows.mp3
/kb/mp3/doris_day/doris_day-que_sera_sera.mp3
/kb/mp3/doris_day/doris_day-secret_love.mp3
/kb/mp3/doris_day/doris_day-you_are_my_sunshine.mp3
/kb/mp3/eva_casidy/eva_cassidy-aint_no_sunshine.mp3
/kb/mp3/eva_casidy/eva_cassidy-kathys_song.mp3
/kb/mp3/eva_casidy/eva_cassidy-track_10.mp3
/kb/mp3/eva_casidy/eva_cassidy-track__1.mp3
/kb/mp3/eva_casidy/eva_cassidy-track__3.mp3
/kb/mp3/eva_casidy/eva_cassidy-what_a_wonderful_world.mp3
/kb/mp3/eva_casidy/eva_cassidy_-fever.mp3
/kb/mp3/favs/oscar_brand-bless_em_all.mp3
/kb/mp3/inkspots/ink_spots-i_dont_want_to_set_the_world_on_fire_1941.mp3
/kb/mp3/inkspots/ink_spots-if_i_didnt_care.mp3
/kb/mp3/inkspots/ink_spots-ill_never_smile_again.mp3
/kb/mp3/kids/disney-electric_light_parade.mp3
/kb/mp3/kids/disney-its_a_small_world_after_all.mp3
/kb/mp3/notfound.mp3
/kb/mp3/richie_havens/richie_havens-03-my_fathers_shoes.mp3
/kb/mp3/richie_havens/richie_havens-05-the_hawk.mp3
/kb/mp3/richie_havens/richie_havens-07-the_times_they_are_a-changin.mp3
/kb/mp3/richie_havens/richie_havens-10-how_the_nights_can_fly.mp3
/kb/mp3/richie_havens/richie_havens-13-at_a_glance.mp3
/kb/mp3/rupert_hine/rupert_hine-01-landscape.mp3
/kb/mp3/rupert_hine/rupert_hine-02-ass_all.mp3
/kb/mp3/rupert_hine/rupert_hine-03-me_you_mine.mp3
/kb/mp3/rupert_hine/rupert_hine-04-scarecrow.mp3
/kb/mp3/rupert_hine/rupert_hine-05-kerosene.mp3
/kb/mp3/rupert_hine/rupert_hine-06-running_away.mp3
/kb/mp3/rupert_hine/rupert_hine-07-medicine_munday.mp3
/kb/mp3/rupert_hine/rupert_hine-08-more_than_one_less_then_five.mp3
/kb/mp3/rupert_hine/rupert_hine-09-boo_boos_faux_pas.mp3
/kb/mp3/rupert_hine/rupert_hine-10-pick_up_a_bone.mp3
/kb/mp3/rupert_hine/rupert_hine-11-instant_muse.mp3
/kb/mp3/start_today_again/01-if_i_could_start_today_again.mp3
/kb/mp3/start_today_again/01-lonely_girls.mp3
/kb/mp3/start_today_again/02-change_your_mind.mp3
/kb/mp3/start_today_again/02-steal_your_love.mp3
/kb/mp3/start_today_again/03-i_envy_the_wind.mp3
/kb/mp3/start_today_again/03-midnight_rain.mp3
/kb/mp3/start_today_again/04-blue.mp3
/kb/mp3/start_today_again/04-i_close_my_eyes_and_think_of_you.mp3
/kb/mp3/start_today_again/05-out_of_touch.mp3
/kb/mp3/start_today_again/05-somewhere_in_the_city.mp3
/kb/mp3/start_today_again/06-are_you_down.mp3
/kb/mp3/start_today_again/06-just_about_to_break.mp3
/kb/mp3/start_today_again/07-essence.mp3
/kb/mp3/start_today_again/07-love_is_the_law.mp3
/kb/mp3/start_today_again/08-reason_to_cry.mp3
/kb/mp3/start_today_again/08-the_pretty_place.mp3
/kb/mp3/start_today_again/09-get_right_with_god.mp3
/kb/mp3/start_today_again/09-i_wasted_time.mp3
/kb/mp3/start_today_again/10-bus_to_baton_rouge.mp3
/kb/mp3/start_today_again/10-would_you_be_my_friend.mp3
/kb/mp3/start_today_again/11-broken_butterflies.mp3
/kb/mp3/start_today_again/11-smoke_under_the_bridge.mp3
/kb/mp3/sweethearts_rodeo/sweethearts_of_the_rodeo-catch_the_wind.mp3
/kb/mp3/sweethearts_rodeo/sweethearts_of_the_rodeo-i_wont_cry_-s.mp3
/kb/mp3/sweethearts_rodeo/sweethearts_of_the_rodeo-the_inn_at_innisfre.mp3
`;	


kolists['gifwave'] = `
/imgs/sound/ringworm_1.gif
/imgs/sound/ringworm_2.gif
/imgs/sound/ringworm_5.gif
/imgs/sound/ringworm_10.gif
/imgs/sound/ringworm_20.gif
/imgs/gif/alien_tek/wave.gif
/imgs/gif/crazy/giphy_fingerwave.gif
/imgs/gif/ducks/gif/alien_tek/wave.gif
/imgs/gif/ducks/gif/gif_spinners/giphy_go_gridwaves.gif
/imgs/gif/ducks/gif/gif_spinners/giphy_waveup.gif
/imgs/gif/gif_202004/giphy_orbwave.gif
/imgs/gif/gif_202004/giphy_wave00.gif
/imgs/gif/gif_202004/giphy_wave02.gif
/imgs/sound/giphy_wave03t.gif
/imgs/gif/gif_202004/giphy_wave03.gif
/imgs/gif/gif_202004/giphy_wave04.gif
/imgs/gif/gif_202004/giphy_wave07.gif
/imgs/gif/gif_202004/giphy_wave08.gif
/imgs/gif/gif_202004/giphy_wave_cbs.gif
/imgs/gif/gif_bugs/giphy_dogewaves.gif
/imgs/gif/gif_bugs/giphy_orb_wave.gif
/imgs/gif/gif_spinners/giphy_go_gridwaves.gif
/imgs/gif/gif_spinners/giphy_waveup.gif
/imgs/gif/giphy_dollars/giphygowave'.gif
/imgs/gif/giphy_us_news_focus/giph_tinkerbell_wavey.gif
/imgs/gif/giphy_us_news_focus/giphy_mouth_wavy.gif
/imgs/gif/giphy_us_news_focus/giphy_us_girlwave.gif
/imgs/gif/giphy_us_news_focus/giphy_us_polewave.gif
/imgs/gif/iperms/giphy_armywave.gif
/imgs/gif/iperms/giphy_armywave_barrel.gif
/imgs/gif/kt/giphy_headwaves.gif
/imgs/gif/notes/waves_blue.gif
/imgs/gif/notes/waves_circle.gif
/imgs/gif/notes/waves_interfere.gif
/imgs/gif/notes/waves_linedrop.gif
/imgs/gif/notes/waves_undulate.gif
/imgs/gif/notes/waves_water.gif
/imgs/gif/us/giphy_jkwii_headwave2.gif
/imgs/gif/us/giphy_orb_wave.gif
/imgs/gif/us/giphy_us_headwave.gif
/imgs/gif/us/tn/tn_giphy_jkwii_headwave2.gif
/imgs/gif/us/tn/tn_giphy_orb_wave.gif
/imgs/gif/us/tn/tn_giphy_us_headwave.gif
/imgs/gif/us_big/giphy_jkwii_headwaves2.gif
/imgs/gif/us_big/giphy_keyboard_wavepanel.gif
`;
	

kolists['ka1_mp3'] =`
/fl/ko_builder/alarm.mp3
/fl/ko_builder/bat_taps.mp3
/fl/ko_builder/bells.mp3
/fl/ko_builder/bubbles.mp3
/fl/ko_builder/busy.mp3
/fl/ko_builder/cashregister.mp3
/fl/ko_builder/catch.mp3
/fl/ko_builder/charge.mp3
/fl/ko_builder/charge_2.mp3
/fl/ko_builder/cheer.mp3
/fl/ko_builder/chord.mp3
/fl/ko_builder/clap_stomp.mp3
/fl/ko_builder/click2.mp3
/fl/ko_builder/cork.mp3
/fl/ko_builder/crowd.mp3
/fl/ko_builder/crumpling.mp3
/fl/ko_builder/cymbal.mp3
/fl/ko_builder/digging_in.mp3
/fl/ko_builder/dooropen.mp3
/fl/ko_builder/doorslam.mp3
/fl/ko_builder/dropped_bat.mp3
/fl/ko_builder/exclamation.mp3
/fl/ko_builder/fall.mp3
/fl/ko_builder/field_of.mp3
/fl/ko_builder/flipflop.mp3
/fl/ko_builder/gong.mp3
/fl/ko_builder/hit.mp3
/fl/ko_builder/lets_go.mp3
/fl/ko_builder/phaser.mp3
/fl/ko_builder/phone.mp3
/fl/ko_builder/ping.mp3
/fl/ko_builder/pitch_whoosh.mp3
/fl/ko_builder/slide.mp3
/fl/ko_builder/slip.mp3
/fl/ko_builder/Takemeou.mp3
/fl/ko_builder/whoosh.mp3
/fl/ko_typo/bubbles.mp3
/fl/ko_typo/click2.mp3
/fl/ko_typo/crumpling.mp3
/fl/ko_typo/phaser.mp3
/fl/ko_typo/ping.mp3
/gm/explosion.mp3
/gm/giggle_explosion.mp3
/gm/giggle_shoot.mp3
/gm/shoot.mp3
/gm/sounds/alarm.mp3
/gm/sounds/apprehensive.mp3
/gm/sounds/aww.mp3
/gm/sounds/ballbounce-172648817.mp3
/gm/sounds/Banging Radiator-SoundBible.com-715716895.mp3
/gm/sounds/bat_taps.mp3
/gm/sounds/beach_talking_teens.mp3
/gm/sounds/beep.mp3
/gm/sounds/bells.mp3
/gm/sounds/bird_in_Rain.mp3
/gm/sounds/birds_after_rain.mp3
/gm/sounds/bleep.mp3
/gm/sounds/bluejay.mp3
/gm/sounds/bluejay_call2.mp3
/gm/sounds/bounce.mp3
/gm/sounds/breathing.mp3
/gm/sounds/bubbles.mp3
/gm/sounds/bump_large.mp3
/gm/sounds/busy.mp3
/gm/sounds/canadian_geese.mp3
/gm/sounds/cashregister.mp3
/gm/sounds/catch.mp3
/gm/sounds/chain_fence_jump.mp3
/gm/sounds/chains_spooky.mp3
/gm/sounds/charge.mp3
/gm/sounds/charge_2.mp3
/gm/sounds/cheer.mp3
/gm/sounds/chord.mp3
/gm/sounds/clap_stomp.mp3
/gm/sounds/click2.mp3
/gm/sounds/computer_error.mp3
/gm/sounds/cork.mp3
/gm/sounds/countdown.mp3
/gm/sounds/Crash Large-SoundBible.com-2049318973.mp3
/gm/sounds/crow.mp3
/gm/sounds/crowd.mp3
/gm/sounds/crumpling.mp3
/gm/sounds/cymbal.mp3
/gm/sounds/day_sunny.mp3
/gm/sounds/demon_girls_mockingbird_hi.mp3
/gm/sounds/digging_in.mp3
/gm/sounds/dooropen.mp3
/gm/sounds/doorslam.mp3
/gm/sounds/drop_fork.mp3
/gm/sounds/dropped_bat.mp3
/gm/sounds/duck_mallard.mp3
/gm/sounds/duck_mallard_quack.mp3
/gm/sounds/duck_pissed.mp3
/gm/sounds/earthquake.mp3
/gm/sounds/exclamation.mp3
/gm/sounds/exhale.mp3
/gm/sounds/explosion.mp3
/gm/sounds/falcon.mp3
/gm/sounds/fall.mp3
/gm/sounds/farm.mp3
/gm/sounds/field.mp3
/gm/sounds/flipflop.mp3
/gm/sounds/frog.mp3
/gm/sounds/fryingpan_hit.mp3
/gm/sounds/fryingpan_impact.mp3
/gm/sounds/giggle.mp3
/gm/sounds/giggle_explosion.mp3
/gm/sounds/giggle_funny_kid.mp3
/gm/sounds/giggle_kid.mp3
/gm/sounds/giggle_shoot.mp3
/gm/sounds/gong.mp3
/gm/sounds/hit.mp3
/gm/sounds/horned_owl.mp3
/gm/sounds/Laugh To Self-SoundBible.com-468656860.mp3
/gm/sounds/laugh_goofy.mp3
/gm/sounds/laugh_monster.mp3
/gm/sounds/laughing_kookaburra_birds.mp3
/gm/sounds/lets_go.mp3
/gm/sounds/mars_attacks.mp3
/gm/sounds/meadowlark.mp3
/gm/sounds/meoutake.mp3
/gm/sounds/merlin.mp3
/gm/sounds/moan.mp3
/gm/sounds/panica.mp3
/gm/sounds/parots_talking.mp3
/gm/sounds/phaser.mp3
/gm/sounds/Phone Off Hook-SoundBible.com-701991146.mp3
/gm/sounds/phone.mp3
/gm/sounds/ping.mp3
/gm/sounds/pterodactyl_screech.mp3
/gm/sounds/rainstorm_april_45m.mp3
/gm/sounds/rooster_crow.mp3
/gm/sounds/sewing_machine.mp3
/gm/sounds/shampoo_hair.mp3
/gm/sounds/shoot.mp3
/gm/sounds/sigh.mp3
/gm/sounds/sigh_female.mp3
/gm/sounds/sigh_heavy.mp3
/gm/sounds/sigh_little_girl.mp3
/gm/sounds/siren_tornado.mp3
/gm/sounds/skipping_cd.mp3
/gm/sounds/slide.mp3
/gm/sounds/slip.mp3
/gm/sounds/slip_bananapeel.mp3
/gm/sounds/slip_strange.mp3
/gm/sounds/sonar.mp3
/gm/sounds/sonar_ping.mp3
/gm/sounds/space_explosion.mp3
/gm/sounds/space_shoot.mp3
/gm/sounds/spli_funny.mp3
/gm/sounds/starting_pistol.mp3
/gm/sounds/suspense_climactic.mp3
/gm/sounds/termites_and_ants.mp3
/gm/sounds/tree_fall_small.mp3
/gm/sounds/walking_snow.mp3
/gm/sounds/warbling_vireo.mp3
/gm/sounds/whoosh.mp3
/gm/sounds/whoosh_pitch.mp3
/gm/sounds/yahoo.mp3
/gm/space/sounds/explosion.mp3
/gm/space/sounds/shoot.mp3
/gm/space/sounds/space_explosion.mp3
/gm/space/sounds/space_shoot.mp3
/im/achat/sounds/sound_1.mp3
/im/achat/sounds/sound_2.mp3
/im/achat/sounds/sound_3.mp3
/im/achat/sounds/sound_4.mp3
/im/achat/sounds/sound_5.mp3
/im/achat/sounds/sound_6.mp3
/im/mibew/sounds/new_message.mp3
/im/mibew/sounds/new_user.mp3
/kb/a/piano/piano_0As.mp3
/kb/a/piano/piano_0B.mp3
/kb/a/piano/piano_0C.mp3
/kb/a/piano/piano_0Cs.mp3
/kb/a/piano/piano_0D.mp3
/kb/a/piano/piano_0Ds.mp3
/kb/a/piano/piano_0E.mp3
/kb/a/piano/piano_0F.mp3
/kb/a/piano/piano_0Fs.mp3
/kb/a/piano/piano_0G.mp3
/kb/a/piano/piano_0Gs.mp3
/kb/a/piano/piano_1A.mp3
/kb/a/piano/piano_1As.mp3
/kb/a/piano/piano_1B.mp3
/kb/a/piano/piano_1C.mp3
/kb/a/piano/piano_1Cs.mp3
/kb/a/piano/piano_1D.mp3
/kb/a/piano/piano_1Ds.mp3
/kb/a/piano/piano_1E.mp3
/kb/a/piano/piano_1F.mp3
/kb/a/piano/piano_1Fs.mp3
/kb/a/piano/piano_1G.mp3
/kb/a/piano/piano_1Gs.mp3
/kb/a/piano/piano_2A.mp3
/kb/a/piano/piano_2As.mp3
/kb/a/piano/piano_2B.mp3
/kb/a/piano/piano_2C.mp3
/kb/a/piano/piano_2Cs.mp3
/kb/a/piano/piano_2D.mp3
/kb/a/piano/piano_2Ds.mp3
/kb/a/piano/piano_2F.mp3
/kb/a/piano/piano_2Fs.mp3
/kb/a/piano/piano_2G.mp3
/kb/a/piano/piano_2Gs.mp3
/kb/a/piano/piano_3A.mp3
/kb/a/piano/piano_3As.mp3
/kb/a/piano/piano_3B.mp3
/kb/a/piano/piano_3C.mp3
/kb/a/piano/piano_3Cs.mp3
/kb/a/piano/piano_3D.mp3
/kb/a/piano/piano_3Ds.mp3
/kb/a/piano/piano_3E.mp3
/kb/a/piano/piano_3F.mp3
/kb/a/piano/piano_3Fs.mp3
/kb/a/piano/piano_3G.mp3
/kb/a/piano/piano_3Gs.mp3
/kb/a/piano/piano_40s.mp3
/kb/a/piano/piano_4A.mp3
/kb/a/piano/piano_4As.mp3
/kb/a/piano/piano_4B.mp3
/kb/a/piano/piano_4C.mp3
/kb/a/piano/piano_4Cs.mp3
/kb/a/piano/piano_4D.mp3
/kb/a/piano/piano_4E.mp3
/kb/a/piano/piano_4F.mp3
/kb/a/piano/piano_4Fs.mp3
/kb/a/piano/piano_4G.mp3
/kb/a/piano/piano_4Gs.mp3
/kb/a/piano/piano_56s.mp3
/kb/a/piano/piano_5A.mp3
/kb/a/piano/piano_5As.mp3
/kb/a/piano/piano_5B.mp3
/kb/a/piano/piano_5C.mp3
/kb/a/piano/piano_5Cs.mp3
/kb/a/piano/piano_5D.mp3
/kb/a/piano/piano_5Ds.mp3
/kb/a/piano/piano_5E.mp3
/kb/a/piano/piano_5F.mp3
/kb/a/piano/piano_5Fs.mp3
/kb/a/piano/piano_5G.mp3
/kb/a/piano/piano_6A.mp3
/kb/a/piano/piano_6As.mp3
/kb/a/piano/piano_6B.mp3
/kb/a/piano/piano_7C.mp3


/kb/aud/mp3/abba-andante_andante.mp3
/kb/aud/mp3/abba-fernando.mp3
/kb/aud/mp3/Beatles - You've Got To Hide Your Love Away.mp3
/kb/aud/mp3/caberet-money,_money.mp3
/kb/aud/mp3/caberet-wilkommen.mp3
/kb/aud/mp3/Can't Help Falling In Love.mp3
/kb/aud/mp3/cold-stupid_girl.mp3
/kb/aud/mp3/crystal-stevie_nicks_1.mp3
/kb/aud/mp3/danny_kaye-inchworm.mp3
/kb/aud/mp3/david_bowie-changes.mp3
/kb/aud/mp3/david_bowie-golden_years.mp3
/kb/aud/mp3/dietrich-lili_marleen-german.mp3
/kb/aud/mp3/dj_ethnic_barry_sisters_-_bei_mir_bistu_shain.mp3
/kb/aud/mp3/dj_ethnic_barry_sisters_-_ich_hob_dich_zifeel_lieb.mp3
/kb/aud/mp3/dj_ethnic_barry_sisters_-_main_glick.mp3
/kb/aud/mp3/dj_ethnic_barry_sisters_-_my_yiddishe_mama.mp3
/kb/aud/mp3/dj_opera_carreras_domingo_pavarotti_-_nessun_dorma.mp3
/kb/aud/mp3/dj_opera_rodgers_&_hammerstein_-_the_sound_of_music_-_edelweiss.mp3
/kb/aud/mp3/dori_caymmi-o_bem_do_mar.mp3
/kb/aud/mp3/doris_day-que_sera_sera.mp3
/kb/aud/mp3/doris_day-secret_love.mp3
/kb/aud/mp3/doris_day-you_are_my_sunshine.mp3
/kb/aud/mp3/elton_jhon-nikita.mp3
/kb/aud/mp3/emmylou_harris-here,_there_and_everywhere.mp3
/kb/aud/mp3/emmylou_harris-like_an_old_fashioned_waltz.mp3
/kb/aud/mp3/emmylou_harris_john_denver-wild_montana_skies.mp3
/kb/aud/mp3/Eva Cassidy - Ain't No Sunshine.mp3
/kb/aud/mp3/eva_cassidy-fever.mp3
/kb/aud/mp3/fuck.mp3
/kb/aud/mp3/glad_all_over.mp3
/kb/aud/mp3/glen_campbell-gentle_on_my_mind_1968.mp3
/kb/aud/mp3/grantorino_full.mp3
/kb/aud/mp3/i_want_to_hold_your_hand.mp3
/kb/aud/mp3/incomplete_eva_cassidy-nightbird.mp3
/kb/aud/mp3/Iris Dement - Easy's Getting Harder Every Day.mp3
/kb/aud/mp3/jesse_colin_young-songbird.mp3
/kb/aud/mp3/jesse_colin_young_sunlight-1976.mp3
/kb/aud/mp3/jimi_hendrix-national_anthem.mp3
/kb/aud/mp3/john_denver_placido_doming-perhaps_love.mp3
/kb/aud/mp3/ka2.mp3
/kb/aud/mp3/king_of_the_road.mp3
/kb/aud/mp3/kingston_town-harry_belafonte.mp3
/kb/aud/mp3/Lady Antebellum - American Honey.mp3
/kb/aud/mp3/lady_antebellum-need_you_now_hq_[lyrics].mp3
/kb/aud/mp3/louie_armstrong-what_a_wonderful_world.mp3
/kb/aud/mp3/love_me_tender.mp3
/kb/aud/mp3/Marlene Dietrich - Muss i' denn.mp3
/kb/aud/mp3/marlene_dietrich_falling_in_love_again_english.mp3
/kb/aud/mp3/mitch_miller-you_are_my_sunshine.mp3
/kb/aud/mp3/mockin_bird_hill_patti_page.mp3
/kb/aud/mp3/mona_lisa.mp3
/kb/aud/mp3/music_13119_benny_benassi_satisfaction.mp3
/kb/aud/mp3/music_141639_pure_beauty.mp3
/kb/aud/mp3/music_145075_bas_couture.mp3
/kb/aud/mp3/music_922401610_beauty_on_fire.mp3
/kb/aud/mp3/music_you_dont_own_me_235310380.mp3
/kb/aud/mp3/never_alone-lady_antebellum..mp3
/kb/aud/mp3/patsy_cline-the_wayward_wind.mp3
/kb/aud/mp3/pattie_page-how_much_is_that_doggie_in_the_window.mp3
/kb/aud/mp3/procol_harem-a_whiter_shade_of_pale.mp3
/kb/aud/mp3/quando,_quando,_quando-engelberthumperdinck.mp3
/kb/aud/mp3/Richie_Havens_-_03_-_My_Father's_Shoes.mp3
/kb/aud/mp3/Richie_Havens_-_05_-_The_Hawk.mp3
/kb/aud/mp3/Richie_Havens_-_07_-_The_Times_They_Are_a-Changin'.mp3
/kb/aud/mp3/Richie_Havens_-_10_-_How_the_Nights_Can_Fly.mp3
/kb/aud/mp3/Richie_Havens_-_13_-_At_a_Glance.mp3
/kb/aud/mp3/righteous_brothers-soul_and_inspiration.mp3
/kb/aud/mp3/scatterbrain-freddy_martin_orch.mp3
/kb/aud/mp3/smokey_robinson-ooh_baby_baby.mp3
/kb/aud/mp3/sound.mp3
/kb/aud/mp3/supermassive_black_hole_lyrics_and_twilight_videos.mp3
/kb/aud/mp3/the_platters_the_great_pretender.mp3
/kb/aud/mp3/third_eye_blind-_never_let_you_go.mp3
/kb/aud/mp3/trick_daddy-take_it_to_the_house.mp3
/kb/aud/mp3/Trio_-_Bum_Bum_1983_NDW.mp3
/kb/aud/mp3/Trio_-_Da_Da_Da_clipe_.mp3
/kb/aud/mp3/TRIO_-_Girl_Girl_Girl.mp3
/kb/aud/mp3/Trio_-_Herz_ist_Trumpf_-_1983.mp3
/kb/aud/mp3/Trio_-_Sabine.mp3
/kb/aud/mp3/Trio_-_Turaluraluralu.mp3
/kb/aud/mp3/Trio_-_Tutti-Frutti_-_NDW_-_1984.mp3
/kb/aud/mp3/trio_Vogel_der_Nacht.mp3
/kb/aud/mp3/twilight_soundtrack.mp3
/kb/aud/mp3/Volare.mp3
/kb/aud/mp3/waits-cemetery_polka-full.mp3
/kb/aud/mp3/waits-come_on_up_to_the_house.mp3
/kb/aud/mp3/waits-house_where_nobody_lives.mp3
/kb/aud/mp3/waits-long_way_home.mp3
/kb/aud/mp3/waits-lullaby-1.mp3
/kb/aud/mp3/waits-time.mp3
/kb/aud/mp3/weihnachtslieder-nicole-still_still_still.mp3
/kb/aud/mp3/wenn_die_soldaten-marlene_dietrich.mp3
/kb/aud/mp3/What's new pussycat.mp3
/kb/aud/mp3/Why_Dont_You_Do_Right_.mp3
/kb/aud/mp3/wish_we_were_back_in_missouri_em.mp3
/kb/aud/mp3/yellow_bird.mp3
/kb/aud/mp3/You Can't Hurry Love.mp3
/kb/aud/mp3/young_love.mp3
/ko/h5/lib/av/aud/effects/beeps/alarm.mp3
/ko/h5/lib/av/aud/effects/beeps/alarm2.mp3
/ko/h5/lib/av/aud/effects/beeps/alarm3.mp3
/ko/h5/lib/av/aud/effects/beeps/buzz.mp3
/ko/h5/lib/av/aud/effects/beeps/compute_ack.mp3
/ko/h5/lib/av/aud/effects/beeps/compute_ack_long.mp3
/ko/h5/lib/av/aud/effects/beeps/ping.mp3
/ko/h5/lib/av/aud/effects/beeps/ping2.mp3
/ko/h5/lib/av/aud/effects/beeps/retro_beep1.mp3
/ko/h5/lib/av/aud/effects/beeps/retro_beep2.mp3
/ko/h5/lib/av/aud/effects/beeps/super_ping.mp3
/ko/h5/lib/av/aud/effects/comm/alien_comm.mp3
/ko/h5/lib/av/aud/effects/comm/alien_comm2.mp3
/ko/h5/lib/av/aud/effects/comm/radio_noise.mp3
/ko/h5/lib/av/aud/effects/comm/radio_signal.mp3
/ko/h5/lib/av/aud/effects/comm/radio_tune.mp3
/ko/h5/lib/av/aud/effects/environmental/cloaking_device.mp3
/ko/h5/lib/av/aud/effects/environmental/computing.mp3
/ko/h5/lib/av/aud/effects/environmental/drop_item.mp3
/ko/h5/lib/av/aud/effects/environmental/engine.mp3
/ko/h5/lib/av/aud/effects/environmental/lightning1.mp3
/ko/h5/lib/av/aud/effects/environmental/lost_in_time.mp3
/ko/h5/lib/av/aud/effects/environmental/low_bass_note.mp3
/ko/h5/lib/av/aud/effects/environmental/low_flange_rez.mp3
/ko/h5/lib/av/aud/effects/environmental/low_hum.mp3
/ko/h5/lib/av/aud/effects/environmental/onimous_echo.mp3
/ko/h5/lib/av/aud/effects/environmental/quasar.mp3
/ko/h5/lib/av/aud/effects/environmental/scanner.mp3
/ko/h5/lib/av/aud/effects/environmental/war_drum.mp3
/ko/h5/lib/av/aud/effects/explosions/explosion2.mp3
/ko/h5/lib/av/aud/effects/explosions/explosion3.mp3
/ko/h5/lib/av/aud/effects/explosions/explosion4.mp3
/ko/h5/lib/av/aud/effects/explosions/explosion5.mp3
/ko/h5/lib/av/aud/effects/explosions/explosion6.mp3
/ko/h5/lib/av/aud/effects/explosions/explosion7.mp3
/ko/h5/lib/av/aud/effects/explosions/explosion8.mp3
/ko/h5/lib/av/aud/effects/explosions/low_explosion.mp3
/ko/h5/lib/av/aud/effects/misc/boss_transform.mp3
/ko/h5/lib/av/aud/effects/misc/boup.mp3
/ko/h5/lib/av/aud/effects/misc/brain_fry.mp3
/ko/h5/lib/av/aud/effects/misc/deploy_mine.mp3
/ko/h5/lib/av/aud/effects/misc/deploy_radio.mp3
/ko/h5/lib/av/aud/effects/misc/deploy_web.mp3
/ko/h5/lib/av/aud/effects/misc/electric_drop.mp3
/ko/h5/lib/av/aud/effects/misc/final_boss_die.mp3
/ko/h5/lib/av/aud/effects/misc/get_item.mp3
/ko/h5/lib/av/aud/effects/misc/get_item2.mp3
/ko/h5/lib/av/aud/effects/misc/item_appear.mp3
/ko/h5/lib/av/aud/effects/misc/item_appear2.mp3
/ko/h5/lib/av/aud/effects/misc/lock_on.mp3
/ko/h5/lib/av/aud/effects/misc/materialize.mp3
/ko/h5/lib/av/aud/effects/misc/power_up.mp3
/ko/h5/lib/av/aud/effects/misc/robot_error.mp3
/ko/h5/lib/av/aud/effects/misc/robot_no.mp3
/ko/h5/lib/av/aud/effects/misc/whiplash.mp3
/ko/h5/lib/av/aud/effects/misc/wobble.mp3
/ko/h5/lib/av/aud/effects/misc/wobble2.mp3
/ko/h5/lib/av/aud/effects/projectiles/alien_shot1.mp3
/ko/h5/lib/av/aud/effects/projectiles/alien_shot2.mp3
/ko/h5/lib/av/aud/effects/projectiles/alien_shot3.mp3
/ko/h5/lib/av/aud/effects/projectiles/alien_shot4.mp3
/ko/h5/lib/av/aud/effects/projectiles/alien_shot5.mp3
/ko/h5/lib/av/aud/effects/projectiles/alien_shot6.mp3
/ko/h5/lib/av/aud/effects/projectiles/alien_shot7.mp3
/ko/h5/lib/av/aud/effects/projectiles/clash_ricochet.mp3
/ko/h5/lib/av/aud/effects/projectiles/hit2.mp3
/ko/h5/lib/av/aud/effects/projectiles/hit3.mp3
/ko/h5/lib/av/aud/effects/projectiles/hit4.mp3
/ko/h5/lib/av/aud/effects/projectiles/hit5.mp3
/ko/h5/lib/av/aud/effects/projectiles/ion_cannon.mp3
/ko/h5/lib/av/aud/effects/projectiles/ion_cannon_light.mp3
/ko/h5/lib/av/aud/effects/projectiles/laser.mp3
/ko/h5/lib/av/aud/effects/projectiles/missile.mp3
/ko/h5/lib/av/aud/effects/projectiles/pea_shooter.mp3
/ko/h5/lib/av/aud/effects/projectiles/photon.mp3
/ko/h5/lib/av/aud/effects/projectiles/quantum_missile.mp3
/ko/h5/lib/av/aud/effects/projectiles/ricochet2.mp3
/ko/h5/lib/av/aud/effects/projectiles/ricochet3.mp3
/ko/h5/lib/av/aud/effects/projectiles/ricochet4.mp3
/ko/h5/lib/av/aud/effects/projectiles/ricochet5.mp3
/ko/h5/lib/av/aud/effects/projectiles/ricochet6.mp3
/ko/h5/lib/av/aud/effects/projectiles/scatter_shot.mp3
/ko/h5/lib/av/aud/effects/projectiles/scatter_shot2.mp3
/ko/h5/lib/av/aud/effects/projectiles/super_missile.mp3
/ko/h5/lib/av/aud/effects/projectiles/super_missile2.mp3
/ko/h5/lib/av/aud/effects/space/black_hole.mp3
/ko/h5/lib/av/aud/effects/space/cosmic_string.mp3
/ko/h5/lib/av/aud/effects/space/enemy_launch_warmup.mp3
/ko/h5/lib/av/aud/effects/space/enemy_swoop_down.mp3
/ko/h5/lib/av/aud/effects/space/enemy_wake_up.mp3
/ko/h5/lib/av/aud/effects/space/engine_damage.mp3
/ko/h5/lib/av/aud/effects/space/engine_warmup.mp3
/ko/h5/lib/av/aud/effects/space/flush_garbage.mp3
/ko/h5/lib/av/aud/effects/space/hyperdrive_abort.mp3
/ko/h5/lib/av/aud/effects/space/hyperdrive_abort2.mp3
/ko/h5/lib/av/aud/effects/space/hyperdrive_warmup.mp3
/ko/h5/lib/av/aud/effects/space/pressurize_airlock.mp3
/ko/h5/lib/av/aud/effects/space/shield_activate.mp3
/ko/h5/lib/av/aud/effects/space/shields_recharged.mp3
/ko/h5/lib/av/aud/effects/space/shields_recharged2.mp3
/ko/h5/lib/av/aud/effects/space/ship_dock.mp3
/ko/h5/lib/av/aud/effects/space/ships_collide.mp3
/ko/h5/lib/av/aud/effects/space/space_bug_scream.mp3
/ko/h5/lib/av/aud/effects/space/space_clank.mp3
/ko/h5/lib/av/aud/effects/space/space_dog_bark.mp3
/ko/h5/lib/av/aud/effects/space/space_drip.mp3
/ko/h5/lib/av/aud/effects/space/space_glug.mp3
/ko/h5/lib/av/aud/effects/space/space_ribbit.mp3
/ko/h5/lib/av/aud/effects/space/space_vacuum.mp3
/ko/h5/lib/av/aud/effects/space/space_wind.mp3
/ko/h5/lib/av/aud/effects/space/super_web_active.mp3
/ko/h5/lib/av/aud/effects/switches/switch.mp3
/ko/h5/lib/av/aud/effects/switches/switch2.mp3
/ko/h5/lib/av/aud/effects/switches/switch3.mp3
/ko/h5/lib/av/aud/effects/switches/switch4.mp3
/ko/h5/lib/av/aud/effects/switches/switch5.mp3
/ko/h5/lib/av/aud/effects/ui/blurn.mp3
/ko/h5/lib/av/aud/effects/ui/blurn_shhh.mp3
/ko/h5/lib/av/aud/effects/ui/notify.mp3
/ko/h5/lib/av/aud/effects/ui/select.mp3
/ko/h5/lib/av/aud/effects/ui/select2.mp3
/ko/h5/lib/av/aud/effects/ui/select3.mp3
/ko/h5/lib/av/aud/effects/ui/select4.mp3
/ko/h5/lib/av/aud/effects/ui/select5.mp3
/ko/h5/lib/av/aud/effects/ui/shunt.mp3
/ko/srv/blab/aud_blab7/sound_001.mp3
/ko/srv/blab/aud_blab7/sound_002.mp3
/ko/srv/blab/aud_blab7/sound_003.mp3
/ko/srv/blab/aud_blab7/sound_004.mp3
/ko/srv/blab/aud_blab7/sound_005.mp3
/ko/srv/blab/aud_blab7/sound_006.mp3
/ko/srv/blab/aud_blab7/sound_007.mp3
/ko/srv/blab/aud_blab7/sound_008.mp3
/ko/srv/blab/aud_blab7/sound_009.mp3
/ko/srv/blab/aud_blab7/sound_010.mp3
/ko/srv/blab/aud_blab7/sound_011.mp3
/ko/srv/blab/aud_blab7/sound_012.mp3
/ko/srv/blab/aud_blab7/sound_013.mp3
/ko/srv/blab/aud_blab7/sound_014.mp3
/ko/srv/blab/aud_blab7/sound_015.mp3
/ko/srv/blab/aud_blab7/sound_016.mp3
/ko/srv/blab/aud_blab7/sound_017.mp3
/ko/srv/blab/aud_blab7/sound_018.mp3
/ko/srv/blab/aud_blab7/sound_019.mp3
/ko/srv/blab/aud_blab7/sound_020.mp3
/ko/srv/blab/aud_blab7/sound_021.mp3
/ko/srv/blab/aud_blab7/sound_022.mp3
/ko/srv/blab/aud_blab7/sound_023.mp3
/ko/srv/blab/aud_blab7/sound_024.mp3
/ko/srv/blab/aud_blab7/sound_025.mp3
/ko/srv/blab/aud_blab7/sound_026.mp3
/ko/srv/blab/aud_blab7/sound_027.mp3
/ko/srv/blab/aud_blab7/sound_028.mp3
/ko/srv/blab/aud_blab7/sound_029.mp3
/ko/srv/blab/aud_blab7/sound_030.mp3
/ko/srv/blab/aud_blab7/sound_031.mp3
/ko/srv/blab/aud_blab7/sound_032.mp3
/ko/srv/blab/aud_blab7/sound_033.mp3
/ko/srv/blab/aud_blab7/sound_034.mp3
/ko/srv/blab/aud_blab7/sound_035.mp3
/ko/srv/blab/aud_blab7/sound_036.mp3
/ko/srv/blab/aud_blab7/sound_037.mp3
/ko/srv/blab/aud_blab7/sound_038.mp3
/ko/srv/blab/aud_blab7/sound_039.mp3
/ko/srv/blab/aud_blab7/sound_040.mp3
/ko/srv/blab/aud_blab7/sound_041.mp3
/ko/srv/blab/aud_blab7/sound_042.mp3
/ko/srv/blab/aud_blab7/sound_043.mp3
/ko/srv/blab/aud_blab7/sound_044.mp3
/ko/srv/blab/aud_blab7/sound_045.mp3
/ko/srv/blab/aud_blab7/sound_046.mp3
/ko/srv/blab/aud_blab7/sound_047.mp3
/ko/srv/blab/aud_blab7/sound_048.mp3
/ko/srv/blab/aud_blab7/sound_049.mp3
/ko/srv/blab/aud_blab7/sound_050.mp3
/ko/srv/blab/aud_blab7/sound_051.mp3
/ko/srv/blab/aud_blab7/sound_052.mp3
/ko/srv/blab/aud_blab7/sound_053.mp3
/ko/srv/blab/aud_blab7/sound_054.mp3
/ko/srv/blab/aud_blab7/sound_055.mp3
/ko/srv/blab/aud_blab7/sound_056.mp3
/ko/srv/blab/aud_blab7/sound_057.mp3
/ko/srv/blab/aud_blab7/sound_058.mp3
/ko/srv/blab/aud_blab7/sound_059.mp3
/ko/srv/blab/aud_blab7/sound_060.mp3
/ko/srv/blab/aud_blab7/sound_061.mp3
/ko/srv/blab/aud_blab7/sound_062.mp3
/ko/srv/blab/aud_blab7/sound_063.mp3
/ko/srv/blab/aud_blab7/sound_064.mp3
/ko/srv/blab/aud_blab7/sound_065.mp3
/ko/srv/blab/aud_blab7/sound_066.mp3
/ko/srv/blab/aud_blab7/sound_067.mp3
/ko/srv/blab/aud_blab7/sound_068.mp3
/ko/srv/blab/aud_blab7/sound_069.mp3
/ko/srv/blab/aud_blab7/sound_070.mp3
/ko/srv/blab/aud_blab7/sound_071.mp3
/ko/srv/blab/aud_blab7/sound_072.mp3
/ko/srv/blab/aud_blab7/sound_073.mp3
/ko/srv/blab/aud_blab7/sound_074.mp3
/ko/srv/blab/aud_blab7/sound_075.mp3
/ko/srv/blab/aud_blab7/sound_076.mp3
/ko/srv/blab/aud_blab7/sound_077.mp3
/ko/srv/blab/aud_blab7/sound_078.mp3
/ko/srv/blab/aud_blab7/sound_079.mp3
/ko/srv/blab/aud_blab7/sound_080.mp3
/ko/srv/blab/aud_blab7/sound_081.mp3
/ko/srv/blab/aud_blab7/sound_082.mp3
/ko/srv/blab/aud_blab7/sound_083.mp3
/ko/srv/blab/aud_blab7/sound_084.mp3
/ko/srv/blab/aud_blab7/sound_085.mp3
/ko/srv/blab/aud_blab7/sound_086.mp3
/ko/srv/blab/aud_blab7/sound_087.mp3
/ko/srv/blab/aud_blab7/sound_088.mp3
/ko/srv/blab/aud_blab7/sound_089.mp3
/ko/srv/blab/aud_blab7/sound_090.mp3
/ko/srv/blab/aud_blab7/sound_091.mp3
/ko/srv/blab/aud_blab7/sound_092.mp3
/ko/srv/blab/aud_blab7/sound_093.mp3
/ko/srv/blab/aud_blab7/sound_094.mp3
/ko/srv/blab/aud_blab7/sound_095.mp3
/ko/srv/blab/aud_blab7/sound_096.mp3
/ko/srv/blab/aud_blab7/sound_097.mp3
/ko/srv/blab/aud_blab7/sound_098.mp3
/ko/srv/blab/aud_blab7/sound_099.mp3
/ko/srv/blab/aud_blab7/sound_100.mp3
/ko/srv/blab/aud_blab7/sound_101.mp3
/ko/srv/blab/ui/sounds/1.mp3
/ko/srv/blab/ui/sounds/2.mp3
/ko/srv/blab/ui/sounds/3.mp3
/ko/srv/blab/ui/sounds/4.mp3
/ko/srv/blab/ui/sounds/5.mp3
/ko/srv/blab/ui/sounds/6.mp3
/ko/srv/blab/ui/sounds/7.mp3
/ko/srv/blab/ui/sounds/8.mp3
/ko/srv/blab/ui/sounds/9.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/beeps/alarm.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/beeps/alarm2.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/beeps/alarm3.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/beeps/buzz.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/beeps/compute_ack.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/beeps/compute_ack_long.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/beeps/ping.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/beeps/ping2.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/beeps/retro_beep1.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/beeps/retro_beep2.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/beeps/super_ping.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/comm/alien_comm.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/comm/alien_comm2.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/comm/radio_noise.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/comm/radio_signal.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/comm/radio_tune.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/environmental/cloaking_device.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/environmental/computing.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/environmental/drop_item.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/environmental/engine.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/environmental/lightning1.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/environmental/lost_in_time.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/environmental/low_bass_note.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/environmental/low_flange_rez.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/environmental/low_hum.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/environmental/onimous_echo.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/environmental/quasar.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/environmental/scanner.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/environmental/war_drum.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/explosions/explosion2.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/explosions/explosion3.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/explosions/explosion4.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/explosions/explosion5.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/explosions/explosion6.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/explosions/explosion7.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/explosions/explosion8.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/explosions/low_explosion.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/misc/boss_transform.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/misc/boup.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/misc/brain_fry.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/misc/deploy_mine.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/misc/deploy_radio.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/misc/deploy_web.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/misc/electric_drop.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/misc/final_boss_die.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/misc/get_item.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/misc/get_item2.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/misc/item_appear.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/misc/item_appear2.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/misc/lock_on.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/misc/materialize.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/misc/power_up.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/misc/robot_error.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/misc/robot_no.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/misc/whiplash.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/misc/wobble.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/misc/wobble2.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/projectiles/alien_shot1.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/projectiles/alien_shot2.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/projectiles/alien_shot3.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/projectiles/alien_shot4.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/projectiles/alien_shot5.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/projectiles/alien_shot6.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/projectiles/alien_shot7.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/projectiles/clash_ricochet.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/projectiles/hit2.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/projectiles/hit3.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/projectiles/hit4.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/projectiles/hit5.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/projectiles/ion_cannon.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/projectiles/ion_cannon_light.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/projectiles/laser.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/projectiles/missile.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/projectiles/pea_shooter.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/projectiles/photon.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/projectiles/quantum_missile.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/projectiles/ricochet2.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/projectiles/ricochet3.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/projectiles/ricochet4.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/projectiles/ricochet5.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/projectiles/ricochet6.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/projectiles/scatter_shot.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/projectiles/scatter_shot2.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/projectiles/super_missile.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/projectiles/super_missile2.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/space/black_hole.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/space/cosmic_string.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/space/enemy_launch_warmup.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/space/enemy_swoop_down.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/space/enemy_wake_up.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/space/engine_damage.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/space/engine_warmup.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/space/flush_garbage.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/space/hyperdrive_abort.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/space/hyperdrive_abort2.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/space/hyperdrive_warmup.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/space/pressurize_airlock.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/space/shield_activate.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/space/shields_recharged.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/space/shields_recharged2.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/space/ship_dock.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/space/ships_collide.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/space/space_bug_scream.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/space/space_clank.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/space/space_dog_bark.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/space/space_drip.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/space/space_glug.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/space/space_ribbit.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/space/space_vacuum.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/space/space_wind.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/space/super_web_active.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/switches/switch.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/switches/switch2.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/switches/switch3.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/switches/switch4.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/switches/switch5.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/ui/blurn.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/ui/blurn_shhh.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/ui/notify.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/ui/select.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/ui/select2.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/ui/select3.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/ui/select4.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/ui/select5.mp3
/ko/svc/effectgames/ht/images/docs/aud/effects/ui/shunt.mp3
/ko/svc/effectgames/ht/sounds/shutter.mp3
/ko/svc/js/effectgm/htdocs/sounds/shutter.mp3
/ko/svc/js/kojs/kojs_3js_stemkoski/7DFPS/audio/deep-solar-wind.mp3
/ko/svc/js/kojs/kojs_threejs/examples/sounds/358232_j_s_song.mp3
/ko/svc/js/kojs/kojs_threejs/examples/sounds/376737_Skullbeatz___Bad_Cat_Maste.mp3
/ko/svc/js/stemkoskijs/7DFPS/audio/deep-solar-wind.mp3
/ko/svc/js/threejs/examples/sounds/358232_j_s_song.mp3
/ko/svc/js/threejs/examples/sounds/376737_Skullbeatz___Bad_Cat_Maste.mp3
/ko/svc/js/threejs-tetris/music/cash.mp3
/ko/svc/js/threejs-tetris/music/collision.mp3
/ko/svc/js/threejs-tetris/music/gameover.mp3
/ko/svc/js/threejs-tetris/music/move.mp3
/ko/svc/jsdoit/preload/_assets/audio/Thunder.mp3
/ko/svc/jsdoit/preload/_assets/static/CabinBoy.mp3
/ko/svc/tests/easeljs/_assets/audio/bionic.mp3
/ko/svc/tests/easeljs/examples/Game/sounds/break.mp3
/ko/svc/tests/easeljs/examples/Game/sounds/death.mp3
/ko/svc/tests/easeljs/examples/Game/sounds/music.mp3
/ko/svc/tests/easeljs/examples/Game/sounds/shot.mp3
/ko/svc/tests/easeljs/examples/Game/sounds/spawn.mp3
/ko/svc/tests/sandbox/PlanetaryGary/assets/sounds/BodySlam.mp3
/ko/svc/tests/sandbox/PlanetaryGary/assets/sounds/DirtSlide.mp3
/ko/svc/tests/sandbox/PlanetaryGary/assets/sounds/EnemyHit.mp3
/ko/svc/tests/sandbox/PlanetaryGary/assets/sounds/garywalk_chill.mp3
/ko/svc/tests/sandbox/PlanetaryGary/assets/sounds/HitHard4.mp3
/ko/svc/tests/sandbox/PlanetaryGary/assets/sounds/jump4.mp3
/ko/svc/tests/sandbox/PlanetaryGary/assets/sounds/LaserGunShot.mp3
/ko/svc/tests/sandbox/PlanetaryGary/assets/sounds/PressPlay.mp3
/ko/svc/tests/sandbox/PlanetaryGary/assets/sounds/TunnelCollision.mp3
/ko/svc/tests/sandbox/ToolkitBannerAd/sounds/EnemyHit.mp3
/ko/svc/tests/sandbox/ToolkitBannerAd/sounds/LaserGunShot.mp3
/ko/svc/tests/soundjs/_assets/audio/05-Binrpilot-Underground.mp3
/ko/svc/tests/soundjs/_assets/audio/Game-AudioSprite.mp3
/ko/svc/tests/soundjs/_assets/audio/Game-Break.mp3
/ko/svc/tests/soundjs/_assets/audio/Game-Death.mp3
/ko/svc/tests/soundjs/_assets/audio/Game-Shot.mp3
/ko/svc/tests/soundjs/_assets/audio/Game-Spawn.mp3
/ko/svc/tests/soundjs/_assets/audio/GU-StealDaisy.mp3
/ko/svc/tests/soundjs/_assets/audio/Humm.mp3
/ko/svc/tests/soundjs/_assets/audio/M-GameBG.mp3
/ko/svc/tests/soundjs/_assets/audio/R-Damage.mp3
/ko/svc/tests/soundjs/_assets/audio/S-Damage.mp3
/ko/svc/tests/soundjs/_assets/audio/Thunder1.mp3
/ko/svc/tests/soundjs/_assets/audio/ToneWobble.mp3
/ko/svc/tests/soundjs/_assets/audio/U-CabinBoy3.mp3
/ko/svc/tests/soundjs/examples/Game/sounds/break.mp3
/ko/svc/tests/soundjs/examples/Game/sounds/death.mp3
/ko/svc/tests/soundjs/examples/Game/sounds/music.mp3
/ko/svc/tests/soundjs/examples/Game/sounds/shot.mp3
/ko/svc/tests/soundjs/examples/Game/sounds/spawn.mp3
/us0/2007/konet.ka5/httpdocs/mp3/net/silent.mp3
/us0/2007/konet.ka5/httpdocs/mp3/pinball/SOUND1.mp3
/us0/2007/konet.ka5/httpdocs/mp3/pinball/SOUND104.mp3
/us0/2007/konet.ka5/httpdocs/mp3/pinball/SOUND105.mp3
/us0/2007/konet.ka5/httpdocs/mp3/pinball/SOUND108.mp3
/us0/2007/konet.ka5/httpdocs/mp3/pinball/SOUND111.mp3
/us0/2007/konet.ka5/httpdocs/mp3/pinball/SOUND112.mp3
/us0/2007/konet.ka5/httpdocs/mp3/pinball/SOUND12.mp3
/us0/2007/konet.ka5/httpdocs/mp3/pinball/SOUND13.mp3
/us0/2007/konet.ka5/httpdocs/mp3/pinball/SOUND131.mp3
/us0/2007/konet.ka5/httpdocs/mp3/pinball/SOUND136.mp3
/us0/2007/konet.ka5/httpdocs/mp3/pinball/SOUND14.mp3
/us0/2007/konet.ka5/httpdocs/mp3/pinball/SOUND16.mp3
/us0/2007/konet.ka5/httpdocs/mp3/pinball/SOUND17.mp3
/us0/2007/konet.ka5/httpdocs/mp3/pinball/SOUND18.mp3
/us0/2007/konet.ka5/httpdocs/mp3/pinball/SOUND181.mp3
/us0/2007/konet.ka5/httpdocs/mp3/pinball/SOUND19.mp3
/us0/2007/konet.ka5/httpdocs/mp3/pinball/SOUND20.mp3
/us0/2007/konet.ka5/httpdocs/mp3/pinball/SOUND21.mp3
/us0/2007/konet.ka5/httpdocs/mp3/pinball/SOUND22.mp3
/us0/2007/konet.ka5/httpdocs/mp3/pinball/SOUND24.mp3
/us0/2007/konet.ka5/httpdocs/mp3/pinball/SOUND240.mp3
/us0/2007/konet.ka5/httpdocs/mp3/pinball/SOUND243.mp3
/us0/2007/konet.ka5/httpdocs/mp3/pinball/SOUND25.mp3
/us0/2007/konet.ka5/httpdocs/mp3/pinball/SOUND26.mp3
/us0/2007/konet.ka5/httpdocs/mp3/pinball/SOUND27.mp3
/us0/2007/konet.ka5/httpdocs/mp3/pinball/SOUND28.mp3
/us0/2007/konet.ka5/httpdocs/mp3/pinball/SOUND29.mp3
/us0/2007/konet.ka5/httpdocs/mp3/pinball/SOUND3.mp3
/us0/2007/konet.ka5/httpdocs/mp3/pinball/SOUND30.mp3
/us0/2007/konet.ka5/httpdocs/mp3/pinball/SOUND34.mp3
/us0/2007/konet.ka5/httpdocs/mp3/pinball/SOUND35.mp3
/us0/2007/konet.ka5/httpdocs/mp3/pinball/SOUND36.mp3
/us0/2007/konet.ka5/httpdocs/mp3/pinball/SOUND38.mp3
/us0/2007/konet.ka5/httpdocs/mp3/pinball/SOUND39.mp3
/us0/2007/konet.ka5/httpdocs/mp3/pinball/SOUND4.mp3
/us0/2007/konet.ka5/httpdocs/mp3/pinball/SOUND42.mp3
/us0/2007/konet.ka5/httpdocs/mp3/pinball/SOUND43.mp3
/us0/2007/konet.ka5/httpdocs/mp3/pinball/SOUND45.mp3
/us0/2007/konet.ka5/httpdocs/mp3/pinball/SOUND49.mp3
/us0/2007/konet.ka5/httpdocs/mp3/pinball/SOUND49D.mp3
/us0/2007/konet.ka5/httpdocs/mp3/pinball/SOUND5.mp3
/us0/2007/konet.ka5/httpdocs/mp3/pinball/SOUND50.mp3
/us0/2007/konet.ka5/httpdocs/mp3/pinball/SOUND528.mp3
/us0/2007/konet.ka5/httpdocs/mp3/pinball/SOUND53.mp3
/us0/2007/konet.ka5/httpdocs/mp3/pinball/SOUND54.mp3
/us0/2007/konet.ka5/httpdocs/mp3/pinball/SOUND55.mp3
/us0/2007/konet.ka5/httpdocs/mp3/pinball/SOUND560.mp3
/us0/2007/konet.ka5/httpdocs/mp3/pinball/SOUND563.mp3
/us0/2007/konet.ka5/httpdocs/mp3/pinball/SOUND57.mp3
/us0/2007/konet.ka5/httpdocs/mp3/pinball/SOUND58.mp3
/us0/2007/konet.ka5/httpdocs/mp3/pinball/SOUND6.mp3
/us0/2007/konet.ka5/httpdocs/mp3/pinball/SOUND65.mp3
/us0/2007/konet.ka5/httpdocs/mp3/pinball/SOUND68.mp3
/us0/2007/konet.ka5/httpdocs/mp3/pinball/SOUND7.mp3
/us0/2007/konet.ka5/httpdocs/mp3/pinball/SOUND713.mp3
/us0/2007/konet.ka5/httpdocs/mp3/pinball/SOUND735.mp3
/us0/2007/konet.ka5/httpdocs/mp3/pinball/SOUND8.mp3
/us0/2007/konet.ka5/httpdocs/mp3/pinball/SOUND827.mp3
/us0/2007/konet.ka5/httpdocs/mp3/pinball/SOUND9.mp3
/us0/2007/konet.ka5/httpdocs/mp3/pinball/SOUND999.mp3
/us0/2007/konet.ka5/httpdocs/mp3/quicken/delete_space1.mp3
/us0/2007/konet.ka5/httpdocs/mp3/quicken/delete_space2.mp3
/us0/2007/konet.ka5/httpdocs/mp3/quicken/delete_tek1.mp3
/us0/2007/konet.ka5/httpdocs/mp3/quicken/delete_tek2.mp3
/us0/2007/konet.ka5/httpdocs/mp3/quicken/delete_tek3.mp3
/us0/2007/konet.ka5/httpdocs/mp3/quicken/delete_tek4.mp3
/us0/2007/konet.ka5/httpdocs/mp3/quicken/qabitem.mp3
/us0/2007/konet.ka5/httpdocs/mp3/quicken/qabmenu.mp3
/us0/2007/konet.ka5/httpdocs/mp3/quicken/qclick.mp3
/us0/2007/konet.ka5/httpdocs/mp3/quicken/qdelete.mp3
/us0/2007/konet.ka5/httpdocs/mp3/quicken/qdelete1.mp3
/us0/2007/konet.ka5/httpdocs/mp3/quicken/qdelete2.mp3
/us0/2007/konet.ka5/httpdocs/mp3/quicken/qdelete3.mp3
/us0/2007/konet.ka5/httpdocs/mp3/quicken/qdelete4.mp3
/us0/2007/konet.ka5/httpdocs/mp3/quicken/qmem.mp3
/us0/2007/konet.ka5/httpdocs/mp3/quicken/qmem2.mp3
/us0/2007/konet.ka5/httpdocs/mp3/quicken/qmem3.mp3
/us0/2007/konet.ka5/httpdocs/mp3/quicken/qmem4.mp3
/us0/2007/konet.ka5/httpdocs/mp3/quicken/qopen.mp3
/us0/2007/konet.ka5/httpdocs/mp3/quicken/qopen1.mp3
/us0/2007/konet.ka5/httpdocs/mp3/quicken/qopen10.mp3
/us0/2007/konet.ka5/httpdocs/mp3/quicken/qopen2.mp3
/us0/2007/konet.ka5/httpdocs/mp3/quicken/qopen3.mp3
/us0/2007/konet.ka5/httpdocs/mp3/quicken/qopen4.mp3
/us0/2007/konet.ka5/httpdocs/mp3/quicken/qopen5.mp3
/us0/2007/konet.ka5/httpdocs/mp3/quicken/qopen6.mp3
/us0/2007/konet.ka5/httpdocs/mp3/quicken/qopen7.mp3
/us0/2007/konet.ka5/httpdocs/mp3/quicken/qopen8.mp3
/us0/2007/konet.ka5/httpdocs/mp3/quicken/qopen9.mp3
/us0/2007/konet.ka5/httpdocs/mp3/quicken/qopen_2000.mp3
/us0/2007/konet.ka5/httpdocs/mp3/quicken/qopen_99.mp3
/us0/2007/konet.ka5/httpdocs/mp3/quicken/qopen_bell.mp3
/us0/2007/konet.ka5/httpdocs/mp3/quicken/qopen_birds.mp3
/us0/2007/konet.ka5/httpdocs/mp3/quicken/qopen_chimes.mp3
/us0/2007/konet.ka5/httpdocs/mp3/quicken/qopen_IPO.mp3
/us0/2007/konet.ka5/httpdocs/mp3/quicken/qopen_newsbreak.mp3
/us0/2007/konet.ka5/httpdocs/mp3/quicken/qopen_rickety_mineshaft_of_riches.mp3
/us0/2007/konet.ka5/httpdocs/mp3/quicken/qrecord.mp3
/us0/2007/konet.ka5/httpdocs/mp3/quicken/qrecord1.mp3
/us0/2007/konet.ka5/httpdocs/mp3/spy/alarm.mp3
/us0/2007/konet.ka5/httpdocs/mp3/spy/beep.mp3
/us0/2007/konet.ka5/httpdocs/mp3/spy/bell.mp3
/us0/2007/konet.ka5/httpdocs/mp3/spy/bells.mp3
/us0/2007/konet.ka5/httpdocs/mp3/spy/blip.mp3
/us0/2007/konet.ka5/httpdocs/mp3/spy/bubbles.mp3
/us0/2007/konet.ka5/httpdocs/mp3/spy/busy.mp3
/us0/2007/konet.ka5/httpdocs/mp3/spy/chord.mp3
/us0/2007/konet.ka5/httpdocs/mp3/spy/click.mp3
/us0/2007/konet.ka5/httpdocs/mp3/spy/click2.mp3
/us0/2007/konet.ka5/httpdocs/mp3/spy/click3.mp3
/us0/2007/konet.ka5/httpdocs/mp3/spy/clink.mp3
/us0/2007/konet.ka5/httpdocs/mp3/spy/clonk.mp3
/us0/2007/konet.ka5/httpdocs/mp3/spy/cork.mp3
/us0/2007/konet.ka5/httpdocs/mp3/spy/crumpling.mp3
/us0/2007/konet.ka5/httpdocs/mp3/spy/cymbal.mp3
/us0/2007/konet.ka5/httpdocs/mp3/spy/doorbell.mp3
/us0/2007/konet.ka5/httpdocs/mp3/spy/exclamation.mp3
/us0/2007/konet.ka5/httpdocs/mp3/spy/fall.mp3
/us0/2007/konet.ka5/httpdocs/mp3/spy/flipflop.mp3
/us0/2007/konet.ka5/httpdocs/mp3/spy/gong.mp3
/us0/2007/konet.ka5/httpdocs/mp3/spy/metalcling.mp3
/us0/2007/konet.ka5/httpdocs/mp3/spy/metalclonk.mp3
/us0/2007/konet.ka5/httpdocs/mp3/spy/phaser.mp3
/us0/2007/konet.ka5/httpdocs/mp3/spy/ping.mp3
/us0/2007/konet.ka5/httpdocs/mp3/spy/sissors.mp3
/us0/2007/konet.ka5/httpdocs/mp3/spy/slip.mp3
/us0/2007/konet.ka5/httpdocs/mp3/spy/taps.mp3
/us0/2007/konet.ka5/httpdocs/mp3/spy/toilet.mp3
/us0/2007/konet.ka5/httpdocs/mp3/ts3/BEAM.mp3
/us0/2007/konet.ka5/httpdocs/mp3/ts3/BIRDS.mp3
/us0/2007/konet.ka5/httpdocs/mp3/ts3/CRICKET.mp3
/us0/2007/konet.ka5/httpdocs/mp3/ts3/KNOCK.mp3
/us0/2007/konet.ka5/httpdocs/mp3/ts3/MACHINE.mp3
/us0/2007/konet.ka5/httpdocs/mp3/ts3/PUTER.mp3
/us0/2007/kuntao.ka5/httpdocs/cms/images/stories/20000229/mp3/kt_000229_001.mp3
/us0/2007/kuntao.ka5/httpdocs/cms/images/stories/20000229/mp3/kt_000229_002.mp3
/us0/2007/kuntao.ka5/httpdocs/cms/images/stories/20000229/mp3/kt_000229_003.mp3
/us0/2007/kuntao.ka5/httpdocs/cms/images/stories/20000229/mp3/kt_000229_004.mp3
/us0/2007/kuntao.ka5/httpdocs/cms/images/stories/20000229/mp3/kt_000229_005.mp3
/us0/2007/kuntao.ka5/httpdocs/cms/images/stories/20000229/mp3/kt_000229_006.mp3
/us0/2007/kuntao.ka5/httpdocs/cms/images/stories/20000229/mp3/kt_000229_007.mp3
/us0/2007/kuntao.ka5/httpdocs/cms/images/stories/20000229/mp3/kt_000229_008.mp3
/us0/2007/kuntao.ka5/httpdocs/cms/images/stories/20000229/mp3/kt_000229_009.mp3
/us0/2007/kuntao.ka5/httpdocs/cms/images/stories/20000229/mp3/kt_000229_010.mp3
/us0/2007/kuntao.ka5/httpdocs/cms/images/stories/20000229/mp3/kt_000229_011.mp3
/us0/2007/kuntao.ka5/httpdocs/cms/images/stories/20000229/mp3/kt_000229_012.mp3
/us0/2007/kuntao.ka5/httpdocs/cms/images/stories/20000229/mp3/kt_000229_013.mp3
/us0/2007/kuntao.ka5/httpdocs/cms/images/stories/20000229/mp3/kt_000229_014.mp3
/us0/2007/kuntao.ka5/httpdocs/cms/images/stories/20000229/mp3/kt_000229_015.mp3
/us0/2007/kuntao.ka5/httpdocs/cms/images/stories/20000229/mp3/kt_000229_016.mp3
/us0/2007/kuntao.ka5/httpdocs/cms/images/stories/20000229/mp3/kt_000229_017.mp3
/us0/2007/kuntao.ka5/httpdocs/cms/images/stories/20000229/mp3/kt_000229_018.mp3
/us0/2007/kuntao.ka5/httpdocs/cms/images/stories/20000229/mp3/kt_000229_019.mp3
/us0/2007/kuntao.ka5/httpdocs/cms/images/stories/20000229/mp3/kt_000229_020.mp3
/us0/2007/kuntao.ka5/httpdocs/cms/images/stories/20000229/mp3/kt_000229_021.mp3
/us0/2007/kuntao.ka5/httpdocs/cms/images/stories/20000229/mp3/kt_000229_022.mp3
/us0/2007/kuntao.ka5/httpdocs/cms/images/stories/20000229/mp3/kt_000229_023.mp3
/us0/2007/kuntao.ka5/httpdocs/cms/images/stories/20000229/mp3/kt_000229_024.mp3
/us0/2007/kuntao.ka5/httpdocs/cms/images/stories/20000229/mp3/kt_000229_025.mp3
/us0/2007/kuntao.ka5/httpdocs/cms/images/stories/20000229/mp3/kt_000229_026.mp3
/us0/2007/kuntao.ka5/httpdocs/cms/images/stories/20000229/mp3/kt_000229_027.mp3
/us0/2007/kuntao.ka5/httpdocs/cms/images/stories/20000229/mp3/kt_000229_028.mp3
/us0/2007/kuntao.ka5/httpdocs/cms/images/stories/20000229/mp3/kt_000229_029.mp3
/us0/2007/kuntao.ka5/httpdocs/cms/images/stories/20000229/mp3/kt_000229_030.mp3
/us0/2007/kuntao.ka5/httpdocs/cms/images/stories/20000229/mp3/kt_000229_031.mp3
/us0/2007/kuntao.ka5/httpdocs/cms/images/stories/20000229/mp3/kt_000229_032.mp3
/us0/2007/kuntao.ka5/httpdocs/cms/images/stories/20000229/mp3/kt_000229_033.mp3
/us0/2007/kuntao.ka5/httpdocs/cms/images/stories/20000229/mp3/kt_000229_034.mp3
/us0/2007/kuntao.ka5/httpdocs/cms/images/stories/20000229/mp3/kt_000229_035.mp3
/us0/2007/kuntao.ka5/httpdocs/cms/images/stories/20000229/mp3/kt_000229_036.mp3
/us0/2007/kuntao.ka5/httpdocs/cms/images/stories/20000229/mp3/kt_000229_037.mp3
/us0/2007/kuntao.ka5/httpdocs/cms/images/stories/20000229/mp3/kt_000229_038.mp3
/us0/2007/kuntao.ka5/httpdocs/cms/images/stories/20000229/mp3/kt_000229_039.mp3
/us0/2007/kuntao.ka5/httpdocs/cms/images/stories/20000229/mp3/kt_000229_040.mp3
/us0/2007/kuntao.ka5/httpdocs/cms/images/stories/20000229/mp3/kt_000229_041.mp3
/us0/2007/kuntao.ka5/httpdocs/cms/images/stories/20000229/mp3/kt_000229_042.mp3
/us0/2007/kuntao.ka5/httpdocs/cms/images/stories/20000229/mp3/kt_000229_043.mp3
/us0/2007/kuntao.ka5/httpdocs/cms/images/stories/20000229/mp3/kt_000229_044.mp3
/us0/2007/kuntao.ka5/httpdocs/cms/images/stories/20000229/mp3/kt_000229_045.mp3
/us0/2007/kuntao.ka5/httpdocs/cms/images/stories/20000229/mp3/kt_000229_046.mp3
/us0/2007/kuntao.ka5/httpdocs/cms/images/stories/20000229/mp3/kt_000229_047.mp3
/us0/2007/kuntao.ka5/httpdocs/cms/images/stories/20000229/mp3/kt_000229_048.mp3
/us0/2007/kuntao.ka5/httpdocs/cms/images/stories/20000229/mp3/kt_000229_049.mp3
/us0/2007/kuntao.ka5/httpdocs/cms/images/stories/20000229/mp3/kt_000229_050.mp3
/us0/2007/kuntao.ka5/httpdocs/cms/images/stories/20000229/mp3/kt_000229_051.mp3
/us0/2007/kuntao.ka5/httpdocs/cms/images/stories/20000229/mp3/kt_000229_052.mp3
/vhosts1/chapel.ka6/httpdocs/ko/shoutcast/Start_Today_Again.mp3
/vhosts1/ka5/httpdocs/doctorjoe/docjoe_dan_Tori_Amos_-_Yes,_Anastasia.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/A Hard Day's Night.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/Always On My Mind.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/Andrew Sisters- Bei Mir Bist du Schon.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/Auctioneer.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/Banana Boat Song.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/Benny Goodman - Bei Mir Bist Du Schon.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/Big girls don't cry.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/Bless The Beasts And Children.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/Cab Calloway - Minnie The Moocher.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/Can't Help Falling In Love.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/Cherry Pink & Apple Blossom White.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/CherryCherry.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/Connie Frances - Who's Sorry Now.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/Connie Frances Where the boys ARE.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/Connie Francis - Mama.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/Crazy.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/dj_classical_bach_-_air_for_g_string.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/dj_classical_bach_-_brandenburg_concerto_3_allegro.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/dj_classical_canon_in_d.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/dj_classical_chopin_-_nocturne_in_e_flat.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/dj_classical_eugene_ormandy_-_grande_valse.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/dj_classical_humoresque.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/dj_classical_hungarian_dance_no_16_-_con_moto.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/dj_classical_hungarian_dance_no_5.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/dj_classical_hungarian_dance_no_7_in_a_-_brahms.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/dj_classical_monti-csardas.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/dj_classical_mozart-variation.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/dj_classical_mozart_-_moonlight_sonata.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/dj_classical_offenbach_-_tales_of_hoffmann,_barcarolle.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/dj_classical_rhapsody_on_a_theme_of_paganini.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/dj_ethnic_andrew_sisters-_bei_mir_bist_du_schon.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/dj_ethnic_barry_sisters_-_a_byssele.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/dj_ethnic_barry_sisters_-_bei_mir_bistu_shain.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/dj_ethnic_barry_sisters_-_chiribim_chiribom.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/dj_ethnic_barry_sisters_-_fargess_mich_nit.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/dj_ethnic_barry_sisters_-_ich_hob_dich_zifeel_lieb.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/dj_ethnic_barry_sisters_-_main_glick.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/dj_ethnic_barry_sisters_-_ochy_chernye.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/dj_ethnic_barry_sisters_-_papirossen.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/dj_ethnic_barry_sisters_-_rumeine.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/dj_ethnic_barry_sisters_-_shabes_lich.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/dj_ethnic_barry_sisters_-_tum_balalaika.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/dj_ethnic_barry_sisters_-_vie_a_heen_zol_ich_gayn.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/dj_ethnic_chassidic_melody__-_netania_davrath.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/dj_ethnic_chieu_matxcova.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/dj_ethnic_ein_keloheinu.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/dj_ethnic_eli_eli.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/dj_ethnic_eretz_eretz.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/dj_ethnic_exodus-havah-nagilah_-_connie-francis.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/dj_ethnic_inzenyrska.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/dj_ethnic_theodore_bikel_-_mayn_shtetele_belz.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/dj_ethnic_tumalalaika_-_herschel_bernardi.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/dj_ethnic_yome,_yome_-_shoshana_damari.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/dj_opera_andrea_bocelli_&_celine_dion_-_the_prayer.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/dj_opera_andrea_bocelli_&_sarah_brightman_-_time_to_say_goodbye.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/dj_opera_andrea_bocelli_-_puccini_-_nessun_dorma.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/dj_opera_beverly_sills_-_richard_strauss_-_breit_uber_mein_haupt.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/dj_opera_carreras_domingo_pavarotti_-_nessun_dorma.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/dj_opera_libiamo-libiamo-carlo-de-monte-victoria-de-los-angeles.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/dj_opera_luciano-pavarotti-una-furtiva-lagrima.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/dj_opera_mario_lanza_-_arriverderci_roma.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/dj_opera_rodgers_&_hammerstein_-_the_sound_of_music_-_edelweiss.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/dj_opera_sarah_brightman_&_andrea_bocelli_-_time_to_say_goodbye.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/dj_opera_sarah_brightman_-_hijo_de_la_luna.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/Doris Day - Que Sera Sera.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/Doris Day - Secret Love.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/Doris Day - You Are My Sunshine.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/Ella Fitzgerald - Heart and Soul.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/Frank Sinatra - One for my baby (and one more for the road) .mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/Frank Sinatra - The Way You Look Tonight.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/Frankie Lane - Cry of the wild goose.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/Girl, You[ll Be a WomanSoon.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/Good Night Irene.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/Great Pretender (Platters).mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/Green Green Grass Of Home.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/High Noon - Frankie Lane.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/Honeycomb.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/I Want To Hold Your Hand.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/If you love me-BrendaLee.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/In The Good Old Summertime.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/Kay Kyser,with Ish Kabibble, Harry Babbitt, Sally Mason - Three little Fishies.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/King of the Road.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/la-paloma - connie-francis.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/Lili Marlene - Marlene Dietrich.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/Little Sir Echo - Horace Heidt.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/Louie Armstrong - What a Wonderful World.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/Louie Louie - Kingsmen.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/Love Me Tender.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/Memories Are Made Of This.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/Mister Sandman - The Chordettes .mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/mockin_bird_hill_patti_page.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/Mona Lisa.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/My Heart Belongs To DaddyK.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/Norwegian Wood.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/oh_lonesome_me_connie_francis.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/Pattie Page - How Much Is That Doggie In The Window.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/Pattie Page - Tennessee Waltz.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/Quando, Quando, Quando-EngelbertHumperdinck.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/Ramblin'_Rose.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/Rosemary Clooney - This Ole House.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/Scatterbrain - Freddy Martin Orch.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/September Morn.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/sherry.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/Sons of The Pioneers _ Cool Water.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/Springtime in the Rockies - Will Carter .mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/Standing On The Corner.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/Sukiyaki.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/Tennessee  Waltz.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/That's Amore.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/The Platters  The Great Pretender.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/The Platters - Unchained Melody.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/They Can't Take That Away From Me.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/Tiny Bubbles & Pearly shells.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/topsy.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/Volare.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/What's new pussycat.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/Why_Dont_You_Do_Right_.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/winchester_cathedral_petula_clark.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/windy.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/Yellow Bird.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/Yesterday.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/You Can't Hurry Love.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/You've lost That Lovin' Feeling .mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/you-send-me.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/YouDon'tBringMeFlowers.mp3
/vhosts1/ka5/httpdocs/doctorjoe/media/mp3/favs/young_love.mp3
/vhosts1/ka5/httpdocs/zencart/media/thehunter.mp3
/vhosts1/ka5/inbox/brell77_snip22_carousel.mp3
/vhosts1/ka5/ko/shoutcast/scpromo.mp3
/vhosts1/ka5/ko/shoutcast/Start_Today_Again.mp3
/vhosts1/ka5/ko/shoutcast/test1.mp3
/vhosts1/konet.org/public_html/ko/shoutcast/scpromo.mp3
/vhosts1/konet.org/public_html/ko/shoutcast/Start_Today_Again.mp3
/vhosts1/konet.org/public_html/ko/shoutcast/test1.mp3
/vhosts1/konet.org/public_html/zencart/media/thehunter.mp3
`;







kolists['av'] = `
/index1_avril.mp4
/index0.mp4
/index1.mp4
/index2.mp4
/index3.mp4
/index4.mp4
/index5.mp4
/index6.mp4
/index7.mp4
/index8.mp4
/index9.mp4
/index10.mp4
/index11.mp4
/av.mp4
/index.mp4
/index1.mp4
/index2.mp4
/index3.mp4
/index4.mp4
/kb/vid/youb/tech_petdrone_skydio_r1_review.mp4
/kb/vid/youb/tech_unboxing_led_500.mp4
/kb/vid/youb/tech_thermoelectric_cooler_pelier.mp4
/kb/vid/youb/dance_rtsf2019_dietmar_n_nellia?never_stop_jiving.mp4
/kb/vid/youb/ dance_butoh_japan.mp4
/kb/vid/youb/dance_peeping_tom_le_salon.mp4
/kb/jtfdc/vid/jtfdc_20190124_1350_stalkaround_lwhitesuv_jtf30in_jkwii.mp4
/kb/jtfdc/vid/jtfdc_20190122_2200_stalkaround_jtf28in_drivewaytraffic.mp4
/kb/vid/youb/01_sixto_rodriguez_sandrevan_lullabylifestyles_[coming_from_.mp4
/kb/vid/youb/02_sixto_rodriguez_i_think_of_you.mp4
/kb/vid/youb/48_roses_mariachi_el_bronx_jay_leno_2011.mp4
/kb/vid/youb/bonnie_raitt_aaron_neville_gregg_allman_tell_it_like_it.mp4
/kb/vid/youb/eva_cassidyaint_no_sunshine.mp4
/kb/vid/youb/eva_cassidyfields_of_gold.mp4
/kb/vid/youb/faithfullworking_class_hero-live.mp4
/kb/vid/youb/official_chrysler_and_bob_dylan_super_bowl_commercial_2017.mp4
/kb/vid/youb/richie_havens_i_was_educated_by_myself_with_lyrics.mp4
/kb/vid/youb/river_run_file24160428.mp4
/kb/vid/youb/steal_away_by_the_fureys.mp4
/kb/vid/youb/the_last_farewell_lyrics_roger_whittaker.mp4
/kb/vid/youb/we_believe_in_happy_ending_emmylou_harris_earl_thomas_co.mp4
/kb/vid/youb/yogis_Tibetan_Buddhism__Secrets_of_the_Yogis_of_Tibet_-_Part_5.mp4
/ko/svc/jsdoit/preload/_assets/static/video.mp4
/ko/svc/js/threejs/examples/textures/sintel.mp4
/3.mp4
/konet/index6.mp4
/konet/index2.mp4
/konet/index.mp4
/konet/index1.mp4
/konet/index3.mp4
/jkwii/jkwii.mp4
/jkwii/js/threejs/examples/textures/sintel.mp4
/index4.mp4
/ka1.mp4
/index8.mp4
/kb/byrdpuckers/vid/jtfdc_20171214_1215_jtf32out_jtf32_lyinglawerin.mp4
/kb/byrdpuckers/vid/huckleberry_hound_17_barbeque_hound.mp4
/kb/byrdpuckers/vid/jtfdc_201802261524_fiona_freeroam.mp4
/kb/byrdpuckers/vid/jtfdc_20180605_0500_jtf31_fiona_roam_go_home_doberwoofs_jkwiiabout.mp4
/kb/byrdpuckers/vid/roy_rogers_dont_fence_me_in.mp4
/kb/byrdpuckers/vid/jtf31.mp4
/kb/byrdpuckers/vid/jtfdc_20180604_1015_jtf31_fiona_qualitytime_unexpected_jkwii.mp4
/kb/byrdpuckers/vid/jtfdc_20180605_1956_bigtruck_n_cabletrailer_stalkback.mp4
/kb/byrdpuckers/vid/doghead_video.mp4
/kb/byrdpuckers/vid/jtfdc_20180607_1813_jtf31_fiona_freeroom_inyourface.mp4
/kb/byrdpuckers/vid/jtfdc_20180530_2034_jkwii_meet_househunters_nice.mp4
/kb/byrdpuckers/vid/jtfdc_20180505_1944_jkwiinkids_center_court.mp4
/kb/byrdpuckers/vid/jtfdc_20180605_1130_jkwii_lost_cable_truck.mp4
/kb/byrdpuckers/vid/jtf30.mp4
/kb/byrdpuckers/vid/jtfdc_20180226_1524_jtf31_fiona_freeroam.mp4
/kb/byrdpuckers/vid/jtfdc_20180605_1130_jkwii_lost_cabletrailer.mp4
/kb/byrdpuckers/vid/jtfdc_20171216_0610_woof.mp4
/kb/byrdpuckers/vid/jtfdc_20180606_1145_jtf40_driveway_byrdpucker_theft_threadt.mp4
/kb/byrdpuckers/vid/jtfdc_20180604_0630_jtf31_fiona_courttime_jkwii.mp4
/kb/byrdpuckers/vid/roy_rogers_dale_evans_sons_of_pioneers_medley.mp4
/kb/byrdpuckers/vid/jtfdc_20180605_1956_cabletrailer_backnice.mp4
/kb/byrdpuckers/vid/index1.mp4
/kb/vid/dutch/dutch_jacksonnocout_get_my_weight_up.mp4
/kb/vid/dutch/dutch_jackson_feat_jibbscity_on_fire_off_then.mp4
/kb/vid/dutch/dutch_jackson_39_new_single.mp4
/kb/vid/youb/Luciano Pavarotti & James Brown - It_s a man_s world (1080pHD).mp4
/kb/vid/youb/REAL_Men_Who_Stare_At_Goats.mp4
/kb/vid/youb/REAL_MEN_WHO_STARE_AT_GOATS_part_2.mp4
/kb/vid/youb/The_Magus_of_Denver.mp4
/kb/vid/youb/PAPA-OOM-MOW-MOW!.mp4
/kb/vid/youb/romania_lalala.mp4
/kb/vid/youb/Willem_de_Thouars,_Kun_Tao_Silat,_1996_Gulfport_School_of_Ta-0.mp4
/kb/vid/youb/Zappa_Plays_Zappa_-_Joe_s_Garage.mp4
/kb/vid/youb/dietric_coffee_ifile-164376962.mp4
/kb/vid/youb/Perhaps_Love_-_John_Denver_Placido_Domingo_legendado.mp4
/kb/vid/youb/Big_Data_-_Tim_Smith.mp4
/kb/vid/youb/OFFICIAL_Chrysler_and_Bob_Dylan_Super_Bowl_Commercial_2014.mp4
/kb/vid/youb/02_Sixto_Rodriguez_-_I_Think_Of_You_.wmv.mp4
/kb/vid/youb/waits-lullaby-1.mp4
/kb/vid/youb/Maria_Muldaur_-_Don_t_You_Feel_My_Leg.mp4
/kb/vid/youb/REAL_MEN_WHO_STARE_AT_GOATS_part_3.mp4
/kb/vid/youb/sharon_jones_100_days.mp4
/kb/vid/youb/Willem_de_Thouars,_Kun_Tao_Silat,_1996_Gulfport_School_of_Ta-1.mp4
/kb/vid/youb/dori_caymmi-o_bem_do_mar.mp4
/kb/vid/youb/01_Sixto_Rodriguez_-_Sandrevan_Lullaby-Lifestyles_[Coming_From_.mp4
/kb/vid/youb/Eleni_Mandell_-__quot_my_twin_quot__-_Live_at_The_EARL.mp4
/kb/vid/youb/Nat_King_Cole_All_Over_The_World.mp4
/kb/vid/youb/shania_tTwain_forever_and_for_always-world.mp4
/kb/vid/youb/harris_together_again_file-249732345.mp4
/kb/vid/youb/doghead_video.mp4
/kb/vid/youb/03_Rodriguez_-_I_ll_Slip_Away.mp4
/kb/vid/youb/Maria_Muldaur_-_My_Tennessee_Mountain_Home__Live_Recording_.mp4
/kb/vid/youb/Trio_-_Sabine.mp4
/kb/vid/youb/WHENEVER GOD SHINES HIS LIGHT - VAN MORRISON.mp4
/kb/vid/youb/eva_cassidy-aint_no_sunshine.mp4
/kb/vid/youb/Maria_Muldaur_-_A_Good_Man_is_Hard_To_Find.mp4
/kb/vid/youb/Eleni_Mandell_-__quot_makeout_king_quot_.mp4
/kb/vid/youb/put_the_lime_in_the_coconut.mp4
/kb/vid/youb/amywinehouse_love_losing_game_file-235773700.mp4
/kb/vid/youb/romania_hat.mp4
/kb/vid/youb/freddy_dreamers_telling_you_now_file-570139451.mp4
/kb/vid/youb/Rodriguez_-_I_Wonder.mp4
/kb/vid/youb/Dreaming As One - Richie Havens.mp4
/kb/vid/youb/trio_Vogel_der_Nacht.mp4
/kb/vid/youb/zara_leander_psycadeylic_file-252228034.mp4
/kb/vid/youb/waits-time3.mp4
/kb/vid/youb/lovers_concerto_file-380426037.mp4
/kb/vid/youb/mclean_starry_nights_file-805110482.mp4
/kb/vid/youb/harris_wheels_of_love_file-54997698.mp4
/kb/vid/youb/Nat_King_Cole_-_Je_Vous_Aime_Beaucoup.mp4
/kb/vid/youb/Master_Guy_Savelli_s_Kun_Tao__U.S._Special_Forces_SERE_Train.mp4
/kb/vid/youb/Rodriguez_cf11_Rich_Folks_Hoax.mp4
/kb/vid/youb/48_Roses_-_Mariachi_El_Bronx_(Jay_Leno,_2011).mp4
/kb/vid/youb/TRIO_-_Du_ich_w_r_so_gern_bei_dir.mp4
/kb/vid/youb/YouTube_-_Amy_Winehouse_-_You_Know_I_m_No_Good.mp4
/kb/vid/youb/waits-come_on_up_to_the_house.mp4
/kb/vid/youb/Maria_Muldaur_-_Handy_Man.mp4
/kb/vid/youb/nina_simone-dont_let_me_be_misunderstood.mp4
/kb/vid/youb/_Firedoglake_sen_byrd_fiddle.mp4
/kb/vid/youb/Trio_-_Turaluraluralu.mp4
/kb/vid/youb/yogis_Tibetan_Buddhism__Secrets_of_the_Yogis_of_Tibet_-_Part_5.mp4
/kb/vid/youb/eva_cassidy-fields_of_gold.mp4
/kb/vid/youb/Paul_Simon_-_You_Can_Call_Me_Al.mp4
/kb/vid/youb/river_run_file-24160428.mp4
/kb/vid/youb/The_Large_Hadron_Rap.mp4
/kb/vid/youb/Petula Clark-Windmills Of Your Mind (lyrics).mp4
/kb/vid/youb/waits-time_full.mp4
/kb/vid/youb/joe_south_want_to_go_home.mp4
/kb/vid/youb/you_dont_own_me.mp4
/kb/vid/youb/iris_sweet_is_thr_melody.mp4
/kb/vid/youb/thai_bowie.mp4
/kb/vid/youb/femme_pencak silat.mp4
/kb/vid/youb/Huckleberry_Hound_17_Barbeque_Hound_-_YouTube.mp4
/kb/vid/youb/harris_nobodys_darlin_file-996617010.mp4
/kb/vid/youb/buckingham_nicks-say_goodbye-live.mp4
/kb/vid/deepmind/ka1.mp4
/kb/vid/deepmind/eva_cassidy-aint_no_sunshine.mp4
/kb/kt/Muhammad_ali_freddy_starr.mp4
/kb/kt/000_Pakua_master_of_94_year_s_old.mp4
/kb/kt/willem_de_thouars_kuntao_silat_1996_gulfport_School_of_ta.mp4
/kb/kt/Grand_Master_TRAN_TIEN_-_Vietnam_Kung_Fu.mp4
/kb/kt/yogis_Of_Tibet_-_Rare_Documentary.mp4
/kb/kt/6_Magic_Moves_-_To_Win_a_STREET_FIGHT.mp4
/kb/kt/kt_000229_037.mp4
/kb/kt/Push_Hands_-_Tui_Shou.mp4
/kb/kt/muhammad_ali funny moments.mp4
/kb/kt/GOATS_DECLASSIFIED__The_True_Story_Behind_The_Men_Who_Stare_.mp4
/kb/kt/master_ken_Seminar_uk_2013.mp4
/kb/kt/funny_monkeys_vs_dogs_cats_compilation_2017.mp4
/kb/kt/kt_000229_033.mp4
/kb/kt/THE_DAY_THE_EARTH_STOOD_STILL_-_1951_KLAATU_S_FINAL_SPEECH.mp4
/kb/kt/kt_000229_013.mp4
/kb/kt/muhammad_ali_beutiful_interview_rip.mp4
/kb/kt/femme_pencak_silat.mp4
/kb/kt/kt_000229_019.mp4
/kb/kt/wudang_vibrating_palm.mp4
/kb/kt/kt_000229_014.mp4
/kb/kt/baguazhang_turning_the_circle_tree.mp4
/kb/kt/S01E23_the_testament_of_arkadia.mp4
/kb/kt/dethouars_willem_de_thouars_uncle_bill_in_Verona_NJ_1-11-18.mp4
/kb/kt/Willem_de_Thouars,_Kun_Tao_Silat,_1996_Gulfport_School_of_Ta-2.mp4
/kb/kt/Aikido_-_Demo_by_founder_-_Moriteru_Uesiba.mp4
/kb/kt/kt_000229_007.mp4
/kb/kt/Shaolin_Monk_Master_Super_Speed.mp4
/kb/kt/Jim Channon Natural Security Future First Earth Battalion.mp4
/kb/kt/cgi_quantum_jump_hayk_sahakyants.mp4
/kb/kt/kt_000229_022.mp4
/kb/jtfdc/vid/jtfdc_20181226_1215_jtf31_teachyourdogsnothere_jkwii.mp4
/kb/jtfdc/vid/jtfdc_20180104_1113_fedexexpress_blackchallenger_meetgreet.mp4
/kb/jtfdc/vid/jtfdc_20181222_0945_jtf31_fiona_plumber_threats_n_stones.mp4
/kb/jtfdc/vid/jtfdc_20170609_1810_burgess_assessmen.mp4
/kb/jtfdc/vid/jtdfinc_2013mmdd_jtf39_trustee_byrd_threats.mp4
/kb/jtfdc/vid/jtfdc_20181210_1641_police2_pierce_pickup_jak3in/jtfdc_20181210_1639_jtf31_darkpickup_backupout.mp4
/kb/jtfdc/vid/jtfdc_20181210_1641_police2_pierce_pickup_jak3in/jtfdc_20181210_1641_police2_pierce_pickup_jak3in.mp4
/kb/jtfdc/vid/jtfdc_20181210_1641_police2_pierce_pickup_jak3in/jtfdc_20181210_1551_jtf31_tresspas.mp4
/kb/jtfdc/vid/jtfdc_20181210_1641_police2_pierce_pickup_jak3in/jtfdc_20181210_1634_jtf31_plannin.mp4
/kb/jtfdc/vid/jtfdc_20181210_1641_police2_pierce_pickup_jak3in/jtfdc_20181210_1637_jtf31_meeting_hahah.mp4
/kb/jtfdc/vid/jtfdc_20181210_1641_police2_pierce_pickup_jak3in/jtfdc_20181210_1540_jtf31_jkwii_threat.mp4
/kb/jtfdc/vid/jtfdc_20181210_1641_police2_pierce_pickup_jak3in/jtfdc_20181210_1638_jtf26_upmail.mp4
/kb/jtfdc/vid/jtfdc_20181210_1641_police2_pierce_pickup_jak3in/jtfdc_20181210_1542_wofffren.mp4
/kb/jtfdc/vid/jtfdc_20181224_2307_jkwii_whyuhere_your_scaringus.mp4
/kb/jtfdc/vid/jtfdc_20181120_1519_jtf30_doogy_jkwii_romppatro.mp4
/kb/jtfdc/vid/jtfdc_20181225_1352_jkwii_kids_jtf31_andy_dog.mp4
/kb/jtfdc/vid/jtfdc_20180411_1436_segrist_dog_fedex_stalk.mp4
/kb/jtfdc/vid/jtfdc_20181225_1951_jsk2in_maverics_santaride.mp4
/kb/jtfdc/vid/jtfdc_20181225_1936_jtf31_thanks4sign_meryxmas_woofs.mp4
/kb/jtfdc/vid/jtfdc_20181225_2250_200yr_stillenact_merryxmas.mp4
/kb/jtfdc/vid/jtfdc_20181224_2349_jkwii_jtf31in_fiona_unleashe_street_charge.mp4
/kb/jtfdc/vid/jtfdc_20181223_1821_jtf30_woofs_allnightling.mp4
/kb/jtfdc/vid/jtfdc_20181121_1123_jtf31_fiona_hadly_jkwii_romppatrol.mp4
/kb/jtfdc/vid/jtfdc_20171216_1520_skkids_jtf31rake_jtf27fedex.mp4
/kb/jtfdc/vid/jtfdc_20181210_1530_fiiretruck_xmaslight/jtfdc_20181210_1533_jtf31in_newblu.mp4
/kb/jtfdc/vid/jtfdc_20181210_1530_fiiretruck_xmaslight/jtfdc_20181210_1525_jtf30in.mp4
/kb/jtfdc/vid/jtfdc_20181210_1530_fiiretruck_xmaslight/jtfdc_20181210_1530_ffiretruck_xmaslight.mp4
/kb/jtfdc/vid/jtfdc_20181210_1530_fiiretruck_xmaslight/jtfdc_20181210_1533_fireatruck_suvdonw.mp4
/kb/jtfdc/vid/jtfdc_20181226_1200_jtf31_2xfiona_streetchargn_dogwalkeers.mp4
/kb/jtfdc/vid/jtfdc_20180308_2034_fedexs_flatbed_courtstalking.mp4
/kb/jtfdc/vid/jtfdc_20181226_1236_byrds_up_quiet .mp4
/kb/jtfdc/vid/jtfdc_20181222_1357_jtf31_trespass_jkwii_liveyouronwlives.mp4
/kb/jtfdc/vid/jtfdc_20181226_1205_jtf31_oureasment_dogtraing.mp4
/kb/jtfdc/vid/jtfdc_20160702_1641_jtf31_josh_4asshole_gobackinside.mp4
/kb/jtfdc/vid/jtfdc_20181225_1345_kids_jtf31_freeroam_dogs.mp4
/kb/jtfdc/vid/jtfdc_20181210_1540_jtf31_jkwii_threats_n_stones.mp4
/kb/jtfdc/vid/jtfdc_20181226_1235_bigtruck_byrds_damage_assessmen.mp4
/kb/kb_ko_jtf/sd_20150720/mp4_20150716/04051_20150716_0643.mp4
/kb/kb_ko_jtf/sd_20150720/mp4_20150716/04044_20150716_0634.mp4
/kb/kb_ko_jtf/sd_20150720/mp4_20150716/04057_20150716_0701.mp4
/kb/kb_ko_jtf/sd_20150720/mp4_20150716/04059_20150716_0709.mp4
/kb/kb_ko_jtf/sd_20150720/mp4_20150716/04045_20150716_0635.mp4
/kb/kb_ko_jtf/sd_20150720/mp4_20150716/04064_20150716_0813.mp4
/kb/kb_ko_jtf/sd_20150720/mp4_20150716/04052_20150716_0644.mp4
/kb/kb_ko_jtf/sd_20150720/mp4_20150716/04046_20150716_0640_jackie_yelling_at_josh.mp4
/kb/kb_ko_jtf/sd_20150720/mp4_20150716/04053_20150716_0644.mp4
/kb/kb_ko_jtf/sd_20150720/mp4_20150716/04043_20150716_0616.mp4
/kb/kb_ko_jtf/sd_20150720/mp4_20150716/04066_20150716_0816.mp4
/kb/kb_ko_jtf/sd_20150720/mp4_20150716/04056_20150716_0646_josh_jackie_yelling.mp4
/kb/kb_ko_jtf/sd_20150720/mp4_20150716/04048_20150716_0641.mp4
/kb/kb_ko_jtf/sd_20150720/mp4_20150716/04063_20150716_0812.mp4
/kb/kb_ko_jtf/sd_20150720/mp4_20150716/04054_20150716_0644.mp4
/kb/kb_ko_jtf/sd_20150720/mp4_20150716/04055_20150716_0644.mp4
/kb/kb_ko_jtf/sd_20150720/mp4_20150716/04049_20150716_0642.mp4
/kb/kb_ko_jtf/sd_20150720/mp4_20150716/04050_20150716_0642.mp4
/kb/kb_ko_jtf/sd_20150720/mp4_20150716/04062_20150716_0738.mp4
/kb/kb_ko_jtf/sd_20150720/mp4_20150716/04065_20150716_0815.mp4
/1.mp4
/index7.mp4
/4.mp4
/2.mp4
/index6.mp4
/index2.mp4
/index.mp4
/koh5.mp4
/index1.mp4
/iperms/doghead_video.mp4
/iperms/Huckleberry_Hound_17_Barbeque_Hound.mp4
/iperms/index2.mp4
/iperms/index1.mp4
/iperms/index3.mp4
/ko_jtf/jtf30/mov/Clip14.mp4
/ko_jtf/wg/mp4_20150716/mp4_email_sent2/04055_20150716_0644.mp4
/ko_jtf/wg/mp4_20150716/04051_20150716_0643.mp4
/ko_jtf/wg/mp4_20150716/04046_20150716_0640_Jackie_yelling_at_Josh.mp4
/ko_jtf/wg/mp4_20150716/04044_20150716_0634.mp4
/ko_jtf/wg/mp4_20150716/mp4_email_sent1/04052_20150716_0644.mp4
/ko_jtf/wg/mp4_20150716/mp4_email_sent1/04054_20150716_0644.mp4
/ko_jtf/wg/mp4_20150716/mp4_email_sent1/04050_20150716_0642.mp4
/ko_jtf/wg/mp4_20150716/04053_20150716_0644.mp4
/ko_jtf/wg/mp4_20150716/04048_20150716_0641.mp4
/ko_jtf/wg/mp4_20150716/mp4_email_sent1 2/04052_20150716_0644.mp4
/ko_jtf/wg/mp4_20150716/mp4_email_sent1 2/04054_20150716_0644.mp4
/ko_jtf/wg/mp4_20150716/mp4_email_sent1 2/04050_20150716_0642.mp4
/ko_jtf/wg/mp4_20150716/04049_20150716_0642.mp4
/ko_jtf/wg/mp4_20150716/04056_20150716_0646_Josh_Jackie_yelling.mp4
/ko_jtf/wg/videos_to_lighten_the_mood/Huckleberry_Hound_17_Barbeque_Hound.mp4
/ko_jtf/wg/videos_to_lighten_the_mood/executive_summary_doghead_video 3-23-16738 PM1.mp4
/ko_jtf/wg/pictures_for_court_20160602/court_pics_videos_20160602/sd_20150806/mt4_20150806/3637_car_drivein_lights_off_20150807.mp4
/ko_jtf/wg/pictures_for_court_20160602/court_pics_videos_20160602/sd_20150806/mt4_20150806/3638_josh_walkin_house_20150807.mp4
/ko_jtf/wg/pictures_for_court_20160602/court_pics_videos_20160602/sd_20150928/mp4_20150928/0475_20150928_0747.mp4
/ko_jtf/wg/pictures_for_court_20160602/court_pics_videos_20160602/sd_20150928/mp4_20150928/0471_20150928_0737.mp4
/ko_jtf/wg/pictures_for_court_20160602/court_pics_videos_20160602/sd_20150928/mp4_20150928/0472_20150928_0737.mp4
/ko_jtf/wg/pictures_for_court_20160602/court_pics_videos_20160602/sd_20150720/mp4_20150716/04051_20150716_0643.mp4
/ko_jtf/wg/pictures_for_court_20160602/court_pics_videos_20160602/sd_20150720/mp4_20150716/04046_20150716_0640_Jackie_yelling_at_Josh.mp4
/ko_jtf/wg/pictures_for_court_20160602/court_pics_videos_20160602/sd_20150720/mp4_20150716/04044_20150716_0634.mp4
/ko_jtf/wg/pictures_for_court_20160602/court_pics_videos_20160602/sd_20150720/mp4_20150716/04057_20150716_0701.mp4
/ko_jtf/wg/pictures_for_court_20160602/court_pics_videos_20160602/sd_20150720/mp4_20150716/04059_20150716_0709.mp4
/ko_jtf/wg/pictures_for_court_20160602/court_pics_videos_20160602/sd_20150720/mp4_20150716/04045_20150716_0635.mp4
/ko_jtf/wg/pictures_for_court_20160602/court_pics_videos_20160602/sd_20150720/mp4_20150716/04064_20150716_0813.mp4
/ko_jtf/wg/pictures_for_court_20160602/court_pics_videos_20160602/sd_20150720/mp4_20150716/04052_20150716_0644.mp4
/ko_jtf/wg/pictures_for_court_20160602/court_pics_videos_20160602/sd_20150720/mp4_20150716/04053_20150716_0644.mp4
/ko_jtf/wg/pictures_for_court_20160602/court_pics_videos_20160602/sd_20150720/mp4_20150716/04043_20150716_0616.mp4
/ko_jtf/wg/pictures_for_court_20160602/court_pics_videos_20160602/sd_20150720/mp4_20150716/04066_20150716_0816.mp4
/ko_jtf/wg/pictures_for_court_20160602/court_pics_videos_20160602/sd_20150720/mp4_20150716/04048_20150716_0641.mp4
/ko_jtf/wg/pictures_for_court_20160602/court_pics_videos_20160602/sd_20150720/mp4_20150716/04063_20150716_0812.mp4
/ko_jtf/wg/pictures_for_court_20160602/court_pics_videos_20160602/sd_20150720/mp4_20150716/04054_20150716_0644.mp4
/ko_jtf/wg/pictures_for_court_20160602/court_pics_videos_20160602/sd_20150720/mp4_20150716/04055_20150716_0644.mp4
/ko_jtf/wg/pictures_for_court_20160602/court_pics_videos_20160602/sd_20150720/mp4_20150716/04049_20150716_0642.mp4
/ko_jtf/wg/pictures_for_court_20160602/court_pics_videos_20160602/sd_20150720/mp4_20150716/04050_20150716_0642.mp4
/ko_jtf/wg/pictures_for_court_20160602/court_pics_videos_20160602/sd_20150720/mp4_20150716/04062_20150716_0738.mp4
/ko_jtf/wg/pictures_for_court_20160602/court_pics_videos_20160602/sd_20150720/mp4_20150716/04056_20150716_0646_Josh_Jackie_yelling.mp4
/ko_jtf/wg/pictures_for_court_20160602/court_pics_videos_20160602/sd_20150720/mp4_20150716/04065_20150716_0815.mp4
/ko_jtf/wg/pictures_for_court_20160602/court_pics_videos_20160602/sd_20150919pm/mp4_20150919pm/00027_20150919_2205_josh_walking.mp4
/ko_jtf/wg/pictures_for_court_20160602/court_pics_videos_20160602/sd_20150919pm/mp4_20150919pm/00026_20150919_2102.mp4
/ko_jtf/wg/pictures_for_court_20160602/court_pics_videos_20160602/sd_20150919pm/mp4_20150919pm/00025_20150919_1947.mp4
/ko_jtf/wg/pictures_for_court_20160602/court_pics_videos_20160602/sd_20150919pm/mp4_20150919pm/00028_20150919_2230.mp4
/ko_jtf/wg/pictures_for_court_20160602/court_pics_videos_20160602/sd_20150919pm/mp4_20150919pm/00023_20150919_1910.mp4
/ko_jtf/wg/pictures_for_court_20160602/court_pics_videos_20160602/sd_20150919am/mp4_20150919am/00045_20150919_1601.mp4
/ko_jtf/wg/pictures_for_court_20160602/court_pics_videos_20160602/sd_20150919am/mp4_20150919am/00041_20150919_1311.mp4
/ko_jtf/wg/pictures_for_court_20160602/court_pics_videos_20160602/sd_20150919am/mp4_20150919am/00043_20150919_1530.mp4
/ko_jtf/wg/pictures_for_court_20160602/court_pics_videos_20160602/sd_20150919am/mp4_20150919am/00037_20150919_1235.mp4
/ko_jtf/wg/pictures_for_court_20160602/court_pics_videos_20160602/sd_20150919am/mp4_20150919am/00036_20150919_1235.mp4
/ko_jtf/wg/pictures_for_court_20160602/court_pics_videos_20160602/sd_20150919am/mp4_20150919am/00042_20150919_1520.mp4
/ko_jtf/wg/pictures_for_court_20160602/videos_to_lighten_the_mood/Huckleberry_Hound_17_Barbeque_Hound.mp4
/ko_jtf/wg/pictures_for_court_20160602/videos_to_lighten_the_mood/executive_summary_doghead_video 3-23-16738 PM1.mp4
/ko_jtf/kb/sd_20150720/mp4_20150716/04051_20150716_0643.mp4
/ko_jtf/kb/sd_20150720/mp4_20150716/04046_20150716_0640_Jackie_yelling_at_Josh.mp4
/ko_jtf/kb/sd_20150720/mp4_20150716/04044_20150716_0634.mp4
/ko_jtf/kb/sd_20150720/mp4_20150716/04057_20150716_0701.mp4
/ko_jtf/kb/sd_20150720/mp4_20150716/04059_20150716_0709.mp4
/ko_jtf/kb/sd_20150720/mp4_20150716/04045_20150716_0635.mp4
/ko_jtf/kb/sd_20150720/mp4_20150716/04064_20150716_0813.mp4
/ko_jtf/kb/sd_20150720/mp4_20150716/04052_20150716_0644.mp4
/ko_jtf/kb/sd_20150720/mp4_20150716/04053_20150716_0644.mp4
/ko_jtf/kb/sd_20150720/mp4_20150716/04043_20150716_0616.mp4
/ko_jtf/kb/sd_20150720/mp4_20150716/04066_20150716_0816.mp4
/ko_jtf/kb/sd_20150720/mp4_20150716/04048_20150716_0641.mp4
/ko_jtf/kb/sd_20150720/mp4_20150716/04063_20150716_0812.mp4
/ko_jtf/kb/sd_20150720/mp4_20150716/04054_20150716_0644.mp4
/ko_jtf/kb/sd_20150720/mp4_20150716/04055_20150716_0644.mp4
/ko_jtf/kb/sd_20150720/mp4_20150716/04049_20150716_0642.mp4
/ko_jtf/kb/sd_20150720/mp4_20150716/04050_20150716_0642.mp4
/ko_jtf/kb/sd_20150720/mp4_20150716/04062_20150716_0738.mp4
/ko_jtf/kb/sd_20150720/mp4_20150716/04056_20150716_0646_Josh_Jackie_yelling.mp4
/ko_jtf/kb/sd_20150720/mp4_20150716/04065_20150716_0815.mp4
/ko_jtf/kb/v/jtfinc_9558_byrd_trustee_threat_201505.mp4
/ko_jtf/kb/v/9557_fiona_runs_201506.mp4
/ko_jtf/kb/v/index5.mp4
/ko_jtf/kb/v/index4.mp4
/ko_jtf/kb/v/ka1.mp4
/ko_jtf/kb/v/doghead_video.mp4
/ko_jtf/kb/v/Huckleberry_Hound_17_Barbeque_Hound.mp4
/ko_jtf/kb/v/9559_byrd_trustee_threat_201505.mp4
/ko_jtf/kb/v/jtdfinc_byrd2013.mp4
/ko_jtf/kb/v/index6.mp4
/ko_jtf/kb/v/index2.mp4
/ko_jtf/kb/v/jtf31_fiona_runs_201506.mp4
/ko_jtf/kb/v/9558_byrd_trustee_threat_201505.mp4
/ko_jtf/kb/v/index.mp4
/ko_jtf/kb/v/jtfinc_9559_byrd_trustee_threat_201505.mp4
/ko_jtf/kb/v/index1.mp4
/ko_jtf/kb/v/ko_jtf.mp4
`;

kolists['fb'] = `
pages/1.jpg
pages/2.jpg
pages/3.jpg
pages/4.jpg
pages/5.jpg
pages/6.jpg
pages/7.jpg
pages/8.jpg
pages/9.jpg
/imgs/gif/alien_tek/a11_flipbook.gif
/imgs/gif/alien_tek/afda.gif
/imgs/gif/alien_tek/applewait.gif
/imgs/gif/alien_tek/asdfadfad.gif
/imgs/gif/alien_tek/cityspiral.gif
/imgs/gif/alien_tek/cobe4.gif
/imgs/gif/alien_tek/donujt.gif
/imgs/gif/alien_tek/drip1.gif
/imgs/gif/alien_tek/floaters.gif
/imgs/gif/alien_tek/icepalace.gif
/imgs/gif/alien_tek/lit2.gif
/imgs/gif/alien_tek/lite1.gif
/imgs/gif/alien_tek/litecrystle.gif
/imgs/gif/alien_tek/med1.gif
/imgs/gif/alien_tek/med19.gif
/imgs/gif/alien_tek/med3.gif
/imgs/gif/alien_tek/med5.gif
/imgs/gif/alien_tek/med6.gif
/imgs/gif/alien_tek/medpump.gif
/imgs/gif/alien_tek/medskin.gif
/imgs/gif/alien_tek/mek1.gif
/imgs/gif/alien_tek/mek12.gif
/imgs/gif/alien_tek/mek17.gif
/imgs/gif/alien_tek/mek2.gif
/imgs/gif/alien_tek/mek3.gif
/imgs/gif/alien_tek/mek5.gif
/imgs/gif/alien_tek/mek7.gif
/imgs/gif/alien_tek/mek8.gif
/imgs/gif/alien_tek/mek9.gif
/imgs/gif/alien_tek/memcore.gif
/imgs/gif/alien_tek/merd2.gif
/imgs/gif/alien_tek/octopus.gif
/imgs/gif/alien_tek/org1.gif
/imgs/gif/alien_tek/photons.gif
/imgs/gif/alien_tek/pip2.gif
/imgs/gif/alien_tek/pulsehelix.gif
/imgs/gif/alien_tek/smoke.gif
/imgs/gif/alien_tek/static4.gif
/imgs/gif/alien_tek/su5_67_h_1340.gif
/imgs/gif/alien_tek/tesla.gif
/imgs/gif/alien_tek/wave.gif
/imgs/gif/byrdpucker/giph_horse_distotiony.gif
/imgs/gif/byrdpucker/giph_horse_smerky.gif
/imgs/gif/byrdpucker/giphy._horse_glittergif.gif
/imgs/gif/byrdpucker/giphy._horse_koballsgif.gif
/imgs/gif/byrdpucker/giphy_bugs_boundry.gif
/imgs/gif/byrdpucker/giphy_bugs_jaildoors.gif
/imgs/gif/byrdpucker/giphy_bugs_pase.gif
/imgs/gif/byrdpucker/giphy_bugs_sstop.gif
/imgs/gif/byrdpucker/giphy_bugs_takaway.gif
/imgs/gif/byrdpucker/giphy_bugs_wakeup.gif
/imgs/gif/byrdpucker/giphy_byrdpucker_dog_n_pony_show.gif
/imgs/gif/byrdpucker/giphy_cruella_1.gif
/imgs/gif/byrdpucker/giphy_cruella_2.gif
/imgs/gif/byrdpucker/giphy_cubemembrain.gif
/imgs/gif/byrdpucker/giphy_cycle.gif
/imgs/gif/byrdpucker/giphy_cycle_circle.gif
/imgs/gif/byrdpucker/giphy_cycle_dog.gif
/imgs/gif/byrdpucker/giphy_cycle_jtf39.gif
/imgs/gif/byrdpucker/giphy_cycle_legs.gif
/imgs/gif/byrdpucker/giphy_cycle_rodent.gif
/imgs/gif/byrdpucker/giphy_dogpaddle.gif
/imgs/gif/byrdpucker/giphy_dogs1.gif
/imgs/gif/byrdpucker/giphy_dogygym.gif
/imgs/gif/byrdpucker/giphy_horse_soccor.gif
/imgs/gif/byrdpucker/giphy_horse_views.gif
/imgs/gif/byrdpucker/giphy_horsefish.gif
/imgs/gif/byrdpucker/giphy_horseg_girl_vintage.gif
/imgs/gif/byrdpucker/giphy_horseguy_pranser.gif
/imgs/gif/byrdpucker/giphy_horserun_pencil.gif
/imgs/gif/byrdpucker/giphy_horserun_vintage.gif
/imgs/gif/byrdpucker/giphy_koponies.gif
/imgs/gif/byrdpucker/giphy_magicdoors2.gif
/imgs/gif/byrdpucker/giphy_magicscary_shadows.gif
/imgs/gif/byrdpucker/giphy_magicspecter2.gif
/imgs/gif/byrdpucker/giphy_mrevil.gif
/imgs/gif/byrdpucker/giphy_mtfail.gif
/imgs/gif/byrdpucker/giphy_pinocio_1.gif
/imgs/gif/byrdpucker/giphy_pinocioa_2.gif
/imgs/gif/byrdpucker/giphy_pinocioa_4.gif
/imgs/gif/byrdpucker/giphy_wicked_curtains_closel_.gif
/imgs/gif/crazy/giph_imnotcrazyy.gif
/imgs/gif/crazy/giphy_containment.gif
/imgs/gif/crazy/giphy_crazy3.gif
/imgs/gif/crazy/giphy_crazy5.gif
/imgs/gif/crazy/giphy_crazy_blond.gif
/imgs/gif/crazy/giphy_crazy_mickey.gif
/imgs/gif/crazy/giphy_crazy_princess.gif
/imgs/gif/crazy/giphy_crazy_simsoncalass.gif
/imgs/gif/crazy/giphy_crazy_smilyface.gif
/imgs/gif/crazy/giphy_crazyguy.gif
/imgs/gif/crazy/giphy_crazylady.gif
/imgs/gif/crazy/giphy_crazyorb.gif
/imgs/gif/crazy/giphy_crazytoon.gif
/imgs/gif/crazy/giphy_derbyguy.gif
/imgs/gif/crazy/giphy_dracual_onoff.gif
/imgs/gif/crazy/giphy_duck_crazy.gif
/imgs/gif/crazy/giphy_duckcrash.gif
/imgs/gif/crazy/giphy_einstein.gif
/imgs/gif/crazy/giphy_einstein_wabblehead.gif
/imgs/gif/crazy/giphy_expression_dancer.gif
/imgs/gif/crazy/giphy_fingerwave.gif
/imgs/gif/crazy/giphy_ladyscarey.gif
/imgs/gif/crazy/giphy_magicorb_laddle.gif
/imgs/gif/crazy/giphy_nerdy.gif
/imgs/gif/crazy/giphy_rumshower.gif
/imgs/gif/crazy/giphy_science_frank.gif
/imgs/gif/crazy/giphy_screamer.gif
/imgs/gif/crazy/giphy_showergirl.gif
/imgs/gif/crazy/giphy_smile.gif
/imgs/gif/crazy/giphy_smileyshark.gif
/imgs/gif/crazy/giphy_time_waites.gif
/imgs/gif/crazy/giphy_timeguy_late.gif
/imgs/gif/crazy/giphy_zoom_crazyguy.gif
/imgs/gif/cute/bee.gif
/imgs/gif/cute/boop.gif
/imgs/gif/cute/CA 4th 027 copy.gif
/imgs/gif/cute/CA 4th 027.gif
/imgs/gif/cute/catas.gif
/imgs/gif/cute/cats.gif
/imgs/gif/cute/cd81506101b9407dec74b5635a70fb16.gif
/imgs/gif/cute/crayons.gif
/imgs/gif/cute/disb.gif
/imgs/gif/cute/dogconfusion.gif
/imgs/gif/cute/fireworks.gif
/imgs/gif/cute/fireworks13.gif
/imgs/gif/cute/fireworks3.gif
/imgs/gif/cute/fireworks4.gif
/imgs/gif/cute/fish-swimming.gif
/imgs/gif/cute/fish.gif
/imgs/gif/cute/gipdicehy.gif
/imgs/gif/cute/gipdisneyhy.gif
/imgs/gif/cute/gipfadfahy.gif
/imgs/gif/cute/giphy.gif
/imgs/gif/cute/kid.gif
/imgs/gif/cute/party.gif
/imgs/gif/cute/photonorb.gif
/imgs/gif/cute/sfg.gif
/imgs/gif/cute/spinning-arrow-right.gif
/imgs/gif/firebubbles.gif
/imgs/gif/firebubblesb.gif
/imgs/gif/firebubblesd.gif
/imgs/gif/firebubblesp.gif
/imgs/gif/firebubblesq.gif
/imgs/gif/focus/giph_focus_kidy.gif
/imgs/gif/focus/giph_focus_simpson.gif
/imgs/gif/focus/giph_watchery.gif
/imgs/gif/focus/giphy._eyeball_glossygif.gif
/imgs/gif/focus/giphy_eye_1.gif
/imgs/gif/focus/giphy_eye_owl.gif
/imgs/gif/focus/giphy_eyes2mouth.gif
/imgs/gif/focus/giphy_eyes_linedraw.gif
/imgs/gif/focus/giphy_facemasks.gif
/imgs/gif/focus/giphy_focus_3dglasses.gif
/imgs/gif/focus/giphy_focus_dali.gif
/imgs/gif/focus/giphy_focus_goggles.gif
/imgs/gif/focus/giphy_focus_iris.gif
/imgs/gif/focus/giphy_focus_koglasses.gif
/imgs/gif/focus/giphy_focus_sleuth.gif
/imgs/gif/gif_bugs/giph_bugs_bellydancery.gif
/imgs/gif/gif_bugs/giph_bugs_monster_outy.gif
/imgs/gif/gif_bugs/giph_bugs_peppy_heartsy.gif
/imgs/gif/gif_bugs/giph_kiti_earthrise.gif
/imgs/gif/gif_bugs/giph_kiti_flyingsaucersy.gif
/imgs/gif/gif_bugs/giph_kiti_unicorn.gif
/imgs/gif/gif_bugs/giph_the_end1y.gif
/imgs/gif/gif_bugs/giphy.=_bugs_beepbeep_cliff.gif
/imgs/gif/gif_bugs/giphy._bugs_apple_androidgif.gif
/imgs/gif/gif_bugs/giphy4.gif
/imgs/gif/gif_bugs/giphy_alien_tek0721.gif
/imgs/gif/gif_bugs/giphy_anthead.gif
/imgs/gif/gif_bugs/giphy_beepbeep_ropebride.gif
/imgs/gif/gif_bugs/giphy_box_conveyor.gif
/imgs/gif/gif_bugs/giphy_box_spinners.gif
/imgs/gif/gif_bugs/giphy_boxhop.gif
/imgs/gif/gif_bugs/giphy_boxopen.gif
/imgs/gif/gif_bugs/giphy_boxs_amazon.gif
/imgs/gif/gif_bugs/giphy_boxtoon.gif
/imgs/gif/gif_bugs/giphy_bugs_alian_upskirt.gif
/imgs/gif/gif_bugs/giphy_bugs_alien.gif
/imgs/gif/gif_bugs/giphy_bugs_alien_bodyscan.gif
/imgs/gif/gif_bugs/giphy_bugs_alien_digits.gif
/imgs/gif/gif_bugs/giphy_bugs_alien_dog.gif
/imgs/gif/gif_bugs/giphy_bugs_alien_flagplan.gif
/imgs/gif/gif_bugs/giphy_bugs_alien_judge.gif
/imgs/gif/gif_bugs/giphy_bugs_attention.gif
/imgs/gif/gif_bugs/giphy_bugs_beepbeep_bizcard.gif
/imgs/gif/gif_bugs/giphy_bugs_beepbeep_byrdman.gif
/imgs/gif/gif_bugs/giphy_bugs_beepbeep_dont_have_the_heart.gif
/imgs/gif/gif_bugs/giphy_bugs_beepbeep_fallin.gif
/imgs/gif/gif_bugs/giphy_bugs_birdcat.gif
/imgs/gif/gif_bugs/giphy_bugs_bow.gif
/imgs/gif/gif_bugs/giphy_bugs_brunhilda.gif
/imgs/gif/gif_bugs/giphy_bugs_bugattack.gif
/imgs/gif/gif_bugs/giphy_bugs_bull.gif
/imgs/gif/gif_bugs/giphy_bugs_deal_with_it.gif
/imgs/gif/gif_bugs/giphy_bugs_ducklightergif.gif
/imgs/gif/gif_bugs/giphy_bugs_evil_castle.gif
/imgs/gif/gif_bugs/giphy_bugs_excuse_me.gif
/imgs/gif/gif_bugs/giphy_bugs_eyeroll.gif
/imgs/gif/gif_bugs/giphy_bugs_fire.gif
/imgs/gif/gif_bugs/giphy_bugs_heart_skipping.gif
/imgs/gif/gif_bugs/giphy_bugs_heaven_fall.gif
/imgs/gif/gif_bugs/giphy_bugs_hencook.gif
/imgs/gif/gif_bugs/giphy_bugs_heyyou.gif
/imgs/gif/gif_bugs/giphy_bugs_inspiration.gif
/imgs/gif/gif_bugs/giphy_bugs_jailbuny.gif
/imgs/gif/gif_bugs/giphy_bugs_jailsam.gif
/imgs/gif/gif_bugs/giphy_bugs_jitters_sip.gif
/imgs/gif/gif_bugs/giphy_bugs_kiti_jitters.gif
/imgs/gif/gif_bugs/giphy_bugs_mess.gif
/imgs/gif/gif_bugs/giphy_bugs_monster_conon.gif
/imgs/gif/gif_bugs/giphy_bugs_monster_contained.gif
/imgs/gif/gif_bugs/giphy_bugs_monster_doorbar.gif
/imgs/gif/gif_bugs/giphy_bugs_monster_flee.gif
/imgs/gif/gif_bugs/giphy_bugs_monster_grab.gif
/imgs/gif/gif_bugs/giphy_bugs_monster_scare.gif
/imgs/gif/gif_bugs/giphy_bugs_monster_stalk.gif
/imgs/gif/gif_bugs/giphy_bugs_monster_stalk2.gif
/imgs/gif/gif_bugs/giphy_bugs_now_we_dance.gif
/imgs/gif/gif_bugs/giphy_bugs_one_more_time.gif
/imgs/gif/gif_bugs/giphy_bugs_pagecut.gif
/imgs/gif/gif_bugs/giphy_bugs_peppy_kiss.gif
/imgs/gif/gif_bugs/giphy_bugs_piano.gif
/imgs/gif/gif_bugs/giphy_bugs_play_this_game.gif
/imgs/gif/gif_bugs/giphy_bugs_pot.gif
/imgs/gif/gif_bugs/giphy_bugs_rockette.gif
/imgs/gif/gif_bugs/giphy_bugs_rocky.gif
/imgs/gif/gif_bugs/giphy_bugs_season.gif
/imgs/gif/gif_bugs/giphy_bugs_shave.gif
/imgs/gif/gif_bugs/giphy_bugs_slots.gif
/imgs/gif/gif_bugs/giphy_bugs_start.gif
/imgs/gif/gif_bugs/giphy_bugs_target.gif
/imgs/gif/gif_bugs/giphy_bugs_thats_all_folks.gif
/imgs/gif/gif_bugs/giphy_bugs_tooth.gif
/imgs/gif/gif_bugs/giphy_bugs_tv_western.gif
/imgs/gif/gif_bugs/giphy_bugs_tweetybird.gif
/imgs/gif/gif_bugs/giphy_bugs_wanted.gif
/imgs/gif/gif_bugs/giphy_bugs_what_a_maroon.gif
/imgs/gif/gif_bugs/giphy_bugs_whitehorse.gif
/imgs/gif/gif_bugs/giphy_bugs_yipe.gif
/imgs/gif/gif_bugs/giphy_chain_n_torus.gif
/imgs/gif/gif_bugs/giphy_chaos.gif
/imgs/gif/gif_bugs/giphy_checkerboard.gif
/imgs/gif/gif_bugs/giphy_choc_girl_tomuch.gif
/imgs/gif/gif_bugs/giphy_choc_kid.gif
/imgs/gif/gif_bugs/giphy_choc_kid2.gif
/imgs/gif/gif_bugs/giphy_choc_lucy.gif
/imgs/gif/gif_bugs/giphy_choc_pour1.gif
/imgs/gif/gif_bugs/giphy_choc_princess.gif
/imgs/gif/gif_bugs/giphy_choc_selfmed.gif
/imgs/gif/gif_bugs/giphy_clapguy.gif
/imgs/gif/gif_bugs/giphy_corners.gif
/imgs/gif/gif_bugs/giphy_corners2.gif
/imgs/gif/gif_bugs/giphy_crown.gif
/imgs/gif/gif_bugs/giphy_diamond_tubing.gif
/imgs/gif/gif_bugs/giphy_digit_copypaste.gif
/imgs/gif/gif_bugs/giphy_dog_fan.gif
/imgs/gif/gif_bugs/giphy_dogewaves.gif
/imgs/gif/gif_bugs/giphy_escalator.gif
/imgs/gif/gif_bugs/giphy_eyebug_hover.gif
/imgs/gif/gif_bugs/giphy_eyefly.gif
/imgs/gif/gif_bugs/giphy_fantube.gif
/imgs/gif/gif_bugs/giphy_gillligan.gif
/imgs/gif/gif_bugs/giphy_go__barbells.gif
/imgs/gif/gif_bugs/giphy_godtwiddle.gif
/imgs/gif/gif_bugs/giphy_kali_0721_a.gif
/imgs/gif/gif_bugs/giphy_kali_boxs.gif
/imgs/gif/gif_bugs/giphy_kali_cirles.gif
/imgs/gif/gif_bugs/giphy_kiti_boxclose.gif
/imgs/gif/gif_bugs/giphy_kiti_boxlid.gif
/imgs/gif/gif_bugs/giphy_kiti_boxthru.gif
/imgs/gif/gif_bugs/giphy_kiti_inabox.gif
/imgs/gif/gif_bugs/giphy_kiti_lightning.gif
/imgs/gif/gif_bugs/giphy_kitisews.gif
/imgs/gif/gif_bugs/giphy_kity_wings.gif
/imgs/gif/gif_bugs/giphy_konabus_loosewheels.gif
/imgs/gif/gif_bugs/giphy_kt_baseball.gif
/imgs/gif/gif_bugs/giphy_lineart.gif
/imgs/gif/gif_bugs/giphy_lineart2.gif
/imgs/gif/gif_bugs/giphy_mouthballs.gif
/imgs/gif/gif_bugs/giphy_mouthtube.gif
/imgs/gif/gif_bugs/giphy_orb_stamper.gif
/imgs/gif/gif_bugs/giphy_orb_stars_.gif
/imgs/gif/gif_bugs/giphy_orb_wave.gif
/imgs/gif/gif_bugs/giphy_orbs_0721b.gif
/imgs/gif/gif_bugs/giphy_orbs_bubbles.gif
/imgs/gif/gif_bugs/giphy_orbs_pods.gif
/imgs/gif/gif_bugs/giphy_org0721a.gif
/imgs/gif/gif_bugs/giphy_ringman.gif
/imgs/gif/gif_bugs/giphy_skateboard_torus.gif
/imgs/gif/gif_bugs/giphy_sketch_laps.gif
/imgs/gif/gif_bugs/giphy_spinner_white.gif
/imgs/gif/gif_bugs/giphy_star_bounce.gif
/imgs/gif/gif_bugs/giphy_tanklite.gif
/imgs/gif/gif_bugs/giphy_thats_all_folks_porky.gif
/imgs/gif/gif_bugs/giphy_the_end2.gif
/imgs/gif/gif_bugs/giphy_the_end_shade.gif
/imgs/gif/gif_bugs/giphy_thinkguy.gif
/imgs/gif/gif_bugs/giphy_triangles.gif
/imgs/gif/gif_bugs/giphy_undulator.gif
/imgs/gif/gif_bugs/giphy_wrap_it_up.gif
/imgs/gif/gif_spinners/giph_headsy.gif
/imgs/gif/gif_spinners/giphy_0rbs21.gif
/imgs/gif/gif_spinners/giphy_ali_ropeadope.gif
/imgs/gif/gif_spinners/giphy_ball_in_box.gif
/imgs/gif/gif_spinners/giphy_barcoede.gif
/imgs/gif/gif_spinners/giphy_blow_the_house_down.gif
/imgs/gif/gif_spinners/giphy_bookdeamon.gif
/imgs/gif/gif_spinners/giphy_box_dancing.gif
/imgs/gif/gif_spinners/giphy_box_of_shame.gif
/imgs/gif/gif_spinners/giphy_box_of_shane2.gif
/imgs/gif/gif_spinners/giphy_boxes_in_boxes.gif
/imgs/gif/gif_spinners/giphy_boxes_up.gif
/imgs/gif/gif_spinners/giphy_bugout.gif
/imgs/gif/gif_spinners/giphy_bugs_alien_hothead.gif
/imgs/gif/gif_spinners/giphy_bugs_beepbeep_cliffdoor.gif
/imgs/gif/gif_spinners/giphy_bugs_beepbeep_crusin.gif
/imgs/gif/gif_spinners/giphy_bugs_beepbeep_crusin_sketch.gif
/imgs/gif/gif_spinners/giphy_bugs_piano_finger.gif
/imgs/gif/gif_spinners/giphy_bugwalker.gif
/imgs/gif/gif_spinners/giphy_cinderella_shoe_not4u.gif
/imgs/gif/gif_spinners/giphy_control_panel.gif
/imgs/gif/gif_spinners/giphy_crosses.gif
/imgs/gif/gif_spinners/giphy_cube_undulate.gif
/imgs/gif/gif_spinners/giphy_cubefalls.gif
/imgs/gif/gif_spinners/giphy_cubeline.gif
/imgs/gif/gif_spinners/giphy_evenplaning.gif
/imgs/gif/gif_spinners/giphy_eyet_ears.gif
/imgs/gif/gif_spinners/giphy_finders_eye_heart.gif
/imgs/gif/gif_spinners/giphy_fixit.gif
/imgs/gif/gif_spinners/giphy_fractals.gif
/imgs/gif/gif_spinners/giphy_fuzzy_orb.gif
/imgs/gif/gif_spinners/giphy_fuzzyv.gif
/imgs/gif/gif_spinners/giphy_girl_pokadots.gif
/imgs/gif/gif_spinners/giphy_go_gridwaves.gif
/imgs/gif/gif_spinners/giphy_go_lites_around.gif
/imgs/gif/gif_spinners/giphy_go_square_crosses.gif
/imgs/gif/gif_spinners/giphy_go_squares.gif
/imgs/gif/gif_spinners/giphy_go_squares_3d.gif
/imgs/gif/gif_spinners/giphy_go_wobbles.gif
/imgs/gif/gif_spinners/giphy_gorays.gif
/imgs/gif/gif_spinners/giphy_gradient.gif
/imgs/gif/gif_spinners/giphy_gush.gif
/imgs/gif/gif_spinners/giphy_gushpipes.gif
/imgs/gif/gif_spinners/giphy_guy_fingertalk.gif
/imgs/gif/gif_spinners/giphy_guy_salute.gif
/imgs/gif/gif_spinners/giphy_guy_stand_proud.gif
/imgs/gif/gif_spinners/giphy_guy_thumbs_down.gif
/imgs/gif/gif_spinners/giphy_hallway_wiggle.gif
/imgs/gif/gif_spinners/giphy_hand2sand.gif
/imgs/gif/gif_spinners/giphy_head_androidspin.gif
/imgs/gif/gif_spinners/giphy_head_dog.gif
/imgs/gif/gif_spinners/giphy_head_milkbob.gif
/imgs/gif/gif_spinners/giphy_head_oz.gif
/imgs/gif/gif_spinners/giphy_head_rings.gif
/imgs/gif/gif_spinners/giphy_head_running.gif
/imgs/gif/gif_spinners/giphy_head_spin.gif
/imgs/gif/gif_spinners/giphy_head_thinker.gif
/imgs/gif/gif_spinners/giphy_head_trippy.gif
/imgs/gif/gif_spinners/giphy_head_trippy_suit.gif
/imgs/gif/gif_spinners/giphy_headtoo.gif
/imgs/gif/gif_spinners/giphy_heart.gif
/imgs/gif/gif_spinners/giphy_heart_sunny.gif
/imgs/gif/gif_spinners/giphy_hex_mnaggots.gif
/imgs/gif/gif_spinners/giphy_hockey_snoopy.gif
/imgs/gif/gif_spinners/giphy_js.gif
/imgs/gif/gif_spinners/giphy_jumpher.gif
/imgs/gif/gif_spinners/giphy_kali22.gif
/imgs/gif/gif_spinners/giphy_kali_eyeball.gif
/imgs/gif/gif_spinners/giphy_kids_out_of_boxes.gif
/imgs/gif/gif_spinners/giphy_ko_ali.gif
/imgs/gif/gif_spinners/giphy_konabus_catpillar.gif
/imgs/gif/gif_spinners/giphy_kt_circlemovie.gif
/imgs/gif/gif_spinners/giphy_kt_orb_boxers.gif
/imgs/gif/gif_spinners/giphy_kt_wooky.gif
/imgs/gif/gif_spinners/giphy_laptops.gif
/imgs/gif/gif_spinners/giphy_latern.gif
/imgs/gif/gif_spinners/giphy_layers.gif
/imgs/gif/gif_spinners/giphy_litedisplay.gif
/imgs/gif/gif_spinners/giphy_litehouse_pyramid.gif
/imgs/gif/gif_spinners/giphy_longdress.gif
/imgs/gif/gif_spinners/giphy_man_siluet.gif
/imgs/gif/gif_spinners/giphy_manlaser.gif
/imgs/gif/gif_spinners/giphy_mesh_popcorn.gif
/imgs/gif/gif_spinners/giphy_meshwrap.gif
/imgs/gif/gif_spinners/giphy_network_grid.gif
/imgs/gif/gif_spinners/giphy_network_wiggle.gif
/imgs/gif/gif_spinners/giphy_noise3.gif
/imgs/gif/gif_spinners/giphy_orb_cicle.gif
/imgs/gif/gif_spinners/giphy_orb_drips.gif
/imgs/gif/gif_spinners/giphy_orb_fuzzy.gif
/imgs/gif/gif_spinners/giphy_orb_hary.gif
/imgs/gif/gif_spinners/giphy_orb_in_cube.gif
/imgs/gif/gif_spinners/giphy_orb_jar.gif
/imgs/gif/gif_spinners/giphy_orb_layers.gif
/imgs/gif/gif_spinners/giphy_orb_noise1.gif
/imgs/gif/gif_spinners/giphy_orb_noise2.gif
/imgs/gif/gif_spinners/giphy_orb_noise3.gif
/imgs/gif/gif_spinners/giphy_orb_slow.gif
/imgs/gif/gif_spinners/giphy_orb_spiral.gif
/imgs/gif/gif_spinners/giphy_orb_torus.gif
/imgs/gif/gif_spinners/giphy_orb_tubemesh.gif
/imgs/gif/gif_spinners/giphy_orb_undulate.gif
/imgs/gif/gif_spinners/giphy_orbnois4.gif
/imgs/gif/gif_spinners/giphy_orbtubes.gif
/imgs/gif/gif_spinners/giphy_pagedown.gif
/imgs/gif/gif_spinners/giphy_pastryroad_dunes.gif
/imgs/gif/gif_spinners/giphy_pdf.gif
/imgs/gif/gif_spinners/giphy_pyramid_spirals.gif
/imgs/gif/gif_spinners/giphy_radar.gif
/imgs/gif/gif_spinners/giphy_rectanges.gif
/imgs/gif/gif_spinners/giphy_runningman2.gif
/imgs/gif/gif_spinners/giphy_runningman_atyou.gif
/imgs/gif/gif_spinners/giphy_shades.gif
/imgs/gif/gif_spinners/giphy_spinner2.gif
/imgs/gif/gif_spinners/giphy_spinner3.gif
/imgs/gif/gif_spinners/giphy_spinner8.gif
/imgs/gif/gif_spinners/giphy_spinner9.gif
/imgs/gif/gif_spinners/giphy_spinner_disk.gif
/imgs/gif/gif_spinners/giphy_spinner_orb.gif
/imgs/gif/gif_spinners/giphy_spinner_sumi.gif
/imgs/gif/gif_spinners/giphy_spinners.gif
/imgs/gif/gif_spinners/giphy_spinners_cubes.gif
/imgs/gif/gif_spinners/giphy_spiral.gif
/imgs/gif/gif_spinners/giphy_spiraltwists.gif
/imgs/gif/gif_spinners/giphy_spotlite.gif
/imgs/gif/gif_spinners/giphy_sprial_ripples.gif
/imgs/gif/gif_spinners/giphy_stickynotes.gif
/imgs/gif/gif_spinners/giphy_tetertotter.gif
/imgs/gif/gif_spinners/giphy_toiletpaper.gif
/imgs/gif/gif_spinners/giphy_torusstripes.gif
/imgs/gif/gif_spinners/giphy_tvwatcher.gif
/imgs/gif/gif_spinners/giphy_undulate2.gif
/imgs/gif/gif_spinners/giphy_waveup.gif
/imgs/gif/gif_spinners/giphy_wirebouncer.gif
/imgs/gif/gif_spinners/tumblr_nbuxxtxV3w1tre1zbo1_500.gif
/imgs/gif/gifset_b/apple.gif
/imgs/gif/gifset_b/appleb.gif
/imgs/gif/gifset_b/appleb_1.gif
/imgs/gif/gifset_b/appleb_10.gif
/imgs/gif/gifset_b/appleb_100.gif
/imgs/gif/gifset_b/appleb_2.gif
/imgs/gif/gifset_b/appleb_20.gif
/imgs/gif/gifset_b/appleb_3.gif
/imgs/gif/gifset_b/appleb_30.gif
/imgs/gif/gifset_b/appleb_4.gif
/imgs/gif/gifset_b/appleb_40.gif
/imgs/gif/gifset_b/appleb_5.gif
/imgs/gif/gifset_b/appleb_50.gif
/imgs/gif/gifset_b/appleb_6.gif
/imgs/gif/gifset_b/appleb_7.gif
/imgs/gif/gifset_b/appleb_70.gif
/imgs/gif/gifset_b/appleb_8.gif
/imgs/gif/gifset_b/appleb_80.gif
/imgs/gif/gifset_b/appleb_9.gif
/imgs/gif/gifset_b/appleb_90.gif
/imgs/gif/gifset_b/appled.gif
/imgs/gif/gifset_b/appled_1.gif
/imgs/gif/gifset_b/appled_10.gif
/imgs/gif/gifset_b/appled_100.gif
/imgs/gif/gifset_b/appled_2.gif
/imgs/gif/gifset_b/appled_20.gif
/imgs/gif/gifset_b/appled_3.gif
/imgs/gif/gifset_b/appled_30.gif
/imgs/gif/gifset_b/appled_4.gif
/imgs/gif/gifset_b/appled_40.gif
/imgs/gif/gifset_b/appled_5.gif
/imgs/gif/gifset_b/appled_50.gif
/imgs/gif/gifset_b/appled_6.gif
/imgs/gif/gifset_b/appled_7.gif
/imgs/gif/gifset_b/appled_70.gif
/imgs/gif/gifset_b/appled_8.gif
/imgs/gif/gifset_b/appled_80.gif
/imgs/gif/gifset_b/appled_9.gif
/imgs/gif/gifset_b/appled_90.gif
/imgs/gif/gifset_b/applep.gif
/imgs/gif/gifset_b/applep_1.gif
/imgs/gif/gifset_b/applep_10.gif
/imgs/gif/gifset_b/applep_100.gif
/imgs/gif/gifset_b/applep_2.gif
/imgs/gif/gifset_b/applep_20.gif
/imgs/gif/gifset_b/applep_3.gif
/imgs/gif/gifset_b/applep_30.gif
/imgs/gif/gifset_b/applep_4.gif
/imgs/gif/gifset_b/applep_40.gif
/imgs/gif/gifset_b/applep_5.gif
/imgs/gif/gifset_b/applep_50.gif
/imgs/gif/gifset_b/applep_6.gif
/imgs/gif/gifset_b/applep_7.gif
/imgs/gif/gifset_b/applep_70.gif
/imgs/gif/gifset_b/applep_8.gif
/imgs/gif/gifset_b/applep_80.gif
/imgs/gif/gifset_b/applep_9.gif
/imgs/gif/gifset_b/applep_90.gif
/imgs/gif/gifset_b/appleq.gif
/imgs/gif/gifset_b/appleq_1.gif
/imgs/gif/gifset_b/appleq_10.gif
/imgs/gif/gifset_b/appleq_100.gif
/imgs/gif/gifset_b/appleq_2.gif
/imgs/gif/gifset_b/appleq_20.gif
/imgs/gif/gifset_b/appleq_3.gif
/imgs/gif/gifset_b/appleq_30.gif
/imgs/gif/gifset_b/appleq_4.gif
/imgs/gif/gifset_b/appleq_40.gif
/imgs/gif/gifset_b/appleq_5.gif
/imgs/gif/gifset_b/appleq_50.gif
/imgs/gif/gifset_b/appleq_6.gif
/imgs/gif/gifset_b/appleq_7.gif
/imgs/gif/gifset_b/appleq_70.gif
/imgs/gif/gifset_b/appleq_8.gif
/imgs/gif/gifset_b/appleq_80.gif
/imgs/gif/gifset_b/appleq_9.gif
/imgs/gif/gifset_b/appleq_90.gif
/imgs/gif/gifset_b/awards.gif
/imgs/gif/gifset_b/bh.gif
/imgs/gif/gifset_b/bhb.gif
/imgs/gif/gifset_b/bhb_1.gif
/imgs/gif/gifset_b/bhb_10.gif
/imgs/gif/gifset_b/bhb_100.gif
/imgs/gif/gifset_b/bhb_2.gif
/imgs/gif/gifset_b/bhb_20.gif
/imgs/gif/gifset_b/bhb_3.gif
/imgs/gif/gifset_b/bhb_30.gif
/imgs/gif/gifset_b/bhb_4.gif
/imgs/gif/gifset_b/bhb_40.gif
/imgs/gif/gifset_b/bhb_5.gif
/imgs/gif/gifset_b/bhb_50.gif
/imgs/gif/gifset_b/bhb_6.gif
/imgs/gif/gifset_b/bhb_7.gif
/imgs/gif/gifset_b/bhb_70.gif
/imgs/gif/gifset_b/bhb_8.gif
/imgs/gif/gifset_b/bhb_80.gif
/imgs/gif/gifset_b/bhb_9.gif
/imgs/gif/gifset_b/bhb_90.gif
/imgs/gif/gifset_b/bhd.gif
/imgs/gif/gifset_b/bhd_1.gif
/imgs/gif/gifset_b/bhd_10.gif
/imgs/gif/gifset_b/bhd_100.gif
/imgs/gif/gifset_b/bhd_2.gif
/imgs/gif/gifset_b/bhd_20.gif
/imgs/gif/gifset_b/bhd_3.gif
/imgs/gif/gifset_b/bhd_30.gif
/imgs/gif/gifset_b/bhd_4.gif
/imgs/gif/gifset_b/bhd_40.gif
/imgs/gif/gifset_b/bhd_5.gif
/imgs/gif/gifset_b/bhd_50.gif
/imgs/gif/gifset_b/bhd_6.gif
/imgs/gif/gifset_b/bhd_7.gif
/imgs/gif/gifset_b/bhd_70.gif
/imgs/gif/gifset_b/bhd_8.gif
/imgs/gif/gifset_b/bhd_80.gif
/imgs/gif/gifset_b/bhd_9.gif
/imgs/gif/gifset_b/bhd_90.gif
/imgs/gif/gifset_b/bhp.gif
/imgs/gif/gifset_b/bhp_1.gif
/imgs/gif/gifset_b/bhp_10.gif
/imgs/gif/gifset_b/bhp_100.gif
/imgs/gif/gifset_b/bhp_2.gif
/imgs/gif/gifset_b/bhp_20.gif
/imgs/gif/gifset_b/bhp_3.gif
/imgs/gif/gifset_b/bhp_30.gif
/imgs/gif/gifset_b/bhp_4.gif
/imgs/gif/gifset_b/bhp_40.gif
/imgs/gif/gifset_b/bhp_5.gif
/imgs/gif/gifset_b/bhp_50.gif
/imgs/gif/gifset_b/bhp_6.gif
/imgs/gif/gifset_b/bhp_7.gif
/imgs/gif/gifset_b/bhp_70.gif
/imgs/gif/gifset_b/bhp_8.gif
/imgs/gif/gifset_b/bhp_80.gif
/imgs/gif/gifset_b/bhp_9.gif
/imgs/gif/gifset_b/bhp_90.gif
/imgs/gif/gifset_b/bhq.gif
/imgs/gif/gifset_b/bhq_1.gif
/imgs/gif/gifset_b/bhq_10.gif
/imgs/gif/gifset_b/bhq_100.gif
/imgs/gif/gifset_b/bhq_2.gif
/imgs/gif/gifset_b/bhq_20.gif
/imgs/gif/gifset_b/bhq_3.gif
/imgs/gif/gifset_b/bhq_30.gif
/imgs/gif/gifset_b/bhq_4.gif
/imgs/gif/gifset_b/bhq_40.gif
/imgs/gif/gifset_b/bhq_5.gif
/imgs/gif/gifset_b/bhq_50.gif
/imgs/gif/gifset_b/bhq_6.gif
/imgs/gif/gifset_b/bhq_7.gif
/imgs/gif/gifset_b/bhq_70.gif
/imgs/gif/gifset_b/bhq_8.gif
/imgs/gif/gifset_b/bhq_80.gif
/imgs/gif/gifset_b/bhq_9.gif
/imgs/gif/gifset_b/bhq_90.gif
/imgs/gif/gifset_f/dollars.gif
/imgs/gif/gifset_f/dollarsb.gif
/imgs/gif/gifset_f/dollarsb_1.gif
/imgs/gif/gifset_f/dollarsb_10.gif
/imgs/gif/gifset_f/dollarsb_100.gif
/imgs/gif/gifset_f/dollarsb_2.gif
/imgs/gif/gifset_f/dollarsb_20.gif
/imgs/gif/gifset_f/dollarsb_3.gif
/imgs/gif/gifset_f/dollarsb_30.gif
/imgs/gif/gifset_f/dollarsb_4.gif
/imgs/gif/gifset_f/dollarsb_40.gif
/imgs/gif/gifset_f/dollarsb_5.gif
/imgs/gif/gifset_f/dollarsb_50.gif
/imgs/gif/gifset_f/dollarsb_6.gif
/imgs/gif/gifset_f/dollarsb_7.gif
/imgs/gif/gifset_f/dollarsb_70.gif
/imgs/gif/gifset_f/dollarsb_8.gif
/imgs/gif/gifset_f/dollarsb_80.gif
/imgs/gif/gifset_f/dollarsb_9.gif
/imgs/gif/gifset_f/dollarsb_90.gif
/imgs/gif/gifset_f/dollarsd.gif
/imgs/gif/gifset_f/dollarsd_1.gif
/imgs/gif/gifset_f/dollarsd_10.gif
/imgs/gif/gifset_f/dollarsd_100.gif
/imgs/gif/gifset_f/dollarsd_2.gif
/imgs/gif/gifset_f/dollarsd_20.gif
/imgs/gif/gifset_f/dollarsd_3.gif
/imgs/gif/gifset_f/dollarsd_30.gif
/imgs/gif/gifset_f/dollarsd_4.gif
/imgs/gif/gifset_f/dollarsd_40.gif
/imgs/gif/gifset_f/dollarsd_5.gif
/imgs/gif/gifset_f/dollarsd_50.gif
/imgs/gif/gifset_f/dollarsd_6.gif
/imgs/gif/gifset_f/dollarsd_7.gif
/imgs/gif/gifset_f/dollarsd_70.gif
/imgs/gif/gifset_f/dollarsd_8.gif
/imgs/gif/gifset_f/dollarsd_80.gif
/imgs/gif/gifset_f/dollarsd_9.gif
/imgs/gif/gifset_f/dollarsd_90.gif
/imgs/gif/gifset_f/dollarsp.gif
/imgs/gif/gifset_f/dollarsp_1.gif
/imgs/gif/gifset_f/dollarsp_10.gif
/imgs/gif/gifset_f/dollarsp_100.gif
/imgs/gif/gifset_f/dollarsp_2.gif
/imgs/gif/gifset_f/dollarsp_20.gif
/imgs/gif/gifset_f/dollarsp_3.gif
/imgs/gif/gifset_f/dollarsp_30.gif
/imgs/gif/gifset_f/dollarsp_4.gif
/imgs/gif/gifset_f/dollarsp_40.gif
/imgs/gif/gifset_f/dollarsp_5.gif
/imgs/gif/gifset_f/dollarsp_50.gif
/imgs/gif/gifset_f/dollarsp_6.gif
/imgs/gif/gifset_f/dollarsp_7.gif
/imgs/gif/gifset_f/dollarsp_70.gif
/imgs/gif/gifset_f/dollarsp_8.gif
/imgs/gif/gifset_f/dollarsp_80.gif
/imgs/gif/gifset_f/dollarsp_9.gif
/imgs/gif/gifset_f/dollarsp_90.gif
/imgs/gif/gifset_f/dollarsq.gif
/imgs/gif/gifset_f/dollarsq_1.gif
/imgs/gif/gifset_f/dollarsq_10.gif
/imgs/gif/gifset_f/dollarsq_100.gif
/imgs/gif/gifset_f/dollarsq_2.gif
/imgs/gif/gifset_f/dollarsq_20.gif
/imgs/gif/gifset_f/dollarsq_3.gif
/imgs/gif/gifset_f/dollarsq_30.gif
/imgs/gif/gifset_f/dollarsq_4.gif
/imgs/gif/gifset_f/dollarsq_40.gif
/imgs/gif/gifset_f/dollarsq_5.gif
/imgs/gif/gifset_f/dollarsq_50.gif
/imgs/gif/gifset_f/dollarsq_6.gif
/imgs/gif/gifset_f/dollarsq_7.gif
/imgs/gif/gifset_f/dollarsq_70.gif
/imgs/gif/gifset_f/dollarsq_8.gif
/imgs/gif/gifset_f/dollarsq_80.gif
/imgs/gif/gifset_f/dollarsq_9.gif
/imgs/gif/gifset_f/dollarsq_90.gif
/imgs/gif/gifset_f/eye1.gif
/imgs/gif/gifset_f/eye1b.gif
/imgs/gif/gifset_f/eye1b_1.gif
/imgs/gif/gifset_f/eye1b_10.gif
/imgs/gif/gifset_f/eye1b_100.gif
/imgs/gif/gifset_f/eye1b_2.gif
/imgs/gif/gifset_f/eye1b_20.gif
/imgs/gif/gifset_f/eye1b_3.gif
/imgs/gif/gifset_f/eye1b_30.gif
/imgs/gif/gifset_f/eye1b_4.gif
/imgs/gif/gifset_f/eye1b_40.gif
/imgs/gif/gifset_f/eye1b_5.gif
/imgs/gif/gifset_f/eye1b_50.gif
/imgs/gif/gifset_f/eye1b_6.gif
/imgs/gif/gifset_f/eye1b_7.gif
/imgs/gif/gifset_f/eye1b_70.gif
/imgs/gif/gifset_f/eye1b_8.gif
/imgs/gif/gifset_f/eye1b_80.gif
/imgs/gif/gifset_f/eye1b_9.gif
/imgs/gif/gifset_f/eye1b_90.gif
/imgs/gif/gifset_f/eye1d.gif
/imgs/gif/gifset_f/eye1d_1.gif
/imgs/gif/gifset_f/eye1d_10.gif
/imgs/gif/gifset_f/eye1d_100.gif
/imgs/gif/gifset_f/eye1d_2.gif
/imgs/gif/gifset_f/eye1d_20.gif
/imgs/gif/gifset_f/eye1d_3.gif
/imgs/gif/gifset_f/eye1d_30.gif
/imgs/gif/gifset_f/eye1d_4.gif
/imgs/gif/gifset_f/eye1d_40.gif
/imgs/gif/gifset_f/eye1d_5.gif
/imgs/gif/gifset_f/eye1d_50.gif
/imgs/gif/gifset_f/eye1d_6.gif
/imgs/gif/gifset_f/eye1d_7.gif
/imgs/gif/gifset_f/eye1d_70.gif
/imgs/gif/gifset_f/eye1d_8.gif
/imgs/gif/gifset_f/eye1d_80.gif
/imgs/gif/gifset_f/eye1d_9.gif
/imgs/gif/gifset_f/eye1d_90.gif
/imgs/gif/gifset_f/eye1p.gif
/imgs/gif/gifset_f/eye1p_1.gif
/imgs/gif/gifset_f/eye1p_10.gif
/imgs/gif/gifset_f/eye1p_100.gif
/imgs/gif/gifset_f/eye1p_2.gif
/imgs/gif/gifset_f/eye1p_20.gif
/imgs/gif/gifset_f/eye1p_3.gif
/imgs/gif/gifset_f/eye1p_30.gif
/imgs/gif/gifset_f/eye1p_4.gif
/imgs/gif/gifset_f/eye1p_40.gif
/imgs/gif/gifset_f/eye1p_5.gif
/imgs/gif/gifset_f/eye1p_50.gif
/imgs/gif/gifset_f/eye1p_6.gif
/imgs/gif/gifset_f/eye1p_7.gif
/imgs/gif/gifset_f/eye1p_70.gif
/imgs/gif/gifset_f/eye1p_8.gif
/imgs/gif/gifset_f/eye1p_80.gif
/imgs/gif/gifset_f/eye1p_9.gif
/imgs/gif/gifset_f/eye1p_90.gif
/imgs/gif/gifset_f/eye1q.gif
/imgs/gif/gifset_f/eye1q_1.gif
/imgs/gif/gifset_f/eye1q_10.gif
/imgs/gif/gifset_f/eye1q_100.gif
/imgs/gif/gifset_f/eye1q_2.gif
/imgs/gif/gifset_f/eye1q_20.gif
/imgs/gif/gifset_f/eye1q_3.gif
/imgs/gif/gifset_f/eye1q_30.gif
/imgs/gif/gifset_f/eye1q_4.gif
/imgs/gif/gifset_f/eye1q_40.gif
/imgs/gif/gifset_f/eye1q_5.gif
/imgs/gif/gifset_f/eye1q_50.gif
/imgs/gif/gifset_f/eye1q_6.gif
/imgs/gif/gifset_f/eye1q_7.gif
/imgs/gif/gifset_f/eye1q_70.gif
/imgs/gif/gifset_f/eye1q_8.gif
/imgs/gif/gifset_f/eye1q_80.gif
/imgs/gif/gifset_f/eye1q_9.gif
/imgs/gif/gifset_f/eye1q_90.gif
/imgs/gif/gifset_f/eye2.gif
/imgs/gif/gifset_f/eye2b.gif
/imgs/gif/gifset_f/eye2b_1.gif
/imgs/gif/gifset_f/eye2b_10.gif
/imgs/gif/gifset_f/eye2b_100.gif
/imgs/gif/gifset_f/eye2b_2.gif
/imgs/gif/gifset_f/eye2b_20.gif
/imgs/gif/gifset_f/eye2b_3.gif
/imgs/gif/gifset_f/eye2b_30.gif
/imgs/gif/gifset_f/eye2b_4.gif
/imgs/gif/gifset_f/eye2b_40.gif
/imgs/gif/gifset_f/eye2b_5.gif
/imgs/gif/gifset_f/eye2b_50.gif
/imgs/gif/gifset_f/eye2b_6.gif
/imgs/gif/gifset_f/eye2b_7.gif
/imgs/gif/gifset_f/eye2b_70.gif
/imgs/gif/gifset_f/eye2b_8.gif
/imgs/gif/gifset_f/eye2b_80.gif
/imgs/gif/gifset_f/eye2b_9.gif
/imgs/gif/gifset_f/eye2b_90.gif
/imgs/gif/gifset_f/eye2d.gif
/imgs/gif/gifset_f/eye2d_1.gif
/imgs/gif/gifset_f/eye2d_10.gif
/imgs/gif/gifset_f/eye2d_100.gif
/imgs/gif/gifset_f/eye2d_2.gif
/imgs/gif/gifset_f/eye2d_20.gif
/imgs/gif/gifset_f/eye2d_3.gif
/imgs/gif/gifset_f/eye2d_30.gif
/imgs/gif/gifset_f/eye2d_4.gif
/imgs/gif/gifset_f/eye2d_40.gif
/imgs/gif/gifset_f/eye2d_5.gif
/imgs/gif/gifset_f/eye2d_50.gif
/imgs/gif/gifset_f/eye2d_6.gif
/imgs/gif/gifset_f/eye2d_7.gif
/imgs/gif/gifset_f/eye2d_70.gif
/imgs/gif/gifset_f/eye2d_8.gif
/imgs/gif/gifset_f/eye2d_80.gif
/imgs/gif/gifset_f/eye2d_9.gif
/imgs/gif/gifset_f/eye2d_90.gif
/imgs/gif/gifset_f/eye2p.gif
/imgs/gif/gifset_f/eye2p_1.gif
/imgs/gif/gifset_f/eye2p_10.gif
/imgs/gif/gifset_f/eye2p_100.gif
/imgs/gif/gifset_f/eye2p_2.gif
/imgs/gif/gifset_f/eye2p_20.gif
/imgs/gif/gifset_f/eye2p_3.gif
/imgs/gif/gifset_f/eye2p_30.gif
/imgs/gif/gifset_f/eye2p_4.gif
/imgs/gif/gifset_f/eye2p_40.gif
/imgs/gif/gifset_f/eye2p_5.gif
/imgs/gif/gifset_f/eye2p_50.gif
/imgs/gif/gifset_f/eye2p_6.gif
/imgs/gif/gifset_f/eye2p_7.gif
/imgs/gif/gifset_f/eye2p_70.gif
/imgs/gif/gifset_f/eye2p_8.gif
/imgs/gif/gifset_f/eye2p_80.gif
/imgs/gif/gifset_f/eye2p_9.gif
/imgs/gif/gifset_f/eye2p_90.gif
/imgs/gif/gifset_f/eye2q.gif
/imgs/gif/gifset_f/eye2q_1.gif
/imgs/gif/gifset_f/eye2q_10.gif
/imgs/gif/gifset_f/eye2q_100.gif
/imgs/gif/gifset_f/eye2q_2.gif
/imgs/gif/gifset_f/eye2q_20.gif
/imgs/gif/gifset_f/eye2q_3.gif
/imgs/gif/gifset_f/eye2q_30.gif
/imgs/gif/gifset_f/eye2q_4.gif
/imgs/gif/gifset_f/eye2q_40.gif
/imgs/gif/gifset_f/eye2q_5.gif
/imgs/gif/gifset_f/eye2q_50.gif
/imgs/gif/gifset_f/eye2q_6.gif
/imgs/gif/gifset_f/eye2q_7.gif
/imgs/gif/gifset_f/eye2q_70.gif
/imgs/gif/gifset_f/eye2q_8.gif
/imgs/gif/gifset_f/eye2q_80.gif
/imgs/gif/gifset_f/eye2q_9.gif
/imgs/gif/gifset_f/eye2q_90.gif
/imgs/gif/gifset_f/eye3.gif
/imgs/gif/gifset_f/eye3b.gif
/imgs/gif/gifset_f/eye3b_1.gif
/imgs/gif/gifset_f/eye3b_10.gif
/imgs/gif/gifset_f/eye3b_100.gif
/imgs/gif/gifset_f/eye3b_2.gif
/imgs/gif/gifset_f/eye3b_20.gif
/imgs/gif/gifset_f/eye3b_3.gif
/imgs/gif/gifset_f/eye3b_30.gif
/imgs/gif/gifset_f/eye3b_4.gif
/imgs/gif/gifset_f/eye3b_40.gif
/imgs/gif/gifset_f/eye3b_5.gif
/imgs/gif/gifset_f/eye3b_50.gif
/imgs/gif/gifset_f/eye3b_6.gif
/imgs/gif/gifset_f/eye3b_7.gif
/imgs/gif/gifset_f/eye3b_70.gif
/imgs/gif/gifset_f/eye3b_8.gif
/imgs/gif/gifset_f/eye3b_80.gif
/imgs/gif/gifset_f/eye3b_9.gif
/imgs/gif/gifset_f/eye3b_90.gif
/imgs/gif/gifset_f/eye3d.gif
/imgs/gif/gifset_f/eye3d_1.gif
/imgs/gif/gifset_f/eye3d_10.gif
/imgs/gif/gifset_f/eye3d_100.gif
/imgs/gif/gifset_f/eye3d_2.gif
/imgs/gif/gifset_f/eye3d_20.gif
/imgs/gif/gifset_f/eye3d_3.gif
/imgs/gif/gifset_f/eye3d_30.gif
/imgs/gif/gifset_f/eye3d_4.gif
/imgs/gif/gifset_f/eye3d_40.gif
/imgs/gif/gifset_f/eye3d_5.gif
/imgs/gif/gifset_f/eye3d_50.gif
/imgs/gif/gifset_f/eye3d_6.gif
/imgs/gif/gifset_f/eye3d_7.gif
/imgs/gif/gifset_f/eye3d_70.gif
/imgs/gif/gifset_f/eye3d_8.gif
/imgs/gif/gifset_f/eye3d_80.gif
/imgs/gif/gifset_f/eye3d_9.gif
/imgs/gif/gifset_f/eye3d_90.gif
/imgs/gif/gifset_f/eye3p.gif
/imgs/gif/gifset_f/eye3p_1.gif
/imgs/gif/gifset_f/eye3p_10.gif
/imgs/gif/gifset_f/eye3p_100.gif
/imgs/gif/gifset_f/eye3p_2.gif
/imgs/gif/gifset_f/eye3p_20.gif
/imgs/gif/gifset_f/eye3p_3.gif
/imgs/gif/gifset_f/eye3p_30.gif
/imgs/gif/gifset_f/eye3p_4.gif
/imgs/gif/gifset_f/eye3p_40.gif
/imgs/gif/gifset_f/eye3p_5.gif
/imgs/gif/gifset_f/eye3p_50.gif
/imgs/gif/gifset_f/eye3p_6.gif
/imgs/gif/gifset_f/eye3p_7.gif
/imgs/gif/gifset_f/eye3p_70.gif
/imgs/gif/gifset_f/eye3p_8.gif
/imgs/gif/gifset_f/eye3p_80.gif
/imgs/gif/gifset_f/eye3p_9.gif
/imgs/gif/gifset_f/eye3p_90.gif
/imgs/gif/gifset_f/eye3q.gif
/imgs/gif/gifset_f/eye3q_1.gif
/imgs/gif/gifset_f/eye3q_10.gif
/imgs/gif/gifset_f/eye3q_100.gif
/imgs/gif/gifset_f/eye3q_2.gif
/imgs/gif/gifset_f/eye3q_20.gif
/imgs/gif/gifset_f/eye3q_3.gif
/imgs/gif/gifset_f/eye3q_30.gif
/imgs/gif/gifset_f/eye3q_4.gif
/imgs/gif/gifset_f/eye3q_40.gif
/imgs/gif/gifset_f/eye3q_5.gif
/imgs/gif/gifset_f/eye3q_50.gif
/imgs/gif/gifset_f/eye3q_6.gif
/imgs/gif/gifset_f/eye3q_7.gif
/imgs/gif/gifset_f/eye3q_70.gif
/imgs/gif/gifset_f/eye3q_8.gif
/imgs/gif/gifset_f/eye3q_80.gif
/imgs/gif/gifset_f/eye3q_9.gif
/imgs/gif/gifset_f/eye3q_90.gif
/imgs/gif/gifset_f/film.gif
/imgs/gif/gifset_f/filmb.gif
/imgs/gif/gifset_f/filmb_1.gif
/imgs/gif/gifset_f/filmb_10.gif
/imgs/gif/gifset_f/filmb_100.gif
/imgs/gif/gifset_f/filmb_2.gif
/imgs/gif/gifset_f/filmb_20.gif
/imgs/gif/gifset_f/filmb_3.gif
/imgs/gif/gifset_f/filmb_30.gif
/imgs/gif/gifset_f/filmb_4.gif
/imgs/gif/gifset_f/filmb_40.gif
/imgs/gif/gifset_f/filmb_5.gif
/imgs/gif/gifset_f/filmb_50.gif
/imgs/gif/gifset_f/filmb_6.gif
/imgs/gif/gifset_f/filmb_7.gif
/imgs/gif/gifset_f/filmb_70.gif
/imgs/gif/gifset_f/filmb_8.gif
/imgs/gif/gifset_f/filmb_80.gif
/imgs/gif/gifset_f/filmb_9.gif
/imgs/gif/gifset_f/filmb_90.gif
/imgs/gif/gifset_f/filmd.gif
/imgs/gif/gifset_f/filmd_1.gif
/imgs/gif/gifset_f/filmd_10.gif
/imgs/gif/gifset_f/filmd_100.gif
/imgs/gif/gifset_f/filmd_2.gif
/imgs/gif/gifset_f/filmd_20.gif
/imgs/gif/gifset_f/filmd_3.gif
/imgs/gif/gifset_f/filmd_30.gif
/imgs/gif/gifset_f/filmd_4.gif
/imgs/gif/gifset_f/filmd_40.gif
/imgs/gif/gifset_f/filmd_5.gif
/imgs/gif/gifset_f/filmd_50.gif
/imgs/gif/gifset_f/filmd_6.gif
/imgs/gif/gifset_f/filmd_7.gif
/imgs/gif/gifset_f/filmd_70.gif
/imgs/gif/gifset_f/filmd_8.gif
/imgs/gif/gifset_f/filmd_80.gif
/imgs/gif/gifset_f/filmd_9.gif
/imgs/gif/gifset_f/filmd_90.gif
/imgs/gif/gifset_f/filmp.gif
/imgs/gif/gifset_f/filmp_1.gif
/imgs/gif/gifset_f/filmp_10.gif
/imgs/gif/gifset_f/filmp_100.gif
/imgs/gif/gifset_f/filmp_2.gif
/imgs/gif/gifset_f/filmp_20.gif
/imgs/gif/gifset_f/filmp_3.gif
/imgs/gif/gifset_f/filmp_30.gif
/imgs/gif/gifset_f/filmp_4.gif
/imgs/gif/gifset_f/filmp_40.gif
/imgs/gif/gifset_f/filmp_5.gif
/imgs/gif/gifset_f/filmp_50.gif
/imgs/gif/gifset_f/filmp_6.gif
/imgs/gif/gifset_f/filmp_7.gif
/imgs/gif/gifset_f/filmp_70.gif
/imgs/gif/gifset_f/filmp_8.gif
/imgs/gif/gifset_f/filmp_80.gif
/imgs/gif/gifset_f/filmp_9.gif
/imgs/gif/gifset_f/filmp_90.gif
/imgs/gif/gifset_f/filmq.gif
/imgs/gif/gifset_f/filmq_1.gif
/imgs/gif/gifset_f/filmq_10.gif
/imgs/gif/gifset_f/filmq_100.gif
/imgs/gif/gifset_f/filmq_2.gif
/imgs/gif/gifset_f/filmq_20.gif
/imgs/gif/gifset_f/filmq_3.gif
/imgs/gif/gifset_f/filmq_30.gif
/imgs/gif/gifset_f/filmq_4.gif
/imgs/gif/gifset_f/filmq_40.gif
/imgs/gif/gifset_f/filmq_5.gif
/imgs/gif/gifset_f/filmq_50.gif
/imgs/gif/gifset_f/filmq_6.gif
/imgs/gif/gifset_f/filmq_7.gif
/imgs/gif/gifset_f/filmq_70.gif
/imgs/gif/gifset_f/filmq_8.gif
/imgs/gif/gifset_f/filmq_80.gif
/imgs/gif/gifset_f/filmq_9.gif
/imgs/gif/gifset_f/filmq_90.gif
/imgs/gif/gifset_f/firebubblesb_1.gif
/imgs/gif/gifset_f/firebubblesb_10.gif
/imgs/gif/gifset_f/firebubblesb_100.gif
/imgs/gif/gifset_f/firebubblesb_2.gif
/imgs/gif/gifset_f/firebubblesb_20.gif
/imgs/gif/gifset_f/firebubblesb_3.gif
/imgs/gif/gifset_f/firebubblesb_30.gif
/imgs/gif/gifset_f/firebubblesb_4.gif
/imgs/gif/gifset_f/firebubblesb_40.gif
/imgs/gif/gifset_f/firebubblesb_5.gif
/imgs/gif/gifset_f/firebubblesb_50.gif
/imgs/gif/gifset_f/firebubblesb_6.gif
/imgs/gif/gifset_f/firebubblesb_7.gif
/imgs/gif/gifset_f/firebubblesb_70.gif
/imgs/gif/gifset_f/firebubblesb_8.gif
/imgs/gif/gifset_f/firebubblesb_80.gif
/imgs/gif/gifset_f/firebubblesb_9.gif
/imgs/gif/gifset_f/firebubblesb_90.gif
/imgs/gif/gifset_f/firebubblesd_1.gif
/imgs/gif/gifset_f/firebubblesd_10.gif
/imgs/gif/gifset_f/firebubblesd_100.gif
/imgs/gif/gifset_f/firebubblesd_2.gif
/imgs/gif/gifset_f/firebubblesd_20.gif
/imgs/gif/gifset_f/firebubblesd_3.gif
/imgs/gif/gifset_f/firebubblesd_30.gif
/imgs/gif/gifset_f/firebubblesd_4.gif
/imgs/gif/gifset_f/firebubblesd_40.gif
/imgs/gif/gifset_f/firebubblesd_5.gif
/imgs/gif/gifset_f/firebubblesd_50.gif
/imgs/gif/gifset_f/firebubblesd_6.gif
/imgs/gif/gifset_f/firebubblesd_7.gif
/imgs/gif/gifset_f/firebubblesd_70.gif
/imgs/gif/gifset_f/firebubblesd_8.gif
/imgs/gif/gifset_f/firebubblesd_80.gif
/imgs/gif/gifset_f/firebubblesd_9.gif
/imgs/gif/gifset_f/firebubblesd_90.gif
/imgs/gif/gifset_f/firebubblesp_1.gif
/imgs/gif/gifset_f/firebubblesp_10.gif
/imgs/gif/gifset_f/firebubblesp_100.gif
/imgs/gif/gifset_f/firebubblesp_2.gif
/imgs/gif/gifset_f/firebubblesp_20.gif
/imgs/gif/gifset_f/firebubblesp_3.gif
/imgs/gif/gifset_f/firebubblesp_30.gif
/imgs/gif/gifset_f/firebubblesp_4.gif
/imgs/gif/gifset_f/firebubblesp_40.gif
/imgs/gif/gifset_f/firebubblesp_5.gif
/imgs/gif/gifset_f/firebubblesp_50.gif
/imgs/gif/gifset_f/firebubblesp_6.gif
/imgs/gif/gifset_f/firebubblesp_7.gif
/imgs/gif/gifset_f/firebubblesp_70.gif
/imgs/gif/gifset_f/firebubblesp_8.gif
/imgs/gif/gifset_f/firebubblesp_80.gif
/imgs/gif/gifset_f/firebubblesp_9.gif
/imgs/gif/gifset_f/firebubblesp_90.gif
/imgs/gif/gifset_firebubbles/firework.gif
/imgs/gif/gifset_firebubbles/fireworkb.gif
/imgs/gif/gifset_firebubbles/fireworkb_1.gif
/imgs/gif/gifset_firebubbles/fireworkb_10.gif
/imgs/gif/gifset_firebubbles/fireworkb_100.gif
/imgs/gif/gifset_firebubbles/fireworkb_2.gif
/imgs/gif/gifset_firebubbles/fireworkb_20.gif
/imgs/gif/gifset_firebubbles/fireworkb_3.gif
/imgs/gif/gifset_firebubbles/fireworkb_30.gif
/imgs/gif/gifset_firebubbles/fireworkb_4.gif
/imgs/gif/gifset_firebubbles/fireworkb_40.gif
/imgs/gif/gifset_firebubbles/fireworkb_5.gif
/imgs/gif/gifset_firebubbles/fireworkb_50.gif
/imgs/gif/gifset_firebubbles/fireworkb_6.gif
/imgs/gif/gifset_firebubbles/fireworkb_7.gif
/imgs/gif/gifset_firebubbles/fireworkb_70.gif
/imgs/gif/gifset_firebubbles/fireworkb_8.gif
/imgs/gif/gifset_firebubbles/fireworkb_80.gif
/imgs/gif/gifset_firebubbles/fireworkb_9.gif
/imgs/gif/gifset_firebubbles/fireworkb_90.gif
/imgs/gif/gifset_firebubbles/fireworkd.gif
/imgs/gif/gifset_firebubbles/fireworkd_1.gif
/imgs/gif/gifset_firebubbles/fireworkd_10.gif
/imgs/gif/gifset_firebubbles/fireworkd_100.gif
/imgs/gif/gifset_firebubbles/fireworkd_2.gif
/imgs/gif/gifset_firebubbles/fireworkd_20.gif
/imgs/gif/gifset_firebubbles/fireworkd_3.gif
/imgs/gif/gifset_firebubbles/fireworkd_30.gif
/imgs/gif/gifset_firebubbles/fireworkd_4.gif
/imgs/gif/gifset_firebubbles/fireworkd_40.gif
/imgs/gif/gifset_firebubbles/fireworkd_5.gif
/imgs/gif/gifset_firebubbles/fireworkd_50.gif
/imgs/gif/gifset_firebubbles/fireworkd_6.gif
/imgs/gif/gifset_firebubbles/fireworkd_7.gif
/imgs/gif/gifset_firebubbles/fireworkd_70.gif
/imgs/gif/gifset_firebubbles/fireworkd_8.gif
/imgs/gif/gifset_firebubbles/fireworkd_80.gif
/imgs/gif/gifset_firebubbles/fireworkd_9.gif
/imgs/gif/gifset_firebubbles/fireworkd_90.gif
/imgs/gif/gifset_firebubbles/fireworkp.gif
/imgs/gif/gifset_firebubbles/fireworkp_1.gif
/imgs/gif/gifset_firebubbles/fireworkp_10.gif
/imgs/gif/gifset_firebubbles/fireworkp_100.gif
/imgs/gif/gifset_firebubbles/fireworkp_2.gif
/imgs/gif/gifset_firebubbles/fireworkp_20.gif
/imgs/gif/gifset_firebubbles/fireworkp_3.gif
/imgs/gif/gifset_firebubbles/fireworkp_30.gif
/imgs/gif/gifset_firebubbles/fireworkp_4.gif
/imgs/gif/gifset_firebubbles/fireworkp_40.gif
/imgs/gif/gifset_firebubbles/fireworkp_5.gif
/imgs/gif/gifset_firebubbles/fireworkp_50.gif
/imgs/gif/gifset_firebubbles/fireworkp_6.gif
/imgs/gif/gifset_firebubbles/fireworkp_7.gif
/imgs/gif/gifset_firebubbles/fireworkp_70.gif
/imgs/gif/gifset_firebubbles/fireworkp_8.gif
/imgs/gif/gifset_firebubbles/fireworkp_80.gif
/imgs/gif/gifset_firebubbles/fireworkp_9.gif
/imgs/gif/gifset_firebubbles/fireworkp_90.gif
/imgs/gif/gifset_firebubbles/fireworkq.gif
/imgs/gif/gifset_firebubbles/fireworkq_1.gif
/imgs/gif/gifset_firebubbles/fireworkq_10.gif
/imgs/gif/gifset_firebubbles/fireworkq_100.gif
/imgs/gif/gifset_firebubbles/fireworkq_2.gif
/imgs/gif/gifset_firebubbles/fireworkq_20.gif
/imgs/gif/gifset_firebubbles/fireworkq_3.gif
/imgs/gif/gifset_firebubbles/fireworkq_30.gif
/imgs/gif/gifset_firebubbles/fireworkq_4.gif
/imgs/gif/gifset_firebubbles/fireworkq_40.gif
/imgs/gif/gifset_firebubbles/fireworkq_5.gif
/imgs/gif/gifset_firebubbles/fireworkq_50.gif
/imgs/gif/gifset_firebubbles/fireworkq_6.gif
/imgs/gif/gifset_firebubbles/fireworkq_7.gif
/imgs/gif/gifset_firebubbles/fireworkq_70.gif
/imgs/gif/gifset_firebubbles/fireworkq_8.gif
/imgs/gif/gifset_firebubbles/fireworkq_80.gif
/imgs/gif/gifset_firebubbles/fireworkq_9.gif
/imgs/gif/gifset_firebubbles/fireworkq_90.gif
/imgs/gif/gifset_h/geard2.gif
/imgs/gif/gifset_h/geard2b.gif
/imgs/gif/gifset_h/geard2b_1.gif
/imgs/gif/gifset_h/geard2b_10.gif
/imgs/gif/gifset_h/geard2b_100.gif
/imgs/gif/gifset_h/geard2b_2.gif
/imgs/gif/gifset_h/geard2b_20.gif
/imgs/gif/gifset_h/geard2b_3.gif
/imgs/gif/gifset_h/geard2b_30.gif
/imgs/gif/gifset_h/geard2b_4.gif
/imgs/gif/gifset_h/geard2b_40.gif
/imgs/gif/gifset_h/geard2b_5.gif
/imgs/gif/gifset_h/geard2b_50.gif
/imgs/gif/gifset_h/geard2b_6.gif
/imgs/gif/gifset_h/geard2b_7.gif
/imgs/gif/gifset_h/geard2b_70.gif
/imgs/gif/gifset_h/geard2b_8.gif
/imgs/gif/gifset_h/geard2b_80.gif
/imgs/gif/gifset_h/geard2b_9.gif
/imgs/gif/gifset_h/geard2b_90.gif
/imgs/gif/gifset_h/geard2d.gif
/imgs/gif/gifset_h/geard2d_1.gif
/imgs/gif/gifset_h/geard2d_10.gif
/imgs/gif/gifset_h/geard2d_100.gif
/imgs/gif/gifset_h/geard2d_2.gif
/imgs/gif/gifset_h/geard2d_20.gif
/imgs/gif/gifset_h/geard2d_3.gif
/imgs/gif/gifset_h/geard2d_30.gif
/imgs/gif/gifset_h/geard2d_4.gif
/imgs/gif/gifset_h/geard2d_40.gif
/imgs/gif/gifset_h/geard2d_5.gif
/imgs/gif/gifset_h/geard2d_50.gif
/imgs/gif/gifset_h/geard2d_6.gif
/imgs/gif/gifset_h/geard2d_7.gif
/imgs/gif/gifset_h/geard2d_70.gif
/imgs/gif/gifset_h/geard2d_8.gif
/imgs/gif/gifset_h/geard2d_80.gif
/imgs/gif/gifset_h/geard2d_9.gif
/imgs/gif/gifset_h/geard2d_90.gif
/imgs/gif/gifset_h/geard2p.gif
/imgs/gif/gifset_h/geard2p_1.gif
/imgs/gif/gifset_h/geard2p_10.gif
/imgs/gif/gifset_h/geard2p_100.gif
/imgs/gif/gifset_h/geard2p_2.gif
/imgs/gif/gifset_h/geard2p_20.gif
/imgs/gif/gifset_h/geard2p_3.gif
/imgs/gif/gifset_h/geard2p_30.gif
/imgs/gif/gifset_h/geard2p_4.gif
/imgs/gif/gifset_h/geard2p_40.gif
/imgs/gif/gifset_h/geard2p_5.gif
/imgs/gif/gifset_h/geard2p_50.gif
/imgs/gif/gifset_h/geard2p_6.gif
/imgs/gif/gifset_h/geard2p_7.gif
/imgs/gif/gifset_h/geard2p_70.gif
/imgs/gif/gifset_h/geard2p_8.gif
/imgs/gif/gifset_h/geard2p_80.gif
/imgs/gif/gifset_h/geard2p_9.gif
/imgs/gif/gifset_h/geard2p_90.gif
/imgs/gif/gifset_h/geard2q.gif
/imgs/gif/gifset_h/geard2q_1.gif
/imgs/gif/gifset_h/geard2q_10.gif
/imgs/gif/gifset_h/geard2q_100.gif
/imgs/gif/gifset_h/geard2q_2.gif
/imgs/gif/gifset_h/geard2q_20.gif
/imgs/gif/gifset_h/geard2q_3.gif
/imgs/gif/gifset_h/geard2q_30.gif
/imgs/gif/gifset_h/geard2q_4.gif
/imgs/gif/gifset_h/geard2q_40.gif
/imgs/gif/gifset_h/geard2q_5.gif
/imgs/gif/gifset_h/geard2q_50.gif
/imgs/gif/gifset_h/geard2q_6.gif
/imgs/gif/gifset_h/geard2q_7.gif
/imgs/gif/gifset_h/geard2q_70.gif
/imgs/gif/gifset_h/geard2q_8.gif
/imgs/gif/gifset_h/geard2q_80.gif
/imgs/gif/gifset_h/geard2q_9.gif
/imgs/gif/gifset_h/geard2q_90.gif
/imgs/gif/gifset_h/gears2.gif
/imgs/gif/gifset_h/gears2b.gif
/imgs/gif/gifset_h/gears2b_1.gif
/imgs/gif/gifset_h/gears2b_10.gif
/imgs/gif/gifset_h/gears2b_100.gif
/imgs/gif/gifset_h/gears2b_2.gif
/imgs/gif/gifset_h/gears2b_20.gif
/imgs/gif/gifset_h/gears2b_3.gif
/imgs/gif/gifset_h/gears2b_30.gif
/imgs/gif/gifset_h/gears2b_4.gif
/imgs/gif/gifset_h/gears2b_40.gif
/imgs/gif/gifset_h/gears2b_5.gif
/imgs/gif/gifset_h/gears2b_50.gif
/imgs/gif/gifset_h/gears2b_6.gif
/imgs/gif/gifset_h/gears2b_7.gif
/imgs/gif/gifset_h/gears2b_70.gif
/imgs/gif/gifset_h/gears2b_8.gif
/imgs/gif/gifset_h/gears2b_80.gif
/imgs/gif/gifset_h/gears2b_9.gif
/imgs/gif/gifset_h/gears2b_90.gif
/imgs/gif/gifset_h/gears2d.gif
/imgs/gif/gifset_h/gears2d_1.gif
/imgs/gif/gifset_h/gears2d_10.gif
/imgs/gif/gifset_h/gears2d_100.gif
/imgs/gif/gifset_h/gears2d_2.gif
/imgs/gif/gifset_h/gears2d_20.gif
/imgs/gif/gifset_h/gears2d_3.gif
/imgs/gif/gifset_h/gears2d_30.gif
/imgs/gif/gifset_h/gears2d_4.gif
/imgs/gif/gifset_h/gears2d_40.gif
/imgs/gif/gifset_h/gears2d_5.gif
/imgs/gif/gifset_h/gears2d_50.gif
/imgs/gif/gifset_h/gears2d_6.gif
/imgs/gif/gifset_h/gears2d_7.gif
/imgs/gif/gifset_h/gears2d_70.gif
/imgs/gif/gifset_h/gears2d_8.gif
/imgs/gif/gifset_h/gears2d_80.gif
/imgs/gif/gifset_h/gears2d_9.gif
/imgs/gif/gifset_h/gears2d_90.gif
/imgs/gif/gifset_h/gears2p.gif
/imgs/gif/gifset_h/gears2p_1.gif
/imgs/gif/gifset_h/gears2p_10.gif
/imgs/gif/gifset_h/gears2p_100.gif
/imgs/gif/gifset_h/gears2p_2.gif
/imgs/gif/gifset_h/gears2p_20.gif
/imgs/gif/gifset_h/gears2p_3.gif
/imgs/gif/gifset_h/gears2p_30.gif
/imgs/gif/gifset_h/gears2p_4.gif
/imgs/gif/gifset_h/gears2p_40.gif
/imgs/gif/gifset_h/gears2p_5.gif
/imgs/gif/gifset_h/gears2p_50.gif
/imgs/gif/gifset_h/gears2p_6.gif
/imgs/gif/gifset_h/gears2p_7.gif
/imgs/gif/gifset_h/gears2p_70.gif
/imgs/gif/gifset_h/gears2p_8.gif
/imgs/gif/gifset_h/gears2p_80.gif
/imgs/gif/gifset_h/gears2p_9.gif
/imgs/gif/gifset_h/gears2p_90.gif
/imgs/gif/gifset_h/gears2q.gif
/imgs/gif/gifset_h/gears2q_1.gif
/imgs/gif/gifset_h/gears2q_10.gif
/imgs/gif/gifset_h/gears2q_100.gif
/imgs/gif/gifset_h/gears2q_2.gif
/imgs/gif/gifset_h/gears2q_20.gif
/imgs/gif/gifset_h/gears2q_3.gif
/imgs/gif/gifset_h/gears2q_30.gif
/imgs/gif/gifset_h/gears2q_4.gif
/imgs/gif/gifset_h/gears2q_40.gif
/imgs/gif/gifset_h/gears2q_5.gif
/imgs/gif/gifset_h/gears2q_50.gif
/imgs/gif/gifset_h/gears2q_6.gif
/imgs/gif/gifset_h/gears2q_7.gif
/imgs/gif/gifset_h/gears2q_70.gif
/imgs/gif/gifset_h/gears2q_8.gif
/imgs/gif/gifset_h/gears2q_80.gif
/imgs/gif/gifset_h/gears2q_9.gif
/imgs/gif/gifset_h/gears2q_90.gif
/imgs/gif/gifset_h/header.gif
/imgs/gif/gifset_h/headerb.gif
/imgs/gif/gifset_h/headerb_1.gif
/imgs/gif/gifset_h/headerb_10.gif
/imgs/gif/gifset_h/headerb_100.gif
/imgs/gif/gifset_h/headerb_2.gif
/imgs/gif/gifset_h/headerb_20.gif
/imgs/gif/gifset_h/headerb_3.gif
/imgs/gif/gifset_h/headerb_30.gif
/imgs/gif/gifset_h/headerb_4.gif
/imgs/gif/gifset_h/headerb_40.gif
/imgs/gif/gifset_h/headerb_5.gif
/imgs/gif/gifset_h/headerb_50.gif
/imgs/gif/gifset_h/headerb_6.gif
/imgs/gif/gifset_h/headerb_7.gif
/imgs/gif/gifset_h/headerb_70.gif
/imgs/gif/gifset_h/headerb_8.gif
/imgs/gif/gifset_h/headerb_80.gif
/imgs/gif/gifset_h/headerb_9.gif
/imgs/gif/gifset_h/headerb_90.gif
/imgs/gif/gifset_h/headerd.gif
/imgs/gif/gifset_h/headerd_1.gif
/imgs/gif/gifset_h/headerd_10.gif
/imgs/gif/gifset_h/headerd_100.gif
/imgs/gif/gifset_h/headerd_2.gif
/imgs/gif/gifset_h/headerd_20.gif
/imgs/gif/gifset_h/headerd_3.gif
/imgs/gif/gifset_h/headerd_30.gif
/imgs/gif/gifset_h/headerd_4.gif
/imgs/gif/gifset_h/headerd_40.gif
/imgs/gif/gifset_h/headerd_5.gif
/imgs/gif/gifset_h/headerd_50.gif
/imgs/gif/gifset_h/headerd_6.gif
/imgs/gif/gifset_h/headerd_7.gif
/imgs/gif/gifset_h/headerd_70.gif
/imgs/gif/gifset_h/headerd_8.gif
/imgs/gif/gifset_h/headerd_80.gif
/imgs/gif/gifset_h/headerd_9.gif
/imgs/gif/gifset_h/headerd_90.gif
/imgs/gif/gifset_h/headerp.gif
/imgs/gif/gifset_h/headerp_1.gif
/imgs/gif/gifset_h/headerp_10.gif
/imgs/gif/gifset_h/headerp_100.gif
/imgs/gif/gifset_h/headerp_2.gif
/imgs/gif/gifset_h/headerp_20.gif
/imgs/gif/gifset_h/headerp_3.gif
/imgs/gif/gifset_h/headerp_30.gif
/imgs/gif/gifset_h/headerp_4.gif
/imgs/gif/gifset_h/headerp_40.gif
/imgs/gif/gifset_h/headerp_5.gif
/imgs/gif/gifset_h/headerp_50.gif
/imgs/gif/gifset_h/headerp_6.gif
/imgs/gif/gifset_h/headerp_7.gif
/imgs/gif/gifset_h/headerp_70.gif
/imgs/gif/gifset_h/headerp_8.gif
/imgs/gif/gifset_h/headerp_80.gif
/imgs/gif/gifset_h/headerp_9.gif
/imgs/gif/gifset_h/headerp_90.gif
/imgs/gif/gifset_h/headerq.gif
/imgs/gif/gifset_h/headerq_1.gif
/imgs/gif/gifset_h/headerq_10.gif
/imgs/gif/gifset_h/headerq_100.gif
/imgs/gif/gifset_h/headerq_2.gif
/imgs/gif/gifset_h/headerq_20.gif
/imgs/gif/gifset_h/headerq_3.gif
/imgs/gif/gifset_h/headerq_30.gif
/imgs/gif/gifset_h/headerq_4.gif
/imgs/gif/gifset_h/headerq_40.gif
/imgs/gif/gifset_h/headerq_5.gif
/imgs/gif/gifset_h/headerq_50.gif
/imgs/gif/gifset_h/headerq_6.gif
/imgs/gif/gifset_h/headerq_7.gif
/imgs/gif/gifset_h/headerq_70.gif
/imgs/gif/gifset_h/headerq_8.gif
/imgs/gif/gifset_h/headerq_80.gif
/imgs/gif/gifset_h/headerq_9.gif
/imgs/gif/gifset_h/headerq_90.gif
/imgs/gif/gifset_h/heart.gif
/imgs/gif/gifset_h/heartb.gif
/imgs/gif/gifset_h/heartb_1.gif
/imgs/gif/gifset_h/heartb_10.gif
/imgs/gif/gifset_h/heartb_100.gif
/imgs/gif/gifset_h/heartb_2.gif
/imgs/gif/gifset_h/heartb_20.gif
/imgs/gif/gifset_h/heartb_3.gif
/imgs/gif/gifset_h/heartb_30.gif
/imgs/gif/gifset_h/heartb_4.gif
/imgs/gif/gifset_h/heartb_40.gif
/imgs/gif/gifset_h/heartb_5.gif
/imgs/gif/gifset_h/heartb_50.gif
/imgs/gif/gifset_h/heartb_6.gif
/imgs/gif/gifset_h/heartb_7.gif
/imgs/gif/gifset_h/heartb_70.gif
/imgs/gif/gifset_h/heartb_8.gif
/imgs/gif/gifset_h/heartb_80.gif
/imgs/gif/gifset_h/heartb_9.gif
/imgs/gif/gifset_h/heartb_90.gif
/imgs/gif/gifset_h/heartd.gif
/imgs/gif/gifset_h/heartd_1.gif
/imgs/gif/gifset_h/heartd_10.gif
/imgs/gif/gifset_h/heartd_100.gif
/imgs/gif/gifset_h/heartd_2.gif
/imgs/gif/gifset_h/heartd_20.gif
/imgs/gif/gifset_h/heartd_3.gif
/imgs/gif/gifset_h/heartd_30.gif
/imgs/gif/gifset_h/heartd_4.gif
/imgs/gif/gifset_h/heartd_40.gif
/imgs/gif/gifset_h/heartd_5.gif
/imgs/gif/gifset_h/heartd_50.gif
/imgs/gif/gifset_h/heartd_6.gif
/imgs/gif/gifset_h/heartd_7.gif
/imgs/gif/gifset_h/heartd_70.gif
/imgs/gif/gifset_h/heartd_8.gif
/imgs/gif/gifset_h/heartd_80.gif
/imgs/gif/gifset_h/heartd_9.gif
/imgs/gif/gifset_h/heartd_90.gif
/imgs/gif/gifset_h/heartp.gif
/imgs/gif/gifset_h/heartp_1.gif
/imgs/gif/gifset_h/heartp_10.gif
/imgs/gif/gifset_h/heartp_100.gif
/imgs/gif/gifset_h/heartp_2.gif
/imgs/gif/gifset_h/heartp_20.gif
/imgs/gif/gifset_h/heartp_3.gif
/imgs/gif/gifset_h/heartp_30.gif
/imgs/gif/gifset_h/heartp_4.gif
/imgs/gif/gifset_h/heartp_40.gif
/imgs/gif/gifset_h/heartp_5.gif
/imgs/gif/gifset_h/heartp_50.gif
/imgs/gif/gifset_h/heartp_6.gif
/imgs/gif/gifset_h/heartp_7.gif
/imgs/gif/gifset_h/heartp_70.gif
/imgs/gif/gifset_h/heartp_8.gif
/imgs/gif/gifset_h/heartp_80.gif
/imgs/gif/gifset_h/heartp_9.gif
/imgs/gif/gifset_h/heartp_90.gif
/imgs/gif/gifset_h/heartq.gif
/imgs/gif/gifset_h/heartq_1.gif
/imgs/gif/gifset_h/heartq_10.gif
/imgs/gif/gifset_h/heartq_100.gif
/imgs/gif/gifset_h/heartq_2.gif
/imgs/gif/gifset_h/heartq_20.gif
/imgs/gif/gifset_h/heartq_3.gif
/imgs/gif/gifset_h/heartq_30.gif
/imgs/gif/gifset_h/heartq_4.gif
/imgs/gif/gifset_h/heartq_40.gif
/imgs/gif/gifset_h/heartq_5.gif
/imgs/gif/gifset_h/heartq_50.gif
/imgs/gif/gifset_h/heartq_6.gif
/imgs/gif/gifset_h/heartq_7.gif
/imgs/gif/gifset_h/heartq_70.gif
/imgs/gif/gifset_h/heartq_8.gif
/imgs/gif/gifset_h/heartq_80.gif
/imgs/gif/gifset_h/heartq_9.gif
/imgs/gif/gifset_h/heartq_90.gif
/imgs/gif/gifset_h/helpbean.gif
/imgs/gif/gifset_knots/knot.gif
/imgs/gif/gifset_knots/knot_koeye.gif
/imgs/gif/gifset_knots/knotb.gif
/imgs/gif/gifset_knots/knotb_1.gif
/imgs/gif/gifset_knots/knotb_10.gif
/imgs/gif/gifset_knots/knotb_100.gif
/imgs/gif/gifset_knots/knotb_2.gif
/imgs/gif/gifset_knots/knotb_20.gif
/imgs/gif/gifset_knots/knotb_3.gif
/imgs/gif/gifset_knots/knotb_30.gif
/imgs/gif/gifset_knots/knotb_4.gif
/imgs/gif/gifset_knots/knotb_40.gif
/imgs/gif/gifset_knots/knotb_5.gif
/imgs/gif/gifset_knots/knotb_50.gif
/imgs/gif/gifset_knots/knotb_6.gif
/imgs/gif/gifset_knots/knotb_7.gif
/imgs/gif/gifset_knots/knotb_70.gif
/imgs/gif/gifset_knots/knotb_8.gif
/imgs/gif/gifset_knots/knotb_80.gif
/imgs/gif/gifset_knots/knotb_9.gif
/imgs/gif/gifset_knots/knotb_90.gif
/imgs/gif/gifset_knots/knotd.gif
/imgs/gif/gifset_knots/knotd_1.gif
/imgs/gif/gifset_knots/knotd_10.gif
/imgs/gif/gifset_knots/knotd_100.gif
/imgs/gif/gifset_knots/knotd_2.gif
/imgs/gif/gifset_knots/knotd_20.gif
/imgs/gif/gifset_knots/knotd_3.gif
/imgs/gif/gifset_knots/knotd_30.gif
/imgs/gif/gifset_knots/knotd_4.gif
/imgs/gif/gifset_knots/knotd_40.gif
/imgs/gif/gifset_knots/knotd_5.gif
/imgs/gif/gifset_knots/knotd_50.gif
/imgs/gif/gifset_knots/knotd_6.gif
/imgs/gif/gifset_knots/knotd_7.gif
/imgs/gif/gifset_knots/knotd_70.gif
/imgs/gif/gifset_knots/knotd_8.gif
/imgs/gif/gifset_knots/knotd_80.gif
/imgs/gif/gifset_knots/knotd_9.gif
/imgs/gif/gifset_knots/knotd_90.gif
/imgs/gif/gifset_knots/knotl.gif
/imgs/gif/gifset_knots/knotp.gif
/imgs/gif/gifset_knots/knotp_1.gif
/imgs/gif/gifset_knots/knotp_10.gif
/imgs/gif/gifset_knots/knotp_100.gif
/imgs/gif/gifset_knots/knotp_2.gif
/imgs/gif/gifset_knots/knotp_20.gif
/imgs/gif/gifset_knots/knotp_3.gif
/imgs/gif/gifset_knots/knotp_30.gif
/imgs/gif/gifset_knots/knotp_4.gif
/imgs/gif/gifset_knots/knotp_40.gif
/imgs/gif/gifset_knots/knotp_5.gif
/imgs/gif/gifset_knots/knotp_50.gif
/imgs/gif/gifset_knots/knotp_6.gif
/imgs/gif/gifset_knots/knotp_7.gif
/imgs/gif/gifset_knots/knotp_70.gif
/imgs/gif/gifset_knots/knotp_8.gif
/imgs/gif/gifset_knots/knotp_80.gif
/imgs/gif/gifset_knots/knotp_9.gif
/imgs/gif/gifset_knots/knotp_90.gif
/imgs/gif/gifset_knots/knotq.gif
/imgs/gif/gifset_knots/knotq_1.gif
/imgs/gif/gifset_knots/knotq_10.gif
/imgs/gif/gifset_knots/knotq_100.gif
/imgs/gif/gifset_knots/knotq_2.gif
/imgs/gif/gifset_knots/knotq_20.gif
/imgs/gif/gifset_knots/knotq_3.gif
/imgs/gif/gifset_knots/knotq_30.gif
/imgs/gif/gifset_knots/knotq_4.gif
/imgs/gif/gifset_knots/knotq_40.gif
/imgs/gif/gifset_knots/knotq_5.gif
/imgs/gif/gifset_knots/knotq_50.gif
/imgs/gif/gifset_knots/knotq_6.gif
/imgs/gif/gifset_knots/knotq_7.gif
/imgs/gif/gifset_knots/knotq_70.gif
/imgs/gif/gifset_knots/knotq_8.gif
/imgs/gif/gifset_knots/knotq_80.gif
/imgs/gif/gifset_knots/knotq_9.gif
/imgs/gif/gifset_knots/knotq_90.gif
/imgs/gif/gifset_knots/koeye_knot.gif
/imgs/gif/gifset_knots/koeye_knot_100x40.gif
/imgs/gif/gifset_knots/koeye_knot_200x80.gif
/imgs/gif/gifset_knots/koeye_knot_400x160.gif
/imgs/gif/gifset_knots/koeye_rings.gif
/imgs/gif/gifset_m/laser1.gif
/imgs/gif/gifset_m/laser1b.gif
/imgs/gif/gifset_m/laser1b_1.gif
/imgs/gif/gifset_m/laser1b_10.gif
/imgs/gif/gifset_m/laser1b_100.gif
/imgs/gif/gifset_m/laser1b_2.gif
/imgs/gif/gifset_m/laser1b_20.gif
/imgs/gif/gifset_m/laser1b_3.gif
/imgs/gif/gifset_m/laser1b_30.gif
/imgs/gif/gifset_m/laser1b_4.gif
/imgs/gif/gifset_m/laser1b_40.gif
/imgs/gif/gifset_m/laser1b_5.gif
/imgs/gif/gifset_m/laser1b_50.gif
/imgs/gif/gifset_m/laser1b_6.gif
/imgs/gif/gifset_m/laser1b_7.gif
/imgs/gif/gifset_m/laser1b_70.gif
/imgs/gif/gifset_m/laser1b_8.gif
/imgs/gif/gifset_m/laser1b_80.gif
/imgs/gif/gifset_m/laser1b_9.gif
/imgs/gif/gifset_m/laser1b_90.gif
/imgs/gif/gifset_m/laser1d.gif
/imgs/gif/gifset_m/laser1d_1.gif
/imgs/gif/gifset_m/laser1d_10.gif
/imgs/gif/gifset_m/laser1d_100.gif
/imgs/gif/gifset_m/laser1d_2.gif
/imgs/gif/gifset_m/laser1d_20.gif
/imgs/gif/gifset_m/laser1d_3.gif
/imgs/gif/gifset_m/laser1d_30.gif
/imgs/gif/gifset_m/laser1d_4.gif
/imgs/gif/gifset_m/laser1d_40.gif
/imgs/gif/gifset_m/laser1d_5.gif
/imgs/gif/gifset_m/laser1d_50.gif
/imgs/gif/gifset_m/laser1d_6.gif
/imgs/gif/gifset_m/laser1d_7.gif
/imgs/gif/gifset_m/laser1d_70.gif
/imgs/gif/gifset_m/laser1d_8.gif
/imgs/gif/gifset_m/laser1d_80.gif
/imgs/gif/gifset_m/laser1d_9.gif
/imgs/gif/gifset_m/laser1d_90.gif
/imgs/gif/gifset_m/laser1p.gif
/imgs/gif/gifset_m/laser1p_1.gif
/imgs/gif/gifset_m/laser1p_10.gif
/imgs/gif/gifset_m/laser1p_100.gif
/imgs/gif/gifset_m/laser1p_2.gif
/imgs/gif/gifset_m/laser1p_20.gif
/imgs/gif/gifset_m/laser1p_3.gif
/imgs/gif/gifset_m/laser1p_30.gif
/imgs/gif/gifset_m/laser1p_4.gif
/imgs/gif/gifset_m/laser1p_40.gif
/imgs/gif/gifset_m/laser1p_5.gif
/imgs/gif/gifset_m/laser1p_50.gif
/imgs/gif/gifset_m/laser1p_6.gif
/imgs/gif/gifset_m/laser1p_7.gif
/imgs/gif/gifset_m/laser1p_70.gif
/imgs/gif/gifset_m/laser1p_8.gif
/imgs/gif/gifset_m/laser1p_80.gif
/imgs/gif/gifset_m/laser1p_9.gif
/imgs/gif/gifset_m/laser1p_90.gif
/imgs/gif/gifset_m/laser1q.gif
/imgs/gif/gifset_m/laser1q_1.gif
/imgs/gif/gifset_m/laser1q_10.gif
/imgs/gif/gifset_m/laser1q_100.gif
/imgs/gif/gifset_m/laser1q_2.gif
/imgs/gif/gifset_m/laser1q_20.gif
/imgs/gif/gifset_m/laser1q_3.gif
/imgs/gif/gifset_m/laser1q_30.gif
/imgs/gif/gifset_m/laser1q_4.gif
/imgs/gif/gifset_m/laser1q_40.gif
/imgs/gif/gifset_m/laser1q_5.gif
/imgs/gif/gifset_m/laser1q_50.gif
/imgs/gif/gifset_m/laser1q_6.gif
/imgs/gif/gifset_m/laser1q_7.gif
/imgs/gif/gifset_m/laser1q_70.gif
/imgs/gif/gifset_m/laser1q_8.gif
/imgs/gif/gifset_m/laser1q_80.gif
/imgs/gif/gifset_m/laser1q_9.gif
/imgs/gif/gifset_m/laser1q_90.gif
/imgs/gif/gifset_m/laser2.gif
/imgs/gif/gifset_m/laser2b.gif
/imgs/gif/gifset_m/laser2b_1.gif
/imgs/gif/gifset_m/laser2b_10.gif
/imgs/gif/gifset_m/laser2b_100.gif
/imgs/gif/gifset_m/laser2b_2.gif
/imgs/gif/gifset_m/laser2b_20.gif
/imgs/gif/gifset_m/laser2b_3.gif
/imgs/gif/gifset_m/laser2b_30.gif
/imgs/gif/gifset_m/laser2b_4.gif
/imgs/gif/gifset_m/laser2b_40.gif
/imgs/gif/gifset_m/laser2b_5.gif
/imgs/gif/gifset_m/laser2b_50.gif
/imgs/gif/gifset_m/laser2b_6.gif
/imgs/gif/gifset_m/laser2b_7.gif
/imgs/gif/gifset_m/laser2b_70.gif
/imgs/gif/gifset_m/laser2b_8.gif
/imgs/gif/gifset_m/laser2b_80.gif
/imgs/gif/gifset_m/laser2b_9.gif
/imgs/gif/gifset_m/laser2b_90.gif
/imgs/gif/gifset_m/laser2d.gif
/imgs/gif/gifset_m/laser2d_1.gif
/imgs/gif/gifset_m/laser2d_10.gif
/imgs/gif/gifset_m/laser2d_100.gif
/imgs/gif/gifset_m/laser2d_2.gif
/imgs/gif/gifset_m/laser2d_20.gif
/imgs/gif/gifset_m/laser2d_3.gif
/imgs/gif/gifset_m/laser2d_30.gif
/imgs/gif/gifset_m/laser2d_4.gif
/imgs/gif/gifset_m/laser2d_40.gif
/imgs/gif/gifset_m/laser2d_5.gif
/imgs/gif/gifset_m/laser2d_50.gif
/imgs/gif/gifset_m/laser2d_6.gif
/imgs/gif/gifset_m/laser2d_7.gif
/imgs/gif/gifset_m/laser2d_70.gif
/imgs/gif/gifset_m/laser2d_8.gif
/imgs/gif/gifset_m/laser2d_80.gif
/imgs/gif/gifset_m/laser2d_9.gif
/imgs/gif/gifset_m/laser2d_90.gif
/imgs/gif/gifset_m/laser2p.gif
/imgs/gif/gifset_m/laser2p_1.gif
/imgs/gif/gifset_m/laser2p_10.gif
/imgs/gif/gifset_m/laser2p_100.gif
/imgs/gif/gifset_m/laser2p_2.gif
/imgs/gif/gifset_m/laser2p_20.gif
/imgs/gif/gifset_m/laser2p_3.gif
/imgs/gif/gifset_m/laser2p_30.gif
/imgs/gif/gifset_m/laser2p_4.gif
/imgs/gif/gifset_m/laser2p_40.gif
/imgs/gif/gifset_m/laser2p_5.gif
/imgs/gif/gifset_m/laser2p_50.gif
/imgs/gif/gifset_m/laser2p_6.gif
/imgs/gif/gifset_m/laser2p_7.gif
/imgs/gif/gifset_m/laser2p_70.gif
/imgs/gif/gifset_m/laser2p_8.gif
/imgs/gif/gifset_m/laser2p_80.gif
/imgs/gif/gifset_m/laser2p_9.gif
/imgs/gif/gifset_m/laser2p_90.gif
/imgs/gif/gifset_m/laser2q.gif
/imgs/gif/gifset_m/laser2q_1.gif
/imgs/gif/gifset_m/laser2q_10.gif
/imgs/gif/gifset_m/laser2q_100.gif
/imgs/gif/gifset_m/laser2q_2.gif
/imgs/gif/gifset_m/laser2q_20.gif
/imgs/gif/gifset_m/laser2q_3.gif
/imgs/gif/gifset_m/laser2q_30.gif
/imgs/gif/gifset_m/laser2q_4.gif
/imgs/gif/gifset_m/laser2q_40.gif
/imgs/gif/gifset_m/laser2q_5.gif
/imgs/gif/gifset_m/laser2q_50.gif
/imgs/gif/gifset_m/laser2q_6.gif
/imgs/gif/gifset_m/laser2q_7.gif
/imgs/gif/gifset_m/laser2q_70.gif
/imgs/gif/gifset_m/laser2q_8.gif
/imgs/gif/gifset_m/laser2q_80.gif
/imgs/gif/gifset_m/laser2q_9.gif
/imgs/gif/gifset_m/laser2q_90.gif
/imgs/gif/gifset_m/laser3.gif
/imgs/gif/gifset_m/laser3b.gif
/imgs/gif/gifset_m/laser3b_1.gif
/imgs/gif/gifset_m/laser3b_10.gif
/imgs/gif/gifset_m/laser3b_100.gif
/imgs/gif/gifset_m/laser3b_2.gif
/imgs/gif/gifset_m/laser3b_20.gif
/imgs/gif/gifset_m/laser3b_3.gif
/imgs/gif/gifset_m/laser3b_30.gif
/imgs/gif/gifset_m/laser3b_4.gif
/imgs/gif/gifset_m/laser3b_40.gif
/imgs/gif/gifset_m/laser3b_5.gif
/imgs/gif/gifset_m/laser3b_50.gif
/imgs/gif/gifset_m/laser3b_6.gif
/imgs/gif/gifset_m/laser3b_7.gif
/imgs/gif/gifset_m/laser3b_70.gif
/imgs/gif/gifset_m/laser3b_8.gif
/imgs/gif/gifset_m/laser3b_80.gif
/imgs/gif/gifset_m/laser3b_9.gif
/imgs/gif/gifset_m/laser3b_90.gif
/imgs/gif/gifset_m/laser3d.gif
/imgs/gif/gifset_m/laser3d_1.gif
/imgs/gif/gifset_m/laser3d_10.gif
/imgs/gif/gifset_m/laser3d_100.gif
/imgs/gif/gifset_m/laser3d_2.gif
/imgs/gif/gifset_m/laser3d_20.gif
/imgs/gif/gifset_m/laser3d_3.gif
/imgs/gif/gifset_m/laser3d_30.gif
/imgs/gif/gifset_m/laser3d_4.gif
/imgs/gif/gifset_m/laser3d_40.gif
/imgs/gif/gifset_m/laser3d_5.gif
/imgs/gif/gifset_m/laser3d_50.gif
/imgs/gif/gifset_m/laser3d_6.gif
/imgs/gif/gifset_m/laser3d_7.gif
/imgs/gif/gifset_m/laser3d_70.gif
/imgs/gif/gifset_m/laser3d_8.gif
/imgs/gif/gifset_m/laser3d_80.gif
/imgs/gif/gifset_m/laser3d_9.gif
/imgs/gif/gifset_m/laser3d_90.gif
/imgs/gif/gifset_m/laser3p.gif
/imgs/gif/gifset_m/laser3p_1.gif
/imgs/gif/gifset_m/laser3p_10.gif
/imgs/gif/gifset_m/laser3p_100.gif
/imgs/gif/gifset_m/laser3p_2.gif
/imgs/gif/gifset_m/laser3p_20.gif
/imgs/gif/gifset_m/laser3p_3.gif
/imgs/gif/gifset_m/laser3p_30.gif
/imgs/gif/gifset_m/laser3p_4.gif
/imgs/gif/gifset_m/laser3p_40.gif
/imgs/gif/gifset_m/laser3p_5.gif
/imgs/gif/gifset_m/laser3p_50.gif
/imgs/gif/gifset_m/laser3p_6.gif
/imgs/gif/gifset_m/laser3p_7.gif
/imgs/gif/gifset_m/laser3p_70.gif
/imgs/gif/gifset_m/laser3p_8.gif
/imgs/gif/gifset_m/laser3p_80.gif
/imgs/gif/gifset_m/laser3p_9.gif
/imgs/gif/gifset_m/laser3p_90.gif
/imgs/gif/gifset_m/laser3q.gif
/imgs/gif/gifset_m/laser3q_1.gif
/imgs/gif/gifset_m/laser3q_10.gif
/imgs/gif/gifset_m/laser3q_100.gif
/imgs/gif/gifset_m/laser3q_2.gif
/imgs/gif/gifset_m/laser3q_20.gif
/imgs/gif/gifset_m/laser3q_3.gif
/imgs/gif/gifset_m/laser3q_30.gif
/imgs/gif/gifset_m/laser3q_4.gif
/imgs/gif/gifset_m/laser3q_40.gif
/imgs/gif/gifset_m/laser3q_5.gif
/imgs/gif/gifset_m/laser3q_50.gif
/imgs/gif/gifset_m/laser3q_6.gif
/imgs/gif/gifset_m/laser3q_7.gif
/imgs/gif/gifset_m/laser3q_70.gif
/imgs/gif/gifset_m/laser3q_8.gif
/imgs/gif/gifset_m/laser3q_80.gif
/imgs/gif/gifset_m/laser3q_9.gif
/imgs/gif/gifset_m/laser3q_90.gif
/imgs/gif/gifset_m/meterbars.gif
/imgs/gif/gifset_m/meterbarsb.gif
/imgs/gif/gifset_m/meterbarsb_1.gif
/imgs/gif/gifset_m/meterbarsb_10.gif
/imgs/gif/gifset_m/meterbarsb_100.gif
/imgs/gif/gifset_m/meterbarsb_2.gif
/imgs/gif/gifset_m/meterbarsb_20.gif
/imgs/gif/gifset_m/meterbarsb_3.gif
/imgs/gif/gifset_m/meterbarsb_30.gif
/imgs/gif/gifset_m/meterbarsb_4.gif
/imgs/gif/gifset_m/meterbarsb_40.gif
/imgs/gif/gifset_m/meterbarsb_5.gif
/imgs/gif/gifset_m/meterbarsb_50.gif
/imgs/gif/gifset_m/meterbarsb_6.gif
/imgs/gif/gifset_m/meterbarsb_7.gif
/imgs/gif/gifset_m/meterbarsb_70.gif
/imgs/gif/gifset_m/meterbarsb_8.gif
/imgs/gif/gifset_m/meterbarsb_80.gif
/imgs/gif/gifset_m/meterbarsb_9.gif
/imgs/gif/gifset_m/meterbarsb_90.gif
/imgs/gif/gifset_m/meterbarsd.gif
/imgs/gif/gifset_m/meterbarsd_1.gif
/imgs/gif/gifset_m/meterbarsd_10.gif
/imgs/gif/gifset_m/meterbarsd_100.gif
/imgs/gif/gifset_m/meterbarsd_2.gif
/imgs/gif/gifset_m/meterbarsd_20.gif
/imgs/gif/gifset_m/meterbarsd_3.gif
/imgs/gif/gifset_m/meterbarsd_30.gif
/imgs/gif/gifset_m/meterbarsd_4.gif
/imgs/gif/gifset_m/meterbarsd_40.gif
/imgs/gif/gifset_m/meterbarsd_5.gif
/imgs/gif/gifset_m/meterbarsd_50.gif
/imgs/gif/gifset_m/meterbarsd_6.gif
/imgs/gif/gifset_m/meterbarsd_7.gif
/imgs/gif/gifset_m/meterbarsd_70.gif
/imgs/gif/gifset_m/meterbarsd_8.gif
/imgs/gif/gifset_m/meterbarsd_80.gif
/imgs/gif/gifset_m/meterbarsd_9.gif
/imgs/gif/gifset_m/meterbarsd_90.gif
/imgs/gif/gifset_m/meterbarsp.gif
/imgs/gif/gifset_m/meterbarsp_1.gif
/imgs/gif/gifset_m/meterbarsp_10.gif
/imgs/gif/gifset_m/meterbarsp_100.gif
/imgs/gif/gifset_m/meterbarsp_2.gif
/imgs/gif/gifset_m/meterbarsp_20.gif
/imgs/gif/gifset_m/meterbarsp_3.gif
/imgs/gif/gifset_m/meterbarsp_30.gif
/imgs/gif/gifset_m/meterbarsp_4.gif
/imgs/gif/gifset_m/meterbarsp_40.gif
/imgs/gif/gifset_m/meterbarsp_5.gif
/imgs/gif/gifset_m/meterbarsp_50.gif
/imgs/gif/gifset_m/meterbarsp_6.gif
/imgs/gif/gifset_m/meterbarsp_7.gif
/imgs/gif/gifset_m/meterbarsp_70.gif
/imgs/gif/gifset_m/meterbarsp_8.gif
/imgs/gif/gifset_m/meterbarsp_80.gif
/imgs/gif/gifset_m/meterbarsp_9.gif
/imgs/gif/gifset_m/meterbarsp_90.gif
/imgs/gif/gifset_m/meterbarsq.gif
/imgs/gif/gifset_m/meterbarsq_1.gif
/imgs/gif/gifset_m/meterbarsq_10.gif
/imgs/gif/gifset_m/meterbarsq_100.gif
/imgs/gif/gifset_m/meterbarsq_2.gif
/imgs/gif/gifset_m/meterbarsq_20.gif
/imgs/gif/gifset_m/meterbarsq_3.gif
/imgs/gif/gifset_m/meterbarsq_30.gif
/imgs/gif/gifset_m/meterbarsq_4.gif
/imgs/gif/gifset_m/meterbarsq_40.gif
/imgs/gif/gifset_m/meterbarsq_5.gif
/imgs/gif/gifset_m/meterbarsq_50.gif
/imgs/gif/gifset_m/meterbarsq_6.gif
/imgs/gif/gifset_m/meterbarsq_7.gif
/imgs/gif/gifset_m/meterbarsq_70.gif
/imgs/gif/gifset_m/meterbarsq_8.gif
/imgs/gif/gifset_m/meterbarsq_80.gif
/imgs/gif/gifset_m/meterbarsq_9.gif
/imgs/gif/gifset_m/meterbarsq_90.gif
/imgs/gif/gifset_m/meterdots.gif
/imgs/gif/gifset_m/meterdotsb.gif
/imgs/gif/gifset_m/meterdotsb_1.gif
/imgs/gif/gifset_m/meterdotsb_10.gif
/imgs/gif/gifset_m/meterdotsb_100.gif
/imgs/gif/gifset_m/meterdotsb_2.gif
/imgs/gif/gifset_m/meterdotsb_20.gif
/imgs/gif/gifset_m/meterdotsb_3.gif
/imgs/gif/gifset_m/meterdotsb_30.gif
/imgs/gif/gifset_m/meterdotsb_4.gif
/imgs/gif/gifset_m/meterdotsb_40.gif
/imgs/gif/gifset_m/meterdotsb_5.gif
/imgs/gif/gifset_m/meterdotsb_50.gif
/imgs/gif/gifset_m/meterdotsb_6.gif
/imgs/gif/gifset_m/meterdotsb_7.gif
/imgs/gif/gifset_m/meterdotsb_70.gif
/imgs/gif/gifset_m/meterdotsb_8.gif
/imgs/gif/gifset_m/meterdotsb_80.gif
/imgs/gif/gifset_m/meterdotsb_9.gif
/imgs/gif/gifset_m/meterdotsb_90.gif
/imgs/gif/gifset_m/meterdotsd.gif
/imgs/gif/gifset_m/meterdotsd_1.gif
/imgs/gif/gifset_m/meterdotsd_10.gif
/imgs/gif/gifset_m/meterdotsd_100.gif
/imgs/gif/gifset_m/meterdotsd_2.gif
/imgs/gif/gifset_m/meterdotsd_20.gif
/imgs/gif/gifset_m/meterdotsd_3.gif
/imgs/gif/gifset_m/meterdotsd_30.gif
/imgs/gif/gifset_m/meterdotsd_4.gif
/imgs/gif/gifset_m/meterdotsd_40.gif
/imgs/gif/gifset_m/meterdotsd_5.gif
/imgs/gif/gifset_m/meterdotsd_50.gif
/imgs/gif/gifset_m/meterdotsd_6.gif
/imgs/gif/gifset_m/meterdotsd_7.gif
/imgs/gif/gifset_m/meterdotsd_70.gif
/imgs/gif/gifset_m/meterdotsd_8.gif
/imgs/gif/gifset_m/meterdotsd_80.gif
/imgs/gif/gifset_m/meterdotsd_9.gif
/imgs/gif/gifset_m/meterdotsd_90.gif
/imgs/gif/gifset_m/meterdotsp.gif
/imgs/gif/gifset_m/meterdotsp_1.gif
/imgs/gif/gifset_m/meterdotsp_10.gif
/imgs/gif/gifset_m/meterdotsp_100.gif
/imgs/gif/gifset_m/meterdotsp_2.gif
/imgs/gif/gifset_m/meterdotsp_20.gif
/imgs/gif/gifset_m/meterdotsp_3.gif
/imgs/gif/gifset_m/meterdotsp_30.gif
/imgs/gif/gifset_m/meterdotsp_4.gif
/imgs/gif/gifset_m/meterdotsp_40.gif
/imgs/gif/gifset_m/meterdotsp_5.gif
/imgs/gif/gifset_m/meterdotsp_50.gif
/imgs/gif/gifset_m/meterdotsp_6.gif
/imgs/gif/gifset_m/meterdotsp_7.gif
/imgs/gif/gifset_m/meterdotsp_70.gif
/imgs/gif/gifset_m/meterdotsp_8.gif
/imgs/gif/gifset_m/meterdotsp_80.gif
/imgs/gif/gifset_m/meterdotsp_9.gif
/imgs/gif/gifset_m/meterdotsp_90.gif
/imgs/gif/gifset_m/meterdotsq.gif
/imgs/gif/gifset_m/meterdotsq_1.gif
/imgs/gif/gifset_m/meterdotsq_10.gif
/imgs/gif/gifset_m/meterdotsq_100.gif
/imgs/gif/gifset_m/meterdotsq_2.gif
/imgs/gif/gifset_m/meterdotsq_20.gif
/imgs/gif/gifset_m/meterdotsq_3.gif
/imgs/gif/gifset_m/meterdotsq_30.gif
/imgs/gif/gifset_m/meterdotsq_4.gif
/imgs/gif/gifset_m/meterdotsq_40.gif
/imgs/gif/gifset_m/meterdotsq_5.gif
/imgs/gif/gifset_m/meterdotsq_50.gif
/imgs/gif/gifset_m/meterdotsq_6.gif
/imgs/gif/gifset_m/meterdotsq_7.gif
/imgs/gif/gifset_m/meterdotsq_70.gif
/imgs/gif/gifset_m/meterdotsq_8.gif
/imgs/gif/gifset_m/meterdotsq_80.gif
/imgs/gif/gifset_m/meterdotsq_9.gif
/imgs/gif/gifset_m/meterdotsq_90.gif
/imgs/gif/gifset_r/firebubblesq_1.gif
/imgs/gif/gifset_r/firebubblesq_10.gif
/imgs/gif/gifset_r/firebubblesq_100.gif
/imgs/gif/gifset_r/firebubblesq_2.gif
/imgs/gif/gifset_r/firebubblesq_20.gif
/imgs/gif/gifset_r/firebubblesq_3.gif
/imgs/gif/gifset_r/firebubblesq_30.gif
/imgs/gif/gifset_r/firebubblesq_4.gif
/imgs/gif/gifset_r/firebubblesq_40.gif
/imgs/gif/gifset_r/firebubblesq_5.gif
/imgs/gif/gifset_r/firebubblesq_50.gif
/imgs/gif/gifset_r/firebubblesq_6.gif
/imgs/gif/gifset_r/firebubblesq_7.gif
/imgs/gif/gifset_r/firebubblesq_70.gif
/imgs/gif/gifset_r/firebubblesq_8.gif
/imgs/gif/gifset_r/firebubblesq_80.gif
/imgs/gif/gifset_r/firebubblesq_9.gif
/imgs/gif/gifset_r/firebubblesq_90.gif
/imgs/gif/gifset_r/penny.gif
/imgs/gif/gifset_r/pennyb.gif
/imgs/gif/gifset_r/pennyb_1.gif
/imgs/gif/gifset_r/pennyb_10.gif
/imgs/gif/gifset_r/pennyb_100.gif
/imgs/gif/gifset_r/pennyb_2.gif
/imgs/gif/gifset_r/pennyb_20.gif
/imgs/gif/gifset_r/pennyb_3.gif
/imgs/gif/gifset_r/pennyb_30.gif
/imgs/gif/gifset_r/pennyb_4.gif
/imgs/gif/gifset_r/pennyb_40.gif
/imgs/gif/gifset_r/pennyb_5.gif
/imgs/gif/gifset_r/pennyb_50.gif
/imgs/gif/gifset_r/pennyb_6.gif
/imgs/gif/gifset_r/pennyb_7.gif
/imgs/gif/gifset_r/pennyb_70.gif
/imgs/gif/gifset_r/pennyb_8.gif
/imgs/gif/gifset_r/pennyb_80.gif
/imgs/gif/gifset_r/pennyb_9.gif
/imgs/gif/gifset_r/pennyb_90.gif
/imgs/gif/gifset_r/pennyd.gif
/imgs/gif/gifset_r/pennyd_1.gif
/imgs/gif/gifset_r/pennyd_10.gif
/imgs/gif/gifset_r/pennyd_100.gif
/imgs/gif/gifset_r/pennyd_2.gif
/imgs/gif/gifset_r/pennyd_20.gif
/imgs/gif/gifset_r/pennyd_3.gif
/imgs/gif/gifset_r/pennyd_30.gif
/imgs/gif/gifset_r/pennyd_4.gif
/imgs/gif/gifset_r/pennyd_40.gif
/imgs/gif/gifset_r/pennyd_5.gif
/imgs/gif/gifset_r/pennyd_50.gif
/imgs/gif/gifset_r/pennyd_6.gif
/imgs/gif/gifset_r/pennyd_7.gif
/imgs/gif/gifset_r/pennyd_70.gif
/imgs/gif/gifset_r/pennyd_8.gif
/imgs/gif/gifset_r/pennyd_80.gif
/imgs/gif/gifset_r/pennyd_9.gif
/imgs/gif/gifset_r/pennyd_90.gif
/imgs/gif/gifset_r/pennyp.gif
/imgs/gif/gifset_r/pennyp_1.gif
/imgs/gif/gifset_r/pennyp_10.gif
/imgs/gif/gifset_r/pennyp_100.gif
/imgs/gif/gifset_r/pennyp_2.gif
/imgs/gif/gifset_r/pennyp_20.gif
/imgs/gif/gifset_r/pennyp_3.gif
/imgs/gif/gifset_r/pennyp_30.gif
/imgs/gif/gifset_r/pennyp_4.gif
/imgs/gif/gifset_r/pennyp_40.gif
/imgs/gif/gifset_r/pennyp_5.gif
/imgs/gif/gifset_r/pennyp_50.gif
/imgs/gif/gifset_r/pennyp_6.gif
/imgs/gif/gifset_r/pennyp_7.gif
/imgs/gif/gifset_r/pennyp_70.gif
/imgs/gif/gifset_r/pennyp_8.gif
/imgs/gif/gifset_r/pennyp_80.gif
/imgs/gif/gifset_r/pennyp_9.gif
/imgs/gif/gifset_r/pennyp_90.gif
/imgs/gif/gifset_r/pennyq.gif
/imgs/gif/gifset_r/pennyq_1.gif
/imgs/gif/gifset_r/pennyq_10.gif
/imgs/gif/gifset_r/pennyq_100.gif
/imgs/gif/gifset_r/pennyq_2.gif
/imgs/gif/gifset_r/pennyq_20.gif
/imgs/gif/gifset_r/pennyq_3.gif
/imgs/gif/gifset_r/pennyq_30.gif
/imgs/gif/gifset_r/pennyq_4.gif
/imgs/gif/gifset_r/pennyq_40.gif
/imgs/gif/gifset_r/pennyq_5.gif
/imgs/gif/gifset_r/pennyq_50.gif
/imgs/gif/gifset_r/pennyq_6.gif
/imgs/gif/gifset_r/pennyq_7.gif
/imgs/gif/gifset_r/pennyq_70.gif
/imgs/gif/gifset_r/pennyq_8.gif
/imgs/gif/gifset_r/pennyq_80.gif
/imgs/gif/gifset_r/pennyq_9.gif
/imgs/gif/gifset_r/pennyq_90.gif
/imgs/gif/gifset_r/ringsb_1.gif
/imgs/gif/gifset_r/ringsb_10.gif
/imgs/gif/gifset_r/ringsb_100.gif
/imgs/gif/gifset_r/ringsb_2.gif
/imgs/gif/gifset_r/ringsb_20.gif
/imgs/gif/gifset_r/ringsb_3.gif
/imgs/gif/gifset_r/ringsb_30.gif
/imgs/gif/gifset_r/ringsb_4.gif
/imgs/gif/gifset_r/ringsb_40.gif
/imgs/gif/gifset_r/ringsb_5.gif
/imgs/gif/gifset_r/ringsb_50.gif
/imgs/gif/gifset_r/ringsb_6.gif
/imgs/gif/gifset_r/ringsb_7.gif
/imgs/gif/gifset_r/ringsb_70.gif
/imgs/gif/gifset_r/ringsb_8.gif
/imgs/gif/gifset_r/ringsb_80.gif
/imgs/gif/gifset_r/ringsb_9.gif
/imgs/gif/gifset_r/ringsb_90.gif
/imgs/gif/gifset_r/ringsd_1.gif
/imgs/gif/gifset_r/ringsd_10.gif
/imgs/gif/gifset_r/ringsd_100.gif
/imgs/gif/gifset_r/ringsd_2.gif
/imgs/gif/gifset_r/ringsd_20.gif
/imgs/gif/gifset_r/ringsd_3.gif
/imgs/gif/gifset_r/ringsd_30.gif
/imgs/gif/gifset_r/ringsd_4.gif
/imgs/gif/gifset_r/ringsd_40.gif
/imgs/gif/gifset_r/ringsd_5.gif
/imgs/gif/gifset_r/ringsd_50.gif
/imgs/gif/gifset_r/ringsd_6.gif
/imgs/gif/gifset_r/ringsd_7.gif
/imgs/gif/gifset_r/ringsd_70.gif
/imgs/gif/gifset_r/ringsd_8.gif
/imgs/gif/gifset_r/ringsd_80.gif
/imgs/gif/gifset_r/ringsd_9.gif
/imgs/gif/gifset_r/ringsd_90.gif
/imgs/gif/gifset_r/ringsp_1.gif
/imgs/gif/gifset_r/ringsp_10.gif
/imgs/gif/gifset_r/ringsp_100.gif
/imgs/gif/gifset_r/ringsp_2.gif
/imgs/gif/gifset_r/ringsp_20.gif
/imgs/gif/gifset_r/ringsp_3.gif
/imgs/gif/gifset_r/ringsp_30.gif
/imgs/gif/gifset_r/ringsp_4.gif
/imgs/gif/gifset_r/ringsp_40.gif
/imgs/gif/gifset_r/ringsp_5.gif
/imgs/gif/gifset_r/ringsp_50.gif
/imgs/gif/gifset_r/ringsp_6.gif
/imgs/gif/gifset_r/ringsp_7.gif
/imgs/gif/gifset_r/ringsp_70.gif
/imgs/gif/gifset_r/ringsp_8.gif
/imgs/gif/gifset_r/ringsp_80.gif
/imgs/gif/gifset_r/ringsp_9.gif
/imgs/gif/gifset_r/ringsp_90.gif
/imgs/gif/gifset_r/ringsq_1.gif
/imgs/gif/gifset_r/ringsq_10.gif
/imgs/gif/gifset_r/ringsq_100.gif
/imgs/gif/gifset_r/ringsq_2.gif
/imgs/gif/gifset_r/ringsq_20.gif
/imgs/gif/gifset_r/ringsq_3.gif
/imgs/gif/gifset_r/ringsq_30.gif
/imgs/gif/gifset_r/ringsq_4.gif
/imgs/gif/gifset_r/ringsq_40.gif
/imgs/gif/gifset_r/ringsq_5.gif
/imgs/gif/gifset_r/ringsq_50.gif
/imgs/gif/gifset_r/ringsq_6.gif
/imgs/gif/gifset_r/ringsq_7.gif
/imgs/gif/gifset_r/ringsq_70.gif
/imgs/gif/gifset_r/ringsq_8.gif
/imgs/gif/gifset_r/ringsq_80.gif
/imgs/gif/gifset_r/ringsq_9.gif
/imgs/gif/gifset_r/ringsq_90.gif
/imgs/gif/gifset_r/rotate.gif
/imgs/gif/gifset_r/rotateb.gif
/imgs/gif/gifset_r/rotateb_1.gif
/imgs/gif/gifset_r/rotateb_10.gif
/imgs/gif/gifset_r/rotateb_100.gif
/imgs/gif/gifset_r/rotateb_2.gif
/imgs/gif/gifset_r/rotateb_20.gif
/imgs/gif/gifset_r/rotateb_3.gif
/imgs/gif/gifset_r/rotateb_30.gif
/imgs/gif/gifset_r/rotateb_4.gif
/imgs/gif/gifset_r/rotateb_40.gif
/imgs/gif/gifset_r/rotateb_5.gif
/imgs/gif/gifset_r/rotateb_50.gif
/imgs/gif/gifset_r/rotateb_6.gif
/imgs/gif/gifset_r/rotateb_7.gif
/imgs/gif/gifset_r/rotateb_70.gif
/imgs/gif/gifset_r/rotateb_8.gif
/imgs/gif/gifset_r/rotateb_80.gif
/imgs/gif/gifset_r/rotateb_9.gif
/imgs/gif/gifset_r/rotateb_90.gif
/imgs/gif/gifset_r/rotated.gif
/imgs/gif/gifset_r/rotated_1.gif
/imgs/gif/gifset_r/rotated_10.gif
/imgs/gif/gifset_r/rotated_100.gif
/imgs/gif/gifset_r/rotated_2.gif
/imgs/gif/gifset_r/rotated_20.gif
/imgs/gif/gifset_r/rotated_3.gif
/imgs/gif/gifset_r/rotated_30.gif
/imgs/gif/gifset_r/rotated_4.gif
/imgs/gif/gifset_r/rotated_40.gif
/imgs/gif/gifset_r/rotated_5.gif
/imgs/gif/gifset_r/rotated_50.gif
/imgs/gif/gifset_r/rotated_6.gif
/imgs/gif/gifset_r/rotated_7.gif
/imgs/gif/gifset_r/rotated_70.gif
/imgs/gif/gifset_r/rotated_8.gif
/imgs/gif/gifset_r/rotated_80.gif
/imgs/gif/gifset_r/rotated_9.gif
/imgs/gif/gifset_r/rotated_90.gif
/imgs/gif/gifset_r/rotatep.gif
/imgs/gif/gifset_r/rotatep_1.gif
/imgs/gif/gifset_r/rotatep_10.gif
/imgs/gif/gifset_r/rotatep_100.gif
/imgs/gif/gifset_r/rotatep_2.gif
/imgs/gif/gifset_r/rotatep_20.gif
/imgs/gif/gifset_r/rotatep_3.gif
/imgs/gif/gifset_r/rotatep_30.gif
/imgs/gif/gifset_r/rotatep_4.gif
/imgs/gif/gifset_r/rotatep_40.gif
/imgs/gif/gifset_r/rotatep_5.gif
/imgs/gif/gifset_r/rotatep_50.gif
/imgs/gif/gifset_r/rotatep_6.gif
/imgs/gif/gifset_r/rotatep_7.gif
/imgs/gif/gifset_r/rotatep_70.gif
/imgs/gif/gifset_r/rotatep_8.gif
/imgs/gif/gifset_r/rotatep_80.gif
/imgs/gif/gifset_r/rotatep_9.gif
/imgs/gif/gifset_r/rotatep_90.gif
/imgs/gif/gifset_r/rotateq.gif
/imgs/gif/gifset_r/rotateq_1.gif
/imgs/gif/gifset_r/rotateq_10.gif
/imgs/gif/gifset_r/rotateq_100.gif
/imgs/gif/gifset_r/rotateq_2.gif
/imgs/gif/gifset_r/rotateq_20.gif
/imgs/gif/gifset_r/rotateq_3.gif
/imgs/gif/gifset_r/rotateq_30.gif
/imgs/gif/gifset_r/rotateq_4.gif
/imgs/gif/gifset_r/rotateq_40.gif
/imgs/gif/gifset_r/rotateq_5.gif
/imgs/gif/gifset_r/rotateq_50.gif
/imgs/gif/gifset_r/rotateq_6.gif
/imgs/gif/gifset_r/rotateq_7.gif
/imgs/gif/gifset_r/rotateq_70.gif
/imgs/gif/gifset_r/rotateq_8.gif
/imgs/gif/gifset_r/rotateq_80.gif
/imgs/gif/gifset_r/rotateq_9.gif
/imgs/gif/gifset_r/rotateq_90.gif
/imgs/gif/gifset_t/soccorball.gif
/imgs/gif/gifset_t/soccorballb.gif
/imgs/gif/gifset_t/soccorballb_1.gif
/imgs/gif/gifset_t/soccorballb_10.gif
/imgs/gif/gifset_t/soccorballb_100.gif
/imgs/gif/gifset_t/soccorballb_2.gif
/imgs/gif/gifset_t/soccorballb_20.gif
/imgs/gif/gifset_t/soccorballb_3.gif
/imgs/gif/gifset_t/soccorballb_30.gif
/imgs/gif/gifset_t/soccorballb_4.gif
/imgs/gif/gifset_t/soccorballb_40.gif
/imgs/gif/gifset_t/soccorballb_5.gif
/imgs/gif/gifset_t/soccorballb_50.gif
/imgs/gif/gifset_t/soccorballb_6.gif
/imgs/gif/gifset_t/soccorballb_7.gif
/imgs/gif/gifset_t/soccorballb_70.gif
/imgs/gif/gifset_t/soccorballb_8.gif
/imgs/gif/gifset_t/soccorballb_80.gif
/imgs/gif/gifset_t/soccorballb_9.gif
/imgs/gif/gifset_t/soccorballb_90.gif
/imgs/gif/gifset_t/soccorballd.gif
/imgs/gif/gifset_t/soccorballd_1.gif
/imgs/gif/gifset_t/soccorballd_10.gif
/imgs/gif/gifset_t/soccorballd_100.gif
/imgs/gif/gifset_t/soccorballd_2.gif
/imgs/gif/gifset_t/soccorballd_20.gif
/imgs/gif/gifset_t/soccorballd_3.gif
/imgs/gif/gifset_t/soccorballd_30.gif
/imgs/gif/gifset_t/soccorballd_4.gif
/imgs/gif/gifset_t/soccorballd_40.gif
/imgs/gif/gifset_t/soccorballd_5.gif
/imgs/gif/gifset_t/soccorballd_50.gif
/imgs/gif/gifset_t/soccorballd_6.gif
/imgs/gif/gifset_t/soccorballd_7.gif
/imgs/gif/gifset_t/soccorballd_70.gif
/imgs/gif/gifset_t/soccorballd_8.gif
/imgs/gif/gifset_t/soccorballd_80.gif
/imgs/gif/gifset_t/soccorballd_9.gif
/imgs/gif/gifset_t/soccorballd_90.gif
/imgs/gif/gifset_t/soccorballp.gif
/imgs/gif/gifset_t/soccorballp_1.gif
/imgs/gif/gifset_t/soccorballp_10.gif
/imgs/gif/gifset_t/soccorballp_100.gif
/imgs/gif/gifset_t/soccorballp_2.gif
/imgs/gif/gifset_t/soccorballp_20.gif
/imgs/gif/gifset_t/soccorballp_3.gif
/imgs/gif/gifset_t/soccorballp_30.gif
/imgs/gif/gifset_t/soccorballp_4.gif
/imgs/gif/gifset_t/soccorballp_40.gif
/imgs/gif/gifset_t/soccorballp_5.gif
/imgs/gif/gifset_t/soccorballp_50.gif
/imgs/gif/gifset_t/soccorballp_6.gif
/imgs/gif/gifset_t/soccorballp_7.gif
/imgs/gif/gifset_t/soccorballp_70.gif
/imgs/gif/gifset_t/soccorballp_8.gif
/imgs/gif/gifset_t/soccorballp_80.gif
/imgs/gif/gifset_t/soccorballp_9.gif
/imgs/gif/gifset_t/soccorballp_90.gif
/imgs/gif/gifset_t/soccorballq.gif
/imgs/gif/gifset_t/soccorballq_1.gif
/imgs/gif/gifset_t/soccorballq_10.gif
/imgs/gif/gifset_t/soccorballq_100.gif
/imgs/gif/gifset_t/soccorballq_2.gif
/imgs/gif/gifset_t/soccorballq_20.gif
/imgs/gif/gifset_t/soccorballq_3.gif
/imgs/gif/gifset_t/soccorballq_30.gif
/imgs/gif/gifset_t/soccorballq_4.gif
/imgs/gif/gifset_t/soccorballq_40.gif
/imgs/gif/gifset_t/soccorballq_5.gif
/imgs/gif/gifset_t/soccorballq_50.gif
/imgs/gif/gifset_t/soccorballq_6.gif
/imgs/gif/gifset_t/soccorballq_7.gif
/imgs/gif/gifset_t/soccorballq_70.gif
/imgs/gif/gifset_t/soccorballq_8.gif
/imgs/gif/gifset_t/soccorballq_80.gif
/imgs/gif/gifset_t/soccorballq_9.gif
/imgs/gif/gifset_t/soccorballq_90.gif
/imgs/gif/gifset_t/sun.gif
/imgs/gif/gifset_t/sunb.gif
/imgs/gif/gifset_t/sunb_1.gif
/imgs/gif/gifset_t/sunb_10.gif
/imgs/gif/gifset_t/sunb_100.gif
/imgs/gif/gifset_t/sunb_2.gif
/imgs/gif/gifset_t/sunb_20.gif
/imgs/gif/gifset_t/sunb_3.gif
/imgs/gif/gifset_t/sunb_30.gif
/imgs/gif/gifset_t/sunb_4.gif
/imgs/gif/gifset_t/sunb_40.gif
/imgs/gif/gifset_t/sunb_5.gif
/imgs/gif/gifset_t/sunb_50.gif
/imgs/gif/gifset_t/sunb_6.gif
/imgs/gif/gifset_t/sunb_7.gif
/imgs/gif/gifset_t/sunb_70.gif
/imgs/gif/gifset_t/sunb_8.gif
/imgs/gif/gifset_t/sunb_80.gif
/imgs/gif/gifset_t/sunb_9.gif
/imgs/gif/gifset_t/sunb_90.gif
/imgs/gif/gifset_t/sund.gif
/imgs/gif/gifset_t/sund_1.gif
/imgs/gif/gifset_t/sund_10.gif
/imgs/gif/gifset_t/sund_100.gif
/imgs/gif/gifset_t/sund_2.gif
/imgs/gif/gifset_t/sund_20.gif
/imgs/gif/gifset_t/sund_3.gif
/imgs/gif/gifset_t/sund_30.gif
/imgs/gif/gifset_t/sund_4.gif
/imgs/gif/gifset_t/sund_40.gif
/imgs/gif/gifset_t/sund_5.gif
/imgs/gif/gifset_t/sund_50.gif
/imgs/gif/gifset_t/sund_6.gif
/imgs/gif/gifset_t/sund_7.gif
/imgs/gif/gifset_t/sund_70.gif
/imgs/gif/gifset_t/sund_8.gif
/imgs/gif/gifset_t/sund_80.gif
/imgs/gif/gifset_t/sund_9.gif
/imgs/gif/gifset_t/sund_90.gif
/imgs/gif/gifset_t/sunp.gif
/imgs/gif/gifset_t/sunp_1.gif
/imgs/gif/gifset_t/sunp_10.gif
/imgs/gif/gifset_t/sunp_100.gif
/imgs/gif/gifset_t/sunp_2.gif
/imgs/gif/gifset_t/sunp_20.gif
/imgs/gif/gifset_t/sunp_3.gif
/imgs/gif/gifset_t/sunp_30.gif
/imgs/gif/gifset_t/sunp_4.gif
/imgs/gif/gifset_t/sunp_40.gif
/imgs/gif/gifset_t/sunp_5.gif
/imgs/gif/gifset_t/sunp_50.gif
/imgs/gif/gifset_t/sunp_6.gif
/imgs/gif/gifset_t/sunp_7.gif
/imgs/gif/gifset_t/sunp_70.gif
/imgs/gif/gifset_t/sunp_8.gif
/imgs/gif/gifset_t/sunp_80.gif
/imgs/gif/gifset_t/sunp_9.gif
/imgs/gif/gifset_t/sunp_90.gif
/imgs/gif/gifset_t/sunq.gif
/imgs/gif/gifset_t/sunq_1.gif
/imgs/gif/gifset_t/sunq_10.gif
/imgs/gif/gifset_t/sunq_100.gif
/imgs/gif/gifset_t/sunq_2.gif
/imgs/gif/gifset_t/sunq_20.gif
/imgs/gif/gifset_t/sunq_3.gif
/imgs/gif/gifset_t/sunq_30.gif
/imgs/gif/gifset_t/sunq_4.gif
/imgs/gif/gifset_t/sunq_40.gif
/imgs/gif/gifset_t/sunq_5.gif
/imgs/gif/gifset_t/sunq_50.gif
/imgs/gif/gifset_t/sunq_6.gif
/imgs/gif/gifset_t/sunq_7.gif
/imgs/gif/gifset_t/sunq_70.gif
/imgs/gif/gifset_t/sunq_8.gif
/imgs/gif/gifset_t/sunq_80.gif
/imgs/gif/gifset_t/sunq_9.gif
/imgs/gif/gifset_t/sunq_90.gif
/imgs/gif/gifset_t/taz.gif
/imgs/gif/gifset_t/tazb.gif
/imgs/gif/gifset_t/tazb_1.gif
/imgs/gif/gifset_t/tazb_10.gif
/imgs/gif/gifset_t/tazb_100.gif
/imgs/gif/gifset_t/tazb_2.gif
/imgs/gif/gifset_t/tazb_20.gif
/imgs/gif/gifset_t/tazb_3.gif
/imgs/gif/gifset_t/tazb_30.gif
/imgs/gif/gifset_t/tazb_4.gif
/imgs/gif/gifset_t/tazb_40.gif
/imgs/gif/gifset_t/tazb_5.gif
/imgs/gif/gifset_t/tazb_50.gif
/imgs/gif/gifset_t/tazb_6.gif
/imgs/gif/gifset_t/tazb_7.gif
/imgs/gif/gifset_t/tazb_70.gif
/imgs/gif/gifset_t/tazb_8.gif
/imgs/gif/gifset_t/tazb_80.gif
/imgs/gif/gifset_t/tazb_9.gif
/imgs/gif/gifset_t/tazb_90.gif
/imgs/gif/gifset_t/tazd.gif
/imgs/gif/gifset_t/tazd_1.gif
/imgs/gif/gifset_t/tazd_10.gif
/imgs/gif/gifset_t/tazd_100.gif
/imgs/gif/gifset_t/tazd_2.gif
/imgs/gif/gifset_t/tazd_20.gif
/imgs/gif/gifset_t/tazd_3.gif
/imgs/gif/gifset_t/tazd_30.gif
/imgs/gif/gifset_t/tazd_4.gif
/imgs/gif/gifset_t/tazd_40.gif
/imgs/gif/gifset_t/tazd_5.gif
/imgs/gif/gifset_t/tazd_50.gif
/imgs/gif/gifset_t/tazd_6.gif
/imgs/gif/gifset_t/tazd_7.gif
/imgs/gif/gifset_t/tazd_70.gif
/imgs/gif/gifset_t/tazd_8.gif
/imgs/gif/gifset_t/tazd_80.gif
/imgs/gif/gifset_t/tazd_9.gif
/imgs/gif/gifset_t/tazd_90.gif
/imgs/gif/gifset_t/tazp.gif
/imgs/gif/gifset_t/tazp_1.gif
/imgs/gif/gifset_t/tazp_10.gif
/imgs/gif/gifset_t/tazp_100.gif
/imgs/gif/gifset_t/tazp_2.gif
/imgs/gif/gifset_t/tazp_20.gif
/imgs/gif/gifset_t/tazp_3.gif
/imgs/gif/gifset_t/tazp_30.gif
/imgs/gif/gifset_t/tazp_4.gif
/imgs/gif/gifset_t/tazp_40.gif
/imgs/gif/gifset_t/tazp_5.gif
/imgs/gif/gifset_t/tazp_50.gif
/imgs/gif/gifset_t/tazp_6.gif
/imgs/gif/gifset_t/tazp_7.gif
/imgs/gif/gifset_t/tazp_70.gif
/imgs/gif/gifset_t/tazp_8.gif
/imgs/gif/gifset_t/tazp_80.gif
/imgs/gif/gifset_t/tazp_9.gif
/imgs/gif/gifset_t/tazp_90.gif
/imgs/gif/gifset_t/tazq.gif
/imgs/gif/gifset_t/tazq_1.gif
/imgs/gif/gifset_t/tazq_10.gif
/imgs/gif/gifset_t/tazq_100.gif
/imgs/gif/gifset_t/tazq_2.gif
/imgs/gif/gifset_t/tazq_20.gif
/imgs/gif/gifset_t/tazq_3.gif
/imgs/gif/gifset_t/tazq_30.gif
/imgs/gif/gifset_t/tazq_4.gif
/imgs/gif/gifset_t/tazq_40.gif
/imgs/gif/gifset_t/tazq_5.gif
/imgs/gif/gifset_t/tazq_50.gif
/imgs/gif/gifset_t/tazq_6.gif
/imgs/gif/gifset_t/tazq_7.gif
/imgs/gif/gifset_t/tazq_70.gif
/imgs/gif/gifset_t/tazq_8.gif
/imgs/gif/gifset_t/tazq_80.gif
/imgs/gif/gifset_t/tazq_9.gif
/imgs/gif/gifset_t/tazq_90.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b1.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b1b.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b1b_1.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b1b_10.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b1b_100.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b1b_2.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b1b_20.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b1b_3.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b1b_30.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b1b_4.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b1b_40.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b1b_5.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b1b_50.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b1b_6.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b1b_7.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b1b_70.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b1b_8.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b1b_80.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b1b_9.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b1b_90.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b1d.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b1d_1.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b1d_10.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b1d_100.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b1d_2.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b1d_20.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b1d_3.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b1d_30.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b1d_4.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b1d_40.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b1d_5.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b1d_50.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b1d_6.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b1d_7.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b1d_70.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b1d_8.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b1d_80.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b1d_9.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b1d_90.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b1p.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b1p_1.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b1p_10.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b1p_100.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b1p_2.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b1p_20.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b1p_3.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b1p_30.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b1p_4.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b1p_40.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b1p_5.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b1p_50.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b1p_6.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b1p_7.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b1p_70.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b1p_8.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b1p_80.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b1p_9.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b1p_90.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b1q.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b1q_1.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b1q_10.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b1q_100.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b1q_2.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b1q_20.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b1q_3.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b1q_30.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b1q_4.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b1q_40.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b1q_5.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b1q_50.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b1q_6.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b1q_7.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b1q_70.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b1q_8.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b1q_80.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b1q_9.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b1q_90.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b2.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b2b.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b2b_1.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b2b_10.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b2b_100.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b2b_2.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b2b_20.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b2b_3.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b2b_30.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b2b_4.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b2b_40.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b2b_5.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b2b_50.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b2b_6.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b2b_7.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b2b_70.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b2b_8.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b2b_80.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b2b_9.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b2b_90.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b2d.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b2d_1.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b2d_10.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b2d_100.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b2d_2.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b2d_20.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b2d_3.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b2d_30.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b2d_4.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b2d_40.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b2d_5.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b2d_50.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b2d_6.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b2d_7.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b2d_70.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b2d_8.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b2d_80.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b2d_9.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b2d_90.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b2p.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b2p_1.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b2p_10.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b2p_100.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b2p_2.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b2p_20.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b2p_3.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b2p_30.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b2p_4.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b2p_40.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b2p_5.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b2p_50.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b2p_6.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b2p_7.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b2p_70.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b2p_8.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b2p_80.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b2p_9.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b2p_90.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b2q.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b2q_1.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b2q_10.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b2q_100.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b2q_2.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b2q_20.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b2q_3.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b2q_30.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b2q_4.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b2q_40.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b2q_5.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b2q_50.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b2q_6.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b2q_7.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b2q_70.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b2q_8.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b2q_80.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b2q_9.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b2q_90.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b3.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b3b.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b3b_1.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b3b_10.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b3b_100.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b3b_2.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b3b_20.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b3b_3.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b3b_30.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b3b_4.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b3b_40.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b3b_5.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b3b_50.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b3b_6.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b3b_7.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b3b_70.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b3b_8.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b3b_80.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b3b_9.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b3b_90.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b3d.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b3d_1.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b3d_10.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b3d_100.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b3d_2.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b3d_20.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b3d_3.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b3d_30.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b3d_4.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b3d_40.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b3d_5.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b3d_50.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b3d_6.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b3d_7.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b3d_70.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b3d_8.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b3d_80.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b3d_9.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b3d_90.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b3p.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b3p_1.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b3p_10.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b3p_100.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b3p_2.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b3p_20.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b3p_3.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b3p_30.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b3p_4.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b3p_40.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b3p_5.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b3p_50.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b3p_6.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b3p_7.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b3p_70.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b3p_8.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b3p_80.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b3p_9.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b3p_90.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b3q.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b3q_1.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b3q_10.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b3q_100.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b3q_2.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b3q_20.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b3q_3.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b3q_30.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b3q_4.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b3q_40.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b3q_5.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b3q_50.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b3q_6.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b3q_7.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b3q_70.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b3q_8.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b3q_80.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b3q_9.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_b3q_90.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_kick.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_kickb.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_kickb_1.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_kickb_10.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_kickb_100.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_kickb_2.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_kickb_20.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_kickb_3.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_kickb_30.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_kickb_4.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_kickb_40.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_kickb_5.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_kickb_50.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_kickb_6.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_kickb_7.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_kickb_70.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_kickb_8.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_kickb_80.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_kickb_9.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_kickb_90.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_kickd.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_kickd_1.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_kickd_10.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_kickd_100.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_kickd_2.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_kickd_20.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_kickd_3.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_kickd_30.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_kickd_4.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_kickd_40.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_kickd_5.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_kickd_50.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_kickd_6.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_kickd_7.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_kickd_70.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_kickd_8.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_kickd_80.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_kickd_9.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_kickd_90.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_kickp.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_kickp_1.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_kickp_10.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_kickp_100.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_kickp_2.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_kickp_20.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_kickp_3.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_kickp_30.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_kickp_4.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_kickp_40.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_kickp_5.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_kickp_50.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_kickp_6.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_kickp_7.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_kickp_70.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_kickp_8.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_kickp_80.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_kickp_9.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_kickp_90.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_kickq.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_kickq_1.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_kickq_10.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_kickq_100.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_kickq_2.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_kickq_20.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_kickq_3.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_kickq_30.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_kickq_4.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_kickq_40.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_kickq_5.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_kickq_50.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_kickq_6.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_kickq_7.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_kickq_70.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_kickq_8.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_kickq_80.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_kickq_9.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_kickq_90.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_l.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_lb.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_lb_1.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_lb_10.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_lb_100.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_lb_2.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_lb_20.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_lb_3.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_lb_30.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_lb_4.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_lb_40.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_lb_5.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_lb_50.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_lb_6.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_lb_7.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_lb_70.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_lb_8.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_lb_80.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_lb_9.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_lb_90.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_ld.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_ld_1.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_ld_10.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_ld_100.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_ld_2.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_ld_20.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_ld_3.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_ld_30.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_ld_4.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_ld_40.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_ld_5.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_ld_50.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_ld_6.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_ld_7.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_ld_70.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_ld_8.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_ld_80.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_ld_9.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_ld_90.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_lp.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_lp_1.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_lp_10.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_lp_100.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_lp_2.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_lp_20.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_lp_3.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_lp_30.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_lp_4.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_lp_40.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_lp_5.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_lp_50.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_lp_6.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_lp_7.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_lp_70.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_lp_8.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_lp_80.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_lp_9.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_lp_90.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_lq.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_lq_1.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_lq_10.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_lq_100.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_lq_2.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_lq_20.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_lq_3.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_lq_30.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_lq_4.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_lq_40.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_lq_5.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_lq_50.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_lq_6.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_lq_7.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_lq_70.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_lq_8.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_lq_80.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_lq_9.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_lq_90.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w2.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w2b.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w2b_1.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w2b_10.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w2b_100.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w2b_2.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w2b_20.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w2b_3.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w2b_30.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w2b_4.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w2b_40.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w2b_5.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w2b_50.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w2b_6.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w2b_7.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w2b_70.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w2b_8.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w2b_80.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w2b_9.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w2b_90.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w2d.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w2d_1.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w2d_10.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w2d_100.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w2d_2.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w2d_20.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w2d_3.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w2d_30.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w2d_4.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w2d_40.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w2d_5.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w2d_50.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w2d_6.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w2d_7.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w2d_70.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w2d_8.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w2d_80.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w2d_9.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w2d_90.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w2p.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w2p_1.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w2p_10.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w2p_100.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w2p_2.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w2p_20.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w2p_3.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w2p_30.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w2p_4.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w2p_40.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w2p_5.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w2p_50.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w2p_6.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w2p_7.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w2p_70.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w2p_8.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w2p_80.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w2p_9.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w2p_90.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w2q.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w2q_1.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w2q_10.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w2q_100.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w2q_2.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w2q_20.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w2q_3.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w2q_30.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w2q_4.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w2q_40.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w2q_5.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w2q_50.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w2q_6.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w2q_7.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w2q_70.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w2q_8.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w2q_80.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w2q_9.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w2q_90.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w3.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w3b.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w3b_1.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w3b_10.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w3b_100.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w3b_2.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w3b_20.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w3b_3.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w3b_30.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w3b_4.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w3b_40.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w3b_5.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w3b_50.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w3b_6.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w3b_7.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w3b_70.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w3b_8.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w3b_80.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w3b_9.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w3b_90.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w3d.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w3d_1.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w3d_10.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w3d_100.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w3d_2.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w3d_20.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w3d_3.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w3d_30.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w3d_4.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w3d_40.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w3d_5.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w3d_50.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w3d_6.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w3d_7.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w3d_70.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w3d_8.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w3d_80.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w3d_9.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w3d_90.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w3p.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w3p_1.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w3p_10.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w3p_100.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w3p_2.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w3p_20.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w3p_3.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w3p_30.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w3p_4.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w3p_40.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w3p_5.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w3p_50.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w3p_6.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w3p_7.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w3p_70.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w3p_8.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w3p_80.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w3p_9.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w3p_90.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w3q.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w3q_1.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w3q_10.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w3q_100.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w3q_2.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w3q_20.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w3q_3.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w3q_30.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w3q_4.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w3q_40.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w3q_5.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w3q_50.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w3q_6.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w3q_7.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w3q_70.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w3q_8.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w3q_80.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w3q_9.gif
/imgs/gif/gifset_trcx/trcx_sxygirl_w3q_90.gif
/imgs/gif/gifset_trcx/trcx_szygirl_b4.gif
/imgs/gif/gifset_trcx/trcx_szygirl_b4b.gif
/imgs/gif/gifset_trcx/trcx_szygirl_b4b_1.gif
/imgs/gif/gifset_trcx/trcx_szygirl_b4b_10.gif
/imgs/gif/gifset_trcx/trcx_szygirl_b4b_100.gif
/imgs/gif/gifset_trcx/trcx_szygirl_b4b_2.gif
/imgs/gif/gifset_trcx/trcx_szygirl_b4b_20.gif
/imgs/gif/gifset_trcx/trcx_szygirl_b4b_3.gif
/imgs/gif/gifset_trcx/trcx_szygirl_b4b_30.gif
/imgs/gif/gifset_trcx/trcx_szygirl_b4b_4.gif
/imgs/gif/gifset_trcx/trcx_szygirl_b4b_40.gif
/imgs/gif/gifset_trcx/trcx_szygirl_b4b_5.gif
/imgs/gif/gifset_trcx/trcx_szygirl_b4b_50.gif
/imgs/gif/gifset_trcx/trcx_szygirl_b4b_6.gif
/imgs/gif/gifset_trcx/trcx_szygirl_b4b_7.gif
/imgs/gif/gifset_trcx/trcx_szygirl_b4b_70.gif
/imgs/gif/gifset_trcx/trcx_szygirl_b4b_8.gif
/imgs/gif/gifset_trcx/trcx_szygirl_b4b_80.gif
/imgs/gif/gifset_trcx/trcx_szygirl_b4b_9.gif
/imgs/gif/gifset_trcx/trcx_szygirl_b4b_90.gif
/imgs/gif/gifset_trcx/trcx_szygirl_b4d.gif
/imgs/gif/gifset_trcx/trcx_szygirl_b4d_1.gif
/imgs/gif/gifset_trcx/trcx_szygirl_b4d_10.gif
/imgs/gif/gifset_trcx/trcx_szygirl_b4d_100.gif
/imgs/gif/gifset_trcx/trcx_szygirl_b4d_2.gif
/imgs/gif/gifset_trcx/trcx_szygirl_b4d_20.gif
/imgs/gif/gifset_trcx/trcx_szygirl_b4d_3.gif
/imgs/gif/gifset_trcx/trcx_szygirl_b4d_30.gif
/imgs/gif/gifset_trcx/trcx_szygirl_b4d_4.gif
/imgs/gif/gifset_trcx/trcx_szygirl_b4d_40.gif
/imgs/gif/gifset_trcx/trcx_szygirl_b4d_5.gif
/imgs/gif/gifset_trcx/trcx_szygirl_b4d_50.gif
/imgs/gif/gifset_trcx/trcx_szygirl_b4d_6.gif
/imgs/gif/gifset_trcx/trcx_szygirl_b4d_7.gif
/imgs/gif/gifset_trcx/trcx_szygirl_b4d_70.gif
/imgs/gif/gifset_trcx/trcx_szygirl_b4d_8.gif
/imgs/gif/gifset_trcx/trcx_szygirl_b4d_80.gif
/imgs/gif/gifset_trcx/trcx_szygirl_b4d_9.gif
/imgs/gif/gifset_trcx/trcx_szygirl_b4d_90.gif
/imgs/gif/gifset_trcx/trcx_szygirl_b4p.gif
/imgs/gif/gifset_trcx/trcx_szygirl_b4p_1.gif
/imgs/gif/gifset_trcx/trcx_szygirl_b4p_10.gif
/imgs/gif/gifset_trcx/trcx_szygirl_b4p_100.gif
/imgs/gif/gifset_trcx/trcx_szygirl_b4p_2.gif
/imgs/gif/gifset_trcx/trcx_szygirl_b4p_20.gif
/imgs/gif/gifset_trcx/trcx_szygirl_b4p_3.gif
/imgs/gif/gifset_trcx/trcx_szygirl_b4p_30.gif
/imgs/gif/gifset_trcx/trcx_szygirl_b4p_4.gif
/imgs/gif/gifset_trcx/trcx_szygirl_b4p_40.gif
/imgs/gif/gifset_trcx/trcx_szygirl_b4p_5.gif
/imgs/gif/gifset_trcx/trcx_szygirl_b4p_50.gif
/imgs/gif/gifset_trcx/trcx_szygirl_b4p_6.gif
/imgs/gif/gifset_trcx/trcx_szygirl_b4p_7.gif
/imgs/gif/gifset_trcx/trcx_szygirl_b4p_70.gif
/imgs/gif/gifset_trcx/trcx_szygirl_b4p_8.gif
/imgs/gif/gifset_trcx/trcx_szygirl_b4p_80.gif
/imgs/gif/gifset_trcx/trcx_szygirl_b4p_9.gif
/imgs/gif/gifset_trcx/trcx_szygirl_b4p_90.gif
/imgs/gif/gifset_trcx/trcx_szygirl_b4q.gif
/imgs/gif/gifset_trcx/trcx_szygirl_b4q_1.gif
/imgs/gif/gifset_trcx/trcx_szygirl_b4q_10.gif
/imgs/gif/gifset_trcx/trcx_szygirl_b4q_100.gif
/imgs/gif/gifset_trcx/trcx_szygirl_b4q_2.gif
/imgs/gif/gifset_trcx/trcx_szygirl_b4q_20.gif
/imgs/gif/gifset_trcx/trcx_szygirl_b4q_3.gif
/imgs/gif/gifset_trcx/trcx_szygirl_b4q_30.gif
/imgs/gif/gifset_trcx/trcx_szygirl_b4q_4.gif
/imgs/gif/gifset_trcx/trcx_szygirl_b4q_40.gif
/imgs/gif/gifset_trcx/trcx_szygirl_b4q_5.gif
/imgs/gif/gifset_trcx/trcx_szygirl_b4q_50.gif
/imgs/gif/gifset_trcx/trcx_szygirl_b4q_6.gif
/imgs/gif/gifset_trcx/trcx_szygirl_b4q_7.gif
/imgs/gif/gifset_trcx/trcx_szygirl_b4q_70.gif
/imgs/gif/gifset_trcx/trcx_szygirl_b4q_8.gif
/imgs/gif/gifset_trcx/trcx_szygirl_b4q_80.gif
/imgs/gif/gifset_trcx/trcx_szygirl_b4q_9.gif
/imgs/gif/gifset_trcx/trcx_szygirl_b4q_90.gif
/imgs/gif/gifset_w/trophy.gif
/imgs/gif/gifset_w/trophyb.gif
/imgs/gif/gifset_w/trophyb_1.gif
/imgs/gif/gifset_w/trophyb_10.gif
/imgs/gif/gifset_w/trophyb_100.gif
/imgs/gif/gifset_w/trophyb_2.gif
/imgs/gif/gifset_w/trophyb_20.gif
/imgs/gif/gifset_w/trophyb_3.gif
/imgs/gif/gifset_w/trophyb_30.gif
/imgs/gif/gifset_w/trophyb_4.gif
/imgs/gif/gifset_w/trophyb_40.gif
/imgs/gif/gifset_w/trophyb_5.gif
/imgs/gif/gifset_w/trophyb_50.gif
/imgs/gif/gifset_w/trophyb_6.gif
/imgs/gif/gifset_w/trophyb_7.gif
/imgs/gif/gifset_w/trophyb_70.gif
/imgs/gif/gifset_w/trophyb_8.gif
/imgs/gif/gifset_w/trophyb_80.gif
/imgs/gif/gifset_w/trophyb_9.gif
/imgs/gif/gifset_w/trophyb_90.gif
/imgs/gif/gifset_w/trophyd.gif
/imgs/gif/gifset_w/trophyd_1.gif
/imgs/gif/gifset_w/trophyd_10.gif
/imgs/gif/gifset_w/trophyd_100.gif
/imgs/gif/gifset_w/trophyd_2.gif
/imgs/gif/gifset_w/trophyd_20.gif
/imgs/gif/gifset_w/trophyd_3.gif
/imgs/gif/gifset_w/trophyd_30.gif
/imgs/gif/gifset_w/trophyd_4.gif
/imgs/gif/gifset_w/trophyd_40.gif
/imgs/gif/gifset_w/trophyd_5.gif
/imgs/gif/gifset_w/trophyd_50.gif
/imgs/gif/gifset_w/trophyd_6.gif
/imgs/gif/gifset_w/trophyd_7.gif
/imgs/gif/gifset_w/trophyd_70.gif
/imgs/gif/gifset_w/trophyd_8.gif
/imgs/gif/gifset_w/trophyd_80.gif
/imgs/gif/gifset_w/trophyd_9.gif
/imgs/gif/gifset_w/trophyd_90.gif
/imgs/gif/gifset_w/trophyp.gif
/imgs/gif/gifset_w/trophyp_1.gif
/imgs/gif/gifset_w/trophyp_10.gif
/imgs/gif/gifset_w/trophyp_100.gif
/imgs/gif/gifset_w/trophyp_2.gif
/imgs/gif/gifset_w/trophyp_20.gif
/imgs/gif/gifset_w/trophyp_3.gif
/imgs/gif/gifset_w/trophyp_30.gif
/imgs/gif/gifset_w/trophyp_4.gif
/imgs/gif/gifset_w/trophyp_40.gif
/imgs/gif/gifset_w/trophyp_5.gif
/imgs/gif/gifset_w/trophyp_50.gif
/imgs/gif/gifset_w/trophyp_6.gif
/imgs/gif/gifset_w/trophyp_7.gif
/imgs/gif/gifset_w/trophyp_70.gif
/imgs/gif/gifset_w/trophyp_8.gif
/imgs/gif/gifset_w/trophyp_80.gif
/imgs/gif/gifset_w/trophyp_9.gif
/imgs/gif/gifset_w/trophyp_90.gif
/imgs/gif/gifset_w/trophyq.gif
/imgs/gif/gifset_w/trophyq_1.gif
/imgs/gif/gifset_w/trophyq_10.gif
/imgs/gif/gifset_w/trophyq_100.gif
/imgs/gif/gifset_w/trophyq_2.gif
/imgs/gif/gifset_w/trophyq_20.gif
/imgs/gif/gifset_w/trophyq_3.gif
/imgs/gif/gifset_w/trophyq_30.gif
/imgs/gif/gifset_w/trophyq_4.gif
/imgs/gif/gifset_w/trophyq_40.gif
/imgs/gif/gifset_w/trophyq_5.gif
/imgs/gif/gifset_w/trophyq_50.gif
/imgs/gif/gifset_w/trophyq_6.gif
/imgs/gif/gifset_w/trophyq_7.gif
/imgs/gif/gifset_w/trophyq_70.gif
/imgs/gif/gifset_w/trophyq_8.gif
/imgs/gif/gifset_w/trophyq_80.gif
/imgs/gif/gifset_w/trophyq_9.gif
/imgs/gif/gifset_w/trophyq_90.gif
/imgs/gif/gifset_w/warning.gif
/imgs/gif/gifset_w/warningb.gif
/imgs/gif/gifset_w/warningb_1.gif
/imgs/gif/gifset_w/warningb_10.gif
/imgs/gif/gifset_w/warningb_100.gif
/imgs/gif/gifset_w/warningb_2.gif
/imgs/gif/gifset_w/warningb_20.gif
/imgs/gif/gifset_w/warningb_3.gif
/imgs/gif/gifset_w/warningb_30.gif
/imgs/gif/gifset_w/warningb_4.gif
/imgs/gif/gifset_w/warningb_40.gif
/imgs/gif/gifset_w/warningb_5.gif
/imgs/gif/gifset_w/warningb_50.gif
/imgs/gif/gifset_w/warningb_6.gif
/imgs/gif/gifset_w/warningb_7.gif
/imgs/gif/gifset_w/warningb_70.gif
/imgs/gif/gifset_w/warningb_8.gif
/imgs/gif/gifset_w/warningb_80.gif
/imgs/gif/gifset_w/warningb_9.gif
/imgs/gif/gifset_w/warningb_90.gif
/imgs/gif/gifset_w/warningd.gif
/imgs/gif/gifset_w/warningd_1.gif
/imgs/gif/gifset_w/warningd_10.gif
/imgs/gif/gifset_w/warningd_100.gif
/imgs/gif/gifset_w/warningd_2.gif
/imgs/gif/gifset_w/warningd_20.gif
/imgs/gif/gifset_w/warningd_3.gif
/imgs/gif/gifset_w/warningd_30.gif
/imgs/gif/gifset_w/warningd_4.gif
/imgs/gif/gifset_w/warningd_40.gif
/imgs/gif/gifset_w/warningd_5.gif
/imgs/gif/gifset_w/warningd_50.gif
/imgs/gif/gifset_w/warningd_6.gif
/imgs/gif/gifset_w/warningd_7.gif
/imgs/gif/gifset_w/warningd_70.gif
/imgs/gif/gifset_w/warningd_8.gif
/imgs/gif/gifset_w/warningd_80.gif
/imgs/gif/gifset_w/warningd_9.gif
/imgs/gif/gifset_w/warningd_90.gif
/imgs/gif/gifset_w/warningp.gif
/imgs/gif/gifset_w/warningp_1.gif
/imgs/gif/gifset_w/warningp_10.gif
/imgs/gif/gifset_w/warningp_100.gif
/imgs/gif/gifset_w/warningp_2.gif
/imgs/gif/gifset_w/warningp_20.gif
/imgs/gif/gifset_w/warningp_3.gif
/imgs/gif/gifset_w/warningp_30.gif
/imgs/gif/gifset_w/warningp_4.gif
/imgs/gif/gifset_w/warningp_40.gif
/imgs/gif/gifset_w/warningp_5.gif
/imgs/gif/gifset_w/warningp_50.gif
/imgs/gif/gifset_w/warningp_6.gif
/imgs/gif/gifset_w/warningp_7.gif
/imgs/gif/gifset_w/warningp_70.gif
/imgs/gif/gifset_w/warningp_8.gif
/imgs/gif/gifset_w/warningp_80.gif
/imgs/gif/gifset_w/warningp_9.gif
/imgs/gif/gifset_w/warningp_90.gif
/imgs/gif/gifset_w/warningq.gif
/imgs/gif/gifset_w/warningq_1.gif
/imgs/gif/gifset_w/warningq_10.gif
/imgs/gif/gifset_w/warningq_100.gif
/imgs/gif/gifset_w/warningq_2.gif
/imgs/gif/gifset_w/warningq_20.gif
/imgs/gif/gifset_w/warningq_3.gif
/imgs/gif/gifset_w/warningq_30.gif
/imgs/gif/gifset_w/warningq_4.gif
/imgs/gif/gifset_w/warningq_40.gif
/imgs/gif/gifset_w/warningq_5.gif
/imgs/gif/gifset_w/warningq_50.gif
/imgs/gif/gifset_w/warningq_6.gif
/imgs/gif/gifset_w/warningq_7.gif
/imgs/gif/gifset_w/warningq_70.gif
/imgs/gif/gifset_w/warningq_8.gif
/imgs/gif/gifset_w/warningq_80.gif
/imgs/gif/gifset_w/warningq_9.gif
/imgs/gif/gifset_w/warningq_90.gif
/imgs/gif/gifset_w/welcome.gif
/imgs/gif/gifset_w/welcomeb.gif
/imgs/gif/gifset_w/welcomeb_1.gif
/imgs/gif/gifset_w/welcomeb_10.gif
/imgs/gif/gifset_w/welcomeb_100.gif
/imgs/gif/gifset_w/welcomeb_2.gif
/imgs/gif/gifset_w/welcomeb_20.gif
/imgs/gif/gifset_w/welcomeb_3.gif
/imgs/gif/gifset_w/welcomeb_30.gif
/imgs/gif/gifset_w/welcomeb_4.gif
/imgs/gif/gifset_w/welcomeb_40.gif
/imgs/gif/gifset_w/welcomeb_5.gif
/imgs/gif/gifset_w/welcomeb_50.gif
/imgs/gif/gifset_w/welcomeb_6.gif
/imgs/gif/gifset_w/welcomeb_7.gif
/imgs/gif/gifset_w/welcomeb_70.gif
/imgs/gif/gifset_w/welcomeb_8.gif
/imgs/gif/gifset_w/welcomeb_80.gif
/imgs/gif/gifset_w/welcomeb_9.gif
/imgs/gif/gifset_w/welcomeb_90.gif
/imgs/gif/gifset_w/welcomed.gif
/imgs/gif/gifset_w/welcomed_1.gif
/imgs/gif/gifset_w/welcomed_10.gif
/imgs/gif/gifset_w/welcomed_100.gif
/imgs/gif/gifset_w/welcomed_2.gif
/imgs/gif/gifset_w/welcomed_20.gif
/imgs/gif/gifset_w/welcomed_3.gif
/imgs/gif/gifset_w/welcomed_30.gif
/imgs/gif/gifset_w/welcomed_4.gif
/imgs/gif/gifset_w/welcomed_40.gif
/imgs/gif/gifset_w/welcomed_5.gif
/imgs/gif/gifset_w/welcomed_50.gif
/imgs/gif/gifset_w/welcomed_6.gif
/imgs/gif/gifset_w/welcomed_7.gif
/imgs/gif/gifset_w/welcomed_70.gif
/imgs/gif/gifset_w/welcomed_8.gif
/imgs/gif/gifset_w/welcomed_80.gif
/imgs/gif/gifset_w/welcomed_9.gif
/imgs/gif/gifset_w/welcomed_90.gif
/imgs/gif/gifset_w/welcomep.gif
/imgs/gif/gifset_w/welcomep_1.gif
/imgs/gif/gifset_w/welcomep_10.gif
/imgs/gif/gifset_w/welcomep_100.gif
/imgs/gif/gifset_w/welcomep_2.gif
/imgs/gif/gifset_w/welcomep_20.gif
/imgs/gif/gifset_w/welcomep_3.gif
/imgs/gif/gifset_w/welcomep_30.gif
/imgs/gif/gifset_w/welcomep_4.gif
/imgs/gif/gifset_w/welcomep_40.gif
/imgs/gif/gifset_w/welcomep_5.gif
/imgs/gif/gifset_w/welcomep_50.gif
/imgs/gif/gifset_w/welcomep_6.gif
/imgs/gif/gifset_w/welcomep_7.gif
/imgs/gif/gifset_w/welcomep_70.gif
/imgs/gif/gifset_w/welcomep_8.gif
/imgs/gif/gifset_w/welcomep_80.gif
/imgs/gif/gifset_w/welcomep_9.gif
/imgs/gif/gifset_w/welcomep_90.gif
/imgs/gif/gifset_w/welcomeq.gif
/imgs/gif/gifset_w/welcomeq_1.gif
/imgs/gif/gifset_w/welcomeq_10.gif
/imgs/gif/gifset_w/welcomeq_100.gif
/imgs/gif/gifset_w/welcomeq_2.gif
/imgs/gif/gifset_w/welcomeq_20.gif
/imgs/gif/gifset_w/welcomeq_3.gif
/imgs/gif/gifset_w/welcomeq_30.gif
/imgs/gif/gifset_w/welcomeq_4.gif
/imgs/gif/gifset_w/welcomeq_40.gif
/imgs/gif/gifset_w/welcomeq_5.gif
/imgs/gif/gifset_w/welcomeq_50.gif
/imgs/gif/gifset_w/welcomeq_6.gif
/imgs/gif/gifset_w/welcomeq_7.gif
/imgs/gif/gifset_w/welcomeq_70.gif
/imgs/gif/gifset_w/welcomeq_8.gif
/imgs/gif/gifset_w/welcomeq_80.gif
/imgs/gif/gifset_w/welcomeq_9.gif
/imgs/gif/gifset_w/welcomeq_90.gif
/imgs/gif/gifset_w/worksign.gif
/imgs/gif/gifset_w/worksignb.gif
/imgs/gif/gifset_w/worksignb_1.gif
/imgs/gif/gifset_w/worksignb_10.gif
/imgs/gif/gifset_w/worksignb_100.gif
/imgs/gif/gifset_w/worksignb_2.gif
/imgs/gif/gifset_w/worksignb_20.gif
/imgs/gif/gifset_w/worksignb_3.gif
/imgs/gif/gifset_w/worksignb_30.gif
/imgs/gif/gifset_w/worksignb_4.gif
/imgs/gif/gifset_w/worksignb_40.gif
/imgs/gif/gifset_w/worksignb_5.gif
/imgs/gif/gifset_w/worksignb_50.gif
/imgs/gif/gifset_w/worksignb_6.gif
/imgs/gif/gifset_w/worksignb_7.gif
/imgs/gif/gifset_w/worksignb_70.gif
/imgs/gif/gifset_w/worksignb_8.gif
/imgs/gif/gifset_w/worksignb_80.gif
/imgs/gif/gifset_w/worksignb_9.gif
/imgs/gif/gifset_w/worksignb_90.gif
/imgs/gif/gifset_w/worksignd.gif
/imgs/gif/gifset_w/worksignd_1.gif
/imgs/gif/gifset_w/worksignd_10.gif
/imgs/gif/gifset_w/worksignd_100.gif
/imgs/gif/gifset_w/worksignd_2.gif
/imgs/gif/gifset_w/worksignd_20.gif
/imgs/gif/gifset_w/worksignd_3.gif
/imgs/gif/gifset_w/worksignd_30.gif
/imgs/gif/gifset_w/worksignd_4.gif
/imgs/gif/gifset_w/worksignd_40.gif
/imgs/gif/gifset_w/worksignd_5.gif
/imgs/gif/gifset_w/worksignd_50.gif
/imgs/gif/gifset_w/worksignd_6.gif
/imgs/gif/gifset_w/worksignd_7.gif
/imgs/gif/gifset_w/worksignd_70.gif
/imgs/gif/gifset_w/worksignd_8.gif
/imgs/gif/gifset_w/worksignd_80.gif
/imgs/gif/gifset_w/worksignd_9.gif
/imgs/gif/gifset_w/worksignd_90.gif
/imgs/gif/gifset_w/worksignp.gif
/imgs/gif/gifset_w/worksignp_1.gif
/imgs/gif/gifset_w/worksignp_10.gif
/imgs/gif/gifset_w/worksignp_100.gif
/imgs/gif/gifset_w/worksignp_2.gif
/imgs/gif/gifset_w/worksignp_20.gif
/imgs/gif/gifset_w/worksignp_3.gif
/imgs/gif/gifset_w/worksignp_30.gif
/imgs/gif/gifset_w/worksignp_4.gif
/imgs/gif/gifset_w/worksignp_40.gif
/imgs/gif/gifset_w/worksignp_5.gif
/imgs/gif/gifset_w/worksignp_50.gif
/imgs/gif/gifset_w/worksignp_6.gif
/imgs/gif/gifset_w/worksignp_7.gif
/imgs/gif/gifset_w/worksignp_70.gif
/imgs/gif/gifset_w/worksignp_8.gif
/imgs/gif/gifset_w/worksignp_80.gif
/imgs/gif/gifset_w/worksignp_9.gif
/imgs/gif/gifset_w/worksignp_90.gif
/imgs/gif/gifset_w/worksignq.gif
/imgs/gif/gifset_w/worksignq_1.gif
/imgs/gif/gifset_w/worksignq_10.gif
/imgs/gif/gifset_w/worksignq_100.gif
/imgs/gif/gifset_w/worksignq_2.gif
/imgs/gif/gifset_w/worksignq_20.gif
/imgs/gif/gifset_w/worksignq_3.gif
/imgs/gif/gifset_w/worksignq_30.gif
/imgs/gif/gifset_w/worksignq_4.gif
/imgs/gif/gifset_w/worksignq_40.gif
/imgs/gif/gifset_w/worksignq_5.gif
/imgs/gif/gifset_w/worksignq_50.gif
/imgs/gif/gifset_w/worksignq_6.gif
/imgs/gif/gifset_w/worksignq_7.gif
/imgs/gif/gifset_w/worksignq_70.gif
/imgs/gif/gifset_w/worksignq_8.gif
/imgs/gif/gifset_w/worksignq_80.gif
/imgs/gif/gifset_w/worksignq_9.gif
/imgs/gif/gifset_w/worksignq_90.gif
/imgs/gif/giphy_dollars/giph_weight.gif
/imgs/gif/giphy_dollars/giphy._hands2gif.gif
/imgs/gif/giphy_dollars/giphy.gif
/imgs/gif/giphy_dollars/giphy001.gif
/imgs/gif/giphy_dollars/giphy002.gif
/imgs/gif/giphy_dollars/giphy003.gif
/imgs/gif/giphy_dollars/giphy006.gif
/imgs/gif/giphy_dollars/giphy_005.gif
/imgs/gif/giphy_dollars/giphy_armodillo.gif
/imgs/gif/giphy_dollars/giphy_arrors.gif
/imgs/gif/giphy_dollars/giphy_bitcoikn.gif
/imgs/gif/giphy_dollars/giphy_bounce.gif
/imgs/gif/giphy_dollars/giphy_circl30.gif
/imgs/gif/giphy_dollars/giphy_compassion.gif
/imgs/gif/giphy_dollars/giphy_dolla.gif
/imgs/gif/giphy_dollars/giphy_dollar.gif
/imgs/gif/giphy_dollars/giphy_dollar11.gif
/imgs/gif/giphy_dollars/giphy_dolrpool.gif
/imgs/gif/giphy_dollars/giphy_droll_wimsy.gif
/imgs/gif/giphy_dollars/giphy_expression.gif
/imgs/gif/giphy_dollars/giphy_getalawyer_horns.gif
/imgs/gif/giphy_dollars/giphy_go20.gif
/imgs/gif/giphy_dollars/giphy_go3.gif
/imgs/gif/giphy_dollars/giphy_gold.gif
/imgs/gif/giphy_dollars/giphy_gov.gif
/imgs/gif/giphy_dollars/giphy_graph2.gif
/imgs/gif/giphy_dollars/giphy_hallway.gif
/imgs/gif/giphy_dollars/giphy_hands.gif
/imgs/gif/giphy_dollars/giphy_hands2.gif
/imgs/gif/giphy_dollars/giphy_hugs.gif
/imgs/gif/giphy_dollars/giphy_kalidis.gif
/imgs/gif/giphy_dollars/giphy_kinetic.gif
/imgs/gif/giphy_dollars/giphy_konabus.gif
/imgs/gif/giphy_dollars/giphy_konabus_stickr.gif
/imgs/gif/giphy_dollars/giphy_kt30.gif
/imgs/gif/giphy_dollars/giphy_law.gif
/imgs/gif/giphy_dollars/giphy_law01.gif
/imgs/gif/giphy_dollars/giphy_law02.gif
/imgs/gif/giphy_dollars/giphy_letter.gif
/imgs/gif/giphy_dollars/giphy_littletipper.gif
/imgs/gif/giphy_dollars/giphy_makechange.gif
/imgs/gif/giphy_dollars/giphy_moneyclap.gif
/imgs/gif/giphy_dollars/giphy_moneyeye.gif
/imgs/gif/giphy_dollars/giphy_moneymachine.gif
/imgs/gif/giphy_dollars/giphy_moneymonkey.gif
/imgs/gif/giphy_dollars/giphy_moneyspiral.gif
/imgs/gif/giphy_dollars/giphy_monydog.gif
/imgs/gif/giphy_dollars/giphy_mouse/giph_phone04y.gif
/imgs/gif/giphy_dollars/giphy_mouse/giphy._nophonegif.gif
/imgs/gif/giphy_dollars/giphy_mouse/giphy.gif
/imgs/gif/giphy_dollars/giphy_mouse/giphy.gif_construction06.gif
/imgs/gif/giphy_dollars/giphy_mouse/giphy_constrion20.gif
/imgs/gif/giphy_dollars/giphy_mouse/giphy_construction01.gif
/imgs/gif/giphy_dollars/giphy_mouse/giphy_construction02.gif
/imgs/gif/giphy_dollars/giphy_mouse/giphy_construction03.gif
/imgs/gif/giphy_dollars/giphy_mouse/giphy_construction04.gif
/imgs/gif/giphy_dollars/giphy_mouse/giphy_construction08.gif
/imgs/gif/giphy_dollars/giphy_mouse/giphy_construction09.gif
/imgs/gif/giphy_dollars/giphy_mouse/giphy_construction11.gif
/imgs/gif/giphy_dollars/giphy_mouse/giphy_construction12.gif
/imgs/gif/giphy_dollars/giphy_mouse/giphy_construction15.gif
/imgs/gif/giphy_dollars/giphy_mouse/giphy_construction21.gif
/imgs/gif/giphy_dollars/giphy_mouse/giphy_construction25.gif
/imgs/gif/giphy_dollars/giphy_mouse/giphy_construction_10.gif
/imgs/gif/giphy_dollars/giphy_mouse/giphy_construction_dogs.gif
/imgs/gif/giphy_dollars/giphy_mouse/giphy_falling01.gif
/imgs/gif/giphy_dollars/giphy_mouse/giphy_falling02.gif
/imgs/gif/giphy_dollars/giphy_mouse/giphy_falling03.gif
/imgs/gif/giphy_dollars/giphy_mouse/giphy_falling04.gif
/imgs/gif/giphy_dollars/giphy_mouse/giphy_falling06.gif
/imgs/gif/giphy_dollars/giphy_mouse/giphy_falling07.gif
/imgs/gif/giphy_dollars/giphy_mouse/giphy_falling08.gif
/imgs/gif/giphy_dollars/giphy_mouse/giphy_falling09.gif
/imgs/gif/giphy_dollars/giphy_mouse/giphy_filecabinat.gif
/imgs/gif/giphy_dollars/giphy_mouse/giphy_focus10.gif
/imgs/gif/giphy_dollars/giphy_mouse/giphy_mouse01.gif
/imgs/gif/giphy_dollars/giphy_mouse/giphy_mouse02.gif
/imgs/gif/giphy_dollars/giphy_mouse/giphy_mouse03.gif
/imgs/gif/giphy_dollars/giphy_mouse/giphy_mouse06.gif
/imgs/gif/giphy_dollars/giphy_mouse/giphy_mouse_konabus.gif
/imgs/gif/giphy_dollars/giphy_mouse/giphy_phone05.gif
/imgs/gif/giphy_dollars/giphy_mouse/giphy_phone06.gif
/imgs/gif/giphy_dollars/giphy_mouse/giphy_snap.gif
/imgs/gif/giphy_dollars/giphy_mouse/giphyfu.gif
/imgs/gif/giphy_dollars/giphy_pano.gif
/imgs/gif/giphy_dollars/giphy_pencil.gif
/imgs/gif/giphy_dollars/giphy_phonepage.gif
/imgs/gif/giphy_dollars/giphy_presentermedia.gif
/imgs/gif/giphy_dollars/giphy_presentermedia2.gif
/imgs/gif/giphy_dollars/giphy_ropeup.gif
/imgs/gif/giphy_dollars/giphy_scrollstats.gif
/imgs/gif/giphy_dollars/giphy_trsansform.gif
/imgs/gif/giphy_dollars/giphy_typer.gif
/imgs/gif/giphy_dollars/giphy_verified.gif
/imgs/gif/giphy_dollars/giphy_water.gif
/imgs/gif/giphy_dollars/giphy_weaigh5.gif
/imgs/gif/giphy_dollars/giphy_weight3.gif
/imgs/gif/giphy_dollars/giphyarrowfire.gif
/imgs/gif/giphy_dollars/giphybuslt.gif
/imgs/gif/giphy_dollars/giphyfocuseyes.gif
/imgs/gif/giphy_dollars/giphygowave'.gif
/imgs/gif/giphy_dollars/giphygraph.gif
/imgs/gif/giphy_dollars/giphymoney_smerf.gif
/imgs/gif/giphy_dollars/giphytwist.gif
/imgs/gif/giphy_dollars/giphyvortex.gif
/imgs/gif/giphy_dollars/giphyweaight2.gif
/imgs/gif/giphy_us_news_focus/5kYpl7hIHEKwNOhjgU1_gV84APypkdg-yYH09H0fkS0.gif
/imgs/gif/giphy_us_news_focus/gip_falls3hy.gif
/imgs/gif/giphy_us_news_focus/giph_applebitesy.gif
/imgs/gif/giphy_us_news_focus/giph_armymovie_dancing.gif
/imgs/gif/giphy_us_news_focus/giph_auroa1y.gif
/imgs/gif/giphy_us_news_focus/giph_cloudlipsy.gif
/imgs/gif/giphy_us_news_focus/giph_crazy_chipndale.gif
/imgs/gif/giphy_us_news_focus/giph_cuberolly.gif
/imgs/gif/giphy_us_news_focus/giph_droopywalkery.gif
/imgs/gif/giphy_us_news_focus/giph_ducks_hatchety.gif
/imgs/gif/giphy_us_news_focus/giph_fallsy.gif
/imgs/gif/giphy_us_news_focus/giph_fradykaty.gif
/imgs/gif/giphy_us_news_focus/giph_hand6y.gif
/imgs/gif/giphy_us_news_focus/giph_handsignxy.gif
/imgs/gif/giphy_us_news_focus/giph_homer_skippingy.gif
/imgs/gif/giphy_us_news_focus/giph_kiti_dancey.gif
/imgs/gif/giphy_us_news_focus/giph_labthinker_startle.gif
/imgs/gif/giphy_us_news_focus/giph_mouthorbsy.gif
/imgs/gif/giphy_us_news_focus/giph_mrrogers_fingersy.gif
/imgs/gif/giphy_us_news_focus/giph_officer_byrdbelly.gif
/imgs/gif/giphy_us_news_focus/giph_pastryroad_food_strollersy.gif
/imgs/gif/giphy_us_news_focus/giph_portalguyy.gif
/imgs/gif/giphy_us_news_focus/giph_roullett2y.gif
/imgs/gif/giphy_us_news_focus/giph_tinkerbell_sity.gif
/imgs/gif/giphy_us_news_focus/giph_tinkerbell_wavey.gif
/imgs/gif/giphy_us_news_focus/giph_yoga_gloey.gif
/imgs/gif/giphy_us_news_focus/giphroullettey.gif
/imgs/gif/giphy_us_news_focus/giphy._andy_pilllession.gif
/imgs/gif/giphy_us_news_focus/giphy._astricgif.gif
/imgs/gif/giphy_us_news_focus/giphy._bigcombgif.gif
/imgs/gif/giphy_us_news_focus/giphy._bugs_blueprintgif.gif
/imgs/gif/giphy_us_news_focus/giphy._bugs_survalgif.gif
/imgs/gif/giphy_us_news_focus/giphy._byrdpucker_newsgif.gif
/imgs/gif/giphy_us_news_focus/giphy._crazy_belegosygif.gif
/imgs/gif/giphy_us_news_focus/giphy._hallwaygif.gif
/imgs/gif/giphy_us_news_focus/giphy._handripplesgif.gif
/imgs/gif/giphy_us_news_focus/giphy._headnhandsgif.gif
/imgs/gif/giphy_us_news_focus/giphy._horse_dancygif.gif
/imgs/gif/giphy_us_news_focus/giphy._horsegirl_toongif.gif
/imgs/gif/giphy_us_news_focus/giphy._jak1gif.gif
/imgs/gif/giphy_us_news_focus/giphy._jumpropegif.gif
/imgs/gif/giphy_us_news_focus/giphy._kitihahagif.gif
/imgs/gif/giphy_us_news_focus/giphy._musicgif.gif
/imgs/gif/giphy_us_news_focus/giphy._oldknobegif.gif
/imgs/gif/giphy_us_news_focus/giphy._orbcube2gif.gif
/imgs/gif/giphy_us_news_focus/giphy._orbsgif.gif
/imgs/gif/giphy_us_news_focus/giphy._ponygirl_runninggif.gif
/imgs/gif/giphy_us_news_focus/giphy._sniffergif.gif
/imgs/gif/giphy_us_news_focus/giphy._timefacegif.gif
/imgs/gif/giphy_us_news_focus/giphy._zoom_creepygif.gif
/imgs/gif/giphy_us_news_focus/giphy._zoom_microgif.gif
/imgs/gif/giphy_us_news_focus/giphy.gif
/imgs/gif/giphy_us_news_focus/giphy.gif_duckbottom.gif
/imgs/gif/giphy_us_news_focus/giphy_321run.gif
/imgs/gif/giphy_us_news_focus/giphy_al_ankovick_handflail.gif
/imgs/gif/giphy_us_news_focus/giphy_alien_bio2.gif
/imgs/gif/giphy_us_news_focus/giphy_alien_dancer.gif
/imgs/gif/giphy_us_news_focus/giphy_alien_handflal.gif
/imgs/gif/giphy_us_news_focus/giphy_alien_heads.gif
/imgs/gif/giphy_us_news_focus/giphy_alien_pause.gif
/imgs/gif/giphy_us_news_focus/giphy_android_breath.gif
/imgs/gif/giphy_us_news_focus/giphy_arm_n_hand.gif
/imgs/gif/giphy_us_news_focus/giphy_army_dancehands.gif
/imgs/gif/giphy_us_news_focus/giphy_armydance_rusia.gif
/imgs/gif/giphy_us_news_focus/giphy_bananahat.gif
/imgs/gif/giphy_us_news_focus/giphy_bettyboop_accounting.gif
/imgs/gif/giphy_us_news_focus/giphy_bigjoger.gif
/imgs/gif/giphy_us_news_focus/giphy_bird_jogger.gif
/imgs/gif/giphy_us_news_focus/giphy_birdgirl_vinage.gif
/imgs/gif/giphy_us_news_focus/giphy_blocks.gif
/imgs/gif/giphy_us_news_focus/giphy_bluecircle.gif
/imgs/gif/giphy_us_news_focus/giphy_bugs_mirror.gif
/imgs/gif/giphy_us_news_focus/giphy_buzznduck.gif
/imgs/gif/giphy_us_news_focus/giphy_byrdpucker_cowgirl_yodkle.gif
/imgs/gif/giphy_us_news_focus/giphy_calwheel.gif
/imgs/gif/giphy_us_news_focus/giphy_carterwalk.gif
/imgs/gif/giphy_us_news_focus/giphy_catglasses.gif
/imgs/gif/giphy_us_news_focus/giphy_chain.gif
/imgs/gif/giphy_us_news_focus/giphy_chap2act.gif
/imgs/gif/giphy_us_news_focus/giphy_charleybrown_depressesd.gif
/imgs/gif/giphy_us_news_focus/giphy_circlecircle.gif
/imgs/gif/giphy_us_news_focus/giphy_clouds.gif
/imgs/gif/giphy_us_news_focus/giphy_clubbing.gif
/imgs/gif/giphy_us_news_focus/giphy_connect.gif
/imgs/gif/giphy_us_news_focus/giphy_cowgirl_hat.gif
/imgs/gif/giphy_us_news_focus/giphy_cowgirl_hips.gif
/imgs/gif/giphy_us_news_focus/giphy_crazy_flowergirl.gif
/imgs/gif/giphy_us_news_focus/giphy_crazy_manson.gif
/imgs/gif/giphy_us_news_focus/giphy_crazy_simson1.gif
/imgs/gif/giphy_us_news_focus/giphy_crazycats.gif
/imgs/gif/giphy_us_news_focus/giphy_crazydanc1.gif
/imgs/gif/giphy_us_news_focus/giphy_crazydanse2.gif
/imgs/gif/giphy_us_news_focus/giphy_crazyeyes.gif
/imgs/gif/giphy_us_news_focus/giphy_crazyguy2.gif
/imgs/gif/giphy_us_news_focus/giphy_crazyhead3.gif
/imgs/gif/giphy_us_news_focus/giphy_curealla_doorflash.gif
/imgs/gif/giphy_us_news_focus/giphy_cute_ponygirl.gif
/imgs/gif/giphy_us_news_focus/giphy_cute_ponytoon.gif
/imgs/gif/giphy_us_news_focus/giphy_cutekiti3.gif
/imgs/gif/giphy_us_news_focus/giphy_cutekity.gif
/imgs/gif/giphy_us_news_focus/giphy_cycklebars.gif
/imgs/gif/giphy_us_news_focus/giphy_cycle2.gif
/imgs/gif/giphy_us_news_focus/giphy_dance_pinocio.gif
/imgs/gif/giphy_us_news_focus/giphy_dancerbears.gif
/imgs/gif/giphy_us_news_focus/giphy_daneworm2.gif
/imgs/gif/giphy_us_news_focus/giphy_derbys.gif
/imgs/gif/giphy_us_news_focus/giphy_dogdron.gif
/imgs/gif/giphy_us_news_focus/giphy_dresswalking.gif
/imgs/gif/giphy_us_news_focus/giphy_drummerboy.gif
/imgs/gif/giphy_us_news_focus/giphy_duck_hotpic.gif
/imgs/gif/giphy_us_news_focus/giphy_duck_refusal.gif
/imgs/gif/giphy_us_news_focus/giphy_duckdance.gif
/imgs/gif/giphy_us_news_focus/giphy_duckdance_1.gif
/imgs/gif/giphy_us_news_focus/giphy_duckwalking.gif
/imgs/gif/giphy_us_news_focus/giphy_dwaf_.gif
/imgs/gif/giphy_us_news_focus/giphy_eyes_cat.gif
/imgs/gif/giphy_us_news_focus/giphy_faint.gif
/imgs/gif/giphy_us_news_focus/giphy_falls2.gif
/imgs/gif/giphy_us_news_focus/giphy_fasttalker.gif
/imgs/gif/giphy_us_news_focus/giphy_feet_aquarium.gif
/imgs/gif/giphy_us_news_focus/giphy_fileburn.gif
/imgs/gif/giphy_us_news_focus/giphy_floatorbe_n_alien.gif
/imgs/gif/giphy_us_news_focus/giphy_focus_pendulum.gif
/imgs/gif/giphy_us_news_focus/giphy_funnwalker.gif
/imgs/gif/giphy_us_news_focus/giphy_gear1.gif
/imgs/gif/giphy_us_news_focus/giphy_goathead.gif
/imgs/gif/giphy_us_news_focus/giphy_goflow.gif
/imgs/gif/giphy_us_news_focus/giphy_gonoard_water.gif
/imgs/gif/giphy_us_news_focus/giphy_handeyes.gif
/imgs/gif/giphy_us_news_focus/giphy_handshadows.gif
/imgs/gif/giphy_us_news_focus/giphy_head3.gif
/imgs/gif/giphy_us_news_focus/giphy_headbank.gif
/imgs/gif/giphy_us_news_focus/giphy_headinhead.gif
/imgs/gif/giphy_us_news_focus/giphy_holloween_waited2long.gif
/imgs/gif/giphy_us_news_focus/giphy_horse_champ.gif
/imgs/gif/giphy_us_news_focus/giphy_horse_circle.gif
/imgs/gif/giphy_us_news_focus/giphy_horse_connelly.gif
/imgs/gif/giphy_us_news_focus/giphy_horseguy.gif
/imgs/gif/giphy_us_news_focus/giphy_horseguy_dancer.gif
/imgs/gif/giphy_us_news_focus/giphy_horseguy_greekdance.gif
/imgs/gif/giphy_us_news_focus/giphy_horsehead2head.gif
/imgs/gif/giphy_us_news_focus/giphy_hotdogs_woof.gif
/imgs/gif/giphy_us_news_focus/giphy_hummingbird.gif
/imgs/gif/giphy_us_news_focus/giphy_icecreamman.gif
/imgs/gif/giphy_us_news_focus/giphy_jkwiitree.gif
/imgs/gif/giphy_us_news_focus/giphy_jtf30_sinkhole.gif
/imgs/gif/giphy_us_news_focus/giphy_jumproap.gif
/imgs/gif/giphy_us_news_focus/giphy_kids_teatertater.gif
/imgs/gif/giphy_us_news_focus/giphy_kiti_piano1.gif
/imgs/gif/giphy_us_news_focus/giphy_kitisocks.gif
/imgs/gif/giphy_us_news_focus/giphy_klatu_visor.gif
/imgs/gif/giphy_us_news_focus/giphy_ko_air_gituar.gif
/imgs/gif/giphy_us_news_focus/giphy_konabus_bigroll.gif
/imgs/gif/giphy_us_news_focus/giphy_kt_closereflex.gif
/imgs/gif/giphy_us_news_focus/giphy_kt_dance.gif
/imgs/gif/giphy_us_news_focus/giphy_kt_warmup.gif
/imgs/gif/giphy_us_news_focus/giphy_kt_wip.gif
/imgs/gif/giphy_us_news_focus/giphy_lab_thinker.gif
/imgs/gif/giphy_us_news_focus/giphy_labthinker_gotit.gif
/imgs/gif/giphy_us_news_focus/giphy_labthinker_happydance.gif
/imgs/gif/giphy_us_news_focus/giphy_labthinker_nod.gif
/imgs/gif/giphy_us_news_focus/giphy_labthinker_poof.gif
/imgs/gif/giphy_us_news_focus/giphy_labthinker_v.gif
/imgs/gif/giphy_us_news_focus/giphy_lawguy_crazy.gif
/imgs/gif/giphy_us_news_focus/giphy_lawguy_doublecrazy.gif
/imgs/gif/giphy_us_news_focus/giphy_lawguy_doublefinders.gif
/imgs/gif/giphy_us_news_focus/giphy_lawguy_singlefinger.gif
/imgs/gif/giphy_us_news_focus/giphy_loopdeloop.gif
/imgs/gif/giphy_us_news_focus/giphy_lovegyro.gif
/imgs/gif/giphy_us_news_focus/giphy_magicdress1.gif
/imgs/gif/giphy_us_news_focus/giphy_magicdress_1.gif
/imgs/gif/giphy_us_news_focus/giphy_magicdress_2.gif
/imgs/gif/giphy_us_news_focus/giphy_magicdress_carage.gif
/imgs/gif/giphy_us_news_focus/giphy_magicfingers.gif
/imgs/gif/giphy_us_news_focus/giphy_magicgeometry.gif
/imgs/gif/giphy_us_news_focus/giphy_mcclown.gif
/imgs/gif/giphy_us_news_focus/giphy_mickey_boatwistle.gif
/imgs/gif/giphy_us_news_focus/giphy_mickey_devildance.gif
/imgs/gif/giphy_us_news_focus/giphy_mickey_magic.gif
/imgs/gif/giphy_us_news_focus/giphy_mickeymagic_hands1.gif
/imgs/gif/giphy_us_news_focus/giphy_mickeymagic_hands2.gif
/imgs/gif/giphy_us_news_focus/giphy_mickeypiano2.gif
/imgs/gif/giphy_us_news_focus/giphy_mickeypiano_32.gif
/imgs/gif/giphy_us_news_focus/giphy_mickymagic_hat1.gif
/imgs/gif/giphy_us_news_focus/giphy_mickymagic_haton.gif
/imgs/gif/giphy_us_news_focus/giphy_mikey_piano.gif
/imgs/gif/giphy_us_news_focus/giphy_miky_magic_stars.gif
/imgs/gif/giphy_us_news_focus/giphy_monkeytrap_release.gif
/imgs/gif/giphy_us_news_focus/giphy_mousedance_1.gif
/imgs/gif/giphy_us_news_focus/giphy_mousedance_2.gif
/imgs/gif/giphy_us_news_focus/giphy_mouth_wavy.gif
/imgs/gif/giphy_us_news_focus/giphy_nosign.gif
/imgs/gif/giphy_us_news_focus/giphy_oragatang_hairblower.gif
/imgs/gif/giphy_us_news_focus/giphy_orbs_n_arcs.gif
/imgs/gif/giphy_us_news_focus/giphy_ozcouple.gif
/imgs/gif/giphy_us_news_focus/giphy_peterpan_closecall.gif
/imgs/gif/giphy_us_news_focus/giphy_piano_mouses.gif
/imgs/gif/giphy_us_news_focus/giphy_pills.gif
/imgs/gif/giphy_us_news_focus/giphy_pinocia_danc2.gif
/imgs/gif/giphy_us_news_focus/giphy_pinup_barbq.gif
/imgs/gif/giphy_us_news_focus/giphy_ponyride.gif
/imgs/gif/giphy_us_news_focus/giphy_potion_head.gif
/imgs/gif/giphy_us_news_focus/giphy_potterywheel.gif
/imgs/gif/giphy_us_news_focus/giphy_powerwoamn.gif
/imgs/gif/giphy_us_news_focus/giphy_pperms_stars_stripes.gif
/imgs/gif/giphy_us_news_focus/giphy_ripples.gif
/imgs/gif/giphy_us_news_focus/giphy_simpsons_takemeaway.gif
/imgs/gif/giphy_us_news_focus/giphy_sitter.gif
/imgs/gif/giphy_us_news_focus/giphy_sitter_pondeyes.gif
/imgs/gif/giphy_us_news_focus/giphy_sloop.gif
/imgs/gif/giphy_us_news_focus/giphy_slots.gif
/imgs/gif/giphy_us_news_focus/giphy_slowwalker.gif
/imgs/gif/giphy_us_news_focus/giphy_soupstorm.gif
/imgs/gif/giphy_us_news_focus/giphy_spion_walker.gif
/imgs/gif/giphy_us_news_focus/giphy_spiral.gif
/imgs/gif/giphy_us_news_focus/giphy_spiralss.gif
/imgs/gif/giphy_us_news_focus/giphy_sprialss.gif
/imgs/gif/giphy_us_news_focus/giphy_starwar_evilhood.gif
/imgs/gif/giphy_us_news_focus/giphy_sumi_gospinner.gif
/imgs/gif/giphy_us_news_focus/giphy_sumo_bodyhead.gif
/imgs/gif/giphy_us_news_focus/giphy_swinggirls.gif
/imgs/gif/giphy_us_news_focus/giphy_tetertater_gus2.gif
/imgs/gif/giphy_us_news_focus/giphy_tetertater_spiners.gif
/imgs/gif/giphy_us_news_focus/giphy_time_bugs.gif
/imgs/gif/giphy_us_news_focus/giphy_time_clockhands.gif
/imgs/gif/giphy_us_news_focus/giphy_timeguy2.gif
/imgs/gif/giphy_us_news_focus/giphy_tinkerbell_.gif
/imgs/gif/giphy_us_news_focus/giphy_tinkerbell_.kickgif.gif
/imgs/gif/giphy_us_news_focus/giphy_tinkerbell_2.gif
/imgs/gif/giphy_us_news_focus/giphy_tinkerbell_4.gif
/imgs/gif/giphy_us_news_focus/giphy_tinkerbell_crazy.gif
/imgs/gif/giphy_us_news_focus/giphy_tinkerbell_mad.gif
/imgs/gif/giphy_us_news_focus/giphy_tinkerbell_mapout.gif
/imgs/gif/giphy_us_news_focus/giphy_tinkerbell_riverdance.gif
/imgs/gif/giphy_us_news_focus/giphy_tinkerbell_starstreamers.gif
/imgs/gif/giphy_us_news_focus/giphy_tinkerbell_surprise.gif
/imgs/gif/giphy_us_news_focus/giphy_tinkerbell_thimble.gif
/imgs/gif/giphy_us_news_focus/giphy_tinkerbell_turnn.gif
/imgs/gif/giphy_us_news_focus/giphy_tinkerbell_wall.gif
/imgs/gif/giphy_us_news_focus/giphy_tinkerbell_waterfall.gif
/imgs/gif/giphy_us_news_focus/giphy_tinkerbell_woops.gif
/imgs/gif/giphy_us_news_focus/giphy_tinrtbell_turm.gif
/imgs/gif/giphy_us_news_focus/giphy_toiletpaper.gif
/imgs/gif/giphy_us_news_focus/giphy_toothout.gif
/imgs/gif/giphy_us_news_focus/giphy_train_justintime.gif
/imgs/gif/giphy_us_news_focus/giphy_trainview.gif
/imgs/gif/giphy_us_news_focus/giphy_trcx_horsewip.gif
/imgs/gif/giphy_us_news_focus/giphy_tvstatic_drips.gif
/imgs/gif/giphy_us_news_focus/giphy_uphill.gif
/imgs/gif/giphy_us_news_focus/giphy_us_chatter.gif
# /imgs/gif/giphy_view30.gif
/imgs/gif/iperms/giphy_army_cleanfun.gif
/imgs/gif/iperms/giphy_army_kiti.gif
/imgs/gif/iperms/giphy_army_marksync.gif
/imgs/gif/iperms/giphy_army_pushups_nohands.gif
/imgs/gif/iperms/giphy_army_seal_sparkle.gif
/imgs/gif/iperms/giphy_army_shake_salure.gif
/imgs/gif/iperms/giphy_army_tankroll.gif
/imgs/gif/iperms/giphy_armydance1.gif
/imgs/gif/iperms/giphy_armymarchn.gif
/imgs/gif/iperms/giphy_armytoon_late.gif
/imgs/gif/iperms/giphy_armywave.gif
/imgs/gif/iperms/giphy_armywave_barrel.gif
/imgs/gif/iperms/giphy_iperms.gif
/imgs/gif/iperms/giphy_iperms_bell.gif
/imgs/gif/iperms/giphy_iperms_strips.gif
/imgs/gif/kali/adfaf.gif
/imgs/gif/kali/kali16.gif
/imgs/gif/kali/kali2.gif
/imgs/gif/kali/kali25.gif
/imgs/gif/kali/kali3.gif
/imgs/gif/kali/kali4.gif
/imgs/gif/kali/kali5.gif
/imgs/gif/kali/kali8].gif
/imgs/gif/kali/kalid1.gif
/imgs/gif/kali/maskflash.gif
/imgs/gif/kali/staic20.gif
/imgs/gif/kali/static1.gif
/imgs/gif/kali/static3.gif
/imgs/gif/kali/static6.gif
/imgs/gif/kitiworks/giphy._kitiworks_read.gif
/imgs/gif/kitiworks/giphy_kiti_ipadfish.gif
/imgs/gif/kitiworks/giphy_kiti_purfect.gif
/imgs/gif/kitiworks/giphy_kitimail.gif
/imgs/gif/kitiworks/giphy_kitionline.gif
/imgs/gif/kitiworks/giphy_kitirunning.gif
/imgs/gif/kitiworks/giphy_kitiwork_bounce.gif
/imgs/gif/kitiworks/giphy_kitiworks_trail.gif
/imgs/gif/kitiworks/giphy_kitiwrites.gif
/imgs/gif/kitiworks/giphy_kocats.gif
/imgs/gif/kitiworks/giphy_news_kitiworks.gif
/imgs/gif/konabus/giphy_konabus10.gif
/imgs/gif/konabus/giphy_konabus11.gif
/imgs/gif/konabus/giphy_konabus13.gif
/imgs/gif/konabus/giphy_konabus14.gif
/imgs/gif/konabus/giphy_konabus20.gif
/imgs/gif/konabus/giphy_skullflowers.gif
/imgs/gif/konabus/giphy_vkonabus03.gif
/imgs/gif/konet/giphy_weave.gif
/imgs/gif/kt/giphy_finger_arat.gif
/imgs/gif/kt/giphy_funnywalking.gif
/imgs/gif/kt/giphy_gymtoss.gif
/imgs/gif/kt/giphy_hand2s.gif
/imgs/gif/kt/giphy_handhither_gloves.gif
/imgs/gif/kt/giphy_hands1.gif
/imgs/gif/kt/giphy_headwaves.gif
/imgs/gif/kt/giphy_homerhandflaling.gif
/imgs/gif/kt/giphy_kt01.gif
/imgs/gif/kt/giphy_kt02.gif
/imgs/gif/kt/giphy_kt03.gif
/imgs/gif/kt/giphy_notes20.gif
/imgs/gif/med/giphy_eyeline.gif
/imgs/gif/med/giphy_eyes_line.gif
/imgs/gif/med/giphy_eyeworms.gif
/imgs/gif/med/giphy_heart01.gif
/imgs/gif/med/giphy_heart02.gif
/imgs/gif/med/giphy_heart04.gif
/imgs/gif/med/giphy_heart06.gif
/imgs/gif/med/giphy_heart10.gif
/imgs/gif/med/giphy_heart11.gif
/imgs/gif/med/giphy_heart12.gif
/imgs/gif/med/giphy_heart13.gif
/imgs/gif/med/giphy_heart15.gif
/imgs/gif/med/giphy_heart16.gif
/imgs/gif/med/giphy_heart17.gif
/imgs/gif/med/giphy_heart18.gif
/imgs/gif/med/giphy_heart19.gif
/imgs/gif/med/giphy_heart20.gif
/imgs/gif/med/giphy_heart21.gif
/imgs/gif/med/giphy_heart22.gif
/imgs/gif/med/giphy_heart23.gif
/imgs/gif/med/giphy_heart24.gif
/imgs/gif/med/giphy_heart25.gif
/imgs/gif/med/giphy_heart26.gif
/imgs/gif/med/giphy_heart27.gif
/imgs/gif/med/giphy_heart28.gif
/imgs/gif/med/giphy_heart29.gif
/imgs/gif/mouse/giphy.gif
/imgs/gif/mouse/giphy_construction01.gif
/imgs/gif/mouse/giphy_construction02.gif
/imgs/gif/mouse/giphy_construction03.gif
/imgs/gif/mouse/giphy_construction04.gif
/imgs/gif/mouse/giphy_construction05.gif
/imgs/gif/mouse/giphy_construction06.gif
/imgs/gif/mouse/giphy_construction07.gif
/imgs/gif/mouse/giphy_construction08.gif
/imgs/gif/mouse/giphy_construction09.gif
/imgs/gif/mouse/giphy_construction10.gif
/imgs/gif/mouse/giphy_construction11.gif
/imgs/gif/mouse/giphy_construction12.gif
/imgs/gif/mouse/giphy_construction13.gif
/imgs/gif/mouse/giphy_construction14.gif
/imgs/gif/mouse/giphy_construction15.gif
/imgs/gif/mouse/giphy_falling01.gif
/imgs/gif/mouse/giphy_falling02.gif
/imgs/gif/mouse/giphy_falling03.gif
/imgs/gif/mouse/giphy_falling04.gif
/imgs/gif/mouse/giphy_falling06.gif
/imgs/gif/mouse/giphy_falling07.gif
/imgs/gif/mouse/giphy_falling08.gif
/imgs/gif/mouse/giphy_falling09.gif
/imgs/gif/mouse/giphy_filecabinat.gif
/imgs/gif/mouse/giphy_focus10.gif
/imgs/gif/mouse/giphy_fu.gif
/imgs/gif/mouse/giphy_mouse01.gif
/imgs/gif/mouse/giphy_mouse02.gif
/imgs/gif/mouse/giphy_mouse03.gif
/imgs/gif/mouse/giphy_mouse06.gif
/imgs/gif/mouse/giphy_mouse_konabus.gif
/imgs/gif/mouse/giphy_phone01.gif
/imgs/gif/mouse/giphy_phone04.gif
/imgs/gif/mouse/giphy_phone05.gif
/imgs/gif/mouse/giphy_phone06.gif
/imgs/gif/mouse/giphy_snap.gif
/imgs/gif/new.gif
/imgs/gif/notes/giphy_konabus16.gif
/imgs/gif/notes/giphy_kt10.gif
/imgs/gif/notes/giphy_notes00.gif
/imgs/gif/notes/giphy_notes01.gif
/imgs/gif/notes/giphy_notes02.gif
/imgs/gif/notes/giphy_notes03.gif
/imgs/gif/notes/giphy_notes04.gif
/imgs/gif/notes/giphy_notes05.gif
/imgs/gif/notes/giphy_notes06.gif
/imgs/gif/notes/giphy_notes07.gif
/imgs/gif/notes/giphy_notes08.gif
/imgs/gif/notes/giphy_notes09.gif
/imgs/gif/notes/giphy_notes10.gif
/imgs/gif/notes/giphy_notes11.gif
/imgs/gif/notes/giphy_notes13.gif
/imgs/gif/notes/giphy_notes15.gif
/imgs/gif/notes/giphy_notes16.gif
/imgs/gif/notes/giphy_notes18.gif
/imgs/gif/notes/giphy_notes19.gif
/imgs/gif/notes/giphy_notes19b.gif
/imgs/gif/notes/giphy_notes23.gif
/imgs/gif/notes/giphy_notes24.gif
/imgs/gif/notes/giphy_notes25.gif
/imgs/gif/notes/giphy_notes26.gif
/imgs/gif/notes/giphy_notes27.gif
/imgs/gif/orbs/balls3.gif
/imgs/gif/orbs/balls4.gif
/imgs/gif/orbs/ballsrainbow.gif
/imgs/gif/orbs/cub1.gif
/imgs/gif/orbs/dia3.gif
/imgs/gif/orbs/diam1.gif
/imgs/gif/orbs/godots.gif
/imgs/gif/orbs/godotss.gif
/imgs/gif/orbs/goripple.gif
/imgs/gif/orbs/helix1.gif
/imgs/gif/orbs/jellyfish.gif
/imgs/gif/orbs/kali11.gif
/imgs/gif/orbs/kali15.gif
/imgs/gif/orbs/kali20.gif
/imgs/gif/orbs/laki21.gif
/imgs/gif/orbs/orb1.gif
/imgs/gif/orbs/orb10.gif
/imgs/gif/orbs/orb11.gif
/imgs/gif/orbs/orb3.gif
/imgs/gif/orbs/orb43.gif
/imgs/gif/orbs/orb6.gif
/imgs/gif/orbs/orb8.gif
/imgs/gif/orbs/orbcryst_alpulse.gif
/imgs/gif/orbs/orbdrip.gif
/imgs/gif/orbs/orbrainbow.gif
/imgs/gif/orbs/orbring.gif
/imgs/gif/orbs/orbspiral.gif
/imgs/gif/orbs/ringcube.gif
/imgs/gif/orbs/rings.gif
/imgs/gif/orbs/rings2.gif
/imgs/gif/orbs/ringworm.gif
/imgs/gif/orbs/rubix.gif
/imgs/gif/orbs/soccorball.gif
/imgs/gif/orbs/sprayfountain.gif
/imgs/gif/orbs/sssfg.gif
/imgs/gif/pastryroad/cakelite.gif
/imgs/gif/pastryroad/giphy._crazycookgif.gif
/imgs/gif/pastryroad/giphy_canydrops.gif
/imgs/gif/pastryroad/giphy_honeydrip.gif
/imgs/gif/pastryroad/giphy_pastryroad_frosting.gif
/imgs/gif/pastryroad/giphy_pastryroad_mixer.gif
/imgs/gif/pastryroad/giphy_woohoo.gif
/imgs/gif/ring.gif
/imgs/gif/ringb.gif
/imgs/gif/ringd.gif
/imgs/gif/ringp.gif
/imgs/gif/ringq.gif
/imgs/gif/rings.gif
/imgs/gif/ringsb.gif
/imgs/gif/ringsd.gif
/imgs/gif/ringsp.gif
/imgs/gif/ringsq.gif
/imgs/gif/spacers/giphy_handkither.gif
/imgs/gif/spacers/giphy_jkwii_head.gif
/imgs/gif/spacers/giphy_jkwii_head2.gif
/imgs/gif/spacers/giphy_spacer_01.gif
/imgs/gif/spacers/giphy_spacer_02.gif
/imgs/gif/spacers/giphy_spacer_03.gif
/imgs/gif/spacers/giphy_spacer_04.gif
/imgs/gif/spacers/giphy_spacer_05.gif
/imgs/gif/spacers/giphy_spacer_07.gif
/imgs/gif/spacers/giphy_spacer_08.gif
/imgs/gif/spacers/giphy_spacer_09.gif
/imgs/gif/spacers/giphy_spacer_10.gif
/imgs/gif/spacers/giphy_spacer_11.gif
/imgs/gif/spacers/giphy_spacer_12.gif
/imgs/gif/spacers/giphy_spacer_13.gif
/imgs/gif/spacers/giphy_spacer_15.gif
/imgs/gif/spacers/giphy_spacer_17.gif
/imgs/gif/spacers/giphy_spacer_19.gif
/imgs/gif/spacers/giphy_spacer_20.gif
/imgs/gif/spacers/giphy_spacer_21.gif
/imgs/gif/spacers/giphy_spacer_22.gif
/imgs/gif/spacers/tn/tn_giphy_handkither.gif
/imgs/gif/spacers/tn/tn_giphy_jkwii_head.gif
/imgs/gif/spacers/tn/tn_giphy_jkwii_head2.gif
/imgs/gif/spacers/tn/tn_giphy_spacer_01.gif
/imgs/gif/spacers/tn/tn_giphy_spacer_02.gif
/imgs/gif/spacers/tn/tn_giphy_spacer_03.gif
/imgs/gif/spacers/tn/tn_giphy_spacer_04.gif
/imgs/gif/spacers/tn/tn_giphy_spacer_05.gif
/imgs/gif/spacers/tn/tn_giphy_spacer_07.gif
/imgs/gif/spacers/tn/tn_giphy_spacer_08.gif
/imgs/gif/spacers/tn/tn_giphy_spacer_09.gif
/imgs/gif/spacers/tn/tn_giphy_spacer_10.gif
/imgs/gif/spacers/tn/tn_giphy_spacer_11.gif
/imgs/gif/spacers/tn/tn_giphy_spacer_12.gif
/imgs/gif/spacers/tn/tn_giphy_spacer_13.gif
/imgs/gif/spacers/tn/tn_giphy_spacer_15.gif
/imgs/gif/spacers/tn/tn_giphy_spacer_17.gif
/imgs/gif/spacers/tn/tn_giphy_spacer_19.gif
/imgs/gif/spacers/tn/tn_giphy_spacer_20.gif
/imgs/gif/spacers/tn/tn_giphy_spacer_21.gif
/imgs/gif/spacers/tn/tn_giphy_spacer_22.gif
/imgs/gif/time/giph_time_ticktocky.gif
/imgs/gif/time/giphy+flag_fireworks.gif
/imgs/gif/time/giphy_circlenumbers.gif
/imgs/gif/time/giphy_kititail.gif
/imgs/gif/time/giphy_konabus_kitibong.gif
/imgs/gif/time/giphy_paperhandling.gif
/imgs/gif/time/giphy_recordtime.gif
/imgs/gif/time/giphy_time1.gif
/imgs/gif/time/giphy_time_1213.gif
/imgs/gif/time/giphy_time_clockrays.gif
/imgs/gif/time/giphy_time_clocks.gif
/imgs/gif/time/giphy_time_cubist.gif
/imgs/gif/time/giphy_time_cycle.gif
/imgs/gif/time/giphy_time_flywheel.gif
/imgs/gif/time/giphy_time_gears.gif
/imgs/gif/time/giphy_time_goo.gif
/imgs/gif/time/giphy_time_hotsand.gif
/imgs/gif/time/giphy_time_kiti_ticktail.gif
/imgs/gif/time/giphy_time_numbers.gif
/imgs/gif/time/giphy_time_running.gif
/imgs/gif/time/giphy_time_schedule.gif
/imgs/gif/time/giphy_time_silouette.gif
/imgs/gif/time/giphy_time_spinn.gif
/imgs/gif/time/giphy_time_spiral.gif
/imgs/gif/time/giphy_time_spiral_up.gif
/imgs/gif/time/giphy_time_strobe.gif
/imgs/gif/time/giphy_time_swingers.gif
/imgs/gif/time/giphy_time_toons.gif
/imgs/gif/time/giphy_time_up.gif
/imgs/gif/time/giphy_timebench.gif
/imgs/gif/time/giphy_timeferro.gif
/imgs/gif/time/giphy_timegirls.gif
/imgs/gif/time/giphy_timeguy.gif
/imgs/gif/time/giphy_timegym.gif
/imgs/gif/time/giphy_timeinky.gif
/imgs/gif/time/giphy_timerunning.gif
/imgs/gif/time/giphy_timespinner.gif
/imgs/gif/time/giphy_timespiral_gold.gif
/imgs/gif/time/giphy_yellowbird_lookin.gif
/imgs/gif/time/stoptheclock.gif
/imgs/gif/time/tn/tn_giph_time_ticktocky.gif
/imgs/gif/time/tn/tn_giphy+flag_fireworks.gif
/imgs/gif/time/tn/tn_giphy_circlenumbers.gif
/imgs/gif/time/tn/tn_giphy_kititail.gif
/imgs/gif/time/tn/tn_giphy_konabus_kitibong.gif
/imgs/gif/time/tn/tn_giphy_paperhandling.gif
/imgs/gif/time/tn/tn_giphy_recordtime.gif
/imgs/gif/time/tn/tn_giphy_time1.gif
/imgs/gif/time/tn/tn_giphy_time_1213.gif
/imgs/gif/time/tn/tn_giphy_time_clockrays.gif
/imgs/gif/time/tn/tn_giphy_time_clocks.gif
/imgs/gif/time/tn/tn_giphy_time_cubist.gif
/imgs/gif/time/tn/tn_giphy_time_cycle.gif
/imgs/gif/time/tn/tn_giphy_time_flywheel.gif
/imgs/gif/time/tn/tn_giphy_time_gears.gif
/imgs/gif/time/tn/tn_giphy_time_goo.gif
/imgs/gif/time/tn/tn_giphy_time_hotsand.gif
/imgs/gif/time/tn/tn_giphy_time_kiti_ticktail.gif
/imgs/gif/time/tn/tn_giphy_time_numbers.gif
/imgs/gif/time/tn/tn_giphy_time_running.gif
/imgs/gif/time/tn/tn_giphy_time_schedule.gif
/imgs/gif/time/tn/tn_giphy_time_silouette.gif
/imgs/gif/time/tn/tn_giphy_time_spinn.gif
/imgs/gif/time/tn/tn_giphy_time_spiral.gif
/imgs/gif/time/tn/tn_giphy_time_spiral_up.gif
/imgs/gif/time/tn/tn_giphy_time_strobe.gif
/imgs/gif/time/tn/tn_giphy_time_swingers.gif
/imgs/gif/time/tn/tn_giphy_time_toons.gif
/imgs/gif/time/tn/tn_giphy_time_up.gif
/imgs/gif/time/tn/tn_giphy_timebench.gif
/imgs/gif/time/tn/tn_giphy_timeferro.gif
/imgs/gif/time/tn/tn_giphy_timegirls.gif
/imgs/gif/time/tn/tn_giphy_timeguy.gif
/imgs/gif/time/tn/tn_giphy_timegym.gif
/imgs/gif/time/tn/tn_giphy_timeinky.gif
/imgs/gif/time/tn/tn_giphy_timerunning.gif
/imgs/gif/time/tn/tn_giphy_timespinner.gif
/imgs/gif/time/tn/tn_giphy_timespiral_gold.gif
/imgs/gif/time/tn/tn_giphy_yellowbird_lookin.gif
/imgs/gif/time/tn/tn_stoptheclock.gif
/imgs/gif/us/giph_jkwii_handglowy.gif
/imgs/gif/us/giph_jkwii_popcorny.gif
/imgs/gif/us/giph_us_snapshot.gif
/imgs/gif/us/giphy_alien_bio3.gif
/imgs/gif/us/giphy_alien_worms.gif
/imgs/gif/us/giphy_book_flipblank.gif
/imgs/gif/us/giphy_book_flipedge.gif
/imgs/gif/us/giphy_book_flipfast.gif
/imgs/gif/us/giphy_book_flipflat.gif
/imgs/gif/us/giphy_book_flipold.gif
/imgs/gif/us/giphy_books_shelf.gif
/imgs/gif/us/giphy_bugs_jaildoorsgif.gif
/imgs/gif/us/giphy_bugs_paper.gif
/imgs/gif/us/giphy_bugs_typer.gif
/imgs/gif/us/giphy_bugs_umbrellagif.gif
/imgs/gif/us/giphy_bugsmugs.gif
/imgs/gif/us/giphy_bulbfire.gif
/imgs/gif/us/giphy_byrdpucker_donutlaw_simpsons.gif
/imgs/gif/us/giphy_byrdpucker_hatgirls.gif
/imgs/gif/us/giphy_byrdpucker_horseheadsgif.gif
/imgs/gif/us/giphy_byrdpucker_scan.gif
/imgs/gif/us/giphy_circles_n_bbs.gif
/imgs/gif/us/giphy_coffee_drip.gif
/imgs/gif/us/giphy_coffee_steam.gif
/imgs/gif/us/giphy_demonhorns.gif
/imgs/gif/us/giphy_flagybanner.gif
/imgs/gif/us/giphy_flipbook.gif
/imgs/gif/us/giphy_flipbook2.gif
/imgs/gif/us/giphy_flipbook_glow.gif
/imgs/gif/us/giphy_flipbooks.gif
/imgs/gif/us/giphy_focus_eyeball_hivey.gif
/imgs/gif/us/giphy_g.gif
/imgs/gif/us/giphy_go_crystalcube.gif
/imgs/gif/us/giphy_gridpart.gif
/imgs/gif/us/giphy_jkwii_glance.gif
/imgs/gif/us/giphy_jkwii_handorb.gif
/imgs/gif/us/giphy_jkwii_headwave2.gif
/imgs/gif/us/giphy_k.gif
/imgs/gif/us/giphy_keyboard_onoff_handtoggle.gif
/imgs/gif/us/giphy_keyboard_round.gif
/imgs/gif/us/giphy_kids_arcstrollers.gif
/imgs/gif/us/giphy_kids_tinkerbel_block.gif
/imgs/gif/us/giphy_kids_tinkerbell_laughblock.gif
/imgs/gif/us/giphy_kids_tinkerbell_leafdoor.gif
/imgs/gif/us/giphy_kids_tinkerbell_stare.gif
/imgs/gif/us/giphy_konabus_bugs_rolln.gif
/imgs/gif/us/giphy_konabus_headsmokn.gif
/imgs/gif/us/giphy_konabus_mushrooms.gif
/imgs/gif/us/giphy_konabus_schrooms.gif
/imgs/gif/us/giphy_koswell50.gif
/imgs/gif/us/giphy_kou_elbowpipes.gif
/imgs/gif/us/giphy_kou_magnets1.gif
/imgs/gif/us/giphy_kou_mercury_steps.gif
/imgs/gif/us/giphy_kou_newschool100.gif
/imgs/gif/us/giphy_kou_science_pour.gif
/imgs/gif/us/giphy_med_headknock1.gif
/imgs/gif/us/giphy_med_heart.gif
/imgs/gif/us/giphy_med_teethgif.gif
/imgs/gif/us/giphy_mistspray.gif
/imgs/gif/us/giphy_news_bookworm.gif
/imgs/gif/us/giphy_news_phone.gif
/imgs/gif/us/giphy_news_presses.gif
/imgs/gif/us/giphy_news_slow.gif
/imgs/gif/us/giphy_news_toon.gif
/imgs/gif/us/giphy_orb7.gif
/imgs/gif/us/giphy_orb_caravan.gif
/imgs/gif/us/giphy_orb_coat.gif
/imgs/gif/us/giphy_orb_crystal.gif
/imgs/gif/us/giphy_orb_cubepulse.gif
/imgs/gif/us/giphy_orb_forward.gif
/imgs/gif/us/giphy_orb_glow.gif
/imgs/gif/us/giphy_orb_linear.gif
/imgs/gif/us/giphy_orb_outgif.gif
/imgs/gif/us/giphy_orb_particles.gif
/imgs/gif/us/giphy_orb_plasmagif.gif
/imgs/gif/us/giphy_orb_spirorbgif.gif
/imgs/gif/us/giphy_orb_static.gif
/imgs/gif/us/giphy_orb_wave.gif
/imgs/gif/us/giphy_orbs_birdseye.gif
/imgs/gif/us/giphy_pastryroad_layersgif.gif
/imgs/gif/us/giphy_pulse.gif
/imgs/gif/us/giphy_pulse_big.gif
/imgs/gif/us/giphy_pulse_cube.gif
/imgs/gif/us/giphy_ringshadows.gif
/imgs/gif/us/giphy_runningman_draw.gif
/imgs/gif/us/giphy_scene_medow_butterfly.gif
/imgs/gif/us/giphy_scene_medow_sky.gif
/imgs/gif/us/giphy_scene_moonpond.gif
/imgs/gif/us/giphy_scene_motiongallery.gif
/imgs/gif/us/giphy_slinky_treadmill.gif
/imgs/gif/us/giphy_spinner1.gif
/imgs/gif/us/giphy_spinner_dark.gif
/imgs/gif/us/giphy_time_platters.gif
/imgs/gif/us/giphy_us_alien_dancers.gif
/imgs/gif/us/giphy_us_babyheads.gif
/imgs/gif/us/giphy_us_ballhead2.gif
/imgs/gif/us/giphy_us_ballheads.gif
/imgs/gif/us/giphy_us_flirty1.gif
/imgs/gif/us/giphy_us_flirty2.gif
/imgs/gif/us/giphy_us_headblinkers.gif
/imgs/gif/us/giphy_us_headline.gif
/imgs/gif/us/giphy_us_headwave.gif
/imgs/gif/us/giphy_us_hive.gif
/imgs/gif/us/giphy_us_hive_walkers.gif
/imgs/gif/us/giphy_us_joggers.gif
/imgs/gif/us/giphy_us_pacer.gif
/imgs/gif/us/giphy_us_toons2.gif
/imgs/gif/us/giphy_us_touch1.gif
/imgs/gif/us/giphy_us_walkers.gif
/imgs/gif/us/giphy_woohoo_mickey.gif
/imgs/gif/us/giphy_xmastrees.gif
/imgs/gif/us/giphy_zensitter.gif
/imgs/gif/us/giphy_zoom_earth.gif
/imgs/gif/us/giphy_zoom_typos_fold.gif
/imgs/gif/us/tn/tn_giph_jkwii_handglowy.gif
/imgs/gif/us/tn/tn_giph_jkwii_popcorny.gif
/imgs/gif/us/tn/tn_giph_us_snapshot.gif
/imgs/gif/us/tn/tn_giphy_alien_bio3.gif
/imgs/gif/us/tn/tn_giphy_alien_worms.gif
/imgs/gif/us/tn/tn_giphy_book_flipblank.gif
/imgs/gif/us/tn/tn_giphy_book_flipedge.gif
/imgs/gif/us/tn/tn_giphy_book_flipfast.gif
/imgs/gif/us/tn/tn_giphy_book_flipflat.gif
/imgs/gif/us/tn/tn_giphy_book_flipold.gif
/imgs/gif/us/tn/tn_giphy_books_shelf.gif
/imgs/gif/us/tn/tn_giphy_bugs_jaildoorsgif.gif
/imgs/gif/us/tn/tn_giphy_bugs_paper.gif
/imgs/gif/us/tn/tn_giphy_bugs_typer.gif
/imgs/gif/us/tn/tn_giphy_bugs_umbrellagif.gif
/imgs/gif/us/tn/tn_giphy_bugsmugs.gif
/imgs/gif/us/tn/tn_giphy_bulbfire.gif
/imgs/gif/us/tn/tn_giphy_byrdpucker_donutlaw_simpsons.gif
/imgs/gif/us/tn/tn_giphy_byrdpucker_hatgirls.gif
/imgs/gif/us/tn/tn_giphy_byrdpucker_horseheadsgif.gif
/imgs/gif/us/tn/tn_giphy_byrdpucker_scan.gif
/imgs/gif/us/tn/tn_giphy_circles_n_bbs.gif
/imgs/gif/us/tn/tn_giphy_coffee_drip.gif
/imgs/gif/us/tn/tn_giphy_coffee_steam.gif
/imgs/gif/us/tn/tn_giphy_demonhorns.gif
/imgs/gif/us/tn/tn_giphy_flagybanner.gif
/imgs/gif/us/tn/tn_giphy_flipbook.gif
/imgs/gif/us/tn/tn_giphy_flipbook2.gif
/imgs/gif/us/tn/tn_giphy_flipbook_glow.gif
/imgs/gif/us/tn/tn_giphy_flipbooks.gif
/imgs/gif/us/tn/tn_giphy_focus_eyeball_hivey.gif
/imgs/gif/us/tn/tn_giphy_g.gif
/imgs/gif/us/tn/tn_giphy_go_crystalcube.gif
/imgs/gif/us/tn/tn_giphy_gridpart.gif
/imgs/gif/us/tn/tn_giphy_jkwii_glance.gif
/imgs/gif/us/tn/tn_giphy_jkwii_handorb.gif
/imgs/gif/us/tn/tn_giphy_jkwii_headwave2.gif
/imgs/gif/us/tn/tn_giphy_k.gif
/imgs/gif/us/tn/tn_giphy_keyboard_onoff_handtoggle.gif
/imgs/gif/us/tn/tn_giphy_keyboard_round.gif
/imgs/gif/us/tn/tn_giphy_kids_arcstrollers.gif
/imgs/gif/us/tn/tn_giphy_kids_tinkerbel_block.gif
/imgs/gif/us/tn/tn_giphy_kids_tinkerbell_laughblock.gif
/imgs/gif/us/tn/tn_giphy_kids_tinkerbell_leafdoor.gif
/imgs/gif/us/tn/tn_giphy_kids_tinkerbell_stare.gif
/imgs/gif/us/tn/tn_giphy_konabus_bugs_rolln.gif
/imgs/gif/us/tn/tn_giphy_konabus_headsmokn.gif
/imgs/gif/us/tn/tn_giphy_konabus_mushrooms.gif
/imgs/gif/us/tn/tn_giphy_konabus_schrooms.gif
/imgs/gif/us/tn/tn_giphy_koswell50.gif
/imgs/gif/us/tn/tn_giphy_kou_elbowpipes.gif
/imgs/gif/us/tn/tn_giphy_kou_magnets1.gif
/imgs/gif/us/tn/tn_giphy_kou_mercury_steps.gif
/imgs/gif/us/tn/tn_giphy_kou_newschool100.gif
/imgs/gif/us/tn/tn_giphy_kou_science_pour.gif
/imgs/gif/us/tn/tn_giphy_med_headknock1.gif
/imgs/gif/us/tn/tn_giphy_med_heart.gif
/imgs/gif/us/tn/tn_giphy_med_teethgif.gif
/imgs/gif/us/tn/tn_giphy_mistspray.gif
/imgs/gif/us/tn/tn_giphy_news_bookworm.gif
/imgs/gif/us/tn/tn_giphy_news_phone.gif
/imgs/gif/us/tn/tn_giphy_news_presses.gif
/imgs/gif/us/tn/tn_giphy_news_slow.gif
/imgs/gif/us/tn/tn_giphy_news_toon.gif
/imgs/gif/us/tn/tn_giphy_orb7.gif
/imgs/gif/us/tn/tn_giphy_orb_caravan.gif
/imgs/gif/us/tn/tn_giphy_orb_coat.gif
/imgs/gif/us/tn/tn_giphy_orb_crystal.gif
/imgs/gif/us/tn/tn_giphy_orb_cubepulse.gif
/imgs/gif/us/tn/tn_giphy_orb_forward.gif
/imgs/gif/us/tn/tn_giphy_orb_glow.gif
/imgs/gif/us/tn/tn_giphy_orb_linear.gif
/imgs/gif/us/tn/tn_giphy_orb_outgif.gif
/imgs/gif/us/tn/tn_giphy_orb_particles.gif
/imgs/gif/us/tn/tn_giphy_orb_plasmagif.gif
/imgs/gif/us/tn/tn_giphy_orb_spirorbgif.gif
/imgs/gif/us/tn/tn_giphy_orb_static.gif
/imgs/gif/us/tn/tn_giphy_orb_wave.gif
/imgs/gif/us/tn/tn_giphy_orbs_birdseye.gif
/imgs/gif/us/tn/tn_giphy_pastryroad_layersgif.gif
/imgs/gif/us/tn/tn_giphy_pulse.gif
/imgs/gif/us/tn/tn_giphy_pulse_big.gif
/imgs/gif/us/tn/tn_giphy_pulse_cube.gif
/imgs/gif/us/tn/tn_giphy_ringshadows.gif
/imgs/gif/us/tn/tn_giphy_runningman_draw.gif
/imgs/gif/us/tn/tn_giphy_scene_medow_butterfly.gif
/imgs/gif/us/tn/tn_giphy_scene_medow_sky.gif
/imgs/gif/us/tn/tn_giphy_scene_moonpond.gif
/imgs/gif/us/tn/tn_giphy_scene_motiongallery.gif
/imgs/gif/us/tn/tn_giphy_slinky_treadmill.gif
/imgs/gif/us/tn/tn_giphy_spinner1.gif
/imgs/gif/us/tn/tn_giphy_spinner_dark.gif
/imgs/gif/us/tn/tn_giphy_time_platters.gif
/imgs/gif/us/tn/tn_giphy_us_alien_dancers.gif
/imgs/gif/us/tn/tn_giphy_us_babyheads.gif
/imgs/gif/us/tn/tn_giphy_us_ballhead2.gif
/imgs/gif/us/tn/tn_giphy_us_ballheads.gif
/imgs/gif/us/tn/tn_giphy_us_flirty1.gif
/imgs/gif/us/tn/tn_giphy_us_flirty2.gif
/imgs/gif/us/tn/tn_giphy_us_headblinkers.gif
/imgs/gif/us/tn/tn_giphy_us_headline.gif
/imgs/gif/us/tn/tn_giphy_us_headwave.gif
/imgs/gif/us/tn/tn_giphy_us_hive.gif
/imgs/gif/us/tn/tn_giphy_us_hive_walkers.gif
/imgs/gif/us/tn/tn_giphy_us_joggers.gif
/imgs/gif/us/tn/tn_giphy_us_pacer.gif
/imgs/gif/us/tn/tn_giphy_us_toons2.gif
/imgs/gif/us/tn/tn_giphy_us_touch1.gif
/imgs/gif/us/tn/tn_giphy_us_walkers.gif
/imgs/gif/us/tn/tn_giphy_woohoo_mickey.gif
/imgs/gif/us/tn/tn_giphy_xmastrees.gif
/imgs/gif/us/tn/tn_giphy_zensitter.gif
/imgs/gif/us/tn/tn_giphy_zoom_earth.gif
/imgs/gif/us/tn/tn_giphy_zoom_typos_fold.gif
/imgs/gif/us_big/giph_us_touch_arms.gif
/imgs/gif/us_big/giphy_alien_bigdancer1.gif
/imgs/gif/us_big/giphy_alien_bigdancer2.gif
/imgs/gif/us_big/giphy_android_anatomy.gif
/imgs/gif/us_big/giphy_boxinbox.gif
/imgs/gif/us_big/giphy_faces2.gif
/imgs/gif/us_big/giphy_finger_team.gif
/imgs/gif/us_big/giphy_focus_android.gif
/imgs/gif/us_big/giphy_jkwii_finger.gif
/imgs/gif/us_big/giphy_jkwii_headwaves2.gif
/imgs/gif/us_big/giphy_keyboard_wavepanel.gif
/imgs/gif/us_big/giphy_kids_bouncedown.gif
/imgs/gif/us_big/giphy_konabus_exhale.gif
/imgs/gif/us_big/giphy_kou_magnet_arc.gif
/imgs/gif/us_big/giphy_kou_magnet_ring.gif
/imgs/gif/us_big/giphy_magnet_link.gif
/imgs/gif/us_big/giphy_med_alien_bio.gif
/imgs/gif/us_big/giphy_med_heart3.gif
/imgs/gif/us_big/giphy_med_implosion.gif
/imgs/gif/us_big/giphy_news_keaton_bignews.gif
/imgs/gif/us_big/giphy_orb_sandripple.gif
/imgs/gif/us_big/giphy_orb_square.gif
/imgs/gif/us_big/giphy_orb_static2.gif
/imgs/gif/us_big/giphy_orbs_concavering.gif
/imgs/gif/us_big/giphy_pastryroad_flipn.gif
/imgs/gif/us_big/giphy_spinner_copper.gif
/imgs/gif/us_big/giphy_us_ballhead_bouncers.gif
/imgs/gif/us_big/giphy_us_gooddeed.gif
/imgs/gif/us_big/giphy_us_hatshake.gif
/imgs/gif/us_big/giphy_us_meet_latex_portal.gif
/imgs/gif/us_big/giphy_us_morph1.gif
/imgs/gif/us_big/giphy_us_morph2.gif
/imgs/gif/us_big/giphy_us_sarandancer.gif
/imgs/gif/us_big/giphy_us_toons1.gif
/imgs/gif/us_big/giphy_zoom_bug.gif
/imgs/gif/view/giphy_us01.gif
/imgs/gif/view/giphy_view00.gif
/imgs/gif/view/giphy_view01.gif
/imgs/gif/view/giphy_view02.gif
/imgs/gif/view/giphy_view03.gif
/imgs/gif/view/giphy_view04.gif
/imgs/gif/view/giphy_view05.gif
/imgs/gif/view/giphy_view06.gif
/imgs/gif/view/giphy_view08.gif
/imgs/gif/view/giphy_view09.gif
/imgs/gif/view/giphy_view10.gif
/imgs/gif/view/giphy_view11.gif
/imgs/gif/view/giphy_view12.gif
/imgs/gif/view/giphy_view13.gif
/imgs/gif/view/giphy_view14.gif
/imgs/gif/view/giphy_view15y.gif
/imgs/gif/view/giphy_view16.gif
/imgs/gif/view/giphy_view17.gif
/imgs/gif/view/giphy_view19.gif
/imgs/gif/view/giphy_view20.gif
/imgs/gif/view/giphy_view21.gif
/imgs/gif/view/giphy_view22.gif
/imgs/gif/view/giphy_view25.gif
/imgs/gif/view/giphy_view26.gif
/imgs/gif/view/giphy_view27.gif
/imgs/gif/view/giphy_view28.gif
/imgs/gif/view/giphy_view29.gif
/imgs/gif/view/giphy_view30.gif
/imgs/gif/view/giphy_view31.gif
/imgs/gif/view/giphy_view32.gif
/imgs/gif/view/giphy_view33.gif
/imgs/gif/view/giphy_view34.gif
/imgs/gif/view/giphy_view35.gif
`;

kolists['bb'] = ``;
kolists['dd'] = ``;

kolists['pn'] = `
/pn/imgs/pano_creek5.jpg
/pn/imgs/pano_burmuda.jpg
/pn/imgs/PIA22313_pano.jpg
/pn/imgs/Sol83-PremiersGivres-pano.jpg
/pn/imgs/Taipo_pano.jpg
/pn/imgs/Opportunity-Mars-Rover-Lander-pia19112.jpg
/pn/imgs/mars-rover-opportunity-pia19111_Sol3902B_Cape_Tribulation_L2R2ana.jpg
/pn/imgs/mars-rover-opportunity-pia19110_Sol3902B_Cape_Tribulation_L257F.jpg
/pn/imgs/mars-gale-crater-panorama-pia11241-full.jpg
/pn/imgs/opportunity-panorama-warton-ridge-enhanced-pia20850-full.jpg
/pn/imgs/mars-panoramic-mt-sharp-rover-curiosity-pia19662.jpg
/pn/imgs/pano_jtf_entrance_jtf.jpg
/pn/imgs/pano_jtf_entrance.jpg
/pn/imgs/pano_fork_grass.jpg
/pn/imgs/pano_jtfarms_entrance_9700x100.jpg
/pn/imgs/pano_backyard_all.jpg
/pn/imgs/pano_jtfarms_enter_hi.jpg
/pn/imgs/pano_falls.jpg
/pn/imgs/pano_falls1_4000.jpg
/pn/imgs/pano_courtyard2.jpg
/pn/imgs/pano_courtyard1.jpg
/pn/imgs/pano_closeline.jpg
/pn/imgs/pano_falls_south.jpg
/pn/imgs/pano_falls_north.jpg
/pn/imgs/pano_falls_015-285.jpg
/pn/imgs/pano_creek.jpg
/pn/imgs/yard.jpg
/pn/imgs/veneer.jpg
/pn/imgs/sphere.jpg
/pn/imgs/pano.jpg
/pn/imgs/mars-gale-crater-panorama-pia11241-full.jpg,.
/pn/imgs,mars-gale-crater-panorama-pia11241-full.jpg,mars-gale-crater-panorama-pia11241-full,.jpg,18009851,2017-07-17_07:37:49,
/pn/imgs/yard.jpg,.
/pn/imgs,yard.jpg,yard,.jpg,100790,2007-05-10_20:35:18,
/pn/imgs/pano_creek5.jpg
/pn/imgs/pano_burmuda.jpg
/pn/imgs/PIA22313_pano.jpg
/pn/imgs/Sol83-PremiersGivres-pano.jpg
/pn/imgs/Taipo_pano.jpg
/pn/imgs/Opportunity-Mars-Rover-Lander-pia19112.jpg
/pn/imgs/mars-rover-opportunity-pia19111_Sol3902B_Cape_Tribulation_L2R2ana.jpg
/pn/imgs/mars-rover-opportunity-pia19110_Sol3902B_Cape_Tribulation_L257F.jpg
/pn/imgs/mars-gale-crater-panorama-pia11241-full.jpg
/pn/imgs/opportunity-panorama-warton-ridge-enhanced-pia20850-full.jpg
/pn/imgs/mars-panoramic-mt-sharp-rover-curiosity-pia19662.jpg
/pn/imgs/pano_jtf_entrance_jtf.jpg
/pn/imgs/pano_jtf_entrance.jpg
/pn/imgs/pano_fork_grass.jpg
/pn/imgs/pano_jtfarms_entrance_9700x100.jpg
/pn/imgs/pano_backyard_all.jpg
/pn/imgs/pano_jtfarms_enter_hi.jpg
/pn/imgs/pano_falls.jpg
/pn/imgs/pano_falls1_4000.jpg
/pn/imgs/pano_courtyard2.jpg
/pn/imgs/pano_courtyard1.jpg
/pn/imgs/pano_closeline.jpg
/pn/imgs/pano_falls_south.jpg
/pn/imgs/pano_falls_north.jpg
/pn/imgs/pano_falls_015-285.jpg
/pn/imgs/pano_creek.jpg
/pn/imgs/yard.jpg
/pn/imgs/veneer.jpg
/pn/imgs/sphere.jpg
/pn/imgs/pano.jpg
// img.src = '
/pn/imgs/pano_falls.jpg';
// img.src = '
/pn/imgs/pano_jtf_sky.jpg';
// img.src = '
/pn/imgs/pano_falls1_4000.jpg';
// img.src = '
/pn/imgs/pano_falls_north.jpg';
// img.src = '
/pn/imgs/pano_falls_south.jpg';
// img.src = '
/pn/imgs/pano_jtf_entrance.jpg';
// img.src = '
/pn/imgs/pano_courtyard1_12b.jpg';
//img.src = '
/pn/imgs/pano_falls1_4000.jpg';
<img name="pano" src=
/pn/imgs/tn/tn_pano.png border=0>
<img name="pano" src=
/pn/imgs/tn/tn_pano_closeline.png border=0>
<img name="pano" src=
/pn/imgs/tn/tn_pano_courtyard1.png border=0>
/pn/imgs/pano_creek5.jpg
/pn/imgs/pano_burmuda.jpg
/pn/imgs/PIA22313_pano.jpg
/pn/imgs/Sol83-PremiersGivres-pano.jpg
/pn/imgs/Taipo_pano.jpg
/pn/imgs/Opportunity-Mars-Rover-Lander-pia19112.jpg
/pn/imgs/mars-rover-opportunity-pia19111_Sol3902B_Cape_Tribulation_L2R2ana.jpg
/pn/imgs/mars-rover-opportunity-pia19110_Sol3902B_Cape_Tribulation_L257F.jpg
/pn/imgs/mars-gale-crater-panorama-pia11241-full.jpg
/pn/imgs/opportunity-panorama-warton-ridge-enhanced-pia20850-full.jpg
/pn/imgs/mars-panoramic-mt-sharp-rover-curiosity-pia19662.jpg
/pn/imgs/pano_jtf_entrance_jtf.jpg
/pn/imgs/pano_jtf_entrance.jpg
/pn/imgs/pano_fork_grass.jpg
/pn/imgs/pano_jtfarms_entrance_9700x100.jpg
/pn/imgs/pano_backyard_all.jpg
/pn/imgs/pano_jtfarms_enter_hi.jpg
/pn/imgs/pano_falls.jpg
/pn/imgs/pano_falls1_4000.jpg
/pn/imgs/pano_courtyard2.jpg
/pn/imgs/pano_courtyard1.jpg
/pn/imgs/pano_closeline.jpg
/pn/imgs/pano_falls_south.jpg
/pn/imgs/pano_falls_north.jpg
/pn/imgs/pano_falls_015-285.jpg
/pn/imgs/yard.jpg
/pn/imgs/veneer.jpg
/pn/imgs/sphere.jpg
/pn/imgs/pano.jpg

`;
kolists['sl'] = `
/sl/html/index_sl.html
/sl/html/index_sl_20180509.html
/sl/html/index_sl_20180514.html
/sl/html/index_sl_20180515_2000.html
/sl/html/index_sl_20180516_0145.html
/sl/html/index_sl_20180516_0330.html
/sl/html/index_sl_20180517.html
/sl/html/index_sl_20180518.html
/sl/html/index_sl_20180520_2000_debugs.html
/sl/html/index_sl_20180521_1200.html
/sl/html/index_sl_20180701.html
/sl/html/index_sl_i.html
/sl/html/index_sl_imgs-anim.html
/sl/html/index_sl_imgs-bg.html
/sl/html/index_sl_imgs-btn.html
/sl/html/index_sl_imgs-links.html
/sl/html/index_sl_jtfdc-kb-animal_control.html
/sl/html/index_sl_jtfdc-kb-court-jpg_eagles_theft.html
/sl/html/index_sl_jtfdc-kb-court-pdf2jpg_20151215_acd.html
/sl/html/index_sl_jtfdc-kb-jpg_20161007_jtflaw_alexander.html
/sl/html/index_sl_jtfdc-kb-jtf_takes.html
/sl/html/index_sl_jtfdc-kb-jtfdc_v_jtfinc.html
/sl/html/index_sl_jtfdc-kb-ka_jtf29_title.html
/sl/html/index_sl_jtfdc-kb-restraining.html
/sl/html/index_sl_jtfdc.html
/sl/html/index_sl_kb-books-go-200807.html
/sl/html/index_sl_kb-books-go-200808.html
/sl/html/index_sl_kb-books-go-20130726.html
/sl/html/index_sl_kb-books-jmh-cleveland copy.html
/sl/html/index_sl_kb-books-jmh-cleveland.html
/sl/html/index_sl_kb-books-jmh-jmh2015 copy.html
/sl/html/index_sl_kb-books-jmh-jmh2015.html
/sl/html/index_sl_kb-books-jmh-jmh71-jmh71a copy.html
/sl/html/index_sl_kb-books-jmh-jmh71-jmh71a.html
/sl/html/index_sl_kb-books-jmh-jmh71-jmh71b copy.html
/sl/html/index_sl_kb-books-jmh-jmh71-jmh71b.html
/sl/html/index_sl_kb-books-jmh-userguide_80_bw copy.html
/sl/html/index_sl_kb-books-jmh-userguide_80_bw.html
/sl/html/index_sl_kb-books-kids-rumplestiltskin.html
/sl/html/index_sl_kb-books-kids-schruvelpeter.html
/sl/html/index_sl_kb-books-mil-iperms.html
/sl/html/index_sl_kb-books-mil-korea74.html
/sl/html/index_sl_kb-books-mil-leonardwood90.html
/sl/html/index_sl_kb-books-mil-saic.html
/sl/html/index_sl_kb-books-tech-astronomy_lacross_menschic.html
/sl/html/index_sl_kb-books-tech-calculus.html
/sl/html/index_sl_kb-books-tech-digitalmag.html
/sl/html/index_sl_kb-books-tech-duden.html
/sl/html/index_sl_kb-books-tech-physics.html
/sl/html/index_sl_kb-books-tech-time.html
/sl/html/index_sl_kb-intl-deutsche_memories.html
/sl/html/index_sl_kb-intl-ein_hundes_leben.html
/sl/html/index_sl_kb-intl-romanian_bocc.html
/sl/html/index_sl_kb-jmh71.html
/sl/html/index_sl_kb-kt-aikido_dynamic_sphere.html
/sl/html/index_sl_kb-kt-asian_fighting_arats_dragger.html
/sl/html/index_sl_kb-kt-chinesemed.html
/sl/html/index_sl_kb-kt-masters.html
/sl/html/index_sl_kb-kt-muschi_five_rings.html
/sl/html/index_sl_links.html
/sl/html/index_sl_medcan_bible.html
`;

kolists['tm'] = ``;

kolists['tl'] = `
/tl/avg.json
/tl/avg_kt.json
/tl/codekit-config.json
/tl/example_json.json
/tl/iperms.json
/tl/jtfdc.json
/tl/jtfinc.json
/tl/ka.json
/tl/ko_json.json
/tl/ko_json_orig.json
/tl/konet.json
/tl/model.json
/tl/saic.json
/tl/t.json
/tl/tl.json
/tl/tl00.json
/tl/tl1.json
/tl/tl1_json.json
/tl/tl2.json
/tl/tl2_json.json
/tl/tl3.json
/tl/tl3_json.json
/tl/tl4_json.json
/tl/tl_best.json
/tl/tl_best1.json
/tl/tl_db.json
/tl/tl_db_cli.json
/tl/tl_db_jpg.json
/tl/tl_db_mp4.json
/tl/tl_fb_law.json
/tl/tl_fb_law_jkwiiv_byrdbell.json
/tl/tl_jenna_json.json
/tl/tl_jpg.json
/tl/tl_jtfdc_kids.json
/tl/tl_jtfdc_stalkarounds.json
/tl/tl_jtfinc_neighbors.json
/tl/tl_mp4.json
/tl/tl_ne.json
/tl/tl_st.json
/tl/tl_templet.json
/tl/tldb.json
/tl/tldb1.json
/tl/tldb2.json
/tl/tli.json
/tl/tll.json
/tl/tlphp.json
`;

kolists['yt'] = `
yt_20200408_mcduff|https://www.youtube.com/watch?v=baK-7kr-zoo
yt_20200408_webb|https://www.youtube.com/watch?v=QdZ-vfJSE9U
yt_20200407_webb|https://www.youtube.com/watch?v=R4dLXs0PIrI
yt_20200406_webb|https://www.youtube.com/watch?v=xgtAHyssRmo
yt_20150625_chrisrea_somewhere_between_stars_santo_spirito|https://www.youtube.com/watch?v=0RF1mXxAhys
yt_20200331_carlin_germs|https://www.youtube.com/watch?v=l_L6AS1Huno
yt_20190311_bob_dylan_gotta_serve_somebody_audio|https://www.youtube.com/watch?v=wC10VWDTzmU
yt_20200407_stroppyme|https://www.youtube.com/watch?v=unNuvGJ3ses
yt_20200406_autodidactic_chinese_tartate_1729|https://www.youtube.com/watch?v=bwoF1MlckRw
yt_20190905_quinn_timothy_oneil_band_let_it_rain_official|https://www.youtube.com/watch?v=CHedk8yAF_g
yt_20200407_housitonic|https://www.youtube.com/watch?v=_pBsL0qW2Vs
yt_20200407_amazingpolly|https://www.youtube.com/watch?v=zoK6h4Mg7E8
yt_20200406_vlad9vt_sicily_polygonal_ancient_masonry|https://www.youtube.com/watch?v=sVMjRmpdUIw
yt_20200404_vlad9vt_malta_magalith|https://www.youtube.com/watch?v=zpHy1Q-fqCU
yt_20200326_borealusforum_wal_thornhil_this_is_our_electric_univers_p1of2|https://www.youtube.com/watch?v=u7peR-2m8XI
yt_szigetfestival_20120811_caro_emerald_mistaken_identiy|https://www.youtube.com/watch?v=qV8CV475WHw
yt_szigetfestival_20120811_caro_emerald_night_like_this|https://www.youtube.com/watch?v=Fc6izYdLhNE
yt_caroemerald_20130826_caro_emerald_paris_acoustic|https://www.youtube.com/watch?v=B3aWlt81EwU
yt_caroemerald_20100715_caro_emerald_back_it_up|https://www.youtube.com/watch?v=jo1cyl0QbWo
yt_caroemerald_20100701_caro_emerald_that_man|https://www.youtube.com/watch?v=CFA6dEwWOb4
yt_hotsardines_20160616_when_i_get_low_i_get_high_alan_cumming|https://www.youtube.com/watch?v=rPnXCPmrV3Y
yt_bigbadvoodoodaddy_20121016_diga_diga_doo_official|https://www.youtube.com/watch?v=ufvmD9s76X0
yt_hartandbonamassa_20130707_strange_fruit_official_beht_n_joe|https://www.youtube.com/watch?v=3Qf_aytrlpQ
yt_doristunes_20191201_twelve_bar_blues_band_you_gonna_need_my_help_someday|https://www.youtube.com/watch?v=x1dBWRybOxc
yt_postmodernjukebos_2081115_purple_rain_prince_cover_miche_braden|https://www.youtube.com/watch?v=LT8dW7bGuuM
yt_sanbornsessions_20200129_michael_mcdonald_find_it_in_your_heard_brian_owens|https://www.youtube.com/watch?v=yt4zhbE07Cg
yt_bjork_20200210_ociania_bjork|https://www.youtube.com/watch?v=thnTE2e341g
yt_webb 20200210_streaming_to_joe_biden_water_island_with_sub_base|https://www.youtube.com/watch?v=3wAy4lMjpVU
yt_mcduff_20200210_mindfields_ep5_vatican_assassins|https://www.youtube.com/watch?v=YX2HWrnPZQ4
yt_quinn_20200210_see_ya_later_twitter_deleting_app|https://www.youtube.com/watch?v=p2RkhTBAyG0
yt_newsbud_20200207_turkey_russia_marriage_convenience_nearing_end|https://www.youtube.com/watch?v=XkiOgnu4Ifs
yt_munder_20200210_china_burning_bright_signatures_from_space|https://www.youtube.com/watch?v=LEcj3cBagCQ
yt_dahboo7_20200120_germany_reports_outbreak_h5n8_bird_flu|https://www.youtube.com/watch?v=4tSZN7r6g5U
yt_dahboo7_20200120_20200210_brazil_virus_unknown_origin_genes|https://www.youtube.com/watch?v=pd6oqf-lzNE
yt_vlad9vt_20200210_yonaguni_underwater_structure|https://www.youtube.com/watch?v=S-UGC-gkyCU
yt_instituetofnoeticsciences_20160707_experiments_consciousness_affects_matter_dean_radin_phd|https://www.youtube.com/watch?v=nRSBaq3vAeY
yt_zachstar_20200210_calculus_optimization_beyond|https://www.youtube.com/watch?v=6O8Jyrr9LRc
yt_vipertv_20200210_olmec_orgins_odd_conclusion|https://www.youtube.com/watch?v=pSE9m9jQKpk
yt_liziqi_20190906_liziqi_channel_corn_chinese|https://www.youtube.com/watch?v=bZsfEwr9i6I
yt_ted_20120312_david_gallo_deep_ocean_mysteries_n_wonders|https://www.youtube.com/watch?v=Uqly8ERIkHM
yt_foodwishes_20150422_greek_lemon_chicken_potatoes|https://www.youtube.com/watch?v=h6OSMbfhIao
`;

kolists['zm'] = `
/zm/space_2019/thule/TileGroup0/0-0-0.jpg
/zm/space_2019/thule1/TileGroup0/0-0-0.jpg
/zm/space_2019/thule2/TileGroup0/0-0-0.jpg
/zm/space_2018/bennu/TileGroup0/0-0-0.jpg
/zm/space_2018/bennu_face/TileGroup0/0-0-0.jpg
/zm/space_2018/mars_barcode_circuitboard/TileGroup0/0-0-0.jpg
/zm/space_2019/mars_barcode10000/TileGroup0/0-0-0.jpg
/heart/notre_dame_easter_2019/imgs/zm/big_12364080-6929643-An_interior_view_of_the_dpi600_Notre_Dame_Cathedral_in_Paris_in_the_aft-a-88_1555453712194/TileGroup0/0-0-0.jpg
/heart/notre_dame_easter_2019/imgs/zm/big_12375020-6929643-image-a-1_1555482644826/TileGroup0/0-0-0.jpg
/heart/notre_dame_easter_2019/imgs/zm/big_12375022-6929643-image-a-4_1555482679561/TileGroup0/0-0-0.jpg
/heart/notre_dame_easter_2019/imgs/zm/big_12375026-6929643-image-a-8_1555482902378/TileGroup0/0-0-0.jpg
/heart/notre_dame_easter_2019/imgs/zm/big_12375032-6929643-image-a-14_1555482936340/TileGroup0/0-0-0.jpg
/heart/notre_dame_easter_2019/imgs/zm/big_12375036-6929643-One_of_the_cathedral_s_many_intricate_fdpi_acades_around_where_the_t-a-1_1555486099469/TileGroup0/0-0-0.jpg
/heart/notre_dame_easter_2019/imgs/zm/big_12381954-6929643-image-m-20_1555496529559/TileGroup0/0-0-0.jpg
/heart/notre_dame_easter_2019/imgs/zm/big_12358952-6929643-Pictured_the_blaze_at_Notre_Dame_yesterday_Much_of_the_roof_was_-/TileGroup0/0-0-0.jpg
/heart/notre_dame_easter_2019/imgs/zm/big_a-91_1555453712206/TileGroup0/0-0-0.jpg
/heart/notre_dame_easter_2019/imgs/zm/big_12361102-6929643-How_did_it_escape_the_flames_The_gdpi_olden_crucifix_standing_above_-a-2_1555486099472/TileGroup0/0-0-0.jpg
/heart/notre_dame_easter_2019/imgs/zm/big_12354988-6928937-Plumes_of_smoke_quickly_billowed_from_the_cathedral_and_could_be-a-22_1555440231597/TileGroup0/0-0-0.jpg
/heart/notre_dame_easter_2019/imgs/zm/big_12356584-6928937-The_fire_swiftly_ripped_through_the_cathedral_s_oak_roof_support-a-35_1555440231801/TileGroup0/0-0-0.jpg
/zm/space_2018/mars_rebar_mouldings/TileGroup0/0-0-0.jpg
/zm/space_2018/mars_pouch_rings/TileGroup0/0-0-0.jpg
/zm/space_2018/pano_mars_mtsharp/TileGroup0/0-0-0.jpg
/zm/space_2018/pano_caralperu/TileGroup0/0-0-0.jpg
/zm/space_2018/pano_jtfinc/TileGroup0/0-0-0.jpg
/zm/space_2018/pano_jtfdc/TileGroup0/0-0-0.jpg
/zm/space_2018/mars_barcode_circuitboard/TileGroup0/0-0-0.jpg
/zm/space_2018/mars_barcode_circuitboard/TileGroup0/0-0-0.jpg
/zm/space_2018/mars_barcode_circuitboard/TileGroup0/0-0-0.jpg
/zm/space_2018/mars_barcode_circuitboard/TileGroup0/0-0-0.jpg
/zm/space_2018/mars_barcode_circuitboard/TileGroup0/0-0-0.jpg
/zm/zm_nasa/mars_zigzag_panels2400/TileGroup0/0-0-0.jpg
/zm/zm_nasa/nasa/1-scientistsfl/TileGroup0/0-0-0.jpg
/zm/zm_nasa/nasa/Echus-Chasma-On-Mars/TileGroup0/0-0-0.jpg
/zm/zm_nasa/nasa/mars_zigzag_panels/TileGroup0/0-0-0.jpg
/zm/zm_nasa/zm/Curiosity-Murray-Buttes/TileGroup0/0-0-0.jpg
/zm/zm_nasa/venus_400/TileGroup0/0-0-0.jpg
/zm/zm_nasa/zm5_planets/1-scientistsfl/TileGroup0/0-0-0.jpg
/zm/zm_nasa/zm5_planets/1-scientistsfl/TileGroup0/0-0-0.jpg
/zm/hrc2009stl/TileGroup0/0-0-0.jpg
/zm/hrc2011/TileGroup0/0-0-0.jpg
/zm/komap/TileGroup0/0-0-0.jpg
/zm/zm_nasa/apollo/070214_val_marineris_02/TileGroup0/0-0-0.jpg
/zm/zm_nasa/apollo/071010-msl-site1-02/TileGroup0/0-0-0.jpg
/zm/zm_nasa/apollo/071127-venus-surface-02/TileGroup0/0-0-0.jpg
/zm/zm_nasa/apollo/080409-phobos-02/TileGroup0/0-0-0.jpg
/zm/zm_nasa/apollo/081016-crater-mound-02/TileGroup0/0-0-0.jpg
/zm/zm_nasa/apollo/081103-mars-ripples-02/TileGroup0/0-0-0.jpg
/zm/zm_nasa/apollo/081204-rock-layers-02/TileGroup0/0-0-0.jpg
/zm/zm_nasa/apollo/090331-mars-starburst-02/TileGroup0/0-0-0.jpg
/zm/zm_nasa/apollo/090813-mars-crater-02.jpg/TileGroup0/0-0-0.jpg
/zm/zm_nasa/apollo/100113-mars-illusion-02/TileGroup0/0-0-0.jpg
/zm/zm_nasa/apollo/20070507_185501_1010108/TileGroup0/0-0-0.jpg
/zm/zm_nasa/apollo/365430main_nacl000000fd_middle_540x540/TileGroup0/0-0-0.jpg
/zm/zm_nasa/apollo/367307main_cracked_hahn_lg/TileGroup0/0-0-0.jpg
/zm/zm_nasa/apollo/369230main_apollolandinglocator_full/TileGroup0/0-0-0.jpg
/zm/zm_nasa/apollo/388038main_milichius_full/TileGroup0/0-0-0.jpg
/zm/zm_nasa/apollo/393992main_ejecta_20091014_full/TileGroup0/0-0-0.jpg
/zm/zm_nasa/apollo/400202main_lroc_apollo11_20091109_full/TileGroup0/0-0-0.jpg
/zm/zm_nasa/apollo/403330main_cabeus_lg/TileGroup0/0-0-0.jpg
/zm/zm_nasa/apollo/414923main_wrinkle-ridge-full/TileGroup0/0-0-0.jpg
/zm/zm_nasa/apollo/416286main_new-images-1-full/TileGroup0/0-0-0.jpg
/zm/zm_nasa/apollo/417415main_tychocloseup-20100115-full/TileGroup0/0-0-0.jpg
/zm/zm_nasa/apollo/417417main_tychofull-20100115-full/TileGroup0/0-0-0.jpg
/zm/zm_nasa/apollo/417869main_arist_bands321-full/TileGroup0/0-0-0.jpg
/zm/zm_nasa/apollo/417873main_M111918050R_thumb-full/TileGroup0/0-0-0.jpg
/zm/zm_nasa/apollo/419421main_AS16-M-0891-full/TileGroup0/0-0-0.jpg
/zm/zm_nasa/apollo/419425main_M106088433R-full/TileGroup0/0-0-0.jpg
/zm/zm_nasa/apollo/421320main_hadley_rille/TileGroup0/0-0-0.jpg
/zm/zm_nasa/apollo/421615main_plato_2_lg/TileGroup0/0-0-0.jpg
/zm/zm_nasa/apollo/421619main_plato_crater_lg/TileGroup0/0-0-0.jpg
/zm/zm_nasa/apollo/422349main_byrgius-a-20100203-full/TileGroup0/0-0-0.jpg
/zm/zm_nasa/apollo/422590-mars-taber-ansigt-/TileGroup0/0-0-0.jpg
/zm/zm_nasa/apollo/424828main_LunarOrbiterIII_3085_med/TileGroup0/0-0-0.jpg
/zm/zm_nasa/apollo/433446main_20100311_crisium_lg/TileGroup0/0-0-0.jpg
/zm/zm_nasa/apollo/445016main_anax3600_500/TileGroup0/0-0-0.jpg
/zm/zm_nasa/apollo/445021main_anax_wac_500/TileGroup0/0-0-0.jpg
/zm/zm_nasa/apollo/449172main_WAC_crop_context/TileGroup0/0-0-0.jpg
/zm/zm_nasa/apollo/449174main_M104376385_thumb/TileGroup0/0-0-0.jpg
/zm/zm_nasa/apollo/450800main_tsiol_2_lg/TileGroup0/0-0-0.jpg
/zm/zm_nasa/apollo/450994main_full_moon_lg/TileGroup0/0-0-0.jpg
/zm/zm_nasa/apollo/453514main_meteor_crater2_lg/TileGroup0/0-0-0.jpg
/zm/zm_nasa/apollo/453516main_meteor_crater_az_lg/TileGroup0/0-0-0.jpg
/zm/zm_nasa/apollo/455939main_holeinone_far_lg/TileGroup0/0-0-0.jpg
/zm/zm_nasa/apollo/463365main_M128202846LE/TileGroup0/0-0-0.jpg
/zm/zm_nasa/apollo/503670main_120210a/TileGroup0/0-0-0.jpg
/zm/zm_nasa/apollo/521685main_022111a/TileGroup0/0-0-0.jpg
/zm/zm_nasa/apollo/521691main_022111b/TileGroup0/0-0-0.jpg
/zm/zm_nasa/apollo/524173main_022511a/TileGroup0/0-0-0.jpg
/zm/zm_nasa/apollo/524220main_030211b/TileGroup0/0-0-0.jpg
/zm/zm_nasa/apollo/528087main_031110a/TileGroup0/0-0-0.jpg
/zm/zm_nasa/apollo/529214main_031611a/TileGroup0/0-0-0.jpg
/zm/zm_nasa/apollo/529221main_031611c/TileGroup0/0-0-0.jpg
/zm/zm_nasa/apollo/531407main_031811b/TileGroup0/0-0-0.jpg
/zm/zm_nasa/apollo/533097main_033111b/TileGroup0/0-0-0.jpg
/zm/zm_nasa/apollo/534165main_040511a/TileGroup0/0-0-0.jpg
/zm/zm_nasa/apollo/536801main_041311aa/TileGroup0/0-0-0.jpg
/zm/zm_nasa/apollo/539777main_042111b/TileGroup0/0-0-0.jpg
/zm/zm_nasa/apollo/541041main_042711a/TileGroup0/0-0-0.jpg
/zm/zm_nasa/apollo/555516main_053111a/TileGroup0/0-0-0.jpg
/zm/zm_nasa/apollo/558017main_060211a/TileGroup0/0-0-0.jpg
/zm/zm_nasa/apollo/561423main_060811b/TileGroup0/0-0-0.jpg
/zm/zm_nasa/apollo/576849main_062811b/TileGroup0/0-0-0.jpg
/zm/zm_nasa/apollo/576883main_062911b/TileGroup0/0-0-0.jpg
/zm/zm_nasa/apollo/58-pluto-3-large/TileGroup0/0-0-0.jpg
/zm/zm_nasa/apollo/ap11_landinJSC2007e045375/TileGroup0/0-0-0.jpg
/zm/zm_nasa/apollo/ap12_landsitea_JSC2011e118358/TileGroup0/0-0-0.jpg
/zm/zm_nasa/apollo/ap15_9aa_JSC2007e045378/TileGroup0/0-0-0.jpg
/zm/zm_nasa/apollo/ap15_lmnortha_JSC2007e045379/TileGroup0/0-0-0.jpg
/zm/zm_nasa/apollo/ap15_s2a_JSC2011e118359/TileGroup0/0-0-0.jpg
/zm/zm_nasa/apollo/ap16_lmviewa_JSC2007e045380/TileGroup0/0-0-0.jpg
/zm/zm_nasa/apollo/ap16_lmwesat_JSC2007e045380/TileGroup0/0-0-0.jpg
/zm/zm_nasa/apollo/ap16_s10a_JSC2007e045380/TileGroup0/0-0-0.jpg
/zm/zm_nasa/apollo/ap16_s11a_JSC2007e045380/TileGroup0/0-0-0.jpg
/zm/zm_nasa/apollo/ap16_s13_JSC2007e045380/TileGroup0/0-0-0.jpg
/zm/zm_nasa/apollo/ap16_s13a_JSC2007e045380/TileGroup0/0-0-0.jpg
/zm/zm_nasa/apollo/ap16_s1a_JSC2007e045380/TileGroup0/0-0-0.jpg
/zm/zm_nasa/apollo/ap16_s1ba_JSC2007e045380/TileGroup0/0-0-0.jpg
/zm/zm_nasa/apollo/ap16_slandsitea_JSC2007e045380/TileGroup0/0-0-0.jpg
/zm/zm_nasa/apollo/ap17_alsepa_JSC2004e52772/TileGroup0/0-0-0.jpg
/zm/zm_nasa/apollo/ap17_eva1a_JSC2007e045384/TileGroup0/0-0-0.jpg
/zm/zm_nasa/apollo/ap17_evaalsepa_JSC2007e045385/TileGroup0/0-0-0.jpg
/zm/zm_nasa/apollo/ap17_s1easta_JSC2004e52773/TileGroup0/0-0-0.jpg
/zm/zm_nasa/apollo/ap17_s1westa_JSC2004e52776/TileGroup0/0-0-0.jpg
/zm/zm_nasa/apollo/ap17_s2a_JSC2004e52777/TileGroup0/0-0-0.jpg
/zm/zm_nasa/apollo/ap17_s2eva2a_JSC2004e52774/TileGroup0/0-0-0.jpg
/zm/zm_nasa/apollo/ap17_s3a_JSC2004e52778/TileGroup0/0-0-0.jpg
/zm/zm_nasa/apollo/ap17_s3a_JSC2007e045386/TileGroup0/0-0-0.jpg
/zm/zm_nasa/apollo/ap17_s4a_JSC2007e045388/TileGroup0/0-0-0.jpg
/zm/zm_nasa/apollo/ap17_s5_JSC2004e20304/TileGroup0/0-0-0.jpg
/zm/zm_nasa/apollo/ap17_s5a_JSC2004e20304/TileGroup0/0-0-0.jpg
/zm/zm_nasa/apollo/ap17_s6a_JSC2007e045387/TileGroup0/0-0-0.jpg
/zm/zm_nasa/apollo/ap17_s6southa_JSC2004e52779/TileGroup0/0-0-0.jpg
/zm/zm_nasa/apollo/ap17_s7a_JSC2004e52775/TileGroup0/0-0-0.jpg
/zm/zm_nasa/apollo/apll-5_JSC2008e040725/TileGroup0/0-0-0.jpg
/zm/zm_nasa/apollo/AS14-68-9450HR/TileGroup0/0-0-0.jpg
/zm/zm_nasa/apollo/lunar-recon-orbiter-apollo-12-surveyor-3-sites-1/TileGroup0/0-0-0.jpg
/zm/zm_nasa/appollo17_4800/TileGroup0/0-0-0.jpg
/zm/zm_nasa/Curiosity-Murray-Buttes/TileGroup0/0-0-0.jpg
/zm/zm_nasa/zm5_planets/2MASS-Redshift-Survey/TileGroup0/0-0-0.jpg
/us/realtor/ky/zoom/map_doevalley/TileGroup0/0-0-0.jpg
/ko_jtf/zm/jtf_parcels/jtf01/TileGroup0/0-0-0.jpg
/ko_jtf/zm/jtf_parcels/jtf02/TileGroup0/0-0-0.jpg
/ko_jtf/zm/jtf_parcels/jtf03/TileGroup0/0-0-0.jpg
/ko_jtf/zm/jtf_parcels/jtf04/TileGroup0/0-0-0.jpg
/ko_jtf/zm/jtf_parcels/jtf05/TileGroup0/0-0-0.jpg
/ko_jtf/zm/jtf_parcels/jtf06/TileGroup0/0-0-0.jpg
/ko_jtf/zm/jtf_parcels/jtf07/TileGroup0/0-0-0.jpg
/ko_jtf/zm/jtf_parcels/jtf08/TileGroup0/0-0-0.jpg
/ko_jtf/zm/jtf_parcels/jtf09/TileGroup0/0-0-0.jpg
/ko_jtf/zm/jtf_parcels/jtf10/TileGroup0/0-0-0.jpg
/ko_jtf/zm/jtf_parcels/jtf11/TileGroup0/0-0-0.jpg
/ko_jtf/zm/jtf_parcels/jtf12/TileGroup0/0-0-0.jpg
/ko_jtf/zm/jtf_parcels/jtf14/TileGroup0/0-0-0.jpg
/ko_jtf/zm/jtf_parcels/jtf15/TileGroup0/0-0-0.jpg
/ko_jtf/zm/jtf_parcels/jtf16/TileGroup0/0-0-0.jpg
/ko_jtf/zm/jtf_parcels/jtf17510/TileGroup0/0-0-0.jpg
/ko_jtf/zm/jtf_parcels/jtf17570/TileGroup0/0-0-0.jpg
/ko_jtf/zm/jtf_parcels/jtf21/TileGroup0/0-0-0.jpg
/ko_jtf/zm/jtf_parcels/jtf22/TileGroup0/0-0-0.jpg
/ko_jtf/zm/jtf_parcels/jtf23/TileGroup0/0-0-0.jpg
/ko_jtf/zm/jtf_parcels/jtf24/TileGroup0/0-0-0.jpg
/ko_jtf/zm/jtf_parcels/jtf26/TileGroup0/0-0-0.jpg
/ko_jtf/zm/jtf_parcels/jtf27/TileGroup0/0-0-0.jpg
/ko_jtf/zm/jtf_parcels/jtf28/TileGroup0/0-0-0.jpg
/ko_jtf/zm/jtf_parcels/jtf29/TileGroup0/0-0-0.jpg
/ko_jtf/zm/jtf_parcels/jtf29 copy/TileGroup0/0-0-0.jpg
/ko_jtf/zm/jtf_parcels/jtf30/TileGroup0/0-0-0.jpg
/ko_jtf/zm/jtf_parcels/jtf31/TileGroup0/0-0-0.jpg
/ko_jtf/zm/jtf_parcels/jtf32/TileGroup0/0-0-0.jpg
/ko_jtf/zm/jtf_parcels/jtf34/TileGroup0/0-0-0.jpg
/ko_jtf/zm/jtf_parcels/jtf35/TileGroup0/0-0-0.jpg
/ko_jtf/zm/jtf_parcels/jtf36/TileGroup0/0-0-0.jpg
/ko_jtf/zm/jtf_parcels/jtf38/TileGroup0/0-0-0.jpg
/ko_jtf/zm/jtf_parcels/jtf40/TileGroup0/0-0-0.jpg
/ko_jtf/zm/jtf_parcels/jtf41/TileGroup0/0-0-0.jpg
/ko_jtf/zm/jtf_parcels/jtf42/TileGroup0/0-0-0.jpg
/ko_jtf/zm/jtf_parcels/jtf43/TileGroup0/0-0-0.jpg
/ko_jtf/zm/jtf_parcels/jtf44/TileGroup0/0-0-0.jpg
/ko_jtf/zm/jtf_parcels/jtf_n/TileGroup0/0-0-0.jpg
/ko_jtf/zm/jtf_parcels/jtf_ne/TileGroup0/0-0-0.jpg
/ko_jtf/zm/jtf_parcels/jtfdc/TileGroup0/0-0-0.jpg
/ko_jtf/zm/jtf_parcels/jtfdc_012/TileGroup0/0-0-0.jpg
/ko_jtf/zm/jtf_parcels/jtfdc_e/TileGroup0/0-0-0.jpg
/ko_jtf/zm/jtf_parcels/jtfdc_greater/TileGroup0/0-0-0.jpg
/ko_jtf/zm/jtf_parcels/jtfdc_inc/TileGroup0/0-0-0.jpg
/ko_jtf/zm/jtf_parcels/jtfdc_n/TileGroup0/0-0-0.jpg
/ko_jtf/zm/jtf_parcels/jtfdc_s/TileGroup0/0-0-0.jpg
/ko_jtf/zm/jtf_parcels/jtfdc_theater/TileGroup0/0-0-0.jpg
/ko_jtf/zm/jtf_parcels/jtfdc_w/TileGroup0/0-0-0.jpg
/ko_jtf/zm/jtf_parcels/jtfinc/TileGroup0/0-0-0.jpg
/ko_jtf/zm/jtf_parcels/jtfinc_proper/TileGroup0/0-0-0.jpg
/ko_jtf/zm/jtf_parcels/jttf37/TileGroup0/0-0-0.jpg
/ko_jtf/zm/jtf_parcels/jyf44/TileGroup0/0-0-0.jpg
/ko_jtf/zm/jtf_parcels/souixp/TileGroup0/0-0-0.jpg
/ko_jtf/zm/jtf_parcels/souixp_boat/TileGroup0/0-0-0.jpg
`;

// kolists['default'] = "neuz konet iperms kids kitiworks pastryroad konabus jtfdc jtfdcr jtfinc jtfdcr dogs memes";
			kolists['divs'] = "av bb fb gm pn sl tl yt zm";
			kolists['kovs'] = "neuz konet iperms kids kitiworks pastryroad konabus jtfdc jtfdcr jtfinc jtfdcr dogs memes";
			kolists['kov'] = "neuz konet iperms kids kitiworks pastryroad konabus jtfdc jtfdcr jtfinc jtfdcr dogs memes";
//			kolists['av'] = jax('/av.txt');
//			kolists['fb'] = jax('/fb.txt');
//			kolists['pn'] = jax('/pn.txt');
//			kolists['sl'] = jax('/sl.txt');
//			kolists['tl'] = jax('/tl.txt');
//			kolists['zm'] = jax('/zm.txt');
			</script>

		<script id="script_jax">
//			alert( "BUGS_5120 jax default_jaxurl="+default_jaxurl );
//			alert( "BUGS_5120 jax jaxurl="+jaxurl );
//			alert( "BUGS_12700 jax kolists_ticktick="+kolists[''] );
//			alert( "BUGS_12700 jax fb="+kolists['fb'] );
//			alert( "BUGS_12701 jax kolists_default="+kolists['default'] );
//			alert( "BUGS_12702 jax kolists_konet="+kolists['default'] );
//			alert( "BUGS_12703 jax kolists_iperms="+kolists['default'] );
//			alert( "BUGS_12704 jax kolists_jtfdcr="+kolists['default'] );
//			alert( "BUGS_12700 jax kolists_jax="+kolists['jax'] );
			var default_jaxurl = "jax.html";
			var jaxurl = default_jaxurl;
			function jax(jaxurl) {
//				alert( "BUGS_19490 jax jaxurl="+jaxurl );
				if(!filecheck(jaxurl)) {
					alert( "BUGS_19493 NOTFOUND jaxurl="+jaxurl );
					return("NOTFOUND="+jaxurl );
					}
				var jaxbak = '-=jaxbak=-';
				kolists['jax'] = '-=jax=-';
//				alert( "BUGS_19500 FOUND jaxurl="+jaxurl );
				$.ajax({
					url: jaxurl,
					context: document.body,
					success: function(responseText) {
// 						alert( "BUGS_19501 jax TXT URL="+jaxurl+" LEN="+responseText.split("\n").length+"  responseText="+responseText );
						kolists['jax'] = responseText;
// 						alert( "BUGS_19502 jax KOL URL="+jaxurl+" LEN="+kolists['jax'].split("\n").length+"  responseText="+kolists['jax'] );
						jaxbak = responseText;
// 						alert( "BUGS_19503 jax JAXBAK URL="+jaxurl+" LEN="+jaxbak.split("\n").length+"  responseText="+jaxbak );
						$("#div_jax").html(responseText);

						var scriptflag = "true";
						if( scriptflag == "true" ) {
							$("#div_jax").find("script").each(function(i) {
								eval($(this).text());
								});
							}
					}
				});
// alert( "BUGS_19538 jax end" );
// alert( "BUGS_19601 jax TXT URL="+jaxurl+" LEN="+responseText.split("\n").length+"  responseText="+responseText );
// alert( "BUGS_19602 jax KOL URL="+jaxurl+" LEN="+kolists['jax'].split("\n").length+"  responseText="+kolists['jax'] );
// alert( "BUGS_19603 jax JAXBAK URL="+jaxurl+" LEN="+jaxbak.split("\n").length+"  responseText="+jaxbak );
// 			alert( "BUGS_19539 jax END" );
			return( jaxbak );
			alert( "BUGS_19540 jax END END" );
			};
		</script>

	<script id="script_startup_blobs">
		function startup_blobs(args) {
//			alert( "BUGS_17401 startup_blobs args="+args );
			startup_blob(args);
//			alert( "BUGS_17402 startup_blobs" );
			}
		</script>
	<script id="script_startup_blob">
		function startup_blob1(args) {
//			alert( "BUGS_17411 startup_blob args="+args );
//			init();
//			alert( "BUGS_17412 startup_blob tail" );

			}
		</script>


	<script id="script_load_kolists">
kolists['listids'] = `
av|/txt/avlist.txt
fb|/txt/fblist.txt
pn|/txt/pnlist.txt
sl|/txt/sllist.txt
tl|/txt/tllist.txt
yt|/txt/ytlist_today.txt
zm|/txt/zmlist.txt
`;
		function load_kolists(args) {
//			args='txt/ytlist_todays.txt';
//			alert( "BUGS_19541 load_kolists args="+args);
//			var ytlist_url='ytlist.txt';
//			if( args ) {ytlist_url=args; }
//			alert( "BUGS_19550 load_kolists ytlist_url="+ytlist_url);
//			alert( "BUGS_19550 show_kolists kolists_ytlist="+kolists['ytlist']);

			var listids=kolists['listids'].split("\n");
			for( j=0; j< listids.length; j++ ) {
				if( /^#/.test(listids[j])) { continue; }
				var len = listids[j].split("|").length;
				var id=listids[j].split("|")[0];
				if( id == undefined ) { continue; }
				if( id == "" ) { continue; }

				var url=listids[j].split("|")[len-1];
				if(! filecheck(url)) { 
					alert( "BUGS_19573 NOTFOUND j="+j+" id="+id+" url="+url );
					continue; 
					}

				
				var listid=id+"list";
				kolists[listid] = '';
				kolists[listid] = "HEAD listid="+listid;
//				alert( "BUGS_19591 j="+j+" id="+id+" url="+url );
				jax(url);
				kolists[listid] = jax(url);
// alert( "BUGS_19601 load_kolists j="+j+" ID="+id+" URL="+url+"\n\nLIST="+kolists[listid] );
				kolists[listid] = kolists['jax'];
// alert( "BUGS_19602 load_kolists j="+j+" ID="+id+" URL="+url+"\n\nLIST="+kolists[listid] );

//				jax(url); kolists[listid]=kolists['jax'];
//				alert( "BUGS_19603 load_kolists FOUND LEN="+kolists[listid].length+"  listid="+listid+" url="+url );
//				len = kolists[listid].split("\n").length;
//				alert( "BUGS_19604 load_kolists FOUND j="+j+" URL="+url+" LEN="+len+"\n\n LIST="+kolists[listid].split("\n"));
				}
//			alert( "BUGS_19611 jaxbak="+jaxbak );
//			alert( "BUGS_19612 kolists_jax="+kolists['jax'] );
//			alert( "BUGS_19613 kolists_fblist="+kolists['fblist'] );
//			alert( "BUGS_19614 kolists_ytlist="+kolists['ytlist'] );
//			alert( "BUGS_19615 kolists_pnlist="+kolists['pnlist'] );
			return(args);
			}
		</script>

	<script id="script_show_kolists">
		function show_kolists(args) {
//			alert( "BUGS_1961 show_kolists args="+args);
//			alert( "BUGS_1961 show_kolists kolists_listids="+kolists['listids']);
//			alert( "BUGS_1961 show_kolists kolists_fblist="+kolists['fblist']);
//			alert( "BUGS_1962 show_kolists kolists_ytlist="+kolists['ytlist']);
//			alert( "BUGS_1963 show_kolists kolists_avlist="+kolists['avlist']);
//			alert( "BUGS_1963 show_kolists args="+args);
			return(args);
			}
		</script>




	<script id="script_startup">
//		if( filecheck(url_yt)) { 
//			alert( "BUGS_12111 ___FOUND url_yt="+url_yt);
//			kolists['yt'] = jax(url_yt); 
//			alert( "BUGS_11982 kolists="+kolists['yt'];
//			}
//		else {
//			alert( "BUGS_11983 NOTFOUND url_yt="+url_yt );
//			}

		function kludge(args) {
			alert( "BUGS_19850 kludge args="+args );
			}
		
		function blob_sound(args) {
//			alert( "BUGS_19900 blob_sound args="+args );

			if( document.getElementById('img_blob_sound')) {
//				alert( "BUGS_19900 blob_sound args="+args );
//				document.getElementById('audio_sound').src=sound;
//				document.getElementById('audio_sound').play();
//				alert( "BUGS_19900 blob_sound args="+args );

//				document.getElementById('img_blob_sound').src="/imgs/sound/btn_sound13.png";
//				document.getElementById('img_blob_sound').src="/imgs/gif/spacers/giphy_spacer_21.gif";
				document.getElementById('img_blob_sound').src=random_gif;
				if( args != "" ) { sound=args; }
				var sound = "/gm/sounds/bubbles.mp3";
				var sounds = kolists['sounds'];
				sounds += kolists['mp3'];

				sounds = sounds.split("\n");
//				var sounds = kolists['sounds'].split("\n");
//				var sounds = kolists['mp3'].split("\n");
				
				sound_max = sounds.length;
//					alert( "BUGS_501 blob_sound sound_max="+sound_max );
				soundid = random_int(sound_max,0);
//					alert( "BUGS_502 blob_sound soundid="+soundid );
				var sound = sounds[soundid];
//					alert( "BUGS_503 blob_sound sound="+sound );

				if(filecheck(sound)) {
//					alert( "BUGS_504 blob_sound FOUND sound="+sound );
					if( document.getElementById('audio_sound')) {
//						alert( "BUGS_505 blob_sound SRC sound="+sound );
						document.getElementById('audio_sound').src=sound;
						document.getElementById('audio_sound').play();
//						alert( "BUGS_506 blob_sound PLAY sound="+sound );
						}
					if( document.getElementById('div_blob_playlist')) {
						var htout = "";
						htout += '<div id="div_blob_playlist">';
						var sound=document.getElementById('audio_sound').src;
						htout += '<h2>'+sound+'</h2>';
						htout += '<h3>'+random_gif+'</h3>';
						htout += '	</div>';
						document.getElementById('div_blob_playlist').innerHTML=htout;
						document.getElementById('div_blob_playlist').style.display="inline";
						}




					}
				}
			else {
//				document.getElementById('img_blob_sound').src="/imgs/sound/btn_sound2.png";
//				document.getElementById('img_blob_sound').src="/imgs/sound/btn_sound10.png";
//				document.getElementById('img_blob_sound').src="/imgs/gif/spacers/giphy_spacer_21.gif";
				if( filecheck(random_gif)) {
					document.getElementById('img_blob_sound').src=random_gif;
					}
				else {
					document.getElementById('img_blob_sound').src="/imgs/gif/notfound.gif";
					}
				}
			}
		</script>
		
	<script id="script_blob_mute">
		function blob_mute(args) {
//			alert( "BUGS_19852 blob_mute args="+args );
			jukeboxs = gifs=kolists['imgs_jukebox'].split("\n");
			max_jukeboxs=jukeboxs.length;
			random_jukeboxid=random_int(max_jukeboxs,0);
			random_jukebox=jukeboxs[random_jukeboxid];

			gifs=kolists['gifwave'].split("\n");
			max_gifs = gifs.length;
			random_gifid = random_int(max_gifs,0);
			random_gif = gifs[random_gifid];

			if( document.getElementById('audio_sound')) {
				if( document.getElementById('audio_sound').muted == true ) {
					document.getElementById('audio_sound').muted = false;
					if( document.getElementById('img_blob_mute')) {
//						document.getElementById('img_blob_mute').src="/imgs/sound/btn_soundwavew.png";
//						document.getElementById('img_blob_mute').src="/imgs/sound/giphy_wave03t.gif";
//						document.getElementById('img_blob_mute').src="/giftran/temp.gif";
//						document.getElementById('img_blob_mute').src=random_gif;
//						document.getElementById('img_blob_mute').src="/imgs/sound/ringworm_1.gif";
//						document.getElementById('img_blob_mute').src="/imgs/imgs_jukebox/record_04.gif";
						document.getElementById('img_blob_mute').src=random_jukebox;
						}
					if( document.getElementById('input_volume')) {
						document.getElementById('input_volume').style.display="inline";
						}
					if( document.getElementById('img_blob_sound')) {
						document.getElementById('img_blob_sound').style.display="inline";
						}

			if( document.getElementById('div_blob_playlist')) {
				var htout = "";
				htout += '<div id="div_blob_playlist">';
				var sound=document.getElementById('audio_sound').src;
				htout += '<h2>'+sound+'</h2>';
				htout += '<h3>'+random_gif+'</h3>';
				htout += '	</div>';
				document.getElementById('div_blob_playlist').innerHTML=htout;
				document.getElementById('div_blob_playlist').style.display="inline";
				}



					}
				else {
					document.getElementById('audio_sound').muted = true;
					if( document.getElementById('img_blob_mute')) {
//						document.getElementById('img_blob_mute').src="/imgs/sound/btn_soundwaveb.png";
						document.getElementById('img_blob_mute').src="/imgs/sound/ringworm_00.png";
						}
					if( document.getElementById('input_volume')) {
						document.getElementById('input_volume').style.display="none";
						}
					if( document.getElementById('img_blob_sound')) {
						document.getElementById('img_blob_sound').style.display="none";
						}
					if( document.getElementById('div_blob_playlist')) {
						document.getElementById('div_blob_playlist').style.display="none";
						}
					}
				}
			}
		</script>


	<script id="script_startup">
		function startup(args) {
			var jaxurl=args;
			var href=window.location.href;
			var search=window.location.search;
//			alert( "BUGS_211112 startup args="+args+" href="+href );
//			kludge('');
//			blob_sound('');
//			alert( "BUGS_19851 startup args="+args );
			if( /jax/.test(search)) {
				jaxurl = search.split("=")[1];
//				alert( "BUGS_17240 startup jaxurl="+jaxurl );
				}


//			var host=window.location.host;
//			var pathname=window.location.pathname;
//			url_default="fb.json";
//			alert( "BUGS_2591 url_default="+url_default );
//			var replaced =  pathname.replace(/(^\.+|\.+$)/mg, '');
//			if( pathname.endsWith(".htm")) {
//			url_default=pathname.replace(".html",".json" );
//			alert( "BUGS_2595 url_default="+url_default );
//			alert( "BUGS_11700 startup jaxurl="+jaxurl );
//			alert( "BUGS_11700 startup jaxurl="+jaxurl+" kolists="+kolists );
//			alert( "BUGS_11701 startup jaxurl="+jaxurl+" divids="+divids );
//			alert( "BUGS_11702 startup jaxurl="+jaxurl+" kolists_divids="+kolists['divids'] );

//			jaxurl="/av.txt";
//			if(filecheck(jaxurl)) { kolists['av'] = jax(jaxurl); }
//			alert( "BUGS_11801 startup jaxurl="+jaxurl+ " len="+kolists['jax'].split("\n").length+ " kolists_jax="+kolists['jax'] );
//			alert( "BUGS_11801 startup jaxurl="+jaxurl+ " len="+kolists['fb'].split("\n").length+ " kolists_fb="+kolists['fb'] );
//			alert( "BUGS_11801 startup jaxurl="+jaxurl+ " len="+kolists['av'].split("\n").length+ " kolists_av="+kolists['av'] );
//			alert( "BUGS_11802 startup jaxurl="+jaxurl+ " len="+kolists['fb'].split("\n").length+ " kolists_fb="+kolists['fb'] );
//			alert( "BUGS_11803 startup jaxurl="+jaxurl+ " len="+kolists['pn'].split("\n").length+ " kolists_pn="+kolists['pn'] );
//			alert( "BUGS_11804 startup jaxurl="+jaxurl+ " len="+kolists['sl'].split("\n").length+ " kolists_sl="+kolists['sl'] );
//			alert( "BUGS_11805 startup jaxurl="+jaxurl+ " len="+kolists['tl'].split("\n").length+ " kolists_tl="+kolists['tl'] );
//			alert( "BUGS_11806 startup jaxurl="+jaxurl+ " len="+kolists['yt'].split("\n").length+ " kolists_yt="+kolists['yt'] );
//			alert( "BUGS_11807 startup jaxurl="+jaxurl+ " len="+kolists['zm'].split("\n").length+ " kolists_zm="+kolists['zm'] );

			kogrids("");

			load_kolists(args);
			show_kolists(args);

			jtfdc_stalkarounds('');

//			alert( "BUGS_17455 startup_canvas args="+args );
			startup_canvas("");

			script_hideshow("alloff");
			script_hideshow("div_bb");
			script_hideshow("div_fb");
			script_hideshow("div_yt");

//			alert( "BUGS_17491 startup_blobs " );
			startup_blobs(args);
//			alert( "BUGS_17492 startup_blobs " );




//			var jaxurl_default="fb.txt";
//			var jaxurl = args;
//			if( args == "" ) { jaxurl=jaxurl_default; }
//			alert( "BUGS_6770 startup args="+args+"  jaxurl="+jaxurl );
//			if( filecheck(jaxurl)) {
//				alert( "BUGS_6991 ___FOUND jaxurl="+jaxurl );
//				}
//			else {
////				alert( "BUGS_6992 NOTFOUND jaxurl="+jaxurl );
//				}
			}
			
		</script>






	</head>



<!-- <body bgcolor="darkslategray" onload=";startup('fb.txt');return false;" > -->
<!-- <body bgcolor="wheat" onload="startup('fb.txt');return false;" > -->
<!-- <body bgcolor="#FFFDDA" onload="startup('fb.txt');return false;" > -->



<hr color=white>
<hr color=black>
<h2>div_fbs</h2>
<img src="/imgs/btn/kop1234.png" onclick="startup(''); return false;">
&nbsp &nbsp &nbsp &nbsp
<img src="/imgs/btn/kop23.png" onclick="startup('fb.txt'); return false;">
<img src="/imgs/btn/kop23.png" onclick="startup('/fb/fb.txt'); return false;">
<img src="/imgs/btn/kop23.png" onclick="startup('/fb/konet/fb.txt'); return false;">
<img src="/imgs/btn/kop23.png" onclick="startup('/fb/iperms/fb.txt'); return false;">
<img src="/imgs/btn/kop23.png" onclick="startup('/fb/ko1/fb.txt'); return false;">
<hr color=white>
<h2>div_yts<h2>
<img src="/imgs/btn/kop14.png" onclick="startup('/yt/txt/ytlist.txt'); return false;">
<img src="/imgs/btn/kop14.png" onclick="startup('/yt/txt/ytlist_20200401.txt'); return false;">
<img src="/imgs/btn/kop14.png" onclick="startup('/yt/txt/ytlist_20200402.txt'); return false;">
<img src="/imgs/btn/kop12.png" onclick="startup('/yt/txt/ytlist_20200403.txt'); return false;">
<hr color=white>
<h2>div_notes</h2>
<img src="/imgs/btn/kop14.png" onclick="startup('notfound.txt'); return false;">
<img src="/imgs/btn/kop14.png" onclick="startup('notes.txt'); return false;">
<img src="/imgs/btn/kop14.png" onclick="startup('/txt/jtfdcr_mp4.txt'); return false;">
<img src="/imgs/btn/kop1.png" onclick="startup('notfound.txt'); return false;">
<img src="/imgs/btn/kop4.png" onclick="startup('notfound.txt'); return false;">

<hr color=white>
<hr color=black>
<!--
<div id="div_fb_w" >
<div id="canvas_fb">
	<div class="zoom-icon zoom-icon-in"></div>

	<div class="magazine-viewport">
		<div class="container">
			<div class="magazine">
				<!-- Next button -->
				<div ignore="1" class="next-button"></div>
				<!-- Previous button -->
				<div ignore="1" class="previous-button"></div>
				</div>
			</div>
		</div>

<!-- Thumbnails -->
	<div id="div_tn"></div>
<!--	<div class="thumbnails" hidden> -->
	<div class="thumbnails" >
		<div>
			<ul>
			<li class="i">
				<img src="pages/tn/tn_1.png" width="76" height="100" class="page-1">
				<span>1</span>
				</li>
			<li class="d">
				<img src="pages/tn/tn_2.png" width="76" height="100" class="page-2">
				<img src="pages/tn/tn_3.png" width="76" height="100" class="page-3">
				<span>2-3</span>
				</li>
			<li class="d">
				<img src="pages/tn/tn_4.png" width="76" height="100" class="page-4">
				<img src="pages/tn/tn_5.png" width="76" height="100" class="page-5">
				<span>4-5</span>
				</li>
			<li class="d">
				<img src="pages/tn/tn_6.png" width="76" height="100" class="page-6">
				<img src="pages/tn/tn_7.png" width="76" height="100" class="page-7">
				<span>6-7</span>
				</li>
			<li class="d">
				<img src="pages/tn/tn_8.png" width="76" height="100" class="page-8">
				<img src="pages/tn/tn_9.png" width="76" height="100" class="page-9">
				<span>8-9</span>
				</li>
			<li class="d">
				<img src="pages/tn/tn_10.png" width="76" height="100" class="page-10">
				<img src="pages/tn/tn_11.png" width="76" height="100" class="page-11">
				<span>10-11</span>
				</li>
			<li class="d">
				<img src="pages/tn/tn_12.png" width="76" height="100" class="page-12">
				<img src="pages/tn/tn_13.png" width="76" height="100" class="page-13">
				<span>12-13</span>
				</li>
			<li class="d">
				<img src="pages/tn/tn_14.png" width="76" height="100" class="page-14">
				<img src="pages/tn/tn_15.png" width="76" height="100" class="page-15">
				<span>14-15</span>
				</li>
			<li class="d">
				<img src="pages/tn/tn_16.png" width="76" height="100" class="page-14">
				<img src="pages/tn/tn_17.png" width="76" height="100" class="page-15">
				<span>16-17</span>
				</li>
			<li class="i">
				<img src="pages/tn/tn_18.png" width="76" height="100" class="page-16">
				<span>18</span>
				</li>
			<ul>
			<div>	</div>
		</div id="div_fb_b_tail">


	<script id="script_fbload" type="text/javascript">
//		function loadApp() {
		function fbload() {
// 			$('#canvas').fadeIn(1000);
 			$('#canvas_fb').fadeIn(1000);
 			var flipbook = $('.magazine');

// Check if the CSS was already loaded
	
	if (flipbook.width()==0 || flipbook.height()==0) {
//		setTimeout(loadApp, 10);
		setTimeout(fbload, 10);
		return;
	}
	
// Create the flipbook
	flipbook.turn({
// Magazine width
// Magazine height
// Duration in millisecond
// Hardware acceleration
// Enables gradients
// Auto center this flipbook
// Elevation from the edge of the flipbook when turning a page
			width: 922,
			height: 600,
			duration: 1000,
			acceleration: !isChrome(),
			gradients: true,
			autoCenter: true,
			elevation: 50,

// The number of pages
// pagelimit pages_len lastpage
//			pages: 12,
//			pages: 16,
//			pages: 758,
			pages: 5368,

// Events

			
			when: {
				turning: function(event, page, view) {
					
					var book = $(this),
					currentPage = book.turn('page'),
					pages = book.turn('pages');
			
					// Update the current URI

					Hash.go('page/' + page).update();

					// Show and hide navigation buttons

					disableControls(page);
					

					$('.thumbnails .page-'+currentPage).
						parent().
						removeClass('current');

					$('.thumbnails .page-'+page).
						parent().
						addClass('current');



				},

				turned: function(event, page, view) {

					disableControls(page);

					$(this).turn('center');

					if (page==1) { 
						$(this).turn('peel', 'br');
					}

				},

				missing: function (event, pages) {

					// Add pages that aren't in the magazine

					for (var i = 0; i < pages.length; i++)
						addPage(pages[i], $(this));

				}
			}

	});

	// Zoom.js

	$('.magazine-viewport').zoom({
		flipbook: $('.magazine'),

		max: function() { 
			
			return largeMagazineWidth()/$('.magazine').width();

		}, 

		when: {

			swipeLeft: function() {

				$(this).zoom('flipbook').turn('next');

			},

			swipeRight: function() {
				
				$(this).zoom('flipbook').turn('previous');

			},

			resize: function(event, scale, page, pageElement) {

				if (scale==1)
					loadSmallPage(page, pageElement);
				else
					loadLargePage(page, pageElement);

			},

			zoomIn: function () {

				$('.thumbnails').hide();
				$('.made').hide();
				$('.magazine').removeClass('animated').addClass('zoom-in');
				$('.zoom-icon').removeClass('zoom-icon-in').addClass('zoom-icon-out');
				
				if (!window.escTip && !$.isTouch) {
					escTip = true;

					$('<div />', {'class': 'exit-message'}).
						html('<div>Press ESC to exit</div>').
							appendTo($('body')).
							delay(2000).
							animate({opacity:0}, 500, function() {
								$(this).remove();
							});
				}
			},

			zoomOut: function () {

				$('.exit-message').hide();
				$('.thumbnails').fadeIn();
				$('.made').fadeIn();
				$('.zoom-icon').removeClass('zoom-icon-out').addClass('zoom-icon-in');

				setTimeout(function(){
					$('.magazine').addClass('animated').removeClass('zoom-in');
					resizeViewport();
				}, 0);

			}
		}
	});

	// Zoom event

	if ($.isTouch)
		$('.magazine-viewport').bind('zoom.doubleTap', zoomTo);
	else
		$('.magazine-viewport').bind('zoom.tap', zoomTo);


	// Using arrow keys to turn the page

	$(document).keydown(function(e){

		var previous = 37, next = 39, esc = 27;

		switch (e.keyCode) {
			case previous:

				// left arrow
				$('.magazine').turn('previous');
				e.preventDefault();

			break;
			case next:

				//right arrow
				$('.magazine').turn('next');
				e.preventDefault();

			break;
			case esc:
				
				$('.magazine-viewport').zoom('zoomOut');	
				e.preventDefault();

			break;
		}
	});

	// URIs - Format #/page/1 

	Hash.on('^page\/([0-9]*)$', {
		yep: function(path, parts) {
			var page = parts[1];

			if (page!==undefined) {
				if ($('.magazine').turn('is'))
					$('.magazine').turn('page', page);
			}

		},
		nop: function(path) {

			if ($('.magazine').turn('is'))
				$('.magazine').turn('page', 1);
		}
	});


	$(window).resize(function() {
		resizeViewport();
	}).bind('orientationchange', function() {
		resizeViewport();
	});

	// Events for thumbnails

	$('.thumbnails').click(function(event) {
		
		var page;

		if (event.target && (page=/page-([0-9]+)/.exec($(event.target).attr('class'))) ) {
		
			$('.magazine').turn('page', page[1]);
		}
	});

	$('.thumbnails li').
		bind($.mouseEvents.over, function() {
			
			$(this).addClass('thumb-hover');

		}).bind($.mouseEvents.out, function() {
			
			$(this).removeClass('thumb-hover');

		});

	if ($.isTouch) {
	
		$('.thumbnails').
			addClass('thumbanils-touch').
			bind($.mouseEvents.move, function(event) {
				event.preventDefault();
			});

	} else {

		$('.thumbnails ul').mouseover(function() {

			$('.thumbnails').addClass('thumbnails-hover');

		}).mousedown(function() {

			return false;

		}).mouseout(function() {

			$('.thumbnails').removeClass('thumbnails-hover');

		});

	}


	// Regions

	if ($.isTouch) {
		$('.magazine').bind('touchstart', regionClick);
	} else {
		$('.magazine').click(regionClick);
	}

	// Events for the next button

	$('.next-button').bind($.mouseEvents.over, function() {
		
		$(this).addClass('next-button-hover');

	}).bind($.mouseEvents.out, function() {
		
		$(this).removeClass('next-button-hover');

	}).bind($.mouseEvents.down, function() {
		
		$(this).addClass('next-button-down');

	}).bind($.mouseEvents.up, function() {
		
		$(this).removeClass('next-button-down');

	}).click(function() {
		
		$('.magazine').turn('next');

	});

	// Events for the next button
	
	$('.previous-button').bind($.mouseEvents.over, function() {
		
		$(this).addClass('previous-button-hover');

	}).bind($.mouseEvents.out, function() {
		
		$(this).removeClass('previous-button-hover');

	}).bind($.mouseEvents.down, function() {
		
		$(this).addClass('previous-button-down');

	}).bind($.mouseEvents.up, function() {
		
		$(this).removeClass('previous-button-down');

	}).click(function() {
		
		$('.magazine').turn('previous');

	});


	resizeViewport();

	$('.magazine').addClass('animated');

}

// Zoom icon

 $('.zoom-icon').bind('mouseover', function() { 
 	
 	if ($(this).hasClass('zoom-icon-in'))
 		$(this).addClass('zoom-icon-in-hover');

 	if ($(this).hasClass('zoom-icon-out'))
 		$(this).addClass('zoom-icon-out-hover');
 
 }).bind('mouseout', function() { 
 	
 	 if ($(this).hasClass('zoom-icon-in'))
 		$(this).removeClass('zoom-icon-in-hover');
 	
 	if ($(this).hasClass('zoom-icon-out'))
 		$(this).removeClass('zoom-icon-out-hover');

 }).bind('click', function() {

 	if ($(this).hasClass('zoom-icon-in'))
 		$('.magazine-viewport').zoom('zoomIn');
 	else if ($(this).hasClass('zoom-icon-out'))	
		$('.magazine-viewport').zoom('zoomOut');

 });

//  $('#canvas').hide();
 $('#canvas_fb').hide();


// Load the HTML4 version if there's not CSS transform

 yepnope({
//	test : Modernizr.csstransforms,
//	yep: ['../../lib/turn.js'],
//	yep: ['data:/text/plain;base64,LyoqCiAqIHR1cm4uanMgNHRoIHJlbGVhc2UKICogdHVybmpzLmNvbQogKiB0dXJuanMuY29tL2xpY2Vuc2UudHh0CiAqCiAqIENvcHlyaWdodCAoQykgMjAxMiBFbW1hbnVlbCBHYXJjaWEKICogQWxsIHJpZ2h0cyByZXNlcnZlZAogKiovCgooZnVuY3Rpb24oJCkgewoKJ3VzZSBzdHJpY3QnOwoKdmFyIGhhczNkLAogIAogIGhhc1JvdCwKCiAgdmVuZG9yID0gJycsCiAgCiAgdmVyc2lvbiA9ICc0LjEuMCcsCgogIFBJID0gTWF0aC5QSSwKCiAgQTkwID0gUEkvMiwKCiAgaXNUb3VjaCA9ICdvbnRvdWNoc3RhcnQnIGluIHdpbmRvdywKCiAgbW91c2VFdmVudHMgPSAoaXNUb3VjaCkgPwogICAgewogICAgICBkb3duOiAndG91Y2hzdGFydCcsCiAgICAgIG1vdmU6ICd0b3VjaG1vdmUnLAogICAgICB1cDogJ3RvdWNoZW5kJywKICAgICAgb3ZlcjogJ3RvdWNoc3RhcnQnLAogICAgICBvdXQ6ICd0b3VjaGVuZCcKICAgIH0KICAgIDoKICAgIHsKICAgICAgZG93bjogJ21vdXNlZG93bicsCiAgICAgIG1vdmU6ICdtb3VzZW1vdmUnLAogICAgICB1cDogJ21vdXNldXAnLAogICAgICBvdmVyOiAnbW91c2VvdmVyJywKICAgICAgb3V0OiAnbW91c2VvdXQnCiAgICB9LAoKICAvLyBDb250YW5zdHMgdXNlZCBmb3IgZWFjaCBjb3JuZXIKICAvLyAgIHwgdGwgKiB0ciB8CiAgLy8gbCB8ICogICAgICogfCByCiAgLy8gICB8IGJsICogYnIgfAoKICBjb3JuZXJzID0gewogICAgYmFja3dhcmQ6IFsnYmwnLCAndGwnXSwKICAgIGZvcndhcmQ6IFsnYnInLCAndHInXSwKICAgIGFsbDogWyd0bCcsICdibCcsICd0cicsICdicicsICdsJywgJ3InXQogIH0sCgogIC8vIERpc3BsYXkgdmFsdWVzCgogIGRpc3BsYXlzID0gWydzaW5nbGUnLCAnZG91YmxlJ10sCgogIC8vIERpcmVjdGlvbiB2YWx1ZXMKCiAgZGlyZWN0aW9ucyA9IFsnbHRyJywgJ3J0bCddLAoKICAvLyBEZWZhdWx0IG9wdGlvbnMKCiAgdHVybk9wdGlvbnMgPSB7CgogICAgLy8gRW5hYmxlcyBoYXJkd2FyZSBhY2NlbGVyYXRpb24KCiAgICBhY2NlbGVyYXRpb246IHRydWUsCgogICAgLy8gRGlzcGxheQoKICAgIGRpc3BsYXk6ICdkb3VibGUnLAoKICAgIC8vIER1cmF0aW9uIG9mIHRyYW5zaXRpb24gaW4gbWlsbGlzZWNvbmRzCgogICAgZHVyYXRpb246IDYwMCwKCiAgICAvLyBGaXJzdCBwYWdlCgogICAgcGFnZTogMSwKICAgIAogICAgLy8gRW5hYmxlcyBncmFkaWVudHMKCiAgICBncmFkaWVudHM6IHRydWUsCgogICAgLy8gQ29ybmVycyB1c2VkIHdoZW4gdHVybmluZyB0aGUgcGFnZQoKICAgIHR1cm5Db3JuZXJzOiAnYmwsYnInLAoKICAgIC8vIEV2ZW50cwoKICAgIHdoZW46IG51bGwKICB9LAoKICBmbGlwT3B0aW9ucyA9IHsKCiAgICAvLyBTaXplIG9mIHRoZSBhY3RpdmUgem9uZSBvZiBlYWNoIGNvcm5lcgoKICAgIGNvcm5lclNpemU6IDEwMAoKICB9LAoKICAvLyBOdW1iZXIgb2YgcGFnZXMgaW4gdGhlIERPTSwgbWluaW11bSB2YWx1ZTogNgoKICBwYWdlc0luRE9NID0gNiwKICAKCnR1cm5NZXRob2RzID0gewoKICAvLyBTaW5nbGV0b24gY29uc3RydWN0b3IKICAvLyAkKCcjc2VsZWN0b3InKS50dXJuKFtvcHRpb25zXSk7CgogIGluaXQ6IGZ1bmN0aW9uKG9wdGlvbnMpIHsKCiAgICAvLyBEZWZpbmUgY29uc3RhbnRzCiAgICAKICAgIGhhczNkID0gJ1dlYktpdENTU01hdHJpeCcgaW4gd2luZG93IHx8ICdNb3pQZXJzcGVjdGl2ZScgaW4gZG9jdW1lbnQuYm9keS5zdHlsZTsKICAgIGhhc1JvdCA9IHJvdGF0aW9uQXZhaWxhYmxlKCk7CiAgICB2ZW5kb3IgPSBnZXRQcmVmaXgoKTsKCiAgICB2YXIgaSwgdGhhdCA9IHRoaXMsIHBhZ2VOdW0gPSAwLCBkYXRhID0gdGhpcy5kYXRhKCksIGNoID0gdGhpcy5jaGlsZHJlbigpOwoKICAgIC8vIFNldCBpbml0aWFsIGNvbmZpZ3VyYXRpb24KCiAgICBvcHRpb25zID0gJC5leHRlbmQoewogICAgICB3aWR0aDogdGhpcy53aWR0aCgpLAogICAgICBoZWlnaHQ6IHRoaXMuaGVpZ2h0KCksCiAgICAgIGRpcmVjdGlvbjogdGhpcy5hdHRyKCdkaXInKSB8fCB0aGlzLmNzcygnZGlyZWN0aW9uJykgfHwgJ2x0cicKICAgIH0sIHR1cm5PcHRpb25zLCBvcHRpb25zKTsKCiAgICBkYXRhLm9wdHMgPSBvcHRpb25zOwogICAgZGF0YS5wYWdlT2JqcyA9IHt9OwogICAgZGF0YS5wYWdlcyA9IHt9OwogICAgZGF0YS5wYWdlV3JhcCA9IHt9OwogICAgZGF0YS5wYWdlWm9vbSA9IHt9OwogICAgZGF0YS5wYWdlUGxhY2UgPSB7fTsKICAgIGRhdGEucGFnZU12ID0gW107CiAgICBkYXRhLnpvb20gPSAxOwogICAgZGF0YS50b3RhbFBhZ2VzID0gb3B0aW9ucy5wYWdlcyB8fCAwOwogICAgZGF0YS5ldmVudEhhbmRsZXJzID0gewogICAgICB0b3VjaFN0YXJ0OiAkLnByb3h5KHR1cm5NZXRob2RzLl90b3VjaFN0YXJ0LCB0aGlzKSwKICAgICAgdG91Y2hNb3ZlOiAkLnByb3h5KHR1cm5NZXRob2RzLl90b3VjaE1vdmUsIHRoaXMpLAogICAgICB0b3VjaEVuZDogJC5wcm94eSh0dXJuTWV0aG9kcy5fdG91Y2hFbmQsIHRoaXMpLAogICAgICBzdGFydDogJC5wcm94eSh0dXJuTWV0aG9kcy5fZXZlbnRTdGFydCwgdGhpcykKICAgIH07CgoKCiAgICAvLyBBZGQgZXZlbnQgbGlzdGVuZXJzCgogICAgaWYgKG9wdGlvbnMud2hlbikKICAgICAgZm9yIChpIGluIG9wdGlvbnMud2hlbikKICAgICAgICBpZiAoaGFzKGksIG9wdGlvbnMud2hlbikpCiAgICAgICAgICB0aGlzLmJpbmQoaSwgb3B0aW9ucy53aGVuW2ldKTsKCiAgICAvLyBTZXQgdGhlIGNzcwoKICAgIHRoaXMuY3NzKHtwb3NpdGlvbjogJ3JlbGF0aXZlJywgd2lkdGg6IG9wdGlvbnMud2lkdGgsIGhlaWdodDogb3B0aW9ucy5oZWlnaHR9KTsKCiAgICAvLyBTZXQgdGhlIGluaXRpYWwgZGlzcGxheQoKICAgIHRoaXMudHVybignZGlzcGxheScsIG9wdGlvbnMuZGlzcGxheSk7CgogICAgLy8gU2V0IHRoZSBkaXJlY3Rpb24KCiAgICBpZiAob3B0aW9ucy5kaXJlY3Rpb24hPT0nJykKICAgICAgdGhpcy50dXJuKCdkaXJlY3Rpb24nLCBvcHRpb25zLmRpcmVjdGlvbik7CiAgICAKICAgIC8vIFByZXZlbnQgYmx1ZSBzY3JlZW4gcHJvYmxlbXMgb2Ygc3dpdGNoaW5nIHRvIGhhcmR3YXJlIGFjY2VsZXJhdGlvbiBtb2RlCiAgICAvLyBCeSBmb3JjaW5nIGhhcmR3YXJlIGFjY2VsZXJhdGlvbiBmb3IgZXZlcgoKICAgIGlmIChoYXMzZCAmJiAhaXNUb3VjaCAmJiBvcHRpb25zLmFjY2VsZXJhdGlvbikKICAgICAgdGhpcy50cmFuc2Zvcm0odHJhbnNsYXRlKDAsIDAsIHRydWUpKTsKCiAgICAvLyBBZGQgcGFnZXMgZnJvbSB0aGUgRE9NCgogICAgZm9yIChpID0gMDsgaTxjaC5sZW5ndGg7IGkrKykgewogICAgICBpZiAoJChjaFtpXSkuYXR0cignaWdub3JlJykhPScxJykgewogICAgICAgIHRoaXMudHVybignYWRkUGFnZScsIGNoW2ldLCArK3BhZ2VOdW0pOwogICAgICB9CiAgICB9CgogICAgLy8gRXZlbnQgbGlzdGVuZXJzCgogICAgJCh0aGlzKS5iaW5kKG1vdXNlRXZlbnRzLmRvd24sIGRhdGEuZXZlbnRIYW5kbGVycy50b3VjaFN0YXJ0KS4KICAgICAgYmluZCgnZW5kJywgdHVybk1ldGhvZHMuX2V2ZW50RW5kKS4KICAgICAgYmluZCgncHJlc3NlZCcsIHR1cm5NZXRob2RzLl9ldmVudFByZXNzZWQpLgogICAgICBiaW5kKCdyZWxlYXNlZCcsIHR1cm5NZXRob2RzLl9ldmVudFJlbGVhc2VkKS4KICAgICAgYmluZCgnZmxpcCcsIHR1cm5NZXRob2RzLl9mbGlwKTsKCiAgICAkKHRoaXMpLnBhcmVudCgpLmJpbmQoJ3N0YXJ0JywgZGF0YS5ldmVudEhhbmRsZXJzLnN0YXJ0KTsKCiAgICAkKGRvY3VtZW50KS5iaW5kKG1vdXNlRXZlbnRzLm1vdmUsIGRhdGEuZXZlbnRIYW5kbGVycy50b3VjaE1vdmUpLgogICAgICBiaW5kKG1vdXNlRXZlbnRzLnVwLCBkYXRhLmV2ZW50SGFuZGxlcnMudG91Y2hFbmQpOwoKICAgIC8vIFNldCB0aGUgaW5pdGlhbCBwYWdlCgogICAgdGhpcy50dXJuKCdwYWdlJywgb3B0aW9ucy5wYWdlKTsKCiAgICAvLyBUaGlzIGZsaXBib29rIGlzIHJlYWR5CgogICAgZGF0YS5kb25lID0gdHJ1ZTsKCiAgICByZXR1cm4gdGhpczsKICB9LAoKICAvLyBBZGRzIGEgcGFnZSBmcm9tIGV4dGVybmFsIGRhdGEKCiAgYWRkUGFnZTogZnVuY3Rpb24oZWxlbWVudCwgcGFnZSkgewoKICAgIHZhciBjdXJyZW50UGFnZSwKICAgICAgY2xhc3NOYW1lLAogICAgICBpbmNQYWdlcyA9IGZhbHNlLAogICAgICBkYXRhID0gdGhpcy5kYXRhKCksCiAgICAgIGxhc3RQYWdlID0gZGF0YS50b3RhbFBhZ2VzKzE7CgogICAgaWYgKGRhdGEuZGVzdHJveWluZykKICAgICAgcmV0dXJuIGZhbHNlOwoKICAgIC8vIFJlYWQgdGhlIHBhZ2UgbnVtYmVyIGZyb20gdGhlIGNsYXNzTmFtZSBvZiBgZWxlbWVudGAgLSBmb3JtYXQ6IHBbMC05XSsKCiAgICBpZiAoKGN1cnJlbnRQYWdlID0gL1xicChbMC05XSspXGIvLmV4ZWMoJChlbGVtZW50KS5hdHRyKCdjbGFzcycpKSkpCiAgICAgIHBhZ2UgPSBwYXJzZUludChjdXJyZW50UGFnZVsxXSwgMTApOwoKICAgIGlmIChwYWdlKSB7CiAgICAgIAogICAgICBpZiAocGFnZT09bGFzdFBhZ2UpCiAgICAgICAgaW5jUGFnZXMgPSB0cnVlOwogICAgICBlbHNlIGlmIChwYWdlPmxhc3RQYWdlKQogICAgICAgIHRocm93IHR1cm5FcnJvcignUGFnZSAiJytwYWdlKyciIGNhbm5vdCBiZSBpbnNlcnRlZCcpOwoKICAgIH0gZWxzZSB7CiAgICAgIAogICAgICBwYWdlID0gbGFzdFBhZ2U7CiAgICAgIGluY1BhZ2VzID0gdHJ1ZTsKCiAgICB9CgogICAgaWYgKHBhZ2U+PTEgJiYgcGFnZTw9bGFzdFBhZ2UpIHsKCiAgICAgIGlmIChkYXRhLmRpc3BsYXk9PSdkb3VibGUnKQogICAgICAgIGNsYXNzTmFtZSA9IChwYWdlJTIpID8gJyBvZGQnIDogJyBldmVuJzsKICAgICAgZWxzZQogICAgICAgIGNsYXNzTmFtZSA9ICcnOwoKICAgICAgLy8gU3RvcCBhbmltYXRpb25zCiAgICAgIGlmIChkYXRhLmRvbmUpCiAgICAgICAgdGhpcy50dXJuKCdzdG9wJyk7CgogICAgICAvLyBNb3ZlIHBhZ2VzIGlmIGl0J3MgbmVjZXNzYXJ5CiAgICAgIGlmIChwYWdlIGluIGRhdGEucGFnZU9ianMpCiAgICAgICAgdHVybk1ldGhvZHMuX21vdmVQYWdlcy5jYWxsKHRoaXMsIHBhZ2UsIDEpOwoKICAgICAgLy8gSW5jcmVhc2UgdGhlIG51bWJlciBvZiBwYWdlcwogICAgICBpZiAoaW5jUGFnZXMpCiAgICAgICAgZGF0YS50b3RhbFBhZ2VzID0gbGFzdFBhZ2U7CgogICAgICAvLyBBZGQgZWxlbWVudAogICAgICBkYXRhLnBhZ2VPYmpzW3BhZ2VdID0gJChlbGVtZW50KS4KICAgICAgICBjc3MoeydmbG9hdCc6ICdsZWZ0J30pLgogICAgICAgIGFkZENsYXNzKCdwYWdlIHAnICsgcGFnZSArIGNsYXNzTmFtZSk7CgogICAgICBpZiAoIWhhc0hhcmRQYWdlKCkgJiYgIGRhdGEucGFnZU9ianNbcGFnZV0uaGFzQ2xhc3MoJ2hhcmQnKSkgewogICAgICAgIGRhdGEucGFnZU9ianNbcGFnZV0ucmVtb3ZlQ2xhc3MoJ2hhcmQnKTsKICAgICAgfQoKICAgICAgLy8gQWRkIHBhZ2UKICAgICAgdHVybk1ldGhvZHMuX2FkZFBhZ2UuY2FsbCh0aGlzLCBwYWdlKTsKCiAgICAgIC8vIFJlbW92ZSBwYWdlcyBvdXQgb2YgcmFuZ2UKICAgICAgdHVybk1ldGhvZHMuX3JlbW92ZUZyb21ET00uY2FsbCh0aGlzKTsKICAgIH0KCiAgICByZXR1cm4gdGhpczsKICB9LAoKICAvLyBBZGRzIGEgcGFnZQoKICBfYWRkUGFnZTogZnVuY3Rpb24ocGFnZSkgewogICAgCiAgICB2YXIgZGF0YSA9IHRoaXMuZGF0YSgpLAogICAgICBlbGVtZW50ID0gZGF0YS5wYWdlT2Jqc1twYWdlXTsKCiAgICBpZiAoZWxlbWVudCkKICAgICAgaWYgKHR1cm5NZXRob2RzLl9uZWNlc3NQYWdlLmNhbGwodGhpcywgcGFnZSkpIHsKCiAgICAgICAgaWYgKCFkYXRhLnBhZ2VXcmFwW3BhZ2VdKSB7CgogICAgICAgICAgLy8gV3JhcHBlcgogICAgICAgICAgZGF0YS5wYWdlV3JhcFtwYWdlXSA9ICQoJzxkaXYvPicsCiAgICAgICAgICAgIHsnY2xhc3MnOiAncGFnZS13cmFwcGVyJywKICAgICAgICAgICAgICBwYWdlOiBwYWdlLAogICAgICAgICAgICAgIGNzczoge3Bvc2l0aW9uOiAnYWJzb2x1dGUnLAogICAgICAgICAgICAgIG92ZXJmbG93OiAnaGlkZGVuJ319KTsKCiAgICAgICAgICAvLyBBcHBlbmQgdG8gdGhpcyBmbGlwYm9vawogICAgICAgICAgdGhpcy5hcHBlbmQoZGF0YS5wYWdlV3JhcFtwYWdlXSk7CgogICAgICAgICAgaWYgKCFkYXRhLnBhZ2VQbGFjZVtwYWdlXSkgewogICAgICAgICAgICAKICAgICAgICAgICAgZGF0YS5wYWdlUGxhY2VbcGFnZV0gPSBwYWdlOwogICAgICAgICAgICAvLyBNb3ZlIGBwYWdlT2Jqc1twYWdlXWAgdG8gd3JhcHBlcgogICAgICAgICAgICBkYXRhLnBhZ2VPYmpzW3BhZ2VdLmFwcGVuZFRvKGRhdGEucGFnZVdyYXBbcGFnZV0pOwogICAgICAgICAgCiAgICAgICAgIH0KCiAgICAgICAgICAvLyBTZXQgdGhlIHNpemUgb2YgdGhlIHBhZ2UKICAgICAgICAgIHZhciBwcm9wID0gdHVybk1ldGhvZHMuX3BhZ2VTaXplLmNhbGwodGhpcywgcGFnZSwgdHJ1ZSk7CiAgICAgICAgICBlbGVtZW50LmNzcyh7d2lkdGg6IHByb3Aud2lkdGgsIGhlaWdodDogcHJvcC5oZWlnaHR9KTsKICAgICAgICAgIGRhdGEucGFnZVdyYXBbcGFnZV0uY3NzKHByb3ApOwoKICAgICAgICB9CgogICAgICAgIGlmIChkYXRhLnBhZ2VQbGFjZVtwYWdlXSA9PSBwYWdlKSB7CgogICAgICAgICAvLyBJZiB0aGUgcGFnZSBpc24ndCBpbiBhbm90aGVyIHBsYWNlLCBjcmVhdGUgdGhlIGZsaXAgZWZmZWN0CiAgICAgICAgICB0dXJuTWV0aG9kcy5fbWFrZUZsaXAuY2FsbCh0aGlzLCBwYWdlKTsKCiAgICAgIH0KICAgICAgICAKICAgICAgfSBlbHNlIHsKCiAgICAgICAgLy8gUGxhY2UKICAgICAgICBkYXRhLnBhZ2VQbGFjZVtwYWdlXSA9IDA7CgogICAgICAgIC8vIFJlbW92ZSBlbGVtZW50IGZyb20gdGhlIERPTQogICAgICAgIGlmIChkYXRhLnBhZ2VPYmpzW3BhZ2VdKQogICAgICAgICAgZGF0YS5wYWdlT2Jqc1twYWdlXS5yZW1vdmUoKTsKCiAgICAgIH0KCiAgfSwKCiAgLy8gQ2hlY2tzIGlmIGEgcGFnZSBpcyBpbiBtZW1vcnkKICAKICBoYXNQYWdlOiBmdW5jdGlvbihwYWdlKSB7CgogICAgcmV0dXJuIGhhcyhwYWdlLCB0aGlzLmRhdGEoKS5wYWdlT2Jqcyk7CiAgCiAgfSwKCiAgLy8gQ2VudGVycyB0aGUgZmxpcGJvb2sKCiAgY2VudGVyOiBmdW5jdGlvbihwYWdlKSB7CiAgICAKICAgIHZhciBkYXRhID0gdGhpcy5kYXRhKCksCiAgICAgIHNpemUgPSAkKHRoaXMpLnR1cm4oJ3NpemUnKSwKICAgICAgbGVmdCA9IDA7CgogICAgaWYgKCFkYXRhLm5vQ2VudGVyKSB7CiAgICAgIGlmIChkYXRhLmRpc3BsYXk9PSdkb3VibGUnKSB7CiAgICAgICAgdmFyIHZpZXcgPSB0aGlzLnR1cm4oJ3ZpZXcnLCBwYWdlIHx8IGRhdGEudHBhZ2UgfHwgZGF0YS5wYWdlKTsKCiAgICAgICAgaWYgKGRhdGEuZGlyZWN0aW9uPT0nbHRyJykgewogICAgICAgICAgaWYgKCF2aWV3WzBdKQogICAgICAgICAgICBsZWZ0IC09IHNpemUud2lkdGgvNDsKICAgICAgICAgIGVsc2UgaWYgKCF2aWV3WzFdKQogICAgICAgICAgICBsZWZ0ICs9IHNpemUud2lkdGgvNDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgaWYgKCF2aWV3WzBdKQogICAgICAgICAgICBsZWZ0ICs9IHNpemUud2lkdGgvNDsKICAgICAgICAgIGVsc2UgaWYgKCF2aWV3WzFdKQogICAgICAgICAgICBsZWZ0IC09IHNpemUud2lkdGgvNDsKICAgICAgICB9CiAgICAgIAogICAgICB9CgogICAgICAkKHRoaXMpLmNzcyh7bWFyZ2luTGVmdDogbGVmdH0pOwogICAgfQoKICAgIHJldHVybiB0aGlzOwoKICB9LAoKICAvLyBEZXN0cm95cyB0aGUgZmxpcGJvb2sKCiAgZGVzdHJveTogZnVuY3Rpb24gKCkgewoKICAgIHZhciBwYWdlLAogICAgICBmbGlwYm9vayA9IHRoaXMsCiAgICAgIGRhdGEgPSB0aGlzLmRhdGEoKSwKICAgICAgZXZlbnRzID0gWwogICAgICAgICdlbmQnLCAnZmlyc3QnLCAnZmxpcCcsICdsYXN0JywgJ3ByZXNzZWQnLAogICAgICAgICdyZWxlYXNlZCcsICdzdGFydCcsICd0dXJuaW5nJywgJ3R1cm5lZCcsCiAgICAgICAgJ3pvb21pbmcnLCAnbWlzc2luZyddOwoKICAgIGlmICh0cmlnZ2VyKCdkZXN0cm95aW5nJywgdGhpcyk9PSdwcmV2ZW50ZWQnKQogICAgICByZXR1cm47CgogICAgZGF0YS5kZXN0cm95aW5nID0gdHJ1ZTsKCiAgICAkLmVhY2goZXZlbnRzLCBmdW5jdGlvbihpbmRleCwgZXZlbnROYW1lKSB7CiAgICAgIGZsaXBib29rLnVuYmluZChldmVudE5hbWUpOwogICAgfSk7CgogICAgdGhpcy5wYXJlbnQoKS51bmJpbmQoJ3N0YXJ0JywgZGF0YS5ldmVudEhhbmRsZXJzLnN0YXJ0KTsKCiAgICAkKGRvY3VtZW50KS51bmJpbmQobW91c2VFdmVudHMubW92ZSwgZGF0YS5ldmVudEhhbmRsZXJzLnRvdWNoTW92ZSkuCiAgICAgIHVuYmluZChtb3VzZUV2ZW50cy51cCwgZGF0YS5ldmVudEhhbmRsZXJzLnRvdWNoRW5kKTsKICAgIAogICAgd2hpbGUgKGRhdGEudG90YWxQYWdlcyE9PTApIHsKICAgICAgdGhpcy50dXJuKCdyZW1vdmVQYWdlJywgZGF0YS50b3RhbFBhZ2VzKTsKICAgIH0KCiAgICBpZiAoZGF0YS5mcGFyZW50KQogICAgICBkYXRhLmZwYXJlbnQucmVtb3ZlKCk7CgogICAgaWYgKGRhdGEuc2hhZG93KQogICAgICBkYXRhLnNoYWRvdy5yZW1vdmUoKTsKCiAgICB0aGlzLnJlbW92ZURhdGEoKTsKICAgIGRhdGEgPSBudWxsOwoKICAgIHJldHVybiB0aGlzOwoKICB9LAoKICAvLyBDaGVja3MgaWYgdGhpcyBlbGVtZW50IGlzIGEgZmxpcGJvb2sKCiAgaXM6IGZ1bmN0aW9uKCkgewoKICAgIHJldHVybiB0eXBlb2YodGhpcy5kYXRhKCkucGFnZXMpPT0nb2JqZWN0JzsKCiAgfSwKCiAgLy8gU2V0cyBhbmQgZ2V0cyB0aGUgem9vbSB2YWx1ZQoKICB6b29tOiBmdW5jdGlvbihuZXdab29tKSB7CiAgICAKICAgIHZhciBkYXRhID0gdGhpcy5kYXRhKCk7CgogICAgaWYgKHR5cGVvZihuZXdab29tKT09J251bWJlcicpIHsKCiAgICAgIGlmIChuZXdab29tPDAuMDAxIHx8IG5ld1pvb20+MTAwKQogICAgICAgIHRocm93IHR1cm5FcnJvcihuZXdab29tKyAnIGlzIG5vdCBhIHZhbHVlIGZvciB6b29tJyk7CiAgICAgIAogICAgICBpZiAodHJpZ2dlcignem9vbWluZycsIHRoaXMsIFtuZXdab29tLCBkYXRhLnpvb21dKT09J3ByZXZlbnRlZCcpCiAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgIAogICAgICB2YXIgc2l6ZSA9IHRoaXMudHVybignc2l6ZScpLAogICAgICAgIGN1cnJlbnRWaWV3ID0gdGhpcy50dXJuKCd2aWV3JyksCiAgICAgICAgaXogPSAxL2RhdGEuem9vbSwKICAgICAgICBuZXdXaWR0aCA9IE1hdGgucm91bmQoc2l6ZS53aWR0aCAqIGl6ICogbmV3Wm9vbSksCiAgICAgICAgbmV3SGVpZ2h0ID0gTWF0aC5yb3VuZChzaXplLmhlaWdodCAqIGl6ICogbmV3Wm9vbSk7CiAgICAKICAgICAgZGF0YS56b29tID0gbmV3Wm9vbTsKCiAgICAgICQodGhpcykudHVybignc3RvcCcpLgogICAgICAgIHR1cm4oJ3NpemUnLCBuZXdXaWR0aCwgbmV3SGVpZ2h0KTsKICAgICAgICAvKi4KICAgICAgICBjc3Moe21hcmdpblRvcDogc2l6ZS5oZWlnaHQgKiBpeiAvIDIgLSBuZXdIZWlnaHQgLyAyfSk7Ki8KCiAgICAgIGlmIChkYXRhLm9wdHMuYXV0b0NlbnRlcikKICAgICAgICB0aGlzLnR1cm4oJ2NlbnRlcicpOwogICAgICAvKmVsc2UKICAgICAgICAkKHRoaXMpLmNzcyh7bWFyZ2luTGVmdDogc2l6ZS53aWR0aCAqIGl6IC8gMiAtIG5ld1dpZHRoIC8gMn0pOyovCgogICAgICB0dXJuTWV0aG9kcy5fdXBkYXRlU2hhZG93LmNhbGwodGhpcyk7CgogICAgICBmb3IgKHZhciBpID0gMDsgaTxjdXJyZW50Vmlldy5sZW5ndGg7IGkrKykgewogICAgICAgIGlmIChjdXJyZW50Vmlld1tpXSAmJiBkYXRhLnBhZ2Vab29tW2N1cnJlbnRWaWV3W2ldXSE9ZGF0YS56b29tKSB7CiAgCiAgICAgICAgICB0aGlzLnRyaWdnZXIoJ3pvb21lZCcsWwogICAgICAgICAgICBjdXJyZW50Vmlld1tpXSwKICAgICAgICAgICAgY3VycmVudFZpZXcsCiAgICAgICAgICAgIGRhdGEucGFnZVpvb21bY3VycmVudFZpZXdbaV1dLAogICAgICAgICAgICBkYXRhLnpvb21dKTsKCiAgICAgICAgICBkYXRhLnBhZ2Vab29tW2N1cnJlbnRWaWV3W2ldXSA9IGRhdGEuem9vbTsKICAgICAgfQogICAgfQoKICAgICAgcmV0dXJuIHRoaXM7CgogICAgfSBlbHNlCiAgICAgIHJldHVybiBkYXRhLnpvb207CgogIH0sCgogIC8vIEdldHMgdGhlIHNpemUgb2YgYSBwYWdlCgogIF9wYWdlU2l6ZTogZnVuY3Rpb24ocGFnZSwgcG9zaXRpb24pIHsKCiAgICB2YXIgZGF0YSA9IHRoaXMuZGF0YSgpLAogICAgICBwcm9wID0ge307CgogICAgaWYgKGRhdGEuZGlzcGxheT09J3NpbmdsZScpIHsKCiAgICAgIHByb3Aud2lkdGggPSB0aGlzLndpZHRoKCk7CiAgICAgIHByb3AuaGVpZ2h0ID0gdGhpcy5oZWlnaHQoKTsKCiAgICAgIGlmIChwb3NpdGlvbikgewogICAgICAgIHByb3AudG9wID0gMDsKICAgICAgICBwcm9wLmxlZnQgPSAwOwogICAgICAgIHByb3AucmlnaHQgPSAnYXV0byc7CiAgICAgIH0KCiAgICB9IGVsc2UgewoKICAgICAgdmFyIHBhZ2VXaWR0aCA9IHRoaXMud2lkdGgoKS8yLAogICAgICAgIHBhZ2VIZWlnaHQgPSB0aGlzLmhlaWdodCgpOwoKICAgICAgaWYgKGRhdGEucGFnZU9ianNbcGFnZV0uaGFzQ2xhc3MoJ293bi1zaXplJykpIHsKICAgICAgICBwcm9wLndpZHRoID0gZGF0YS5wYWdlT2Jqc1twYWdlXS53aWR0aCgpOwogICAgICAgIHByb3AuaGVpZ2h0ID0gZGF0YS5wYWdlT2Jqc1twYWdlXS5oZWlnaHQoKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBwcm9wLndpZHRoID0gcGFnZVdpZHRoOwogICAgICAgIHByb3AuaGVpZ2h0ID0gcGFnZUhlaWdodDsKICAgICAgfQogICAgICAKICAgICAgaWYgKHBvc2l0aW9uKSB7CiAgICAgICAgdmFyIG9kZCA9IHBhZ2UlMjsKICAgICAgICBwcm9wLnRvcCA9IChwYWdlSGVpZ2h0LXByb3AuaGVpZ2h0KS8yOwoKICAgICAgICBpZiAoZGF0YS5kaXJlY3Rpb249PSdsdHInKSB7CiAgICAgICAgICAKICAgICAgICAgIHByb3BbKG9kZCkgPyAncmlnaHQnIDogJ2xlZnQnXSA9IHBhZ2VXaWR0aC1wcm9wLndpZHRoOwogICAgICAgICAgcHJvcFsob2RkKSA/ICdsZWZ0JyA6ICdyaWdodCddID0gJ2F1dG8nOwoKICAgICAgICB9IGVsc2UgewogICAgICAgICAgCiAgICAgICAgICBwcm9wWyhvZGQpID8gJ2xlZnQnIDogJ3JpZ2h0J10gPSBwYWdlV2lkdGgtcHJvcC53aWR0aDsKICAgICAgICAgIHByb3BbKG9kZCkgPyAncmlnaHQnIDogJ2xlZnQnXSA9ICdhdXRvJzsKCiAgICAgICAgfQogICAgICAKICAgICAgfQogICAgfQoKICAgIHJldHVybiBwcm9wOwoKICB9LAoKICAvLyBQcmVwYXJlcyB0aGUgZmxpcCBlZmZlY3QgZm9yIGEgcGFnZQoKICBfbWFrZUZsaXA6IGZ1bmN0aW9uKHBhZ2UpIHsKCiAgICB2YXIgZGF0YSA9IHRoaXMuZGF0YSgpOwoKICAgIGlmICghZGF0YS5wYWdlc1twYWdlXSAmJiBkYXRhLnBhZ2VQbGFjZVtwYWdlXT09cGFnZSkgewogICAgICAKICAgICAgdmFyIHNpbmdsZSA9IGRhdGEuZGlzcGxheT09J3NpbmdsZScsCiAgICAgICAgb2RkID0gcGFnZSUyOwoKICAgICAgZGF0YS5wYWdlc1twYWdlXSA9IGRhdGEucGFnZU9ianNbcGFnZV0uCiAgICAgICAgY3NzKHR1cm5NZXRob2RzLl9wYWdlU2l6ZS5jYWxsKHRoaXMsIHBhZ2UpKS4KICAgICAgICBmbGlwKHsKICAgICAgICAgIHBhZ2U6IHBhZ2UsCiAgICAgICAgICBuZXh0OiAob2RkIHx8IHNpbmdsZSkgPyBwYWdlKzEgOiBwYWdlLTEsCiAgICAgICAgICB0dXJuOiB0aGlzCiAgICAgICAgfSkuCiAgICAgICAgZmxpcCgnZGlzYWJsZScsIGRhdGEuZGlzYWJsZWQpOwoKICAgICAgICAvLyBJc3N1ZSBhYm91dCB6LWluZGV4CiAgICAgICAgdHVybk1ldGhvZHMuX3NldFBhZ2VMb2MuY2FsbCh0aGlzLCBwYWdlKTsKCiAgICAgICAgZGF0YS5wYWdlWm9vbVtwYWdlXSA9IGRhdGEuem9vbTsKICAgICAgICAKICAgIH0KCiAgICByZXR1cm4gZGF0YS5wYWdlc1twYWdlXTsKICB9LAoKICAvLyBNYWtlcyBwYWdlcyB3aXRoaW4gYSByYW5nZQoKICBfbWFrZVJhbmdlOiBmdW5jdGlvbigpIHsKCiAgICB2YXIgcGFnZSwgcmFuZ2UsCiAgICAgIGRhdGEgPSB0aGlzLmRhdGEoKTsKCiAgICBpZiAoZGF0YS50b3RhbFBhZ2VzPDEpCiAgICAgIHJldHVybjsKCiAgICByYW5nZSA9IHRoaXMudHVybigncmFuZ2UnKTsKCiAgICBmb3IgKHBhZ2UgPSByYW5nZVswXTsgcGFnZTw9cmFuZ2VbMV07IHBhZ2UrKykKICAgICAgdHVybk1ldGhvZHMuX2FkZFBhZ2UuY2FsbCh0aGlzLCBwYWdlKTsKCiAgfSwKCiAgLy8gUmV0dXJucyBhIHJhbmdlIG9mIHBhZ2VzIHRoYXQgc2hvdWxkIGJlIGluIHRoZSBET00KICAvLyBFeGFtcGxlOgogIC8vIC0gcGFnZSBpbiB0aGUgY3VycmVudCB2aWV3LCByZXR1cm4gdHJ1ZQogIC8vICogcGFnZSBpcyBpbiB0aGUgcmFuZ2UsIHJldHVybiB0cnVlCiAgLy8gT3RoZXJ3aXNlLCByZXR1cm4gZmFsc2UKICAvLwogIC8vIDEgMi0zIDQtNSA2LTcgOC05IDEwLTExIDEyLTEzCiAgLy8gICAqKiAgKiogIC0tICAgKiogICoqCgogIHJhbmdlOiBmdW5jdGlvbihwYWdlKSB7CgogICAgdmFyIHJlbWFpbmluZ1BhZ2VzLCBsZWZ0LCByaWdodCwgdmlldywKICAgICAgZGF0YSA9IHRoaXMuZGF0YSgpOwoKICAgICAgcGFnZSA9IHBhZ2UgfHwgZGF0YS50cGFnZSB8fCBkYXRhLnBhZ2UgfHwgMTsKICAgICAgdmlldyA9IHR1cm5NZXRob2RzLl92aWV3LmNhbGwodGhpcywgcGFnZSk7CgogICAgICBpZiAocGFnZTwxIHx8IHBhZ2U+ZGF0YS50b3RhbFBhZ2VzKQogICAgICAgIHRocm93IHR1cm5FcnJvcignIicrcGFnZSsnIiBpcyBub3QgYSB2YWxpZCBwYWdlJyk7CgogICAgCiAgICAgIHZpZXdbMV0gPSB2aWV3WzFdIHx8IHZpZXdbMF07CiAgICAgIAogICAgICBpZiAodmlld1swXT49MSAmJiB2aWV3WzFdPD1kYXRhLnRvdGFsUGFnZXMpIHsKCiAgICAgICAgcmVtYWluaW5nUGFnZXMgPSBNYXRoLmZsb29yKChwYWdlc0luRE9NLTIpLzIpOwoKICAgICAgICBpZiAoZGF0YS50b3RhbFBhZ2VzLXZpZXdbMV0gPiB2aWV3WzBdKSB7CiAgICAgICAgICBsZWZ0ID0gTWF0aC5taW4odmlld1swXS0xLCByZW1haW5pbmdQYWdlcyk7CiAgICAgICAgICByaWdodCA9IDIqcmVtYWluaW5nUGFnZXMtbGVmdDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgcmlnaHQgPSBNYXRoLm1pbihkYXRhLnRvdGFsUGFnZXMtdmlld1sxXSwgcmVtYWluaW5nUGFnZXMpOwogICAgICAgICAgbGVmdCA9IDIqcmVtYWluaW5nUGFnZXMtcmlnaHQ7CiAgICAgICAgfQoKICAgICAgfSBlbHNlIHsKICAgICAgICBsZWZ0ID0gcGFnZXNJbkRPTS0xOwogICAgICAgIHJpZ2h0ID0gcGFnZXNJbkRPTS0xOwogICAgICB9CgogICAgICByZXR1cm4gW01hdGgubWF4KDEsIHZpZXdbMF0tbGVmdCksCiAgICAgICAgICBNYXRoLm1pbihkYXRhLnRvdGFsUGFnZXMsIHZpZXdbMV0rcmlnaHQpXTsKCiAgfSwKCiAgLy8gRGV0ZWN0cyBpZiBhIHBhZ2UgaXMgd2l0aGluIHRoZSByYW5nZSBvZiBgcGFnZXNJbkRPTWAgZnJvbSB0aGUgY3VycmVudCB2aWV3CgogIF9uZWNlc3NQYWdlOiBmdW5jdGlvbihwYWdlKSB7CiAgICAKICAgIGlmIChwYWdlPT09MCkKICAgICAgcmV0dXJuIHRydWU7CgogICAgdmFyIHJhbmdlID0gdGhpcy50dXJuKCdyYW5nZScpOwoKICAgIHJldHVybiB0aGlzLmRhdGEoKS5wYWdlT2Jqc1twYWdlXS5oYXNDbGFzcygnZml4ZWQnKSB8fAogICAgICAocGFnZT49cmFuZ2VbMF0gJiYgcGFnZTw9cmFuZ2VbMV0pOwogICAgCiAgfSwKCiAgLy8gUmVsZWFzZXMgbWVtb3J5IGJ5IHJlbW92aW5nIHBhZ2VzIGZyb20gdGhlIERPTQoKICBfcmVtb3ZlRnJvbURPTTogZnVuY3Rpb24oKSB7CgogICAgdmFyIHBhZ2UsIGRhdGEgPSB0aGlzLmRhdGEoKTsKCiAgICBmb3IgKHBhZ2UgaW4gZGF0YS5wYWdlV3JhcCkKICAgICAgaWYgKGhhcyhwYWdlLCBkYXRhLnBhZ2VXcmFwKSAmJgogICAgICAgICF0dXJuTWV0aG9kcy5fbmVjZXNzUGFnZS5jYWxsKHRoaXMsIHBhZ2UpKQogICAgICB0dXJuTWV0aG9kcy5fcmVtb3ZlUGFnZUZyb21ET00uY2FsbCh0aGlzLCBwYWdlKTsKICAgIAogIH0sCgogIC8vIFJlbW92ZXMgYSBwYWdlIGZyb20gRE9NIGFuZCBpdHMgaW50ZXJuYWwgcmVmZXJlbmNlcwoKICBfcmVtb3ZlUGFnZUZyb21ET006IGZ1bmN0aW9uKHBhZ2UpIHsKCiAgICB2YXIgZGF0YSA9IHRoaXMuZGF0YSgpOwoKICAgIGlmIChkYXRhLnBhZ2VzW3BhZ2VdKSB7CiAgICAgIHZhciBkZCA9IGRhdGEucGFnZXNbcGFnZV0uZGF0YSgpOwoKICAgICAgZmxpcE1ldGhvZHMuX21vdmVGb2xkaW5nUGFnZS5jYWxsKGRhdGEucGFnZXNbcGFnZV0sIGZhbHNlKTsKCiAgICAgIGlmIChkZC5mICYmIGRkLmYuZndyYXBwZXIpCiAgICAgICAgZGQuZi5md3JhcHBlci5yZW1vdmUoKTsKCiAgICAgIGRhdGEucGFnZXNbcGFnZV0ucmVtb3ZlRGF0YSgpOwogICAgICBkYXRhLnBhZ2VzW3BhZ2VdLnJlbW92ZSgpOwogICAgICBkZWxldGUgZGF0YS5wYWdlc1twYWdlXTsKICAgIH0KCiAgICBpZiAoZGF0YS5wYWdlT2Jqc1twYWdlXSkKICAgICAgZGF0YS5wYWdlT2Jqc1twYWdlXS5yZW1vdmUoKTsKCiAgICBpZiAoZGF0YS5wYWdlV3JhcFtwYWdlXSkgewogICAgICBkYXRhLnBhZ2VXcmFwW3BhZ2VdLnJlbW92ZSgpOwogICAgICBkZWxldGUgZGF0YS5wYWdlV3JhcFtwYWdlXTsKICAgIH0KCiAgICB0dXJuTWV0aG9kcy5fcmVtb3ZlTXYuY2FsbCh0aGlzLCBwYWdlKTsKCiAgICBkZWxldGUgZGF0YS5wYWdlUGxhY2VbcGFnZV07CiAgICBkZWxldGUgZGF0YS5wYWdlWm9vbVtwYWdlXTsKCiAgfSwKCiAgLy8gUmVtb3ZlcyBhIHBhZ2UKCiAgcmVtb3ZlUGFnZTogZnVuY3Rpb24ocGFnZSkgewoKICAgIHZhciBkYXRhID0gdGhpcy5kYXRhKCk7CgogICAgLy8gRGVsZXRlIGFsbCB0aGUgcGFnZXMKICAgIGlmIChwYWdlPT0nKicpIHsKICAgICAgCiAgICAgIHdoaWxlIChkYXRhLnRvdGFsUGFnZXMhPT0wKSB7CiAgICAgICAgdGhpcy50dXJuKCdyZW1vdmVQYWdlJywgZGF0YS50b3RhbFBhZ2VzKTsKICAgICAgfQoKICAgIH0gZWxzZSB7CgogICAgICBpZiAocGFnZTwxIHx8IHBhZ2U+ZGF0YS50b3RhbFBhZ2VzKQogICAgICAgIHRocm93IHR1cm5FcnJvcignVGhlIHBhZ2UgJysgcGFnZSArICcgZG9lc25cJ3QgZXhpc3QnKTsKICAgICAgICAKICAgICAgaWYgKGRhdGEucGFnZU9ianNbcGFnZV0pIHsKCiAgICAgICAgLy8gU3RvcCBhbmltYXRpb25zCiAgICAgICAgdGhpcy50dXJuKCdzdG9wJyk7CgogICAgICAgIC8vIFJlbW92ZSBgcGFnZWAKICAgICAgICB0dXJuTWV0aG9kcy5fcmVtb3ZlUGFnZUZyb21ET00uY2FsbCh0aGlzLCBwYWdlKTsKCiAgICAgICAgZGVsZXRlIGRhdGEucGFnZU9ianNbcGFnZV07CgogICAgICB9CgogICAgICAvLyBNb3ZlIHRoZSBwYWdlcwogICAgICB0dXJuTWV0aG9kcy5fbW92ZVBhZ2VzLmNhbGwodGhpcywgcGFnZSwgLTEpOwoKICAgICAgLy8gUmVzaXplIHRoZSBzaXplIG9mIHRoaXMgZmxpcGJvb2sKICAgICAgZGF0YS50b3RhbFBhZ2VzID0gZGF0YS50b3RhbFBhZ2VzLTE7CgogICAgICAvLyBDaGVjayB0aGUgY3VycmVudCB2aWV3CgogICAgICBpZiAoZGF0YS5wYWdlPmRhdGEudG90YWxQYWdlcykgewoKICAgICAgIGRhdGEucGFnZSA9IG51bGw7CiAgICAgICB0dXJuTWV0aG9kcy5fZml0UGFnZS5jYWxsKHRoaXMsIGRhdGEudG90YWxQYWdlcyk7CgogICAgICB9IGVsc2UgewoKICAgICAgICB0dXJuTWV0aG9kcy5fbWFrZVJhbmdlLmNhbGwodGhpcyk7CiAgICAgICAgdGhpcy50dXJuKCd1cGRhdGUnKTsKCiAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gdGhpczsKICAKICB9LAoKICAvLyBNb3ZlcyBwYWdlcwoKICBfbW92ZVBhZ2VzOiBmdW5jdGlvbihmcm9tLCBjaGFuZ2UpIHsKCiAgICB2YXIgcGFnZSwKICAgICAgdGhhdCA9IHRoaXMsCiAgICAgIGRhdGEgPSB0aGlzLmRhdGEoKSwKICAgICAgc2luZ2xlID0gZGF0YS5kaXNwbGF5PT0nc2luZ2xlJywKICAgICAgbW92ZSA9IGZ1bmN0aW9uKHBhZ2UpIHsKCiAgICAgICAgdmFyIG5leHQgPSBwYWdlICsgY2hhbmdlLAogICAgICAgICAgb2RkID0gbmV4dCUyLAogICAgICAgICAgY2xhc3NOYW1lID0gKG9kZCkgPyAnIG9kZCAnIDogJyBldmVuICc7CgogICAgICAgIGlmIChkYXRhLnBhZ2VPYmpzW3BhZ2VdKQogICAgICAgICAgZGF0YS5wYWdlT2Jqc1tuZXh0XSA9IGRhdGEucGFnZU9ianNbcGFnZV0uCiAgICAgICAgICAgIHJlbW92ZUNsYXNzKCdwJyArIHBhZ2UgKyAnIG9kZCBldmVuJykuCiAgICAgICAgICAgIGFkZENsYXNzKCdwJyArIG5leHQgKyBjbGFzc05hbWUpOwoKICAgICAgICBpZiAoZGF0YS5wYWdlUGxhY2VbcGFnZV0gJiYgZGF0YS5wYWdlV3JhcFtwYWdlXSkgewoKICAgICAgICAgIGRhdGEucGFnZVBsYWNlW25leHRdID0gbmV4dDsKICAgICAgICAKICAgICAgICAgIGlmIChkYXRhLnBhZ2VPYmpzW25leHRdLmhhc0NsYXNzKCdmaXhlZCcpKQogICAgICAgICAgICBkYXRhLnBhZ2VXcmFwW25leHRdID0gZGF0YS5wYWdlV3JhcFtwYWdlXS4KICAgICAgICAgICAgICBhdHRyKCdwYWdlJywgbmV4dCk7CiAgICAgICAgICBlbHNlCiAgICAgICAgICAgIGRhdGEucGFnZVdyYXBbbmV4dF0gPSBkYXRhLnBhZ2VXcmFwW3BhZ2VdLgogICAgICAgICAgICAgIGNzcyh0dXJuTWV0aG9kcy5fcGFnZVNpemUuY2FsbCh0aGF0LCBuZXh0LCB0cnVlKSkuCiAgICAgICAgICAgICAgYXR0cigncGFnZScsIG5leHQpOwogICAgICAKICAgICAgICAgICAgaWYgKGRhdGEucGFnZXNbcGFnZV0pCiAgICAgICAgICAgICAgZGF0YS5wYWdlc1tuZXh0XSA9IGRhdGEucGFnZXNbcGFnZV0uCiAgICAgICAgICAgICAgICBmbGlwKCdvcHRpb25zJywgewogICAgICAgICAgICAgICAgICBwYWdlOiBuZXh0LAogICAgICAgICAgICAgICAgICBuZXh0OiAoc2luZ2xlIHx8IG9kZCkgPyBuZXh0KzEgOiBuZXh0LTEKICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgaWYgKGNoYW5nZSkgewogICAgICAgICAgICAgIGRlbGV0ZSBkYXRhLnBhZ2VzW3BhZ2VdOwogICAgICAgICAgICAgIGRlbGV0ZSBkYXRhLnBhZ2VQbGFjZVtwYWdlXTsKICAgICAgICAgICAgICBkZWxldGUgZGF0YS5wYWdlWm9vbVtwYWdlXTsKICAgICAgICAgICAgICBkZWxldGUgZGF0YS5wYWdlT2Jqc1twYWdlXTsKICAgICAgICAgICAgICBkZWxldGUgZGF0YS5wYWdlV3JhcFtwYWdlXTsKICAgICAgICAgICAgfQoKICAgICAgICB9CgogICAgfTsKCiAgICBpZiAoY2hhbmdlPjApCiAgICAgIGZvciAocGFnZT1kYXRhLnRvdGFsUGFnZXM7IHBhZ2U+PWZyb207IHBhZ2UtLSkKICAgICAgICBtb3ZlKHBhZ2UpOwogICAgZWxzZQogICAgICBmb3IgKHBhZ2U9ZnJvbTsgcGFnZTw9ZGF0YS50b3RhbFBhZ2VzOyBwYWdlKyspCiAgICAgICAgbW92ZShwYWdlKTsKCiAgfSwKCiAgLy8gU2V0cyBvciBHZXRzIHRoZSBkaXNwbGF5IG1vZGUKCiAgZGlzcGxheTogZnVuY3Rpb24oZGlzcGxheSkgewoKICAgIHZhciBkYXRhID0gdGhpcy5kYXRhKCksCiAgICAgIGN1cnJlbnREaXNwbGF5ID0gZGF0YS5kaXNwbGF5OwoKICAgIGlmIChkaXNwbGF5PT09dW5kZWZpbmVkKSB7CiAgICAgIAogICAgICByZXR1cm4gY3VycmVudERpc3BsYXk7CgogICAgfSBlbHNlIHsKCiAgICAgIGlmICgkLmluQXJyYXkoZGlzcGxheSwgZGlzcGxheXMpPT0tMSkKICAgICAgICB0aHJvdyB0dXJuRXJyb3IoJyInK2Rpc3BsYXkgKyAnIiBpcyBub3QgYSB2YWx1ZSBmb3IgZGlzcGxheScpOwogICAgICAKICAgICAgc3dpdGNoKGRpc3BsYXkpIHsKICAgICAgICBjYXNlICdzaW5nbGUnOgoKICAgICAgICAgIC8vIENyZWF0ZSBhIHRlbXBvcmFsIHBhZ2UgdG8gdXNlIGFzIGZvbGRlZCBwYWdlCgogICAgICAgICAgaWYgKCFkYXRhLnBhZ2VPYmpzWzBdKSB7CiAgICAgICAgICAgIHRoaXMudHVybignc3RvcCcpLgogICAgICAgICAgICAgIGNzcyh7J292ZXJmbG93JzogJ2hpZGRlbid9KTsKCiAgICAgICAgICAgIGRhdGEucGFnZU9ianNbMF0gPSAkKCc8ZGl2IC8+JywKICAgICAgICAgICAgICAgIHsnY2xhc3MnOiAncGFnZSBwLXRlbXBvcmFsJ30pLgogICAgICAgICAgICAgIGNzcyh7d2lkdGg6IHRoaXMud2lkdGgoKSwgaGVpZ2h0OiB0aGlzLmhlaWdodCgpfSkuCiAgICAgICAgICAgICAgYXBwZW5kVG8odGhpcyk7CiAgICAgICAgICB9CgogICAgICAgICAgdGhpcy5hZGRDbGFzcygnc2hhZG93Jyk7CgogICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgJ2RvdWJsZSc6CgogICAgICAgICAgLy8gUmVtb3ZlIHRoZSB0ZW1wb3JhbCBwYWdlCgogICAgICAgICAgaWYgKGRhdGEucGFnZU9ianNbMF0pIHsKICAgICAgICAgICAgdGhpcy50dXJuKCdzdG9wJykuY3NzKHsnb3ZlcmZsb3cnOiAnJ30pOwogICAgICAgICAgICBkYXRhLnBhZ2VPYmpzWzBdLnJlbW92ZSgpOwogICAgICAgICAgICBkZWxldGUgZGF0YS5wYWdlT2Jqc1swXTsKICAgICAgICAgIH0KCiAgICAgICAgICB0aGlzLnJlbW92ZUNsYXNzKCdzaGFkb3cnKTsKCiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgCgogICAgICBkYXRhLmRpc3BsYXkgPSBkaXNwbGF5OwoKICAgICAgaWYgKGN1cnJlbnREaXNwbGF5KSB7CiAgICAgICAgdmFyIHNpemUgPSB0aGlzLnR1cm4oJ3NpemUnKTsKICAgICAgICB0dXJuTWV0aG9kcy5fbW92ZVBhZ2VzLmNhbGwodGhpcywgMSwgMCk7CiAgICAgICAgdGhpcy50dXJuKCdzaXplJywgc2l6ZS53aWR0aCwgc2l6ZS5oZWlnaHQpLgogICAgICAgICAgdHVybigndXBkYXRlJyk7CiAgICAgIH0KCiAgICAgIHJldHVybiB0aGlzOwoKICAgIH0KICAKICB9LAogIAogIC8vIEdldHMgYW5kIHNldHMgdGhlIGRpcmVjdGlvbiBvZiB0aGUgZmxpcGJvb2sKCiAgZGlyZWN0aW9uOiBmdW5jdGlvbihkaXIpIHsKCiAgICB2YXIgZGF0YSA9IHRoaXMuZGF0YSgpOwoKICAgIGlmIChkaXI9PT11bmRlZmluZWQpIHsKCiAgICAgIHJldHVybiBkYXRhLmRpcmVjdGlvbjsKCiAgICB9IGVsc2UgewoKICAgICAgZGlyID0gZGlyLnRvTG93ZXJDYXNlKCk7CgogICAgICBpZiAoJC5pbkFycmF5KGRpciwgZGlyZWN0aW9ucyk9PS0xKQogICAgICAgIHRocm93IHR1cm5FcnJvcignIicgKyBkaXIgKyAnIiBpcyBub3QgYSB2YWx1ZSBmb3IgZGlyZWN0aW9uJyk7CgogICAgICBpZiAoZGlyPT0ncnRsJykgewogICAgICAgICQodGhpcykuYXR0cignZGlyJywgJ2x0cicpLgogICAgICAgICAgY3NzKHtkaXJlY3Rpb246ICdsdHInfSk7CiAgICAgIH0KCiAgICAgIGRhdGEuZGlyZWN0aW9uID0gZGlyOwoKICAgICAgaWYgKGRhdGEuZG9uZSkKICAgICAgICB0aGlzLnR1cm4oJ3NpemUnLCAkKHRoaXMpLndpZHRoKCksICQodGhpcykuaGVpZ2h0KCkpOwoKICAgICAgcmV0dXJuIHRoaXM7CiAgICB9CgogIH0sCgogIC8vIERldGVjdHMgYW5pbWF0aW9uCgogIGFuaW1hdGluZzogZnVuY3Rpb24oKSB7CgogICAgcmV0dXJuIHRoaXMuZGF0YSgpLnBhZ2VNdi5sZW5ndGg+MDsKCiAgfSwKCiAgLy8gR2V0cyB0aGUgY3VycmVudCBhY3RpdmF0ZWQgY29ybmVyCgogIGNvcm5lcjogZnVuY3Rpb24oKSB7CiAgICAKICAgIHZhciBjb3JuZXIsCiAgICAgIHBhZ2UsCiAgICAgIGRhdGEgPSB0aGlzLmRhdGEoKTsKCiAgICBmb3IgKHBhZ2UgaW4gZGF0YS5wYWdlcykgewogICAgICBpZiAoaGFzKHBhZ2UsIGRhdGEucGFnZXMpKQogICAgICAgIGlmICgoY29ybmVyID0gZGF0YS5wYWdlc1twYWdlXS5mbGlwKCdjb3JuZXInKSkpIHsKICAgICAgICAgIHJldHVybiBjb3JuZXI7CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiBmYWxzZTsKICB9LAoKICAvLyBHZXRzIHRoZSBkYXRhIHN0b3JlZCBpbiB0aGUgZmxpcGJvb2sKCiAgZGF0YTogZnVuY3Rpb24oKSB7CiAgICAKICAgIHJldHVybiB0aGlzLmRhdGEoKTsKCiAgfSwKCiAgLy8gRGlzYWJsZXMgYW5kIGVuYWJsZXMgdGhlIGVmZmVjdAoKICBkaXNhYmxlOiBmdW5jdGlvbihkaXNhYmxlKSB7CgogICAgdmFyIHBhZ2UsCiAgICAgIGRhdGEgPSB0aGlzLmRhdGEoKSwKICAgICAgdmlldyA9IHRoaXMudHVybigndmlldycpOwoKICAgIGRhdGEuZGlzYWJsZWQgPSBkaXNhYmxlPT09dW5kZWZpbmVkIHx8IGRpc2FibGU9PT10cnVlOwoKICAgIGZvciAocGFnZSBpbiBkYXRhLnBhZ2VzKSB7CiAgICAgIGlmIChoYXMocGFnZSwgZGF0YS5wYWdlcykpCiAgICAgICAgZGF0YS5wYWdlc1twYWdlXS5mbGlwKCdkaXNhYmxlJywKICAgICAgICAgIChkYXRhLmRpc2FibGVkKSA/IHRydWUgOiAkLmluQXJyYXkocGFyc2VJbnQocGFnZSwgMTApLCB2aWV3KT09LTEpOwogICAgfQoKICAgIHJldHVybiB0aGlzOwoKICB9LAoKICAvLyBEaXNhYmxlcyBhbmQgZW5hYmxlcyB0aGUgZWZmZWN0CgogIGRpc2FibGVkOiBmdW5jdGlvbihkaXNhYmxlKSB7CgogICAgaWYgKGRpc2FibGU9PT11bmRlZmluZWQpIHsKICAgICAgcmV0dXJuIHRoaXMuZGF0YSgpLmRpc2FibGVkPT09dHJ1ZTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiB0aGlzLnR1cm4oJ2Rpc2FibGUnLCBkaXNhYmxlKTsKICAgIH0KCiAgfSwKCiAgLy8gR2V0cyBhbmQgc2V0cyB0aGUgc2l6ZQoKICBzaXplOiBmdW5jdGlvbih3aWR0aCwgaGVpZ2h0KSB7CgogICAgaWYgKHdpZHRoPT09dW5kZWZpbmVkIHx8IGhlaWdodD09PXVuZGVmaW5lZCkgewogICAgICAKICAgICAgcmV0dXJuIHt3aWR0aDogdGhpcy53aWR0aCgpLCBoZWlnaHQ6IHRoaXMuaGVpZ2h0KCl9OwoKICAgIH0gZWxzZSB7CgogICAgICB0aGlzLnR1cm4oJ3N0b3AnKTsKCiAgICAgIHZhciBwYWdlLCBwcm9wLAogICAgICAgIGRhdGEgPSB0aGlzLmRhdGEoKSwKICAgICAgICBwYWdlV2lkdGggPSAoZGF0YS5kaXNwbGF5PT0nZG91YmxlJykgPyB3aWR0aC8yIDogd2lkdGg7CgogICAgICB0aGlzLmNzcyh7d2lkdGg6IHdpZHRoLCBoZWlnaHQ6IGhlaWdodH0pOwoKICAgICAgaWYgKGRhdGEucGFnZU9ianNbMF0pCiAgICAgICAgZGF0YS5wYWdlT2Jqc1swXS5jc3Moe3dpZHRoOiBwYWdlV2lkdGgsIGhlaWdodDogaGVpZ2h0fSk7CiAgICAgIAogICAgICBmb3IgKHBhZ2UgaW4gZGF0YS5wYWdlV3JhcCkgewogICAgICAgIGlmICghaGFzKHBhZ2UsIGRhdGEucGFnZVdyYXApKSBjb250aW51ZTsKCiAgICAgICAgcHJvcCA9IHR1cm5NZXRob2RzLl9wYWdlU2l6ZS5jYWxsKHRoaXMsIHBhZ2UsIHRydWUpOwoKICAgICAgICBkYXRhLnBhZ2VPYmpzW3BhZ2VdLmNzcyh7d2lkdGg6IHByb3Aud2lkdGgsIGhlaWdodDogcHJvcC5oZWlnaHR9KTsKICAgICAgICBkYXRhLnBhZ2VXcmFwW3BhZ2VdLmNzcyhwcm9wKTsKICAgICAgICAKICAgICAgICBpZiAoZGF0YS5wYWdlc1twYWdlXSkKICAgICAgICAgIGRhdGEucGFnZXNbcGFnZV0uY3NzKHt3aWR0aDogcHJvcC53aWR0aCwgaGVpZ2h0OiBwcm9wLmhlaWdodH0pOwogICAgICB9CgogICAgICB0aGlzLnR1cm4oJ3Jlc2l6ZScpOwoKICAgICAgcmV0dXJuIHRoaXM7CgogICAgfQogIH0sCgogIC8vIFJlc2l6ZXMgZWFjaCBwYWdlCgogIHJlc2l6ZTogZnVuY3Rpb24oKSB7CgogICAgdmFyIHBhZ2UsIGRhdGEgPSB0aGlzLmRhdGEoKTsKCiAgICBpZiAoZGF0YS5wYWdlc1swXSkgewogICAgICBkYXRhLnBhZ2VXcmFwWzBdLmNzcyh7bGVmdDogLXRoaXMud2lkdGgoKX0pOwogICAgICBkYXRhLnBhZ2VzWzBdLmZsaXAoJ3Jlc2l6ZScsIHRydWUpOwogICAgfQoKICAgIGZvciAocGFnZSA9IDE7IHBhZ2UgPD0gZGF0YS50b3RhbFBhZ2VzOyBwYWdlKyspCiAgICAgIGlmIChkYXRhLnBhZ2VzW3BhZ2VdKQogICAgICAgIGRhdGEucGFnZXNbcGFnZV0uZmxpcCgncmVzaXplJywgdHJ1ZSk7CgogICAgdHVybk1ldGhvZHMuX3VwZGF0ZVNoYWRvdy5jYWxsKHRoaXMpOwoKICAgIGlmIChkYXRhLm9wdHMuYXV0b0NlbnRlcikKICAgICAgdGhpcy50dXJuKCdjZW50ZXInKTsKCiAgfSwKCiAgLy8gUmVtb3ZlcyBhbiBhbmltYXRpb24gZnJvbSB0aGUgY2FjaGUKCiAgX3JlbW92ZU12OiBmdW5jdGlvbihwYWdlKSB7CgogICAgdmFyIGksIGRhdGEgPSB0aGlzLmRhdGEoKTsKICAgICAgCiAgICBmb3IgKGk9MDsgaTxkYXRhLnBhZ2VNdi5sZW5ndGg7IGkrKykKICAgICAgaWYgKGRhdGEucGFnZU12W2ldPT1wYWdlKSB7CiAgICAgICAgZGF0YS5wYWdlTXYuc3BsaWNlKGksIDEpOwogICAgICAgIHJldHVybiB0cnVlOwogICAgICB9CgogICAgcmV0dXJuIGZhbHNlOwoKICB9LAoKICAvLyBBZGRzIGFuIGFuaW1hdGlvbiB0byB0aGUgY2FjaGUKICAKICBfYWRkTXY6IGZ1bmN0aW9uKHBhZ2UpIHsKCiAgICB2YXIgZGF0YSA9IHRoaXMuZGF0YSgpOwoKICAgIHR1cm5NZXRob2RzLl9yZW1vdmVNdi5jYWxsKHRoaXMsIHBhZ2UpOwogICAgZGF0YS5wYWdlTXYucHVzaChwYWdlKTsKCiAgfSwKCiAgLy8gR2V0cyBpbmRleGVzIGZvciBhIHZpZXcKCiAgX3ZpZXc6IGZ1bmN0aW9uKHBhZ2UpIHsKICAKICAgIHZhciBkYXRhID0gdGhpcy5kYXRhKCk7CiAgICAKICAgIHBhZ2UgPSBwYWdlIHx8IGRhdGEucGFnZTsKCiAgICBpZiAoZGF0YS5kaXNwbGF5PT0nZG91YmxlJykKICAgICAgcmV0dXJuIChwYWdlJTIpID8gW3BhZ2UtMSwgcGFnZV0gOiBbcGFnZSwgcGFnZSsxXTsKICAgIGVsc2UKICAgICAgcmV0dXJuIFtwYWdlXTsKCiAgfSwKCiAgLy8gR2V0cyBhIHZpZXcKCiAgdmlldzogZnVuY3Rpb24ocGFnZSkgewoKICAgIHZhciBkYXRhID0gdGhpcy5kYXRhKCksCiAgICAgIHZpZXcgPSB0dXJuTWV0aG9kcy5fdmlldy5jYWxsKHRoaXMsIHBhZ2UpOwoKICAgIGlmIChkYXRhLmRpc3BsYXk9PSdkb3VibGUnKQogICAgICByZXR1cm4gWyh2aWV3WzBdPjApID8gdmlld1swXSA6IDAsCiAgICAgICAgKHZpZXdbMV08PWRhdGEudG90YWxQYWdlcykgPyB2aWV3WzFdIDogMF07CiAgICBlbHNlCiAgICAgIHJldHVybiBbKHZpZXdbMF0+MCAmJiB2aWV3WzBdPD1kYXRhLnRvdGFsUGFnZXMpID8gdmlld1swXSA6IDBdOwoKICB9LAoKICAvLyBTdG9wcyBhbmltYXRpb25zCgogIHN0b3A6IGZ1bmN0aW9uKGlnbm9yZSwgYW5pbWF0ZSkgewoKICAgIGlmICh0aGlzLnR1cm4oJ2FuaW1hdGluZycpKSB7CiAgCiAgICAgIHZhciBpLCBvcHRzLCBwYWdlLAogICAgICAgIGRhdGEgPSB0aGlzLmRhdGEoKTsKCiAgICAgIGlmIChkYXRhLnRwYWdlKSB7CiAgICAgICAgZGF0YS5wYWdlID0gZGF0YS50cGFnZTsKICAgICAgICBkZWxldGUgZGF0YVsndHBhZ2UnXTsKICAgICAgfQoKICAgICAgZm9yIChpID0gMDsgaTxkYXRhLnBhZ2VNdi5sZW5ndGg7IGkrKykgewoKICAgICAgICBpZiAoIWRhdGEucGFnZU12W2ldIHx8IGRhdGEucGFnZU12W2ldPT09aWdub3JlKQogICAgICAgICAgY29udGludWU7CgogICAgICAgIHBhZ2UgPSBkYXRhLnBhZ2VzW2RhdGEucGFnZU12W2ldXTsKICAgICAgICBvcHRzID0gcGFnZS5kYXRhKCkuZi5vcHRzOwoKICAgICAgICBwYWdlLmZsaXAoJ2hpZGVGb2xkZWRQYWdlJywgYW5pbWF0ZSk7CgogICAgICAgIGlmICghYW5pbWF0ZSkKICAgICAgICAgIGZsaXBNZXRob2RzLl9tb3ZlRm9sZGluZ1BhZ2UuY2FsbChwYWdlLCBmYWxzZSk7CgogICAgICAgIGlmIChvcHRzLmZvcmNlKSB7CiAgICAgICAgICBvcHRzLm5leHQgPSAob3B0cy5wYWdlJTI9PT0wKSA/IG9wdHMucGFnZS0xIDogb3B0cy5wYWdlKzE7CiAgICAgICAgICBkZWxldGUgb3B0c1snZm9yY2UnXTsKICAgICAgICB9CgogICAgICB9CiAgICB9CiAgICAKICAgIHRoaXMudHVybigndXBkYXRlJyk7CgogICAgcmV0dXJuIHRoaXM7CiAgfSwKCiAgLy8gR2V0cyBhbmQgc2V0cyB0aGUgbnVtYmVyIG9mIHBhZ2VzCgogIHBhZ2VzOiBmdW5jdGlvbihwYWdlcykgewoKICAgIHZhciBkYXRhID0gdGhpcy5kYXRhKCk7CgogICAgaWYgKHBhZ2VzKSB7CgogICAgICBpZiAocGFnZXM8ZGF0YS50b3RhbFBhZ2VzKSB7CgogICAgICAgIGZvciAodmFyIHBhZ2UgPSBkYXRhLnRvdGFsUGFnZXM7IHBhZ2U+cGFnZXM7IHBhZ2UtLSkKICAgICAgICAgIHRoaXMudHVybigncmVtb3ZlUGFnZScsIHBhZ2UpOwoKICAgICAgfQoKICAgICAgICBkYXRhLnRvdGFsUGFnZXMgPSBwYWdlczsKICAgICAgICB0dXJuTWV0aG9kcy5fZml0UGFnZS5jYWxsKHRoaXMsIGRhdGEucGFnZSk7CgogICAgICByZXR1cm4gdGhpczsKCiAgICB9IGVsc2UKICAgICAgcmV0dXJuIGRhdGEudG90YWxQYWdlczsKCiAgfSwKCiAgLy8gQ2hlY2tzIG1pc3NpbmcgcGFnZXMKCiAgX21pc3NpbmcgOiBmdW5jdGlvbihwYWdlKSB7CiAgICAKICAgIHZhciBkYXRhID0gdGhpcy5kYXRhKCk7CgogICAgaWYgKGRhdGEudG90YWxQYWdlczwxKQogICAgICByZXR1cm47CgogICAgdmFyIHAsCiAgICAgICAgcmFuZ2UgPSB0aGlzLnR1cm4oJ3JhbmdlJywgcGFnZSksCiAgICAgICAgbWlzc2luZyA9IFtdOwoKICAgIGZvciAocCA9IHJhbmdlWzBdOyBwPD1yYW5nZVsxXTsgcCsrKSB7CiAgICAgIGlmICghZGF0YS5wYWdlT2Jqc1twXSkKICAgICAgICBtaXNzaW5nLnB1c2gocCk7CiAgICB9CgogICAgaWYgKG1pc3NpbmcubGVuZ3RoPjApCiAgICAgIHRoaXMudHJpZ2dlcignbWlzc2luZycsIFttaXNzaW5nXSk7CgogIH0sCgogIC8vIFNldHMgYSBwYWdlIHdpdGhvdXQgZWZmZWN0CgogIF9maXRQYWdlOiBmdW5jdGlvbihwYWdlKSB7CgogICAgdmFyIGRhdGEgPSB0aGlzLmRhdGEoKSwKICAgICAgbmV3VmlldyA9IHRoaXMudHVybigndmlldycsIHBhZ2UpOwoKICAgIHR1cm5NZXRob2RzLl9taXNzaW5nLmNhbGwodGhpcywgcGFnZSk7CiAgICAKICAgIGlmICghZGF0YS5wYWdlT2Jqc1twYWdlXSkKICAgICAgcmV0dXJuOwoKICAgIGRhdGEucGFnZSA9IHBhZ2U7CiAgCiAgICB0aGlzLnR1cm4oJ3N0b3AnKTsKCiAgICBmb3IgKHZhciBpID0gMDsgaTxuZXdWaWV3Lmxlbmd0aDsgaSsrKSB7CgogICAgICBpZiAobmV3Vmlld1tpXSAmJiBkYXRhLnBhZ2Vab29tW25ld1ZpZXdbaV1dIT1kYXRhLnpvb20pIHsKICAKICAgICAgICB0aGlzLnRyaWdnZXIoJ3pvb21lZCcsWwogICAgICAgICAgbmV3Vmlld1tpXSwKICAgICAgICAgIG5ld1ZpZXcsCiAgICAgICAgICBkYXRhLnBhZ2Vab29tW25ld1ZpZXdbaV1dLAogICAgICAgICAgZGF0YS56b29tXSk7CgogICAgICAgIGRhdGEucGFnZVpvb21bbmV3Vmlld1tpXV0gPSBkYXRhLnpvb207CgogICAgICB9CiAgICB9CgogICAgdHVybk1ldGhvZHMuX3JlbW92ZUZyb21ET00uY2FsbCh0aGlzKTsKICAgIHR1cm5NZXRob2RzLl9tYWtlUmFuZ2UuY2FsbCh0aGlzKTsKICAgIHR1cm5NZXRob2RzLl91cGRhdGVTaGFkb3cuY2FsbCh0aGlzKTsKICAgIHRoaXMudHJpZ2dlcigndHVybmVkJywgW3BhZ2UsIG5ld1ZpZXddKTsKICAgIHRoaXMudHVybigndXBkYXRlJyk7CgogICAgaWYgKGRhdGEub3B0cy5hdXRvQ2VudGVyKQogICAgICB0aGlzLnR1cm4oJ2NlbnRlcicpOwoKICB9LAogIAogIC8vIFR1cm5zIHRoZSBwYWdlCgogIF90dXJuUGFnZTogZnVuY3Rpb24ocGFnZSkgewoKICAgIHZhciBjdXJyZW50LAogICAgICBuZXh0LAogICAgICBkYXRhID0gdGhpcy5kYXRhKCksCiAgICAgIHBsYWNlID0gZGF0YS5wYWdlUGxhY2VbcGFnZV0sCiAgICAgIHZpZXcgPSB0aGlzLnR1cm4oJ3ZpZXcnKSwKICAgICAgbmV3VmlldyA9IHRoaXMudHVybigndmlldycsIHBhZ2UpOwoKCiAgICBpZiAoZGF0YS5wYWdlIT1wYWdlKSB7CgogICAgICB2YXIgY3VycmVudFBhZ2UgPSBkYXRhLnBhZ2U7CgogICAgICBpZiAodHJpZ2dlcigndHVybmluZycsIHRoaXMsIFtwYWdlLCBuZXdWaWV3XSk9PSdwcmV2ZW50ZWQnKSB7CgogICAgICAgIGlmIChjdXJyZW50UGFnZT09ZGF0YS5wYWdlICYmICQuaW5BcnJheShwbGFjZSwgZGF0YS5wYWdlTXYpIT0tMSkKICAgICAgICAgIGRhdGEucGFnZXNbcGxhY2VdLmZsaXAoJ2hpZGVGb2xkZWRQYWdlJywgdHJ1ZSk7CiAgICAgICAgCiAgICAgICAgcmV0dXJuOwoKICAgICAgfQoKICAgICAgaWYgKCQuaW5BcnJheSgxLCBuZXdWaWV3KSE9LTEpCiAgICAgICAgdGhpcy50cmlnZ2VyKCdmaXJzdCcpOwogICAgICBpZiAoJC5pbkFycmF5KGRhdGEudG90YWxQYWdlcywgbmV3VmlldykhPS0xKQogICAgICAgIHRoaXMudHJpZ2dlcignbGFzdCcpOwoKICAgIH0KCiAgICBpZiAoZGF0YS5kaXNwbGF5PT0nc2luZ2xlJykgewogICAgICBjdXJyZW50ID0gdmlld1swXTsKICAgICAgbmV4dCA9IG5ld1ZpZXdbMF07CiAgICB9IGVsc2UgaWYgKHZpZXdbMV0gJiYgcGFnZT52aWV3WzFdKSB7CiAgICAgIGN1cnJlbnQgPSB2aWV3WzFdOwogICAgICBuZXh0ID0gbmV3Vmlld1swXTsKICAgIH0gZWxzZSBpZiAodmlld1swXSAmJiBwYWdlPHZpZXdbMF0pIHsKICAgICAgY3VycmVudCA9IHZpZXdbMF07CiAgICAgIG5leHQgPSBuZXdWaWV3WzFdOwogICAgfQoKICAgIHZhciBvcHRzQ29ybmVycyA9IGRhdGEub3B0cy50dXJuQ29ybmVycy5zcGxpdCgnLCcpLAogICAgICBmbGlwRGF0YSA9IGRhdGEucGFnZXNbY3VycmVudF0uZGF0YSgpLmYsCiAgICAgIG9wdHMgPSBmbGlwRGF0YS5vcHRzLAogICAgICBhY3R1YWxQb2ludCA9IGZsaXBEYXRhLnBvaW50OwoKICAgIHR1cm5NZXRob2RzLl9taXNzaW5nLmNhbGwodGhpcywgcGFnZSk7CiAgICAKICAgIGlmICghZGF0YS5wYWdlT2Jqc1twYWdlXSkKICAgICAgcmV0dXJuOwoKICAgIHRoaXMudHVybignc3RvcCcpOwoKICAgIGRhdGEucGFnZSA9IHBhZ2U7CgogICAgdHVybk1ldGhvZHMuX21ha2VSYW5nZS5jYWxsKHRoaXMpOwoKICAgIGRhdGEudHBhZ2UgPSBuZXh0OwoKICAgIGlmIChvcHRzLm5leHQhPW5leHQpIHsKICAgICAgb3B0cy5uZXh0ID0gbmV4dDsKICAgICAgb3B0cy5mb3JjZSA9IHRydWU7CiAgICB9CgogICAgdGhpcy50dXJuKCd1cGRhdGUnKTsKCiAgICBmbGlwRGF0YS5wb2ludCA9IGFjdHVhbFBvaW50OwogICAgCiAgICBpZiAoZmxpcERhdGEuZWZmZWN0PT0naGFyZCcpCiAgICAgIGlmIChkYXRhLmRpcmVjdGlvbj09J2x0cicpCiAgICAgICAgZGF0YS5wYWdlc1tjdXJyZW50XS5mbGlwKCd0dXJuUGFnZScsCiAgICAgICAgICAocGFnZT5jdXJyZW50KSA/ICdyJyA6ICdsJyk7CiAgICAgIGVsc2UKICAgICAgICBkYXRhLnBhZ2VzW2N1cnJlbnRdLmZsaXAoJ3R1cm5QYWdlJywKICAgICAgICAgIChwYWdlPmN1cnJlbnQpID8gJ2wnIDogJ3InKTsKICAgIGVsc2UgewogICAgICBpZiAoZGF0YS5kaXJlY3Rpb249PSdsdHInKQogICAgICAgIGRhdGEucGFnZXNbY3VycmVudF0uZmxpcCgndHVyblBhZ2UnLAogICAgICAgICAgb3B0c0Nvcm5lcnNbKHBhZ2U+Y3VycmVudCkgPyAxIDogMF0pOwogICAgICBlbHNlCiAgICAgICAgZGF0YS5wYWdlc1tjdXJyZW50XS5mbGlwKCd0dXJuUGFnZScsCiAgICAgICAgICBvcHRzQ29ybmVyc1socGFnZT5jdXJyZW50KSA/IDAgOiAxXSk7CiAgICB9CgogIH0sCgogIC8vIEdldHMgYW5kIHNldHMgYSBwYWdlCgogIHBhZ2U6IGZ1bmN0aW9uKHBhZ2UpIHsKCiAgICB2YXIgZGF0YSA9IHRoaXMuZGF0YSgpOwoKICAgIGlmIChwYWdlPT09dW5kZWZpbmVkKSB7CiAgICAgIAogICAgICByZXR1cm4gZGF0YS5wYWdlOwoKICAgIH0gZWxzZSB7CgogICAgICBpZiAoIWRhdGEuZGlzYWJsZWQgJiYgIWRhdGEuZGVzdHJveWluZykgewoKICAgICAgICBwYWdlID0gcGFyc2VJbnQocGFnZSwgMTApOwoKICAgICAgICBpZiAocGFnZT4wICYmIHBhZ2U8PWRhdGEudG90YWxQYWdlcykgewoKICAgICAgICAgIGlmIChwYWdlIT1kYXRhLnBhZ2UpIHsKICAgICAgICAgICAgaWYgKCFkYXRhLmRvbmUgfHwgJC5pbkFycmF5KHBhZ2UsIHRoaXMudHVybigndmlldycpKSE9LTEpCiAgICAgICAgICAgICAgdHVybk1ldGhvZHMuX2ZpdFBhZ2UuY2FsbCh0aGlzLCBwYWdlKTsKICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgIHR1cm5NZXRob2RzLl90dXJuUGFnZS5jYWxsKHRoaXMsIHBhZ2UpOwogICAgICAgICAgfQogICAgICAKICAgICAgICAgIHJldHVybiB0aGlzOwoKICAgICAgICB9IGVsc2UgewogICAgICAgIAogICAgICAgICAgdGhyb3cgdHVybkVycm9yKCdUaGUgcGFnZSAnICsgcGFnZSArICcgZG9lcyBub3QgZXhpc3QnKTsKCiAgICAgICAgfQoKICAgICAgfQoKICAgIH0KCiAgfSwKCiAgLy8gVHVybnMgdG8gdGhlIG5leHQgdmlldwoKICBuZXh0OiBmdW5jdGlvbigpIHsKCiAgICByZXR1cm4gdGhpcy50dXJuKCdwYWdlJywgTWF0aC5taW4odGhpcy5kYXRhKCkudG90YWxQYWdlcywKICAgICAgdHVybk1ldGhvZHMuX3ZpZXcuY2FsbCh0aGlzLCB0aGlzLmRhdGEoKS5wYWdlKS5wb3AoKSArIDEpKTsKICAKICB9LAoKICAvLyBUdXJucyB0byB0aGUgcHJldmlvdXMgdmlldwoKICBwcmV2aW91czogZnVuY3Rpb24oKSB7CgogICAgcmV0dXJuIHRoaXMudHVybigncGFnZScsIE1hdGgubWF4KDEsCiAgICAgIHR1cm5NZXRob2RzLl92aWV3LmNhbGwodGhpcywgdGhpcy5kYXRhKCkucGFnZSkuc2hpZnQoKSAtIDEpKTsKCiAgfSwKCiAgLy8gU2hvd3MgYSBwZWVsaW5nIGNvcm5lcgoKICBwZWVsOiBmdW5jdGlvbihjb3JuZXIsIGFuaW1hdGUpIHsKICAgIAogICAgdmFyIGRhdGEgPSB0aGlzLmRhdGEoKSwKICAgICAgdmlldyA9IHRoaXMudHVybigndmlldycpOwoKICAgIGFuaW1hdGUgPSAoYW5pbWF0ZT09PXVuZGVmaW5lZCkgPyB0cnVlIDogYW5pbWF0ZT09PXRydWU7CgogICAgaWYgKGNvcm5lcj09PWZhbHNlKSB7CiAgICAgIAogICAgICB0aGlzLnR1cm4oJ3N0b3AnLCBudWxsLCBhbmltYXRlKTsKCiAgICB9IGVsc2UgewogICAgCiAgICAgIGlmIChkYXRhLmRpc3BsYXk9PSdzaW5nbGUnKSB7CgogICAgICAgIGRhdGEucGFnZXNbZGF0YS5wYWdlXS5mbGlwKCdwZWVsJywgY29ybmVyLCBhbmltYXRlKTsKCiAgICAgIH0gZWxzZSB7CgogICAgICAgIHZhciBwYWdlOwoKICAgICAgICBpZiAoZGF0YS5kaXJlY3Rpb249PSdsdHInKSB7CiAgICAgICAgICAKICAgICAgICAgIHBhZ2UgPSAoY29ybmVyLmluZGV4T2YoJ2wnKSE9LTEpID8gdmlld1swXSA6IHZpZXdbMV07CgogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAKICAgICAgICAgIHBhZ2UgPSAoY29ybmVyLmluZGV4T2YoJ2wnKSE9LTEpID8gdmlld1sxXSA6IHZpZXdbMF07CgogICAgICAgIH0KICAgICAgICAKICAgICAgICBpZiAoZGF0YS5wYWdlc1twYWdlXSkKICAgICAgICAgIGRhdGEucGFnZXNbcGFnZV0uZmxpcCgncGVlbCcsIGNvcm5lciwgYW5pbWF0ZSk7CgogICAgICB9CiAgICB9CgogICAgcmV0dXJuIHRoaXM7CgogIH0sCgogIC8vIEFkZHMgYSBtb3Rpb24gdG8gdGhlIGludGVybmFsIGxpc3QKICAvLyBUaGlzIGV2ZW50IGlzIGNhbGxlZCBpbiBjb250ZXh0IG9mIGZsaXAKCiAgX2FkZE1vdGlvblBhZ2U6IGZ1bmN0aW9uKCkgewoKICAgIHZhciBvcHRzID0gJCh0aGlzKS5kYXRhKCkuZi5vcHRzLAogICAgICB0dXJuID0gb3B0cy50dXJuLAogICAgICBkZCA9IHR1cm4uZGF0YSgpOwoKICAgIHR1cm5NZXRob2RzLl9hZGRNdi5jYWxsKHR1cm4sIG9wdHMucGFnZSk7CgogIH0sCgogIC8vIFRoaXMgZXZlbnQgaXMgY2FsbGVkIGluIGNvbnRleHQgb2YgZmxpcAoKICBfZXZlbnRTdGFydDogZnVuY3Rpb24oZSwgb3B0cywgY29ybmVyKSB7CgogICAgdmFyIGRhdGEgPSBvcHRzLnR1cm4uZGF0YSgpLAogICAgICBhY3R1YWxab29tID0gZGF0YS5wYWdlWm9vbVtvcHRzLnBhZ2VdOwoKICAgIGlmIChlLmlzRGVmYXVsdFByZXZlbnRlZCgpKSB7CiAgICAgIHR1cm5NZXRob2RzLl91cGRhdGVTaGFkb3cuY2FsbChvcHRzLnR1cm4pOwogICAgICByZXR1cm47CiAgICB9CgogICAgaWYgKGFjdHVhbFpvb20gJiYgYWN0dWFsWm9vbSE9ZGF0YS56b29tKSB7CiAgICAgIAogICAgICBvcHRzLnR1cm4udHJpZ2dlcignem9vbWVkJyxbCiAgICAgICAgb3B0cy5wYWdlLAogICAgICAgIG9wdHMudHVybi50dXJuKCd2aWV3Jywgb3B0cy5wYWdlKSwKICAgICAgICBhY3R1YWxab29tLAogICAgICAgIGRhdGEuem9vbV0pOwoKICAgICAgZGF0YS5wYWdlWm9vbVtvcHRzLnBhZ2VdID0gZGF0YS56b29tOwoKICAgIH0KCiAgICBpZiAoZGF0YS5kaXNwbGF5PT0nc2luZ2xlJyAmJiBjb3JuZXIpIHsKCiAgICAgIGlmICgoY29ybmVyLmNoYXJBdCgxKT09J2wnICYmIGRhdGEuZGlyZWN0aW9uPT0nbHRyJykgfHwKICAgICAgICAoY29ybmVyLmNoYXJBdCgxKT09J3InICYmIGRhdGEuZGlyZWN0aW9uPT0ncnRsJykpCiAgICAgIHsKICAgICAgICAKICAgICAgICBvcHRzLm5leHQgPSAob3B0cy5uZXh0PG9wdHMucGFnZSkgPyBvcHRzLm5leHQgOiBvcHRzLnBhZ2UtMTsKICAgICAgICBvcHRzLmZvcmNlID0gdHJ1ZTsKCiAgICAgIH0gZWxzZSB7CiAgICAgICAgCiAgICAgICAgb3B0cy5uZXh0ID0gKG9wdHMubmV4dD5vcHRzLnBhZ2UpID8gb3B0cy5uZXh0IDogb3B0cy5wYWdlKzE7CgogICAgICB9CgogICAgfQoKICAgIHR1cm5NZXRob2RzLl9hZGRNb3Rpb25QYWdlLmNhbGwoZS50YXJnZXQpOwogICAgdHVybk1ldGhvZHMuX3VwZGF0ZVNoYWRvdy5jYWxsKG9wdHMudHVybik7CiAgfSwKCiAgLy8gVGhpcyBldmVudCBpcyBjYWxsZWQgaW4gY29udGV4dCBvZiBmbGlwCgogIF9ldmVudEVuZDogZnVuY3Rpb24oZSwgb3B0cywgdHVybmVkKSB7CiAgCiAgICB2YXIgdGhhdCA9ICQoZS50YXJnZXQpLAogICAgICBkYXRhID0gdGhhdC5kYXRhKCkuZiwKICAgICAgdHVybiA9IG9wdHMudHVybiwKICAgICAgZGQgPSB0dXJuLmRhdGEoKTsKCiAgICBpZiAodHVybmVkKSB7CgogICAgICB2YXIgdHBhZ2UgPSBkZC50cGFnZSB8fCBkZC5wYWdlOwogICAgCiAgICAgIGlmICh0cGFnZT09b3B0cy5uZXh0IHx8IHRwYWdlPT1vcHRzLnBhZ2UpIHsKICAgICAgICBkZWxldGUgZGQudHBhZ2U7CgogICAgICAgIHR1cm5NZXRob2RzLl9maXRQYWdlLmNhbGwodHVybiwgdHBhZ2UgfHwgb3B0cy5uZXh0LCB0cnVlKTsKICAgICAgfQoKICAgIH0gZWxzZSB7CiAgICAgIAogICAgICB0dXJuTWV0aG9kcy5fcmVtb3ZlTXYuY2FsbCh0dXJuLCBvcHRzLnBhZ2UpOwogICAgICB0dXJuTWV0aG9kcy5fdXBkYXRlU2hhZG93LmNhbGwodHVybik7CiAgICAgIHR1cm4udHVybigndXBkYXRlJyk7CgogICAgfQogICAgCiAgfSwKICAKICAvLyBUaGlzIGV2ZW50IGlzIGNhbGxlZCBpbiBjb250ZXh0IG9mIGZsaXAKCiAgX2V2ZW50UHJlc3NlZDogZnVuY3Rpb24oZSkgewoKICAgIHZhciBwYWdlLAogICAgICBkYXRhID0gJChlLnRhcmdldCkuZGF0YSgpLmYsCiAgICAgIHR1cm4gPSBkYXRhLm9wdHMudHVybiwKICAgICAgdHVybkRhdGEgPSB0dXJuLmRhdGEoKSwKICAgICAgcGFnZXMgPSB0dXJuRGF0YS5wYWdlczsKICAgIAogICAgdHVybkRhdGEubW91c2VBY3Rpb24gPSB0cnVlOwoKICAgIHR1cm4udHVybigndXBkYXRlJyk7CgogICAgcmV0dXJuIGRhdGEudGltZSA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpOwoKICB9LAoKICAvLyBUaGlzIGV2ZW50IGlzIGNhbGxlZCBpbiBjb250ZXh0IG9mIGZsaXAKCiAgX2V2ZW50UmVsZWFzZWQ6IGZ1bmN0aW9uKGUsIHBvaW50KSB7CgogICAgdmFyIG91dEFyZWEsCiAgICAgIHBhZ2UgPSAkKGUudGFyZ2V0KSwKICAgICAgZGF0YSA9IHBhZ2UuZGF0YSgpLmYsCiAgICAgIHR1cm4gPSBkYXRhLm9wdHMudHVybiwKICAgICAgdHVybkRhdGEgPSB0dXJuLmRhdGEoKTsKICAgIAogICAgaWYgKHR1cm5EYXRhLmRpc3BsYXk9PSdzaW5nbGUnKSB7CiAgICAgIG91dEFyZWEgPSAocG9pbnQuY29ybmVyPT0nYnInIHx8IHBvaW50LmNvcm5lcj09J3RyJykgPwogICAgICAgIHBvaW50Lng8cGFnZS53aWR0aCgpLzI6CiAgICAgICAgcG9pbnQueD5wYWdlLndpZHRoKCkvMjsKICAgIH0gZWxzZSB7CiAgICAgIG91dEFyZWEgPSBwb2ludC54PDAgfHwgcG9pbnQueD5wYWdlLndpZHRoKCk7CiAgICB9CgogICAgaWYgKChuZXcgRGF0ZSgpKS5nZXRUaW1lKCktZGF0YS50aW1lPDIwMCB8fCBvdXRBcmVhKSB7CgogICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgIHR1cm5NZXRob2RzLl90dXJuUGFnZS5jYWxsKHR1cm4sIGRhdGEub3B0cy5uZXh0KTsKCiAgICB9CgogICAgdHVybkRhdGEubW91c2VBY3Rpb24gPSBmYWxzZTsKCiAgfSwKCiAgLy8gVGhpcyBldmVudCBpcyBjYWxsZWQgaW4gY29udGV4dCBvZiBmbGlwCiAgCiAgX2ZsaXA6IGZ1bmN0aW9uKGUpIHsKCiAgICBlLnN0b3BQcm9wYWdhdGlvbigpOwoKICAgIHZhciBvcHRzID0gJChlLnRhcmdldCkuZGF0YSgpLmYub3B0czsKCiAgICBvcHRzLnR1cm4udHJpZ2dlcigndHVybicsIFtvcHRzLm5leHRdKTsKCiAgICBpZiAob3B0cy50dXJuLmRhdGEoKS5vcHRzLmF1dG9DZW50ZXIpIHsKICAgICAgb3B0cy50dXJuLnR1cm4oJ2NlbnRlcicsIG9wdHMubmV4dCk7CiAgICB9CgogIH0sCgogLy8KICBfdG91Y2hTdGFydDogZnVuY3Rpb24oKSB7CiAgICB2YXIgZGF0YSA9IHRoaXMuZGF0YSgpOwogICAgZm9yICh2YXIgcGFnZSBpbiBkYXRhLnBhZ2VzKSB7CiAgICAgIGlmIChoYXMocGFnZSwgZGF0YS5wYWdlcykgJiYKICAgICAgICBmbGlwTWV0aG9kcy5fZXZlbnRTdGFydC5hcHBseShkYXRhLnBhZ2VzW3BhZ2VdLCBhcmd1bWVudHMpPT09ZmFsc2UpIHsKICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQogICAgfQogIH0sCiAgCiAgLy8KICBfdG91Y2hNb3ZlOiBmdW5jdGlvbigpIHsKICAgIHZhciBkYXRhID0gdGhpcy5kYXRhKCk7CiAgICBmb3IgKHZhciBwYWdlIGluIGRhdGEucGFnZXMpIHsKICAgICAgaWYgKGhhcyhwYWdlLCBkYXRhLnBhZ2VzKSkgewogICAgICAgIGZsaXBNZXRob2RzLl9ldmVudE1vdmUuYXBwbHkoZGF0YS5wYWdlc1twYWdlXSwgYXJndW1lbnRzKTsKICAgICAgfQogICAgfQogIH0sCgogIC8vCiAgX3RvdWNoRW5kOiBmdW5jdGlvbigpIHsKICAgIHZhciBkYXRhID0gdGhpcy5kYXRhKCk7CiAgICBmb3IgKHZhciBwYWdlIGluIGRhdGEucGFnZXMpIHsKICAgICAgaWYgKGhhcyhwYWdlLCBkYXRhLnBhZ2VzKSkgewogICAgICAgIGZsaXBNZXRob2RzLl9ldmVudEVuZC5hcHBseShkYXRhLnBhZ2VzW3BhZ2VdLCBhcmd1bWVudHMpOwogICAgICB9CiAgICB9CiAgfSwKCiAgLy8gQ2FsY3VsYXRlIHRoZSB6LWluZGV4IHZhbHVlIGZvciBwYWdlcyBkdXJpbmcgdGhlIGFuaW1hdGlvbgoKICBjYWxjdWxhdGVaOiBmdW5jdGlvbihtdikgewoKICAgIHZhciBpLCBwYWdlLCBuZXh0UGFnZSwgcGxhY2VQYWdlLCBkcGFnZSwKICAgICAgdGhhdCA9IHRoaXMsCiAgICAgIGRhdGEgPSB0aGlzLmRhdGEoKSwKICAgICAgdmlldyA9IHRoaXMudHVybigndmlldycpLAogICAgICBjdXJyZW50UGFnZSA9IHZpZXdbMF0gfHwgdmlld1sxXSwKICAgICAgdG90YWwgPSBtdi5sZW5ndGgtMSwKICAgICAgciA9IHtwYWdlWjoge30sIHBhcnRaOiB7fSwgcGFnZVY6IHt9fSwKCiAgICAgIGFkZFZpZXcgPSBmdW5jdGlvbihwYWdlKSB7CiAgICAgICAgdmFyIHZpZXcgPSB0aGF0LnR1cm4oJ3ZpZXcnLCBwYWdlKTsKICAgICAgICBpZiAodmlld1swXSkgci5wYWdlVlt2aWV3WzBdXSA9IHRydWU7CiAgICAgICAgaWYgKHZpZXdbMV0pIHIucGFnZVZbdmlld1sxXV0gPSB0cnVlOwogICAgICB9OwogICAgCiAgICBmb3IgKGkgPSAwOyBpPD10b3RhbDsgaSsrKSB7CiAgICAgIHBhZ2UgPSBtdltpXTsKICAgICAgbmV4dFBhZ2UgPSBkYXRhLnBhZ2VzW3BhZ2VdLmRhdGEoKS5mLm9wdHMubmV4dDsKICAgICAgcGxhY2VQYWdlID0gZGF0YS5wYWdlUGxhY2VbcGFnZV07CiAgICAgIGFkZFZpZXcocGFnZSk7CiAgICAgIGFkZFZpZXcobmV4dFBhZ2UpOwogICAgICBkcGFnZSA9IChkYXRhLnBhZ2VQbGFjZVtuZXh0UGFnZV09PW5leHRQYWdlKSA/IG5leHRQYWdlIDogcGFnZTsKICAgICAgci5wYWdlWltkcGFnZV0gPSBkYXRhLnRvdGFsUGFnZXMgLSBNYXRoLmFicyhjdXJyZW50UGFnZS1kcGFnZSk7CiAgICAgIHIucGFydFpbcGxhY2VQYWdlXSA9IGRhdGEudG90YWxQYWdlcyoyIC0gIHRvdGFsICsgaTsKICAgIH0KCiAgICByZXR1cm4gcjsKICB9LAoKICAvLyBVcGRhdGVzIHRoZSB6LWluZGV4IGFuZCBkaXNwbGF5IHByb3BlcnR5IG9mIGV2ZXJ5IHBhZ2UKCiAgdXBkYXRlOiBmdW5jdGlvbigpIHsKCiAgICB2YXIgcGFnZSwKICAgICAgZGF0YSA9IHRoaXMuZGF0YSgpOwoKICAgIGlmICh0aGlzLnR1cm4oJ2FuaW1hdGluZycpICYmIGRhdGEucGFnZU12WzBdIT09MCkgewoKICAgICAgLy8gVXBkYXRlIG1vdGlvbgoKICAgICAgdmFyIHAsIGFwYWdlLCBmaXhlZCwKICAgICAgICBwb3MgPSB0aGlzLnR1cm4oJ2NhbGN1bGF0ZVonLCBkYXRhLnBhZ2VNdiksCiAgICAgICAgY29ybmVyID0gdGhpcy50dXJuKCdjb3JuZXInKSwKICAgICAgICBhY3R1YWxWaWV3ID0gdGhpcy50dXJuKCd2aWV3JyksCiAgICAgICAgbmV3VmlldyA9IHRoaXMudHVybigndmlldycsIGRhdGEudHBhZ2UpOwogIAogICAgICBmb3IgKHBhZ2UgaW4gZGF0YS5wYWdlV3JhcCkgewoKICAgICAgICBpZiAoIWhhcyhwYWdlLCBkYXRhLnBhZ2VXcmFwKSkKICAgICAgICAgIGNvbnRpbnVlOwoKICAgICAgICBmaXhlZCA9IGRhdGEucGFnZU9ianNbcGFnZV0uaGFzQ2xhc3MoJ2ZpeGVkJyk7CgogICAgICAgIGRhdGEucGFnZVdyYXBbcGFnZV0uY3NzKHsKICAgICAgICAgIGRpc3BsYXk6IChwb3MucGFnZVZbcGFnZV0gfHwgZml4ZWQpID8gJycgOiAnbm9uZScsCiAgICAgICAgICB6SW5kZXg6CiAgICAgICAgICAgIChkYXRhLnBhZ2VPYmpzW3BhZ2VdLmhhc0NsYXNzKCdoYXJkJykgPwogICAgICAgICAgICAgIHBvcy5wYXJ0WltwYWdlXQogICAgICAgICAgICAgIDoKICAgICAgICAgICAgICBwb3MucGFnZVpbcGFnZV0KICAgICAgICAgICAgKSB8fCAoZml4ZWQgPyAtMSA6IDApCiAgICAgICAgfSk7CgogICAgICAgIGlmICgocCA9IGRhdGEucGFnZXNbcGFnZV0pKSB7CgogICAgICAgICAgcC5mbGlwKCd6JywgcG9zLnBhcnRaW3BhZ2VdIHx8IG51bGwpOwoKICAgICAgICAgIGlmIChwb3MucGFnZVZbcGFnZV0pCiAgICAgICAgICAgIHAuZmxpcCgncmVzaXplJyk7CiAgICAgICAgICAKICAgICAgICAgIGlmIChkYXRhLnRwYWdlKSB7IC8vIElzIGl0IHR1cm5pbmcgdGhlIHBhZ2UgdG8gYHRwYWdlYD8KCiAgICAgICAgICAgIHAuZmxpcCgnaG92ZXInLCBmYWxzZSkuCiAgICAgICAgICAgICAgZmxpcCgnZGlzYWJsZScsCiAgICAgICAgICAgICAgICAkLmluQXJyYXkocGFyc2VJbnQocGFnZSwgMTApLCBkYXRhLnBhZ2VNdik9PS0xICYmCiAgICAgICAgICAgICAgICBwYWdlIT1uZXdWaWV3WzBdICYmCiAgICAgICAgICAgICAgICBwYWdlIT1uZXdWaWV3WzFdKTsKCiAgICAgICAgICB9IGVsc2UgewoKICAgICAgICAgICAgcC5mbGlwKCdob3ZlcicsIGNvcm5lcj09PWZhbHNlKS4KICAgICAgICAgICAgICBmbGlwKCdkaXNhYmxlJywgcGFnZSE9YWN0dWFsVmlld1swXSAmJiBwYWdlIT1hY3R1YWxWaWV3WzFdKTsKCiAgICAgICAgICB9CgogICAgICAgIH0KCiAgICAgIH0KCiAgICB9IGVsc2UgewoKICAgICAgLy8gVXBkYXRlIHN0YXRpYyBwYWdlcwoKICAgICAgZm9yIChwYWdlIGluIGRhdGEucGFnZVdyYXApIHsKCiAgICAgICAgaWYgKCFoYXMocGFnZSwgZGF0YS5wYWdlV3JhcCkpCiAgICAgICAgICBjb250aW51ZTsKCiAgICAgICAgdmFyIHBhZ2VMb2NhdGlvbiA9IHR1cm5NZXRob2RzLl9zZXRQYWdlTG9jLmNhbGwodGhpcywgcGFnZSk7CgogICAgICAgIGlmIChkYXRhLnBhZ2VzW3BhZ2VdKSB7CiAgICAgICAgICBkYXRhLnBhZ2VzW3BhZ2VdLgogICAgICAgICAgICBmbGlwKCdkaXNhYmxlJywgZGF0YS5kaXNhYmxlZCB8fCBwYWdlTG9jYXRpb24hPTEpLgogICAgICAgICAgICBmbGlwKCdob3ZlcicsIHRydWUpLgogICAgICAgICAgICBmbGlwKCd6JywgbnVsbCk7CiAgICAgICAgfQogICAgICB9CiAgICB9CgogICAgcmV0dXJuIHRoaXM7CiAgfSwKCiAgLy8gVXBkYXRlcyB0aGUgcG9zaXRpb24gYW5kIHNpemUgb2YgdGhlIGZsaXBib29rJ3Mgc2hhZG93CgogIF91cGRhdGVTaGFkb3c6IGZ1bmN0aW9uKCkgewogICAgCiAgICB2YXIgdmlldywgdmlldzIsIHNoYWRvdywKICAgICAgZGF0YSA9IHRoaXMuZGF0YSgpLAogICAgICB3aWR0aCA9IHRoaXMud2lkdGgoKSwKICAgICAgaGVpZ2h0ID0gdGhpcy5oZWlnaHQoKSwKICAgICAgcGFnZVdpZHRoID0gKGRhdGEuZGlzcGxheT09J3NpbmdsZScpID8gd2lkdGggOiB3aWR0aC8yOwoKICAgIHZpZXcgPSB0aGlzLnR1cm4oJ3ZpZXcnKTsKCiAgICBpZiAoIWRhdGEuc2hhZG93KSB7CiAgICAgIGRhdGEuc2hhZG93ID0gJCgnPGRpdiAvPicsIHsKICAgICAgICAgICdjbGFzcyc6ICdzaGFkb3cnLAogICAgICAgICAgJ2Nzcyc6IGRpdkF0dCgwLCAwLCAwKS5jc3MKICAgICAgICB9KS4KICAgICAgICBhcHBlbmRUbyh0aGlzKTsKICAgIH0KCiAgICBmb3IgKHZhciBpID0gMDsgaTxkYXRhLnBhZ2VNdi5sZW5ndGg7IGkrKykgewogICAgICBpZiAoIXZpZXdbMF0gfHwgIXZpZXdbMV0pCiAgICAgICAgYnJlYWs7CiAgICAKICAgICAgdmlldyA9IHRoaXMudHVybigndmlldycsIGRhdGEucGFnZXNbZGF0YS5wYWdlTXZbaV1dLmRhdGEoKS5mLm9wdHMubmV4dCk7CiAgICAgIHZpZXcyID0gdGhpcy50dXJuKCd2aWV3JywgZGF0YS5wYWdlTXZbaV0pOwoKICAgICAgdmlld1swXSA9IHZpZXdbMF0gJiYgdmlldzJbMF07CiAgICAgIHZpZXdbMV0gPSB2aWV3WzFdICYmIHZpZXcyWzFdOwogICAgfQoKICAgIGlmICghdmlld1swXSkgc2hhZG93ID0gKGRhdGEuZGlyZWN0aW9uPT0nbHRyJykgPyAxIDogMjsKICAgIGVsc2UgaWYgKCF2aWV3WzFdKSBzaGFkb3cgPSAoZGF0YS5kaXJlY3Rpb249PSdsdHInKSA/IDIgOiAxOwogICAgZWxzZSBzaGFkb3cgPSAzOwoKICAgIHN3aXRjaCAoc2hhZG93KSB7CiAgICAgIGNhc2UgMToKICAgICAgICBkYXRhLnNoYWRvdy5jc3MoewogICAgICAgICAgd2lkdGg6IHBhZ2VXaWR0aCwKICAgICAgICAgIGhlaWdodDogaGVpZ2h0LAogICAgICAgICAgdG9wOiAwLAogICAgICAgICAgbGVmdDogcGFnZVdpZHRoCiAgICAgICAgfSk7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgMjoKICAgICAgICBkYXRhLnNoYWRvdy5jc3MoewogICAgICAgICAgd2lkdGg6IHBhZ2VXaWR0aCwKICAgICAgICAgIGhlaWdodDogaGVpZ2h0LAogICAgICAgICAgdG9wOiAwLAogICAgICAgICAgbGVmdDogMAogICAgICAgIH0pOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlIDM6CiAgICAgICAgZGF0YS5zaGFkb3cuY3NzKHsKICAgICAgICAgIHdpZHRoOiB3aWR0aCwKICAgICAgICAgIGhlaWdodDogaGVpZ2h0LAogICAgICAgICAgdG9wOiAwLAogICAgICAgICAgbGVmdDogMAogICAgICAgIH0pOwogICAgICAgIGJyZWFrOwogICAgfQoKICB9LAoKICAvLyBTZXRzIHRoZSB6LWluZGV4IGFuZCBkaXNwbGF5IHByb3BlcnR5IG9mIGEgcGFnZQogIC8vIEl0IGRlcGVuZHMgb24gdGhlIGN1cnJlbnQgdmlldwoKICBfc2V0UGFnZUxvYzogZnVuY3Rpb24ocGFnZSkgewoKICAgIHZhciBkYXRhID0gdGhpcy5kYXRhKCksCiAgICAgIHZpZXcgPSB0aGlzLnR1cm4oJ3ZpZXcnKSwKICAgICAgbG9jID0gMDsKCiAgICAKICAgIGlmIChwYWdlPT12aWV3WzBdIHx8IHBhZ2U9PXZpZXdbMV0pCiAgICAgIGxvYyA9IDE7CiAgICBlbHNlIGlmICgKICAgICAgKGRhdGEuZGlzcGxheT09J3NpbmdsZScgJiYgcGFnZT09dmlld1swXSsxKSB8fAogICAgICAoZGF0YS5kaXNwbGF5PT0nZG91YmxlJyAmJiBwYWdlPT12aWV3WzBdLTIgfHwgcGFnZT09dmlld1sxXSsyKQogICAgKQogICAgICBsb2MgPSAyOwoKICAgIGlmICghdGhpcy50dXJuKCdhbmltYXRpbmcnKSkKICAgICAgc3dpdGNoIChsb2MpIHsKICAgICAgICBjYXNlIDE6CiAgICAgICAgICBkYXRhLnBhZ2VXcmFwW3BhZ2VdLmNzcygKICAgICAgICAgIHsKICAgICAgICAgICAgekluZGV4OiBkYXRhLnRvdGFsUGFnZXMsCiAgICAgICAgICAgIGRpc3BsYXk6ICcnCiAgICAgICAgICB9KTsKICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDI6CiAgICAgICAgICBkYXRhLnBhZ2VXcmFwW3BhZ2VdLmNzcygKICAgICAgICAgIHsKICAgICAgICAgICAgekluZGV4OiBkYXRhLnRvdGFsUGFnZXMtMSwKICAgICAgICAgICAgZGlzcGxheTogJycKICAgICAgICAgIH0pOwogICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMDoKICAgICAgICAgIGRhdGEucGFnZVdyYXBbcGFnZV0uY3NzKAogICAgICAgICAgewogICAgICAgICAgICB6SW5kZXg6IDAsCiAgICAgICAgICAgIGRpc3BsYXk6IChkYXRhLnBhZ2VPYmpzW3BhZ2VdLmhhc0NsYXNzKCdmaXhlZCcpKSA/ICcnIDogJ25vbmUnfQogICAgICAgICAgKTsKICAgICAgICBicmVhazsKICAgICAgfQogICAgCiAgICByZXR1cm4gbG9jOwogIH0sCgogIC8vIEdldHMgYW5kIHNldHMgdGhlIG9wdGlvbnMKCiAgb3B0aW9uczogZnVuY3Rpb24ob3B0aW9ucykgewogICAgCiAgICBpZiAob3B0aW9ucz09PXVuZGVmaW5lZCkgewogICAgICAKICAgICAgcmV0dXJuIHRoaXMuZGF0YSgpLm9wdHM7CgogICAgfSBlbHNlIHsKCiAgICAgIHZhciBkYXRhID0gdGhpcy5kYXRhKCk7CgogICAgICAvLyBTZXQgbmV3IHZhbHVlcwoKICAgICAgJC5leHRlbmQoZGF0YS5vcHRzLCBvcHRpb25zKTsKICAgICAgCiAgICAgIC8vIFNldCBwYWdlcwoKICAgICAgaWYgKG9wdGlvbnMucGFnZXMpCiAgICAgICAgdGhpcy50dXJuKCdwYWdlcycsIG9wdGlvbnMucGFnZXMpOwoKICAgICAgLy8gU2V0IHBhZ2UKCiAgICAgIGlmIChvcHRpb25zLnBhZ2UpCiAgICAgICAgdGhpcy50dXJuKCdwYWdlJywgb3B0aW9ucy5wYWdlKTsKCiAgICAgIC8vIFNldCBkaXNwbGF5CgogICAgICBpZiAob3B0aW9ucy5kaXNwbGF5KQogICAgICAgIHRoaXMudHVybignZGlzcGxheScsIG9wdGlvbnMuZGlzcGxheSk7CiAgICAgIAogICAgICAvLyBTZXQgZGlyZWN0aW9uCgogICAgICBpZiAob3B0aW9ucy5kaXJlY3Rpb24pCiAgICAgICAgdGhpcy50dXJuKCdkaXJlY3Rpb24nLCBvcHRpb25zLmRpcmVjdGlvbik7CgogICAgICAvLyBTZXQgc2l6ZQoKICAgICAgaWYgKG9wdGlvbnMud2lkdGggJiYgb3B0aW9ucy5oZWlnaHQpCiAgICAgICAgdGhpcy50dXJuKCdzaXplJywgb3B0aW9ucy53aWR0aCwgb3B0aW9ucy5oZWlnaHQpOwogICAgICAKICAgICAgLy8gQWRkIGV2ZW50IGxpc3RlbmVycwoKICAgICAgaWYgKG9wdGlvbnMud2hlbikKICAgICAgICBmb3IgKHZhciBldmVudE5hbWUgaW4gb3B0aW9ucy53aGVuKQogICAgICAgICAgaWYgKGhhcyhldmVudE5hbWUsIG9wdGlvbnMud2hlbikpIHsKICAgICAgICAgICAgdGhpcy51bmJpbmQoZXZlbnROYW1lKS4KICAgICAgICAgICAgICBiaW5kKGV2ZW50TmFtZSwgb3B0aW9ucy53aGVuW2V2ZW50TmFtZV0pOwogICAgICAgICAgfQoKICAgICAgcmV0dXJuIHRoaXM7CiAgICB9CgogIH0sCgogIC8vIEdldHMgdGhlIGN1cnJlbnQgdmVyc2lvbgoKICB2ZXJzaW9uOiBmdW5jdGlvbigpIHsKCiAgICByZXR1cm4gdmVyc2lvbjsKCiAgfQp9LAoKLy8gTWV0aG9kcyBhbmQgcHJvcGVydGllcyBmb3IgdGhlIGZsaXAgcGFnZSBlZmZlY3QKCmZsaXBNZXRob2RzID0gewoKICAvLyBDb25zdHJ1Y3RvcgoKICBpbml0OiBmdW5jdGlvbihvcHRzKSB7CgogICAgdGhpcy5kYXRhKHtmOiB7CiAgICAgIGRpc2FibGVkOiBmYWxzZSwKICAgICAgaG92ZXI6IGZhbHNlLAogICAgICBlZmZlY3Q6ICh0aGlzLmhhc0NsYXNzKCdoYXJkJykpID8gJ2hhcmQnIDogJ3NoZWV0JwogICAgfX0pOwogIAogICAgdGhpcy5mbGlwKCdvcHRpb25zJywgb3B0cyk7CgogICAgZmxpcE1ldGhvZHMuX2FkZFBhZ2VXcmFwcGVyLmNhbGwodGhpcyk7CgogICAgcmV0dXJuIHRoaXM7CiAgfSwKCiAgc2V0RGF0YTogZnVuY3Rpb24oZCkgewogICAgCiAgICB2YXIgZGF0YSA9IHRoaXMuZGF0YSgpOwoKICAgIGRhdGEuZiA9ICQuZXh0ZW5kKGRhdGEuZiwgZCk7CgogICAgcmV0dXJuIHRoaXM7CiAgfSwKCiAgb3B0aW9uczogZnVuY3Rpb24ob3B0cykgewogICAgCiAgICB2YXIgZGF0YSA9IHRoaXMuZGF0YSgpLmY7CgogICAgaWYgKG9wdHMpIHsKICAgICAgZmxpcE1ldGhvZHMuc2V0RGF0YS5jYWxsKHRoaXMsCiAgICAgICAge29wdHM6ICQuZXh0ZW5kKHt9LCBkYXRhLm9wdHMgfHwgZmxpcE9wdGlvbnMsIG9wdHMpfSk7CiAgICAgIHJldHVybiB0aGlzOwogICAgfSBlbHNlCiAgICAgIHJldHVybiBkYXRhLm9wdHM7CgogIH0sCgogIHo6IGZ1bmN0aW9uKHopIHsKICAgIAogICAgdmFyIGRhdGEgPSB0aGlzLmRhdGEoKS5mOwoKICAgIGRhdGEub3B0c1snei1pbmRleCddID0gejsKCiAgICBpZiAoZGF0YS5md3JhcHBlcikKICAgICAgZGF0YS5md3JhcHBlci5jc3MoewogICAgICAgIHpJbmRleDogeiB8fCBwYXJzZUludChkYXRhLnBhcmVudC5jc3MoJ3otaW5kZXgnKSwgMTApIHx8IDAKICAgICAgfSk7CgogICAgcmV0dXJuIHRoaXM7CiAgfSwKCiAgX2NBbGxvd2VkOiBmdW5jdGlvbigpIHsKICAgIAogICAgdmFyIGRhdGEgPSB0aGlzLmRhdGEoKS5mLAogICAgICBwYWdlID0gZGF0YS5vcHRzLnBhZ2UsCiAgICAgIHR1cm5EYXRhID0gZGF0YS5vcHRzLnR1cm4uZGF0YSgpLAogICAgICBvZGQgPSBwYWdlJTI7CiAgICAKICAgIGlmIChkYXRhLmVmZmVjdD09J2hhcmQnKSB7CiAgICAKICAgICAgcmV0dXJuICh0dXJuRGF0YS5kaXJlY3Rpb249PSdsdHInKSA/CiAgICAgICAgWyhvZGQpID8gJ3InIDogJ2wnXSA6CiAgICAgICAgWyhvZGQpID8gJ2wnIDogJ3InXTsKCiAgICB9IGVsc2UgewoKICAgICAgaWYgKHR1cm5EYXRhLmRpc3BsYXk9PSdzaW5nbGUnKSB7CgogICAgICAgIGlmIChwYWdlPT0xKQogICAgICAgICAgcmV0dXJuICh0dXJuRGF0YS5kaXJlY3Rpb249PSdsdHInKSA/CiAgICAgICAgICAgIGNvcm5lcnNbJ2ZvcndhcmQnXSA6IGNvcm5lcnNbJ2JhY2t3YXJkJ107CiAgICAgICAgZWxzZSBpZiAocGFnZT09dHVybkRhdGEudG90YWxQYWdlcykKICAgICAgICAgIHJldHVybiAodHVybkRhdGEuZGlyZWN0aW9uPT0nbHRyJykgPwogICAgICAgICAgICBjb3JuZXJzWydiYWNrd2FyZCddIDogY29ybmVyc1snZm9yd2FyZCddOwogICAgICAgIGVsc2UKICAgICAgICAgIHJldHVybiBjb3JuZXJzWydhbGwnXTsKCiAgICAgIH0gZWxzZSB7CgogICAgICAgIHJldHVybiAodHVybkRhdGEuZGlyZWN0aW9uPT0nbHRyJykgPwogICAgICAgICAgY29ybmVyc1sob2RkKSA/ICdmb3J3YXJkJyA6ICdiYWNrd2FyZCddCiAgICAgICAgICA6CiAgICAgICAgICBjb3JuZXJzWyhvZGQpID8gJ2JhY2t3YXJkJyA6ICdmb3J3YXJkJ107CgogICAgICB9CgogICAgfQoKICB9LAoKICBfY29ybmVyQWN0aXZhdGVkOiBmdW5jdGlvbihwKSB7CgogICAgdmFyIGRhdGEgPSB0aGlzLmRhdGEoKS5mLAogICAgICB3aWR0aCA9IHRoaXMud2lkdGgoKSwKICAgICAgaGVpZ2h0ID0gdGhpcy5oZWlnaHQoKSwKICAgICAgcG9pbnQgPSB7eDogcC54LCB5OiBwLnksIGNvcm5lcjogJyd9LAogICAgICBjc3ogPSBkYXRhLm9wdHMuY29ybmVyU2l6ZTsKCiAgICBpZiAocG9pbnQueDw9MCB8fCBwb2ludC55PD0wIHx8IHBvaW50Lng+PXdpZHRoIHx8IHBvaW50Lnk+PWhlaWdodCkKICAgICAgcmV0dXJuIGZhbHNlOwoKICAgIHZhciBhbGxvd2VkQ29ybmVycyA9IGZsaXBNZXRob2RzLl9jQWxsb3dlZC5jYWxsKHRoaXMpOwoKICAgIHN3aXRjaCAoZGF0YS5lZmZlY3QpIHsKICAgICAgY2FzZSAnaGFyZCc6CiAgICAgICAgCiAgICAgICAgaWYgKHBvaW50Lng+d2lkdGgtY3N6KQogICAgICAgICAgcG9pbnQuY29ybmVyID0gJ3InOwogICAgICAgIGVsc2UgaWYgKHBvaW50Lng8Y3N6KQogICAgICAgICAgcG9pbnQuY29ybmVyID0gJ2wnOwogICAgICAgIGVsc2UKICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgCiAgICAgICAgYnJlYWs7CgogICAgICBjYXNlICdzaGVldCc6CiAgICAgICAgCiAgICAgICAgaWYgKHBvaW50Lnk8Y3N6KQogICAgICAgICAgcG9pbnQuY29ybmVyKz0gJ3QnOwogICAgICAgIGVsc2UgaWYgKHBvaW50Lnk+PWhlaWdodC1jc3opCiAgICAgICAgICBwb2ludC5jb3JuZXIrPSAnYic7CiAgICAgICAgZWxzZQogICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgCiAgICAgICAgaWYgKHBvaW50Lng8PWNzeikKICAgICAgICAgIHBvaW50LmNvcm5lcis9ICdsJzsKICAgICAgICBlbHNlIGlmIChwb2ludC54Pj13aWR0aC1jc3opCiAgICAgICAgICBwb2ludC5jb3JuZXIrPSAncic7CiAgICAgICAgZWxzZQogICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIAogICAgICAgIGJyZWFrOwogICAgICB9CgogICAgcmV0dXJuICghcG9pbnQuY29ybmVyIHx8ICQuaW5BcnJheShwb2ludC5jb3JuZXIsIGFsbG93ZWRDb3JuZXJzKT09LTEpID8KICAgICAgZmFsc2UgOiBwb2ludDsKCiAgfSwKCiAgX2lzSUFyZWE6IGZ1bmN0aW9uKGUpIHsKCiAgICB2YXIgcG9zID0gdGhpcy5kYXRhKCkuZi5wYXJlbnQub2Zmc2V0KCk7CgogICAgZSA9IChpc1RvdWNoICYmIGUub3JpZ2luYWxFdmVudCkgPyBlLm9yaWdpbmFsRXZlbnQudG91Y2hlc1swXSA6IGU7CgogICAgcmV0dXJuIGZsaXBNZXRob2RzLl9jb3JuZXJBY3RpdmF0ZWQuY2FsbCh0aGlzLAogICAgICB7CiAgICAgICAgeDogZS5wYWdlWC1wb3MubGVmdCwKICAgICAgICB5OiBlLnBhZ2VZLXBvcy50b3AKICAgICAgfSk7CgogIH0sCgogIF9jOiBmdW5jdGlvbihjb3JuZXIsIG9wdHMpIHsKCiAgICBvcHRzID0gb3B0cyB8fCAwOwoKICAgIHN3aXRjaCAoY29ybmVyKSB7CiAgICAgIGNhc2UgJ3RsJzoKICAgICAgICByZXR1cm4gcG9pbnQyRChvcHRzLCBvcHRzKTsKICAgICAgY2FzZSAndHInOgogICAgICAgIHJldHVybiBwb2ludDJEKHRoaXMud2lkdGgoKS1vcHRzLCBvcHRzKTsKICAgICAgY2FzZSAnYmwnOgogICAgICAgIHJldHVybiBwb2ludDJEKG9wdHMsIHRoaXMuaGVpZ2h0KCktb3B0cyk7CiAgICAgIGNhc2UgJ2JyJzoKICAgICAgICByZXR1cm4gcG9pbnQyRCh0aGlzLndpZHRoKCktb3B0cywgdGhpcy5oZWlnaHQoKS1vcHRzKTsKICAgICAgY2FzZSAnbCc6CiAgICAgICAgcmV0dXJuIHBvaW50MkQob3B0cywgMCk7CiAgICAgIGNhc2UgJ3InOgogICAgICAgIHJldHVybiBwb2ludDJEKHRoaXMud2lkdGgoKS1vcHRzLCAwKTsKICAgIH0KCiAgfSwKCiAgX2MyOiBmdW5jdGlvbihjb3JuZXIpIHsKCiAgICBzd2l0Y2ggKGNvcm5lcikgewogICAgICBjYXNlICd0bCc6CiAgICAgICAgcmV0dXJuIHBvaW50MkQodGhpcy53aWR0aCgpKjIsIDApOwogICAgICBjYXNlICd0cic6CiAgICAgICAgcmV0dXJuIHBvaW50MkQoLXRoaXMud2lkdGgoKSwgMCk7CiAgICAgIGNhc2UgJ2JsJzoKICAgICAgICByZXR1cm4gcG9pbnQyRCh0aGlzLndpZHRoKCkqMiwgdGhpcy5oZWlnaHQoKSk7CiAgICAgIGNhc2UgJ2JyJzoKICAgICAgICByZXR1cm4gcG9pbnQyRCgtdGhpcy53aWR0aCgpLCB0aGlzLmhlaWdodCgpKTsKICAgICAgY2FzZSAnbCc6CiAgICAgICAgcmV0dXJuIHBvaW50MkQodGhpcy53aWR0aCgpKjIsIDApOwogICAgICBjYXNlICdyJzoKICAgICAgICByZXR1cm4gcG9pbnQyRCgtdGhpcy53aWR0aCgpLCAwKTsKICAgIH0KCiAgfSwKCiAgX2ZvbGRpbmdQYWdlOiBmdW5jdGlvbigpIHsKCiAgICB2YXIgZGF0YSA9IHRoaXMuZGF0YSgpLmY7CgogICAgaWYgKCFkYXRhKQogICAgICByZXR1cm47CgogICAgdmFyIG9wdHMgPSBkYXRhLm9wdHM7CgogICAgaWYgKG9wdHMudHVybikgewogICAgICBkYXRhID0gb3B0cy50dXJuLmRhdGEoKTsKICAgICAgaWYgKGRhdGEuZGlzcGxheSA9PSAnc2luZ2xlJykKICAgICAgICByZXR1cm4gKG9wdHMubmV4dD4xIHx8IG9wdHMucGFnZT4xKSA/IGRhdGEucGFnZU9ianNbMF0gOiBudWxsOwogICAgICBlbHNlCiAgICAgICAgcmV0dXJuIGRhdGEucGFnZU9ianNbb3B0cy5uZXh0XTsKICAgIH0KCiAgfSwKCiAgX2JhY2tHcmFkaWVudDogZnVuY3Rpb24oKSB7CgogICAgdmFyIGRhdGEgPSB0aGlzLmRhdGEoKS5mLAogICAgICB0dXJuRGF0YSA9IGRhdGEub3B0cy50dXJuLmRhdGEoKSwKICAgICAgZ3JhZGllbnQgPSAgdHVybkRhdGEub3B0cy5ncmFkaWVudHMgJiYgKHR1cm5EYXRhLmRpc3BsYXk9PSdzaW5nbGUnIHx8CiAgICAgICAgIChkYXRhLm9wdHMucGFnZSE9MiAmJiBkYXRhLm9wdHMucGFnZSE9dHVybkRhdGEudG90YWxQYWdlcy0xKSk7CgogICAgaWYgKGdyYWRpZW50ICYmICFkYXRhLmJzaGFkb3cpCiAgICAgIGRhdGEuYnNoYWRvdyA9ICQoJzxkaXYvPicsIGRpdkF0dCgwLCAwLCAxKSkuCiAgICAgICAgY3NzKHsncG9zaXRpb24nOiAnJywgd2lkdGg6IHRoaXMud2lkdGgoKSwgaGVpZ2h0OiB0aGlzLmhlaWdodCgpfSkuCiAgICAgICAgYXBwZW5kVG8oZGF0YS5wYXJlbnQpOwoKICAgIHJldHVybiBncmFkaWVudDsKCiAgfSwKCiAgdHlwZTogZnVuY3Rpb24gKCkgewogICAgCiAgICByZXR1cm4gdGhpcy5kYXRhKCkuZi5lZmZlY3Q7CgogIH0sCgogIHJlc2l6ZTogZnVuY3Rpb24oZnVsbCkgewogICAgCiAgICB2YXIgZGF0YSA9IHRoaXMuZGF0YSgpLmYsCiAgICAgIHR1cm5EYXRhID0gZGF0YS5vcHRzLnR1cm4uZGF0YSgpLAogICAgICB3aWR0aCA9IHRoaXMud2lkdGgoKSwKICAgICAgaGVpZ2h0ID0gdGhpcy5oZWlnaHQoKTsKCiAgICBzd2l0Y2ggKGRhdGEuZWZmZWN0KSB7CiAgICAgIGNhc2UgJ2hhcmQnOgogICAgICAgIAogICAgICBpZiAoZnVsbCkgewogICAgICAgIGRhdGEud3JhcHBlci5jc3Moe3dpZHRoOiB3aWR0aCwgaGVpZ2h0OiBoZWlnaHR9KTsKICAgICAgICBkYXRhLmZwYWdlLmNzcyh7d2lkdGg6IHdpZHRoLCBoZWlnaHQ6IGhlaWdodH0pOwogICAgICAgIGlmICh0dXJuRGF0YS5vcHRzLmdyYWRpZW50cykgewogICAgICAgICAgZGF0YS5hc2hhZG93LmNzcyh7d2lkdGg6IHdpZHRoLCBoZWlnaHQ6IGhlaWdodH0pOwogICAgICAgICAgZGF0YS5ic2hhZG93LmNzcyh7d2lkdGg6IHdpZHRoLCBoZWlnaHQ6IGhlaWdodH0pOwogICAgICAgIH0KICAgICAgfQoKICAgICAgYnJlYWs7CiAgICAgIGNhc2UgJ3NoZWV0JzoKCiAgICAgIGlmIChmdWxsKSB7CiAgICAgICAgdmFyIHNpemUgPSBNYXRoLnJvdW5kKE1hdGguc3FydChNYXRoLnBvdyh3aWR0aCwgMikrTWF0aC5wb3coaGVpZ2h0LCAyKSkpOwoKICAgICAgICBkYXRhLndyYXBwZXIuY3NzKHt3aWR0aDogc2l6ZSwgaGVpZ2h0OiBzaXplfSk7CiAgICAgICAgZGF0YS5md3JhcHBlci5jc3Moe3dpZHRoOiBzaXplLCBoZWlnaHQ6IHNpemV9KS4KICAgICAgICAgIGNoaWxkcmVuKCc6Zmlyc3QtY2hpbGQnKS4KICAgICAgICAgIGNzcyh7d2lkdGg6IHdpZHRoLCBoZWlnaHQ6IGhlaWdodH0pOwoKICAgICAgICBkYXRhLmZwYWdlLmNzcyh7d2lkdGg6IHdpZHRoLCBoZWlnaHQ6IGhlaWdodH0pOwoKICAgICAgICBpZiAodHVybkRhdGEub3B0cy5ncmFkaWVudHMpCiAgICAgICAgICBkYXRhLmFzaGFkb3cuY3NzKHt3aWR0aDogd2lkdGgsIGhlaWdodDogaGVpZ2h0fSk7CgogICAgICAgIGlmIChmbGlwTWV0aG9kcy5fYmFja0dyYWRpZW50LmNhbGwodGhpcykpCiAgICAgICAgICBkYXRhLmJzaGFkb3cuY3NzKHt3aWR0aDogd2lkdGgsIGhlaWdodDogaGVpZ2h0fSk7CiAgICAgIH0KCiAgICAgIGlmIChkYXRhLnBhcmVudC5pcygnOnZpc2libGUnKSkgewogICAgICAgIHZhciBvZmZzZXQgPSBmaW5kUG9zKGRhdGEucGFyZW50WzBdKTsKCiAgICAgICAgZGF0YS5md3JhcHBlci5jc3Moe3RvcDogb2Zmc2V0LnRvcCwKICAgICAgICAgIGxlZnQ6IG9mZnNldC5sZWZ0fSk7CgogICAgICAgIC8vaWYgKGRhdGEub3B0cy50dXJuKSB7CiAgICAgICAgIG9mZnNldCA9IGZpbmRQb3MoZGF0YS5vcHRzLnR1cm5bMF0pOwogICAgICAgICBkYXRhLmZwYXJlbnQuY3NzKHt0b3A6IC1vZmZzZXQudG9wLCBsZWZ0OiAtb2Zmc2V0LmxlZnR9KTsKICAgICAgICAvL30KICAgICAgfQoKICAgICAgdGhpcy5mbGlwKCd6JywgZGF0YS5vcHRzWyd6LWluZGV4J10pOwoKICAgICAgYnJlYWs7CiAgICB9CgogIH0sCgogIC8vIFByZXBhcmVzIHRoZSBwYWdlIGJ5IGFkZGluZyBhIGdlbmVyYWwgd3JhcHBlciBhbmQgYW5vdGhlciBvYmplY3RzCgogIF9hZGRQYWdlV3JhcHBlcjogZnVuY3Rpb24oKSB7CgogICAgdmFyIGF0dCwKICAgICAgZGF0YSA9IHRoaXMuZGF0YSgpLmYsCiAgICAgIHR1cm5EYXRhID0gZGF0YS5vcHRzLnR1cm4uZGF0YSgpLAogICAgICBwYXJlbnQgPSB0aGlzLnBhcmVudCgpOwoKICAgIGRhdGEucGFyZW50ID0gcGFyZW50OwoKICBpZiAoIWRhdGEud3JhcHBlcikKICAgIHN3aXRjaCAoZGF0YS5lZmZlY3QpIHsKICAgICAgY2FzZSAnaGFyZCc6CiAgICAgICAgCiAgICAgICAgdmFyIGNzc1Byb3BlcnRpZXMgPSB7fTsKICAgICAgICBjc3NQcm9wZXJ0aWVzW3ZlbmRvciArICd0cmFuc2Zvcm0tc3R5bGUnXSA9ICdwcmVzZXJ2ZS0zZCc7CiAgICAgICAgY3NzUHJvcGVydGllc1t2ZW5kb3IgKyAnYmFja2ZhY2UtdmlzaWJpbGl0eSddID0gJ2hpZGRlbic7CgogICAgICAgIGRhdGEud3JhcHBlciA9ICQoJzxkaXYvPicsIGRpdkF0dCgwLCAwLCAyKSkuCiAgICAgICAgICBjc3MoY3NzUHJvcGVydGllcykuCiAgICAgICAgICBhcHBlbmRUbyhwYXJlbnQpLgogICAgICAgICAgcHJlcGVuZCh0aGlzKTsKCiAgICAgICAgZGF0YS5mcGFnZSA9ICQoJzxkaXYvPicsIGRpdkF0dCgwLCAwLCAxKSkuCiAgICAgICAgICBjc3MoY3NzUHJvcGVydGllcykuCiAgICAgICAgICBhcHBlbmRUbyhwYXJlbnQpOwogICAgICAgIAogICAgICAgIGlmICh0dXJuRGF0YS5vcHRzLmdyYWRpZW50cykgewogICAgICAgICAgZGF0YS5hc2hhZG93ID0gJCgnPGRpdi8+JywgZGl2QXR0KDAsIDAsICAwKSkuCiAgICAgICAgICAgIGhpZGUoKS4KICAgICAgICAgICAgYXBwZW5kVG8ocGFyZW50KTsKCiAgICAgICAgICBkYXRhLmJzaGFkb3cgPSAkKCc8ZGl2Lz4nLCBkaXZBdHQoMCwgMCwgIDApKTsKICAgICAgICB9CgogICAgICBicmVhazsKICAgICAgY2FzZSAnc2hlZXQnOgogICAgICAgIAogICAgICAgIHZhciB3aWR0aCA9IHRoaXMud2lkdGgoKSwKICAgICAgICAgIGhlaWdodCA9IHRoaXMuaGVpZ2h0KCksCiAgICAgICAgICBzaXplID0gTWF0aC5yb3VuZChNYXRoLnNxcnQoTWF0aC5wb3cod2lkdGgsIDIpK01hdGgucG93KGhlaWdodCwgMikpKTsKICAgICAgICAKICAgICAgICBkYXRhLmZwYXJlbnQgPSBkYXRhLm9wdHMudHVybi5kYXRhKCkuZnBhcmVudDsKCiAgICAgICAgaWYgKCFkYXRhLmZwYXJlbnQpIHsKICAgICAgICAgIHZhciBmcGFyZW50ID0gJCgnPGRpdi8+Jywge2Nzczogeydwb2ludGVyLWV2ZW50cyc6ICdub25lJ319KS5oaWRlKCk7CiAgICAgICAgICAgIGZwYXJlbnQuZGF0YSgpLmZsaXBzID0gMDsKICAgICAgICAgICAgZnBhcmVudC5jc3MoZGl2QXR0KDAsIDAsICdhdXRvJywgJ3Zpc2libGUnKS5jc3MpLgogICAgICAgICAgICBhcHBlbmRUbyhkYXRhLm9wdHMudHVybik7CiAgICAgICAgICAgIAogICAgICAgICAgICBkYXRhLm9wdHMudHVybi5kYXRhKCkuZnBhcmVudCA9IGZwYXJlbnQ7CiAgICAgICAgICAgIGRhdGEuZnBhcmVudCA9IGZwYXJlbnQ7CiAgICAgICAgfQoKICAgICAgICB0aGlzLmNzcyh7cG9zaXRpb246ICdhYnNvbHV0ZScsIHRvcDogMCwgbGVmdDogMCwgYm90dG9tOiAnYXV0bycsIHJpZ2h0OiAnYXV0byd9KTsKCiAgICAgICAgZGF0YS53cmFwcGVyID0gJCgnPGRpdi8+JywgZGl2QXR0KDAsIDAsIHRoaXMuY3NzKCd6LWluZGV4JykpKS4KICAgICAgICAgIGFwcGVuZFRvKHBhcmVudCkuCiAgICAgICAgICBwcmVwZW5kKHRoaXMpOwoKICAgICAgICBkYXRhLmZ3cmFwcGVyID0gJCgnPGRpdi8+JywgZGl2QXR0KHBhcmVudC5vZmZzZXQoKS50b3AsIHBhcmVudC5vZmZzZXQoKS5sZWZ0KSkuCiAgICAgICAgICBoaWRlKCkuCiAgICAgICAgICBhcHBlbmRUbyhkYXRhLmZwYXJlbnQpOwoKICAgICAgICBkYXRhLmZwYWdlID0gJCgnPGRpdi8+JywgZGl2QXR0KDAsIDAsIDAsICd2aXNpYmxlJykpLgogICAgICAgICAgY3NzKHtjdXJzb3I6ICdkZWZhdWx0J30pLgogICAgICAgICAgYXBwZW5kVG8oZGF0YS5md3JhcHBlcik7CgogICAgICAgIGlmICh0dXJuRGF0YS5vcHRzLmdyYWRpZW50cykKICAgICAgICAgIGRhdGEuYXNoYWRvdyA9ICQoJzxkaXYvPicsIGRpdkF0dCgwLCAwLCAgMSkpLgogICAgICAgICAgYXBwZW5kVG8oZGF0YS5mcGFnZSk7CgogICAgICAgIGZsaXBNZXRob2RzLnNldERhdGEuY2FsbCh0aGlzLCBkYXRhKTsKCiAgICAgIGJyZWFrOwogICAgfQoKICAgIC8vIFNldCBzaXplCiAgICBmbGlwTWV0aG9kcy5yZXNpemUuY2FsbCh0aGlzLCB0cnVlKTsKCiAgfSwKCiAgLy8gVGFrZXMgYSAyUCBwb2ludCBmcm9tIHRoZSBzY3JlZW4gYW5kIGFwcGxpZXMgdGhlIHRyYW5zZm9ybWF0aW9uCgogIF9mb2xkOiBmdW5jdGlvbihwb2ludCkgewoKICAgIHZhciBkYXRhID0gdGhpcy5kYXRhKCkuZiwKICAgICAgdHVybkRhdGEgPSBkYXRhLm9wdHMudHVybi5kYXRhKCksCiAgICAgIG8gPSBmbGlwTWV0aG9kcy5fYy5jYWxsKHRoaXMsIHBvaW50LmNvcm5lciksCiAgICAgIHdpZHRoID0gdGhpcy53aWR0aCgpLAogICAgICBoZWlnaHQgPSB0aGlzLmhlaWdodCgpOwoKICAgIHN3aXRjaCAoZGF0YS5lZmZlY3QpIHsKCiAgICAgIGNhc2UgJ2hhcmQnOgoKICAgICAgICBpZiAocG9pbnQuY29ybmVyPT0nbCcpCiAgICAgICAgICBwb2ludC54ID0gTWF0aC5taW4oTWF0aC5tYXgocG9pbnQueCwgMCksIHdpZHRoKjIpOwogICAgICAgIGVsc2UKICAgICAgICAgIHBvaW50LnggPSBNYXRoLm1heChNYXRoLm1pbihwb2ludC54LCB3aWR0aCksIC13aWR0aCk7CgogICAgICAgIHZhciBsZWZ0UG9zLAogICAgICAgICAgc2hhZG93LAogICAgICAgICAgZ3JhZGllbnRYLAogICAgICAgICAgZnBhZ2VPcmlnaW4sCiAgICAgICAgICBwYXJlbnRPcmlnaW4sCiAgICAgICAgICB0b3RhbFBhZ2VzID0gdHVybkRhdGEudG90YWxQYWdlcywKICAgICAgICAgIHpJbmRleCA9IGRhdGEub3B0c1snei1pbmRleCddIHx8IHRvdGFsUGFnZXMsCiAgICAgICAgICBwYXJlbnRDc3MgPSB7J292ZXJmbG93JzogJ3Zpc2libGUnfSwKICAgICAgICAgIHJlbFggPSAoby54KSA/IChvLnggLSBwb2ludC54KS93aWR0aCA6IHBvaW50Lngvd2lkdGgsCiAgICAgICAgICBhbmdsZSA9IHJlbFggKiA5MCwKICAgICAgICAgIGhhbGYgPSBhbmdsZTw5MDsKCiAgICAgICAgc3dpdGNoIChwb2ludC5jb3JuZXIpIHsKICAgICAgICAgIGNhc2UgJ2wnOgoKICAgICAgICAgICAgZnBhZ2VPcmlnaW4gPSAgJzAlIDUwJSc7CiAgICAgICAgICAgIHBhcmVudE9yaWdpbiA9ICAnMTAwJSA1MCUnOwoKICAgICAgICAgICAgaWYgKGhhbGYpIHsKICAgICAgICAgICAgICBsZWZ0UG9zID0gMDsKICAgICAgICAgICAgICBzaGFkb3cgPSBkYXRhLm9wdHMubmV4dC0xPjA7CiAgICAgICAgICAgICAgZ3JhZGllbnRYID0gMTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICBsZWZ0UG9zID0gJzEwMCUnOwogICAgICAgICAgICAgIHNoYWRvdyA9IGRhdGEub3B0cy5wYWdlKzE8dG90YWxQYWdlczsKICAgICAgICAgICAgICBncmFkaWVudFggPSAwOwogICAgICAgICAgICB9CgogICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlICdyJzoKCiAgICAgICAgICAgIGZwYWdlT3JpZ2luID0gICcxMDAlIDUwJSc7CiAgICAgICAgICAgIHBhcmVudE9yaWdpbiA9ICAnMCUgNTAlJzsKICAgICAgICAgICAgYW5nbGUgPSAtYW5nbGU7CiAgICAgICAgICAgIHdpZHRoID0gLXdpZHRoOwoKICAgICAgICAgICAgaWYgKGhhbGYpIHsKICAgICAgICAgICAgICBsZWZ0UG9zID0gMDsKICAgICAgICAgICAgICBzaGFkb3cgPSBkYXRhLm9wdHMubmV4dCsxPHRvdGFsUGFnZXM7CiAgICAgICAgICAgICAgZ3JhZGllbnRYID0gMDsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICBsZWZ0UG9zID0gJy0xMDAlJzsKICAgICAgICAgICAgICBzaGFkb3cgPSBkYXRhLm9wdHMucGFnZSE9MTsKICAgICAgICAgICAgICBncmFkaWVudFggPSAxOwogICAgICAgICAgICB9CgogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQoKICAgICAgICBwYXJlbnRDc3NbdmVuZG9yKydwZXJzcGVjdGl2ZS1vcmlnaW4nXSA9IHBhcmVudE9yaWdpbjsKCiAgICAgICAgZGF0YS53cmFwcGVyLnRyYW5zZm9ybSgncm90YXRlWSgnK2FuZ2xlKydkZWcpJyArCiAgICAgICAgICAndHJhbnNsYXRlM2QoMHB4LCAwcHgsICcrKHRoaXMuYXR0cignZGVwdGgnKXx8MCkrJ3B4KScsIHBhcmVudE9yaWdpbik7CgogICAgICAgIGRhdGEuZnBhZ2UudHJhbnNmb3JtKCd0cmFuc2xhdGVYKCcrd2lkdGgrJ3B4KSByb3RhdGVZKCcrKDE4MCthbmdsZSkrJ2RlZyknLCBmcGFnZU9yaWdpbik7CgogICAgICAgIGRhdGEucGFyZW50LmNzcyhwYXJlbnRDc3MpOwoKICAgICAgICBpZiAoaGFsZikgewogICAgICAgICAgcmVsWCA9IC1yZWxYKzE7CiAgICAgICAgICBkYXRhLndyYXBwZXIuY3NzKHt6SW5kZXg6IHpJbmRleCsxfSk7CiAgICAgICAgICBkYXRhLmZwYWdlLmNzcyh7ekluZGV4OiB6SW5kZXh9KTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgcmVsWCA9IHJlbFgtMTsKICAgICAgICAgIGRhdGEud3JhcHBlci5jc3Moe3pJbmRleDogekluZGV4fSk7CiAgICAgICAgICBkYXRhLmZwYWdlLmNzcyh7ekluZGV4OiB6SW5kZXgrMX0pOwogICAgICAgIH0KCiAgICAgICAgaWYgKHR1cm5EYXRhLm9wdHMuZ3JhZGllbnRzKSB7CiAgICAgICAgICBpZiAoc2hhZG93KQogICAgICAgICAgICBkYXRhLmFzaGFkb3cuY3NzKHsKICAgICAgICAgICAgICBkaXNwbGF5OiAnJywKICAgICAgICAgICAgICBsZWZ0OiBsZWZ0UG9zLAogICAgICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogJ3JnYmEoMCwwLDAsJysoMC41KnJlbFgpKycpJwogICAgICAgICAgICB9KS4KICAgICAgICAgICAgdHJhbnNmb3JtKCdyb3RhdGVZKDBkZWcpJyk7CiAgICAgICAgICBlbHNlCiAgICAgICAgICAgIGRhdGEuYXNoYWRvdy5oaWRlKCk7CgogICAgICAgICAgZGF0YS5ic2hhZG93LmNzcyh7b3BhY2l0eTotcmVsWCArIDF9KTsKCiAgICAgICAgICBpZiAoaGFsZikgewogICAgICAgICAgICBpZiAoZGF0YS5ic2hhZG93LnBhcmVudCgpWzBdIT1kYXRhLndyYXBwZXJbMF0pIHsKICAgICAgICAgICAgICBkYXRhLmJzaGFkb3cuYXBwZW5kVG8oZGF0YS53cmFwcGVyKTsKICAgICAgICAgICAgfQogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgaWYgKGRhdGEuYnNoYWRvdy5wYXJlbnQoKVswXSE9ZGF0YS5mcGFnZVswXSkgewogICAgICAgICAgICAgIGRhdGEuYnNoYWRvdy5hcHBlbmRUbyhkYXRhLmZwYWdlKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgLypkYXRhLmJzaGFkb3cuY3NzKHsKICAgICAgICAgICAgYmFja2dyb3VuZENvbG9yOiAncmdiYSgwLDAsMCwnKygwLjEpKycpJwogICAgICAgICAgfSkqLwogICAgICAgICAgZ3JhZGllbnQoZGF0YS5ic2hhZG93LCBwb2ludDJEKGdyYWRpZW50WCAqIDEwMCwgMCksIHBvaW50MkQoKC1ncmFkaWVudFggKyAxKSoxMDAsIDApLAogICAgICAgICAgICBbWzAsICdyZ2JhKDAsMCwwLDAuMyknXSxbMSwgJ3JnYmEoMCwwLDAsMCknXV0sMik7CiAgICAgICAgICAKICAgICAgICB9CgogICAgICAgIGJyZWFrOwogICAgICBjYXNlICdzaGVldCc6CgogICAgICAgIHZhciB0aGF0ID0gdGhpcywKICAgICAgICAgIGEgPSAwLAogICAgICAgICAgYWxwaGEgPSAwLAogICAgICAgICAgYmV0YSwKICAgICAgICAgIHB4LAogICAgICAgICAgZ3JhZGllbnRFbmRQb2ludEEsCiAgICAgICAgICBncmFkaWVudEVuZFBvaW50QiwKICAgICAgICAgIGdyYWRpZW50U3RhcnRWYWwsCiAgICAgICAgICBncmFkaWVudFNpemUsCiAgICAgICAgICBncmFkaWVudE9wYWNpdHksCiAgICAgICAgICBzaGFkb3dWYWwsCiAgICAgICAgICBtdiA9IHBvaW50MkQoMCwgMCksCiAgICAgICAgICBkZiA9IHBvaW50MkQoMCwgMCksCiAgICAgICAgICB0ciA9IHBvaW50MkQoMCwgMCksCiAgICAgICAgICBmb2xkaW5nID0gZmxpcE1ldGhvZHMuX2ZvbGRpbmdQYWdlLmNhbGwodGhpcyksCiAgICAgICAgICB0YW4gPSBNYXRoLnRhbihhbHBoYSksCiAgICAgICAgICBhYyA9IHR1cm5EYXRhLm9wdHMuYWNjZWxlcmF0aW9uLAogICAgICAgICAgaCA9IGRhdGEud3JhcHBlci5oZWlnaHQoKSwKICAgICAgICAgIHRvcCA9IHBvaW50LmNvcm5lci5zdWJzdHIoMCwgMSkgPT0gJ3QnLAogICAgICAgICAgbGVmdCA9IHBvaW50LmNvcm5lci5zdWJzdHIoMSwgMSkgPT0gJ2wnLAoKICAgICAgY29tcHV0ZSA9IGZ1bmN0aW9uKCkgewoKICAgICAgICB2YXIgcmVsID0gcG9pbnQyRCgwLCAwKTsKICAgICAgICB2YXIgbWlkZGxlID0gcG9pbnQyRCgwLCAwKTsKCiAgICAgICAgcmVsLnggPSAoby54KSA/IG8ueCAtIHBvaW50LnggOiBwb2ludC54OwoKICAgICAgICBpZiAoIWhhc1JvdCkgewogICAgICAgICAgcmVsLnkgPSAwOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICByZWwueSA9IChvLnkpID8gby55IC0gcG9pbnQueSA6IHBvaW50Lnk7CiAgICAgICAgfQoKICAgICAgICBtaWRkbGUueCA9IChsZWZ0KT8gd2lkdGggLSByZWwueC8yIDogcG9pbnQueCArIHJlbC54LzI7CiAgICAgICAgbWlkZGxlLnkgPSByZWwueS8yOwogICAgICAgIAogICAgICAgIHZhciBhbHBoYSA9ICBBOTAtTWF0aC5hdGFuMihyZWwueSwgcmVsLngpLAogICAgICAgICAgZ2FtbWEgPSBhbHBoYSAtIE1hdGguYXRhbjIobWlkZGxlLnksIG1pZGRsZS54KSwKICAgICAgICAgIGRpc3RhbmNlID0gIE1hdGgubWF4KDAsIE1hdGguc2luKGdhbW1hKSAqIE1hdGguc3FydChNYXRoLnBvdyhtaWRkbGUueCwgMikgKyBNYXRoLnBvdyhtaWRkbGUueSwgMikpKTsKICAgICAgICAgIAogICAgICAgICAgYSA9IGRlZyhhbHBoYSk7CgogICAgICAgICAgdHIgPSBwb2ludDJEKGRpc3RhbmNlICogTWF0aC5zaW4oYWxwaGEpLCBkaXN0YW5jZSAqIE1hdGguY29zKGFscGhhKSk7CgogICAgICAgICAgaWYgKGFscGhhID4gQTkwKSB7CiAgICAgICAgICAgIHRyLnggPSB0ci54ICsgTWF0aC5hYnModHIueSAqIHJlbC55L3JlbC54KTsKICAgICAgICAgICAgdHIueSA9IDA7CiAgICAgICAgICAgIGlmIChNYXRoLnJvdW5kKHRyLngqTWF0aC50YW4oUEktYWxwaGEpKSA8IGhlaWdodCkgewogICAgICAgICAgICAgIHBvaW50LnkgPSBNYXRoLnNxcnQoTWF0aC5wb3coaGVpZ2h0LCAyKSsyICogbWlkZGxlLnggKiByZWwueCk7CiAgICAgICAgICAgICAgaWYgKHRvcCkgcG9pbnQueSA9ICBoZWlnaHQgLSBwb2ludC55OwogICAgICAgICAgICAgIHJldHVybiBjb21wdXRlKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgCiAgICAgICAgICBpZiAoYWxwaGE+QTkwKSB7CiAgICAgICAgICAgIHZhciBiZXRhID0gUEktYWxwaGEsIGRkID0gaCAtIGhlaWdodC9NYXRoLnNpbihiZXRhKTsKICAgICAgICAgICAgbXYgPSBwb2ludDJEKE1hdGgucm91bmQoZGQqTWF0aC5jb3MoYmV0YSkpLCBNYXRoLnJvdW5kKGRkKk1hdGguc2luKGJldGEpKSk7CiAgICAgICAgICAgIGlmIChsZWZ0KSBtdi54ID0gLSBtdi54OwogICAgICAgICAgICBpZiAodG9wKSBtdi55ID0gLSBtdi55OwogICAgICAgICAgfQoKICAgICAgICAgIHB4ID0gTWF0aC5yb3VuZCh0ci55L01hdGgudGFuKGFscGhhKSArIHRyLngpOwogICAgICAKICAgICAgICAgIHZhciBzaWRlID0gd2lkdGggLSBweCwKICAgICAgICAgICAgc2lkZVggPSBzaWRlKk1hdGguY29zKGFscGhhKjIpLAogICAgICAgICAgICBzaWRlWSA9IHNpZGUqTWF0aC5zaW4oYWxwaGEqMik7CiAgICAgICAgICAgIGRmID0gcG9pbnQyRCgKICAgICAgICAgICAgICBNYXRoLnJvdW5kKChsZWZ0ID8gc2lkZSAtc2lkZVggOiBweCtzaWRlWCkpLAogICAgICAgICAgICAgIE1hdGgucm91bmQoKHRvcCkgPyBzaWRlWSA6IGhlaWdodCAtIHNpZGVZKSk7CiAgICAgICAgICAKICAgICAgICAvLyBHcmFkaWVudHMKICAgICAgICAgIGlmICh0dXJuRGF0YS5vcHRzLmdyYWRpZW50cykgewoKICAgICAgICAgICAgZ3JhZGllbnRTaXplID0gc2lkZSpNYXRoLnNpbihhbHBoYSk7CgogICAgICAgICAgICB2YXIgZW5kaW5nUG9pbnQgPSBmbGlwTWV0aG9kcy5fYzIuY2FsbCh0aGF0LCBwb2ludC5jb3JuZXIpLAogICAgICAgICAgICAgZmFyID0gTWF0aC5zcXJ0KE1hdGgucG93KGVuZGluZ1BvaW50LngtcG9pbnQueCwgMikrTWF0aC5wb3coZW5kaW5nUG9pbnQueS1wb2ludC55LCAyKSkvd2lkdGg7CgogICAgICAgICAgICBzaGFkb3dWYWwgPSBNYXRoLnNpbihBOTAqKChmYXI+MSkgPyAyIC0gZmFyIDogZmFyKSk7CgogICAgICAgICAgICBncmFkaWVudE9wYWNpdHkgPSBNYXRoLm1pbihmYXIsIDEpOwoKICAgICAgICAgICAKICAgICAgICAgICAgICBncmFkaWVudFN0YXJ0VmFsID0gZ3JhZGllbnRTaXplPjEwMCA/IChncmFkaWVudFNpemUtMTAwKS9ncmFkaWVudFNpemUgOiAwOwoKICAgICAgICAgICAgICBncmFkaWVudEVuZFBvaW50QSA9IHBvaW50MkQoCiAgICAgICAgICAgICAgICBncmFkaWVudFNpemUqTWF0aC5zaW4oYWxwaGEpL3dpZHRoKjEwMCwKICAgICAgICAgICAgICAgIGdyYWRpZW50U2l6ZSpNYXRoLmNvcyhhbHBoYSkvaGVpZ2h0KjEwMCk7CiAgICAgICAgICAgCgogICAgICAgICAgICAgIGlmIChmbGlwTWV0aG9kcy5fYmFja0dyYWRpZW50LmNhbGwodGhhdCkpIHsKCiAgICAgICAgICAgICAgICBncmFkaWVudEVuZFBvaW50QiA9IHBvaW50MkQoCiAgICAgICAgICAgICAgICAgIGdyYWRpZW50U2l6ZSoxLjIqTWF0aC5zaW4oYWxwaGEpL3dpZHRoKjEwMCwKICAgICAgICAgICAgICAgICAgZ3JhZGllbnRTaXplKjEuMipNYXRoLmNvcyhhbHBoYSkvaGVpZ2h0KjEwMCk7CgogICAgICAgICAgICAgICAgaWYgKCFsZWZ0KSBncmFkaWVudEVuZFBvaW50Qi54ID0gMTAwLWdyYWRpZW50RW5kUG9pbnRCLng7CiAgICAgICAgICAgICAgICBpZiAoIXRvcCkgZ3JhZGllbnRFbmRQb2ludEIueSA9IDEwMC1ncmFkaWVudEVuZFBvaW50Qi55OwoKICAgICAgICAgICAgICB9CgogICAgICAgICAgfQoKICAgICAgICAgIHRyLnggPSBNYXRoLnJvdW5kKHRyLngpOwogICAgICAgICAgdHIueSA9IE1hdGgucm91bmQodHIueSk7CgogICAgICAgIHJldHVybiB0cnVlOwogICAgICB9LAoKICAgICAgdHJhbnNmb3JtID0gZnVuY3Rpb24odHIsIGMsIHgsIGEpIHsKICAgICAgCiAgICAgICAgdmFyIGYgPSBbJzAnLCAnYXV0byddLCBtdlcgPSAod2lkdGgtaCkqeFswXS8xMDAsIG12SCA9IChoZWlnaHQtaCkqeFsxXS8xMDAsCiAgICAgICAgICBjc3NBID0ge2xlZnQ6IGZbY1swXV0sIHRvcDogZltjWzFdXSwgcmlnaHQ6IGZbY1syXV0sIGJvdHRvbTogZltjWzNdXX0sCiAgICAgICAgICBjc3NCID0ge30sCiAgICAgICAgICBhbGlhc2luZ0ZrID0gKGEhPTkwICYmIGEhPS05MCkgPyAobGVmdCA/IC0xIDogMSkgOiAwLAogICAgICAgICAgb3JpZ2luID0geFswXSArICclICcgKyB4WzFdICsgJyUnOwoKICAgICAgICB0aGF0LmNzcyhjc3NBKS4KICAgICAgICAgIHRyYW5zZm9ybShyb3RhdGUoYSkgKyB0cmFuc2xhdGUodHIueCArIGFsaWFzaW5nRmssIHRyLnksIGFjKSwgb3JpZ2luKTsKCiAgICAgICAgZGF0YS5mcGFnZS5jc3MoY3NzQSkudHJhbnNmb3JtKAogICAgICAgICAgcm90YXRlKGEpICsKICAgICAgICAgIHRyYW5zbGF0ZSh0ci54ICsgZGYueCAtIG12LnggLSB3aWR0aCp4WzBdLzEwMCwgdHIueSArIGRmLnkgLSBtdi55IC0gaGVpZ2h0KnhbMV0vMTAwLCBhYykgKwogICAgICAgICAgcm90YXRlKCgxODAvYSAtIDIpKmEpLAogICAgICAgICAgb3JpZ2luKTsKCiAgICAgICAgZGF0YS53cmFwcGVyLnRyYW5zZm9ybSh0cmFuc2xhdGUoLXRyLnggKyBtdlctYWxpYXNpbmdGaywgLXRyLnkgKyBtdkgsIGFjKSArIHJvdGF0ZSgtYSksIG9yaWdpbik7CgogICAgICAgIGRhdGEuZndyYXBwZXIudHJhbnNmb3JtKHRyYW5zbGF0ZSgtdHIueCArIG12LnggKyBtdlcsIC10ci55ICsgbXYueSArIG12SCwgYWMpICsgcm90YXRlKC1hKSwgb3JpZ2luKTsKICAgICAgCiAgICAgICAgaWYgKHR1cm5EYXRhLm9wdHMuZ3JhZGllbnRzKSB7CgogICAgICAgICAgaWYgKHhbMF0pCiAgICAgICAgICAgIGdyYWRpZW50RW5kUG9pbnRBLnggPSAxMDAtZ3JhZGllbnRFbmRQb2ludEEueDsKCiAgICAgICAgICBpZiAoeFsxXSkKICAgICAgICAgICAgZ3JhZGllbnRFbmRQb2ludEEueSA9ICgxMDAtZ3JhZGllbnRFbmRQb2ludEEueSk7CgogICAgICAgICAgY3NzQlsnYm94LXNoYWRvdyddID0gJzAgMCAyMHB4IHJnYmEoMCwwLDAsJysoMC41KnNoYWRvd1ZhbCkrJyknOwogICAgICAgICAgZm9sZGluZy5jc3MoY3NzQik7CgogICAgICAgICAgZ3JhZGllbnQoZGF0YS5hc2hhZG93LAogICAgICAgICAgICAgIHBvaW50MkQobGVmdD8xMDA6MCwgdG9wPzA6MTAwKSwKICAgICAgICAgICAgICBwb2ludDJEKGdyYWRpZW50RW5kUG9pbnRBLngsIGdyYWRpZW50RW5kUG9pbnRBLnkpLAogICAgICAgICAgICAgIFtbZ3JhZGllbnRTdGFydFZhbCwgJ3JnYmEoMCwwLDAsMCknXSwKICAgICAgICAgICAgICBbKCgxLWdyYWRpZW50U3RhcnRWYWwpKjAuOCkrZ3JhZGllbnRTdGFydFZhbCwgJ3JnYmEoMCwwLDAsJysoMC4yKmdyYWRpZW50T3BhY2l0eSkrJyknXSwKICAgICAgICAgICAgICBbMSwgJ3JnYmEoMjU1LDI1NSwyNTUsJysoMC4yKmdyYWRpZW50T3BhY2l0eSkrJyknXV0sCiAgICAgICAgICAgICAgMywKICAgICAgICAgICAgICBhbHBoYSk7CgogICAgICAgICAgaWYgKGZsaXBNZXRob2RzLl9iYWNrR3JhZGllbnQuY2FsbCh0aGF0KSkKICAgICAgICAgICAgZ3JhZGllbnQoZGF0YS5ic2hhZG93LAogICAgICAgICAgICAgICAgcG9pbnQyRChsZWZ0PzA6MTAwLCB0b3A/MDoxMDApLAogICAgICAgICAgICAgICAgcG9pbnQyRChncmFkaWVudEVuZFBvaW50Qi54LCBncmFkaWVudEVuZFBvaW50Qi55KSwKICAgICAgICAgICAgICAgIFtbMC42LCAncmdiYSgwLDAsMCwwKSddLAogICAgICAgICAgICAgICAgWzAuOCwgJ3JnYmEoMCwwLDAsJysoMC4zKmdyYWRpZW50T3BhY2l0eSkrJyknXSwKICAgICAgICAgICAgICAgIFsxLCAncmdiYSgwLDAsMCwwKSddCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgMyk7CiAgICAgICAgfQoKICAgICAgfTsKCiAgICAgIHN3aXRjaCAocG9pbnQuY29ybmVyKSB7CiAgICAgICAgY2FzZSAnbCcgOgoKCiAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAncicgOgoKCiAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAndGwnIDoKICAgICAgICAgIHBvaW50LnggPSBNYXRoLm1heChwb2ludC54LCAxKTsKICAgICAgICAgIGNvbXB1dGUoKTsKICAgICAgICAgIHRyYW5zZm9ybSh0ciwgWzEsMCwwLDFdLCBbMTAwLCAwXSwgYSk7CiAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAndHInIDoKICAgICAgICAgIHBvaW50LnggPSBNYXRoLm1pbihwb2ludC54LCB3aWR0aC0xKTsKICAgICAgICAgIGNvbXB1dGUoKTsKICAgICAgICAgIHRyYW5zZm9ybShwb2ludDJEKC10ci54LCB0ci55KSwgWzAsMCwwLDFdLCBbMCwgMF0sIC1hKTsKICAgICAgICBicmVhazsKICAgICAgICBjYXNlICdibCcgOgogICAgICAgICAgcG9pbnQueCA9IE1hdGgubWF4KHBvaW50LngsIDEpOwogICAgICAgICAgY29tcHV0ZSgpOwogICAgICAgICAgdHJhbnNmb3JtKHBvaW50MkQodHIueCwgLXRyLnkpLCBbMSwxLDAsMF0sIFsxMDAsIDEwMF0sIC1hKTsKICAgICAgICBicmVhazsKICAgICAgICBjYXNlICdicicgOgogICAgICAgICAgcG9pbnQueCA9IE1hdGgubWluKHBvaW50LngsIHdpZHRoLTEpOwogICAgICAgICAgY29tcHV0ZSgpOwogICAgICAgICAgdHJhbnNmb3JtKHBvaW50MkQoLXRyLngsIC10ci55KSwgWzAsMSwxLDBdLCBbMCwgMTAwXSwgYSk7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KCiAgICBicmVhazsKICB9CgogICAgZGF0YS5wb2ludCA9IHBvaW50OwogIAogIH0sCgogIF9tb3ZlRm9sZGluZ1BhZ2U6IGZ1bmN0aW9uKG1vdmUpIHsKCiAgICB2YXIgZGF0YSA9IHRoaXMuZGF0YSgpLmY7CgogICAgaWYgKCFkYXRhKQogICAgICByZXR1cm47CgogICAgdmFyIHR1cm4gPSBkYXRhLm9wdHMudHVybiwKICAgICAgdHVybkRhdGEgPSB0dXJuLmRhdGEoKSwKICAgICAgcGxhY2UgPSB0dXJuRGF0YS5wYWdlUGxhY2U7CiAgICAgIAogICAgaWYgKG1vdmUpIHsKCiAgICAgIHZhciBuZXh0UGFnZSA9IGRhdGEub3B0cy5uZXh0OwogIAogICAgICBpZiAocGxhY2VbbmV4dFBhZ2VdIT1kYXRhLm9wdHMucGFnZSkgewoKICAgICAgICBpZiAoZGF0YS5mb2xkaW5nKQogICAgICAgICAgZmxpcE1ldGhvZHMuX21vdmVGb2xkaW5nUGFnZS5jYWxsKHRoaXMsIGZhbHNlKTsKCiAgICAgICAgdmFyIGZvbGRpbmcgPSBmbGlwTWV0aG9kcy5fZm9sZGluZ1BhZ2UuY2FsbCh0aGlzKTsKICAgICAgICAKICAgICAgICBmb2xkaW5nLmFwcGVuZFRvKGRhdGEuZnBhZ2UpOwogICAgICAgIHBsYWNlW25leHRQYWdlXSA9IGRhdGEub3B0cy5wYWdlOwogICAgICAgIGRhdGEuZm9sZGluZyA9IG5leHRQYWdlOwogICAgICB9CgogICAgICB0dXJuLnR1cm4oJ3VwZGF0ZScpOwoKICAgIH0gZWxzZSB7CgogICAgICBpZiAoZGF0YS5mb2xkaW5nKSB7CgogICAgICAgIGlmICh0dXJuRGF0YS5wYWdlc1tkYXRhLmZvbGRpbmddKSB7CiAgICAgICAgIAogICAgICAgICAgLy8gSWYgd2UgaGF2ZSBmbGlwIGF2YWlsYWJsZQoKICAgICAgICAgIHZhciBmbGlwRGF0YSA9IHR1cm5EYXRhLnBhZ2VzW2RhdGEuZm9sZGluZ10uZGF0YSgpLmY7CiAgICAgICAgICAKICAgICAgICAgIHR1cm5EYXRhLnBhZ2VPYmpzW2RhdGEuZm9sZGluZ10uCiAgICAgICAgICAgIGFwcGVuZFRvKGZsaXBEYXRhLndyYXBwZXIpOwoKICAgICAgICB9IGVsc2UgaWYgKHR1cm5EYXRhLnBhZ2VXcmFwW2RhdGEuZm9sZGluZ10pIHsKICAgICAgICAgIAogICAgICAgICAgLy8gSWYgd2UgaGF2ZSB0aGUgcGFnZVdyYXBwZXIKCiAgICAgICAgICB0dXJuRGF0YS5wYWdlT2Jqc1tkYXRhLmZvbGRpbmddLgogICAgICAgICAgICBhcHBlbmRUbyh0dXJuRGF0YS5wYWdlV3JhcFtkYXRhLmZvbGRpbmddKTsKCiAgICAgICAgfQoKICAgICAgICBpZiAoZGF0YS5mb2xkaW5nIGluIHBsYWNlKSB7CiAgICAgICAgICBwbGFjZVtkYXRhLmZvbGRpbmddID0gZGF0YS5mb2xkaW5nOwogICAgICAgIH0KCiAgICAgICAgZGVsZXRlIGRhdGEuZm9sZGluZzsKCiAgICAgIH0KICAgIH0KICB9LAoKICBfc2hvd0ZvbGRlZFBhZ2U6IGZ1bmN0aW9uKGMsIGFuaW1hdGUpIHsKCiAgICB2YXIgZm9sZGluZyA9IGZsaXBNZXRob2RzLl9mb2xkaW5nUGFnZS5jYWxsKHRoaXMpLAogICAgICBkZCA9IHRoaXMuZGF0YSgpLAogICAgICBkYXRhID0gZGQuZiwKICAgICAgdmlzaWJsZSA9IGRhdGEudmlzaWJsZTsKCiAgICBpZiAoZm9sZGluZykgewoKICAgICAgaWYgKCF2aXNpYmxlIHx8ICFkYXRhLnBvaW50IHx8IGRhdGEucG9pbnQuY29ybmVyIT1jLmNvcm5lcikgewoKICAgICAgICB2YXIgY29ybmVyID0gKAogICAgICAgICAgZGF0YS5zdGF0dXM9PSdob3ZlcicgfHwKICAgICAgICAgIGRhdGEuc3RhdHVzPT0ncGVlbCcgfHwKICAgICAgICAgIGRhdGEub3B0cy50dXJuLmRhdGEoKS5tb3VzZUFjdGlvbikgPwogICAgICAgIGMuY29ybmVyIDogbnVsbDsKCiAgICAgICAgdmlzaWJsZSA9IGZhbHNlOwoKICAgICAgICBpZiAodHJpZ2dlcignc3RhcnQnLCB0aGlzLCBbZGF0YS5vcHRzLCBjb3JuZXJdKT09J3ByZXZlbnRlZCcpCiAgICAgICAgICByZXR1cm4gZmFsc2U7CgogICAgICB9CgogICAgICBpZiAoYW5pbWF0ZSkgewogICAgICAgIAogICAgICAgIHZhciB0aGF0ID0gdGhpcywKICAgICAgICAgIHBvaW50ID0gKGRhdGEucG9pbnQgJiYgZGF0YS5wb2ludC5jb3JuZXI9PWMuY29ybmVyKSA/CiAgICAgICAgICBkYXRhLnBvaW50IDogZmxpcE1ldGhvZHMuX2MuY2FsbCh0aGlzLCBjLmNvcm5lciwgMSk7CiAgICAgIAogICAgICAgIHRoaXMuYW5pbWF0ZWYoewogICAgICAgICAgZnJvbTogW3BvaW50LngsIHBvaW50LnldLAogICAgICAgICAgdG86IFtjLngsIGMueV0sCiAgICAgICAgICBkdXJhdGlvbjogNTAwLAogICAgICAgICAgZnJhbWU6IGZ1bmN0aW9uKHYpIHsKICAgICAgICAgICAgYy54ID0gTWF0aC5yb3VuZCh2WzBdKTsKICAgICAgICAgICAgYy55ID0gTWF0aC5yb3VuZCh2WzFdKTsKICAgICAgICAgICAgZmxpcE1ldGhvZHMuX2ZvbGQuY2FsbCh0aGF0LCBjKTsKICAgICAgICAgIH0KICAgICAgICB9KTsKCiAgICAgIH0gZWxzZSAgewoKICAgICAgICBmbGlwTWV0aG9kcy5fZm9sZC5jYWxsKHRoaXMsIGMpOwoKICAgICAgICBpZiAoZGQuZWZmZWN0ICYmICFkZC5lZmZlY3QudHVybmluZykKICAgICAgICAgIHRoaXMuYW5pbWF0ZWYoZmFsc2UpOwoKICAgICAgfQoKICAgICAgaWYgKCF2aXNpYmxlKSB7CgogICAgICAgIHN3aXRjaChkYXRhLmVmZmVjdCkgewogICAgICAgICAgY2FzZSAnaGFyZCc6CgogICAgICAgICAgICBkYXRhLnZpc2libGUgPSB0cnVlOwogICAgICAgICAgICBmbGlwTWV0aG9kcy5fbW92ZUZvbGRpbmdQYWdlLmNhbGwodGhpcywgdHJ1ZSk7CiAgICAgICAgICAgIGRhdGEuZnBhZ2Uuc2hvdygpOwogICAgICAgICAgICBpZiAoZGF0YS5vcHRzLnNoYWRvd3MpCiAgICAgICAgICAgICAgZGF0YS5ic2hhZG93LnNob3coKTsKCiAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgJ3NoZWV0JzoKCiAgICAgICAgICAgIGRhdGEudmlzaWJsZSA9IHRydWU7CiAgICAgICAgICAgIGRhdGEuZnBhcmVudC5zaG93KCkuZGF0YSgpLmZsaXBzKys7CiAgICAgICAgICAgIGZsaXBNZXRob2RzLl9tb3ZlRm9sZGluZ1BhZ2UuY2FsbCh0aGlzLCB0cnVlKTsKICAgICAgICAgICAgZGF0YS5md3JhcHBlci5zaG93KCk7CiAgICAgICAgICAgIGlmIChkYXRhLmJzaGFkb3cpCiAgICAgICAgICAgICAgZGF0YS5ic2hhZG93LnNob3coKTsKCiAgICAgICAgICBicmVhazsKICAgICAgICB9CgogICAgICB9CgogICAgICByZXR1cm4gdHJ1ZTsKCiAgICB9CgogICAgcmV0dXJuIGZhbHNlOwogIH0sCgogIGhpZGU6IGZ1bmN0aW9uKCkgewoKICAgIHZhciBkYXRhID0gdGhpcy5kYXRhKCkuZiwKICAgICAgdHVybkRhdGEgPSBkYXRhLm9wdHMudHVybi5kYXRhKCksCiAgICAgIGZvbGRpbmcgPSBmbGlwTWV0aG9kcy5fZm9sZGluZ1BhZ2UuY2FsbCh0aGlzKTsKCiAgICBzd2l0Y2ggKGRhdGEuZWZmZWN0KSB7CiAgICAgIGNhc2UgJ2hhcmQnOgogICAgICAgIAogICAgICAgIGlmICh0dXJuRGF0YS5vcHRzLmdyYWRpZW50cykgewogICAgICAgICAgZGF0YS5ic2hhZG93TG9jID0gMDsKICAgICAgICAgIGRhdGEuYnNoYWRvdy5yZW1vdmUoKTsKICAgICAgICAgIGRhdGEuYXNoYWRvdy5oaWRlKCk7CiAgICAgICAgfQoKICAgICAgICBkYXRhLndyYXBwZXIudHJhbnNmb3JtKCcnKTsKICAgICAgICBkYXRhLmZwYWdlLmhpZGUoKTsKCiAgICAgIGJyZWFrOwogICAgICBjYXNlICdzaGVldCc6CgogICAgICAgIGlmICgoLS1kYXRhLmZwYXJlbnQuZGF0YSgpLmZsaXBzKT09PTApCiAgICAgICAgICBkYXRhLmZwYXJlbnQuaGlkZSgpOwoKICAgICAgICB0aGlzLmNzcyh7bGVmdDogMCwgdG9wOiAwLCByaWdodDogJ2F1dG8nLCBib3R0b206ICdhdXRvJ30pLgogICAgICAgICAgdHJhbnNmb3JtKCcnKTsKCiAgICAgICAgZGF0YS53cmFwcGVyLnRyYW5zZm9ybSgnJyk7CgogICAgICAgIGRhdGEuZndyYXBwZXIuaGlkZSgpOwoKICAgICAgICBpZiAoZGF0YS5ic2hhZG93KQogICAgICAgICAgZGF0YS5ic2hhZG93LmhpZGUoKTsKCiAgICAgICAgZm9sZGluZy50cmFuc2Zvcm0oJycpOwoKICAgICAgYnJlYWs7CiAgICB9CgogICAgICBkYXRhLnZpc2libGUgPSBmYWxzZTsKCiAgICByZXR1cm4gdGhpczsKICB9LAoKICBoaWRlRm9sZGVkUGFnZTogZnVuY3Rpb24oYW5pbWF0ZSkgewoKICAgIHZhciBkYXRhID0gdGhpcy5kYXRhKCkuZjsKCiAgICBpZiAoIWRhdGEucG9pbnQpIHJldHVybjsKCiAgICB2YXIgdGhhdCA9IHRoaXMsCiAgICAgIHAxID0gZGF0YS5wb2ludCwKICAgICAgaGlkZSA9IGZ1bmN0aW9uKCkgewogICAgICAgIGRhdGEucG9pbnQgPSBudWxsOwogICAgICAgIGRhdGEuc3RhdHVzID0gJyc7CiAgICAgICAgdGhhdC5mbGlwKCdoaWRlJyk7CiAgICAgICAgdGhhdC50cmlnZ2VyKCdlbmQnLCBbZGF0YS5vcHRzLCBmYWxzZV0pOwogICAgICB9OwoKICAgIGlmIChhbmltYXRlKSB7CgogICAgICB2YXIgcDQgPSBmbGlwTWV0aG9kcy5fYy5jYWxsKHRoaXMsIHAxLmNvcm5lciksCiAgICAgICAgdG9wID0gKHAxLmNvcm5lci5zdWJzdHIoMCwxKT09J3QnKSwKICAgICAgICBkZWx0YSA9ICh0b3ApID8gTWF0aC5taW4oMCwgcDEueS1wNC55KS8yIDogTWF0aC5tYXgoMCwgcDEueS1wNC55KS8yLAogICAgICAgIHAyID0gcG9pbnQyRChwMS54LCBwMS55K2RlbHRhKSwKICAgICAgICBwMyA9IHBvaW50MkQocDQueCwgcDQueS1kZWx0YSk7CiAgICAKICAgICAgdGhpcy5hbmltYXRlZih7CiAgICAgICAgZnJvbTogMCwKICAgICAgICB0bzogMSwKICAgICAgICBmcmFtZTogZnVuY3Rpb24odikgewogICAgICAgICAgdmFyIG5wID0gYmV6aWVyKHAxLCBwMiwgcDMsIHA0LCB2KTsKICAgICAgICAgIHAxLnggPSBucC54OwogICAgICAgICAgcDEueSA9IG5wLnk7CiAgICAgICAgICBmbGlwTWV0aG9kcy5fZm9sZC5jYWxsKHRoYXQsIHAxKTsKICAgICAgICB9LAogICAgICAgIGNvbXBsZXRlOiBoaWRlLAogICAgICAgIGR1cmF0aW9uOiA4MDAsCiAgICAgICAgaGlkaW5nOiB0cnVlCiAgICAgIH0pOwoKICAgIH0gZWxzZSB7CgogICAgICB0aGlzLmFuaW1hdGVmKGZhbHNlKTsKICAgICAgaGlkZSgpOwoKICAgIH0KICB9LAoKICB0dXJuUGFnZTogZnVuY3Rpb24oY29ybmVyKSB7CgogICAgdmFyIHRoYXQgPSB0aGlzLAogICAgICBkYXRhID0gdGhpcy5kYXRhKCkuZiwKICAgICAgdHVybkRhdGEgPSBkYXRhLm9wdHMudHVybi5kYXRhKCk7CgogICAgY29ybmVyID0ge2Nvcm5lcjogKGRhdGEuY29ybmVyKSA/CiAgICAgIGRhdGEuY29ybmVyLmNvcm5lciA6CiAgICAgIGNvcm5lciB8fCBmbGlwTWV0aG9kcy5fY0FsbG93ZWQuY2FsbCh0aGlzKVswXX07CgogICAgdmFyIHAxID0gZGF0YS5wb2ludCB8fAogICAgICBmbGlwTWV0aG9kcy5fYy5jYWxsKHRoaXMsCiAgICAgICAgY29ybmVyLmNvcm5lciwKICAgICAgICAoZGF0YS5vcHRzLnR1cm4pID8gdHVybkRhdGEub3B0cy5lbGV2YXRpb24gOiAwKSwKICAgICAgcDQgPSBmbGlwTWV0aG9kcy5fYzIuY2FsbCh0aGlzLCBjb3JuZXIuY29ybmVyKTsKCiAgICAgIHRoaXMudHJpZ2dlcignZmxpcCcpLgogICAgICAgIGFuaW1hdGVmKHsKICAgICAgICAgIGZyb206IDAsCiAgICAgICAgICB0bzogMSwKICAgICAgICAgIGZyYW1lOiBmdW5jdGlvbih2KSB7CgogICAgICAgICAgICB2YXIgbnAgPSBiZXppZXIocDEsIHAxLCBwNCwgcDQsIHYpOwogICAgICAgICAgICBjb3JuZXIueCA9IG5wLng7CiAgICAgICAgICAgIGNvcm5lci55ID0gbnAueTsKICAgICAgICAgICAgZmxpcE1ldGhvZHMuX3Nob3dGb2xkZWRQYWdlLmNhbGwodGhhdCwgY29ybmVyKTsKCiAgICAgICAgICB9LAogICAgICAgICAgY29tcGxldGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAKICAgICAgICAgICAgdGhhdC50cmlnZ2VyKCdlbmQnLCBbZGF0YS5vcHRzLCB0cnVlXSk7CgogICAgICAgICAgfSwKICAgICAgICAgIGR1cmF0aW9uOiB0dXJuRGF0YS5vcHRzLmR1cmF0aW9uLAogICAgICAgICAgdHVybmluZzogdHJ1ZQogICAgICAgIH0pOwoKICAgICAgZGF0YS5jb3JuZXIgPSBudWxsOwogIH0sCgogIG1vdmluZzogZnVuY3Rpb24oKSB7CgogICAgcmV0dXJuICdlZmZlY3QnIGluIHRoaXMuZGF0YSgpOwogIAogIH0sCgogIGlzVHVybmluZzogZnVuY3Rpb24oKSB7CgogICAgcmV0dXJuIHRoaXMuZmxpcCgnbW92aW5nJykgJiYgdGhpcy5kYXRhKCkuZWZmZWN0LnR1cm5pbmc7CiAgCiAgfSwKCiAgY29ybmVyOiBmdW5jdGlvbigpIHsKICAgIAogICAgcmV0dXJuIHRoaXMuZGF0YSgpLmYuY29ybmVyOwogICAgICAKICB9LAoKICBfZXZlbnRTdGFydDogZnVuY3Rpb24oZSkgewoKICAgIHZhciBkYXRhID0gdGhpcy5kYXRhKCkuZiwKICAgICAgdHVybiA9IGRhdGEub3B0cy50dXJuOwoKICAgIGlmICghZGF0YS5jb3JuZXIgJiYgIWRhdGEuZGlzYWJsZWQgJiYgIXRoaXMuZmxpcCgnaXNUdXJuaW5nJykgJiYKICAgICAgZGF0YS5vcHRzLnBhZ2U9PXR1cm4uZGF0YSgpLnBhZ2VQbGFjZVtkYXRhLm9wdHMucGFnZV0pCiAgICB7CgogICAgICBkYXRhLmNvcm5lciA9IGZsaXBNZXRob2RzLl9pc0lBcmVhLmNhbGwodGhpcywgZSk7CgogICAgICBpZiAoZGF0YS5jb3JuZXIgJiYgZmxpcE1ldGhvZHMuX2ZvbGRpbmdQYWdlLmNhbGwodGhpcykpIHsKCiAgICAgICAgdGhpcy50cmlnZ2VyKCdwcmVzc2VkJywgW2RhdGEucG9pbnRdKTsKICAgICAgICBmbGlwTWV0aG9kcy5fc2hvd0ZvbGRlZFBhZ2UuY2FsbCh0aGlzLCBkYXRhLmNvcm5lcik7CgogICAgICAgIHJldHVybiBmYWxzZTsKCiAgICAgIH0gZWxzZQogICAgICAgIGRhdGEuY29ybmVyID0gbnVsbDsKCiAgICB9CgogIH0sCgogIF9ldmVudE1vdmU6IGZ1bmN0aW9uKGUpIHsKCiAgICB2YXIgZGF0YSA9IHRoaXMuZGF0YSgpLmY7CgogICAgaWYgKCFkYXRhLmRpc2FibGVkKSB7CgogICAgICBlID0gKGlzVG91Y2gpID8gZS5vcmlnaW5hbEV2ZW50LnRvdWNoZXMgOiBbZV07CgogICAgICBpZiAoZGF0YS5jb3JuZXIpIHsKCiAgICAgICAgdmFyIHBvcyA9IGRhdGEucGFyZW50Lm9mZnNldCgpOwogICAgICAgIGRhdGEuY29ybmVyLnggPSBlWzBdLnBhZ2VYLXBvcy5sZWZ0OwogICAgICAgIGRhdGEuY29ybmVyLnkgPSBlWzBdLnBhZ2VZLXBvcy50b3A7CiAgICAgICAgZmxpcE1ldGhvZHMuX3Nob3dGb2xkZWRQYWdlLmNhbGwodGhpcywgZGF0YS5jb3JuZXIpOwoKICAgICAgfSBlbHNlIGlmIChkYXRhLmhvdmVyICYmICF0aGlzLmRhdGEoKS5lZmZlY3QgJiYgdGhpcy5pcygnOnZpc2libGUnKSkgewoKICAgICAgICB2YXIgcG9pbnQgPSBmbGlwTWV0aG9kcy5faXNJQXJlYS5jYWxsKHRoaXMsIGVbMF0pOwoKICAgICAgICBpZiAocG9pbnQpIHsKCiAgICAgICAgICBpZiAoKGRhdGEuZWZmZWN0PT0nc2hlZXQnICYmIHBvaW50LmNvcm5lci5sZW5ndGg9PTIpICB8fCBkYXRhLmVmZmVjdD09J2hhcmQnKSB7CiAgICAgICAgICAgIGRhdGEuc3RhdHVzID0gJ2hvdmVyJzsKICAgICAgICAgICAgdmFyIG9yaWdpbiA9IGZsaXBNZXRob2RzLl9jLmNhbGwodGhpcywgcG9pbnQuY29ybmVyLCBkYXRhLm9wdHMuY29ybmVyU2l6ZS8yKTsKICAgICAgICAgICAgcG9pbnQueCA9IG9yaWdpbi54OwogICAgICAgICAgICBwb2ludC55ID0gb3JpZ2luLnk7CiAgICAgICAgICAgIGZsaXBNZXRob2RzLl9zaG93Rm9sZGVkUGFnZS5jYWxsKHRoaXMsIHBvaW50LCB0cnVlKTsKICAgICAgICAgIH0KICAgICAgICAKICAgICAgICB9IGVsc2UgewogICAgICAgICAgCiAgICAgICAgICBpZiAoZGF0YS5zdGF0dXM9PSdob3ZlcicpIHsKICAgICAgICAgICAgZGF0YS5zdGF0dXMgPSAnJzsKICAgICAgICAgICAgZmxpcE1ldGhvZHMuaGlkZUZvbGRlZFBhZ2UuY2FsbCh0aGlzLCB0cnVlKTsKICAgICAgICAgIH0KCiAgICAgICAgfQoKICAgICAgfQoKICAgIH0KCiAgfSwKCiAgX2V2ZW50RW5kOiBmdW5jdGlvbigpIHsKCiAgICB2YXIgZGF0YSA9IHRoaXMuZGF0YSgpLmYsCiAgICAgIGNvcm5lciA9IGRhdGEuY29ybmVyOwoKICAgIGlmICghZGF0YS5kaXNhYmxlZCAmJiBjb3JuZXIpIHsKICAgICAgaWYgKHRyaWdnZXIoJ3JlbGVhc2VkJywgdGhpcywgW2RhdGEucG9pbnQgfHwgY29ybmVyXSkhPSdwcmV2ZW50ZWQnKSB7CiAgICAgICAgZmxpcE1ldGhvZHMuaGlkZUZvbGRlZFBhZ2UuY2FsbCh0aGlzLCB0cnVlKTsKICAgICAgfQogICAgfQoKICAgIGRhdGEuY29ybmVyID0gbnVsbDsKCiAgfSwKCiAgZGlzYWJsZTogZnVuY3Rpb24oZGlzYWJsZSkgewoKICAgIGZsaXBNZXRob2RzLnNldERhdGEuY2FsbCh0aGlzLCB7J2Rpc2FibGVkJzogZGlzYWJsZX0pOwogICAgcmV0dXJuIHRoaXM7CgogIH0sCgogIGhvdmVyOiBmdW5jdGlvbihob3ZlcikgewogICAgCiAgICBmbGlwTWV0aG9kcy5zZXREYXRhLmNhbGwodGhpcywgeydob3Zlcic6IGhvdmVyfSk7CiAgICByZXR1cm4gdGhpczsKCiAgfSwKCiAgcGVlbDogZnVuY3Rpb24gKGNvcm5lciwgYW5pbWF0ZSkgewoKICAgIHZhciBkYXRhID0gdGhpcy5kYXRhKCkuZjsKCiAgICBpZiAoY29ybmVyKSB7CgogICAgICBpZiAoJC5pbkFycmF5KGNvcm5lciwgY29ybmVycy5hbGwpPT0tMSkKICAgICAgICB0aHJvdyB0dXJuRXJyb3IoJ0Nvcm5lciAnK2Nvcm5lcisnIGlzIG5vdCBwZXJtaXR0ZWQnKTsKCiAgICAgIGlmICgkLmluQXJyYXkoY29ybmVyLCBmbGlwTWV0aG9kcy5fY0FsbG93ZWQuY2FsbCh0aGlzKSkhPS0xKSB7CgogICAgICAgIHZhciBwb2ludCA9IGZsaXBNZXRob2RzLl9jLmNhbGwodGhpcywgY29ybmVyLCBkYXRhLm9wdHMuY29ybmVyU2l6ZS8yKTsKICAgICAgICAKICAgICAgICBkYXRhLnN0YXR1cyA9ICdwZWVsJzsKCiAgICAgICAgZmxpcE1ldGhvZHMuX3Nob3dGb2xkZWRQYWdlLmNhbGwodGhpcywKICAgICAgICB7CiAgICAgICAgICBjb3JuZXI6IGNvcm5lciwKICAgICAgICAgIHg6IHBvaW50LngsCiAgICAgICAgICB5OiBwb2ludC55CiAgICAgICAgfSwgYW5pbWF0ZSk7CgogICAgICB9CgoKICAgIH0gZWxzZSB7CgogICAgICBkYXRhLnN0YXR1cyA9ICcnOwoKICAgICAgZmxpcE1ldGhvZHMuaGlkZUZvbGRlZFBhZ2UuY2FsbCh0aGlzLCBhbmltYXRlKTsKICAgICAgCiAgICB9CgogICAgcmV0dXJuIHRoaXM7CiAgfQp9OwoKCi8vIFByb2Nlc3NlcyBjbGFzc2VzCgpmdW5jdGlvbiBkZWModGhhdCwgbWV0aG9kcywgYXJncykgewoKICBpZiAoIWFyZ3NbMF0gfHwgdHlwZW9mKGFyZ3NbMF0pPT0nb2JqZWN0JykKICAgIHJldHVybiBtZXRob2RzLmluaXQuYXBwbHkodGhhdCwgYXJncyk7CgogIGVsc2UgaWYgKG1ldGhvZHNbYXJnc1swXV0pCiAgICByZXR1cm4gbWV0aG9kc1thcmdzWzBdXS5hcHBseSh0aGF0LCBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmdzLCAxKSk7CgogIGVsc2UKICAgIHRocm93IHR1cm5FcnJvcihhcmdzWzBdICsgJyBpcyBub3QgYSBtZXRob2Qgb3IgcHJvcGVydHknKTsKCn0KCgovLyBBdHRyaWJ1dGVzIGZvciBhIGxheWVyCgpmdW5jdGlvbiBkaXZBdHQodG9wLCBsZWZ0LCB6SW5kZXgsIG92ZXJmKSB7CiAgICAKICByZXR1cm4geydjc3MnOiB7CiAgICBwb3NpdGlvbjogJ2Fic29sdXRlJywKICAgIHRvcDogdG9wLAogICAgbGVmdDogbGVmdCwKICAgICdvdmVyZmxvdyc6IG92ZXJmIHx8ICdoaWRkZW4nLAogICAgekluZGV4OiB6SW5kZXggfHwgJ2F1dG8nCiAgfQp9OwogICAgICAKfQoKLy8gR2V0cyBhIDJEIHBvaW50IGZyb20gYSBiZXppZXIgY3VydmUgb2YgZm91ciBwb2ludHMKCmZ1bmN0aW9uIGJlemllcihwMSwgcDIsIHAzLCBwNCwgdCkgewoKICB2YXIgYSA9IDEgLSB0LAogICAgYiA9IGEgKiBhICogYSwKICAgIGMgPSB0ICogdCAqIHQ7CiAgICAKICByZXR1cm4gcG9pbnQyRChNYXRoLnJvdW5kKGIqcDEueCArIDMqdCphKmEqcDIueCArIDMqdCp0KmEqcDMueCArIGMqcDQueCksCiAgICBNYXRoLnJvdW5kKGIqcDEueSArIDMqdCphKmEqcDIueSArIDMqdCp0KmEqcDMueSArIGMqcDQueSkpOwoKfQogIAovLyBDb252ZXJ0cyBhbiBhbmdsZSBmcm9tIGRlZ3JlZXMgdG8gcmFkaWFucwoKZnVuY3Rpb24gcmFkKGRlZ3JlZXMpIHsKICAKICByZXR1cm4gZGVncmVlcy8xODAqUEk7Cgp9CgovLyBDb252ZXJ0cyBhbiBhbmdsZSBmcm9tIHJhZGlhbnMgdG8gZGVncmVlcwoKZnVuY3Rpb24gZGVnKHJhZGlhbnMpIHsKICAKICByZXR1cm4gcmFkaWFucy9QSSoxODA7Cgp9CgovLyBHZXRzIGEgMkQgcG9pbnQKCmZ1bmN0aW9uIHBvaW50MkQoeCwgeSkgewogIAogIHJldHVybiB7eDogeCwgeTogeX07Cgp9CgovLyBXZWJraXQgNTM0LjMgb24gQW5kcm9pZCB3cm9uZ2x5IHJlcGFpbnRzIGVsZW1lbnRzIHRoYXQgdXNlIG92ZXJmbG93OmhpZGRlbiArIHJvdGF0aW9uCgpmdW5jdGlvbiByb3RhdGlvbkF2YWlsYWJsZSgpIHsKICB2YXIgcGFydHM7CgogIGlmICgocGFydHMgPSAvQXBwbGVXZWJraXRcLyhbMC05XC5dKykvaS5leGVjKG5hdmlnYXRvci51c2VyQWdlbnQpKSkgewogICAgdmFyIHdlYmtpdFZlcnNpb24gPSBwYXJzZUZsb2F0KHBhcnRzWzFdKTsKICAgIHJldHVybiAod2Via2l0VmVyc2lvbj41MzQuMyk7CiAgfSBlbHNlIHsKICAgIHJldHVybiB0cnVlOwogIH0KfQoKLy8gUmV0dXJucyB0aGUgdHJhc2xhdGUgdmFsdWUKCmZ1bmN0aW9uIHRyYW5zbGF0ZSh4LCB5LCB1c2UzZCkgewogIAogIHJldHVybiAoaGFzM2QgJiYgdXNlM2QpID8gJyB0cmFuc2xhdGUzZCgnICsgeCArICdweCwnICsgeSArICdweCwgMHB4KSAnCiAgOiAnIHRyYW5zbGF0ZSgnICsgeCArICdweCwgJyArIHkgKyAncHgpICc7Cgp9CgovLyBSZXR1cm5zIHRoZSByb3RhdGlvbiB2YWx1ZQoKZnVuY3Rpb24gcm90YXRlKGRlZ3JlZXMpIHsKICAKICByZXR1cm4gJyByb3RhdGUoJyArIGRlZ3JlZXMgKyAnZGVnKSAnOwoKfQoKLy8gQ2hlY2tzIGlmIGEgcHJvcGVydHkgYmVsb25ncyB0byBhbiBvYmplY3QKCmZ1bmN0aW9uIGhhcyhwcm9wZXJ0eSwgb2JqZWN0KSB7CiAgCiAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIHByb3BlcnR5KTsKCn0KCi8vIEdldHMgdGhlIENTUzMgdmVuZG9yIHByZWZpeAoKZnVuY3Rpb24gZ2V0UHJlZml4KCkgewoKICB2YXIgdmVuZG9yUHJlZml4ZXMgPSBbJ01veicsJ1dlYmtpdCcsJ0todG1sJywnTycsJ21zJ10sCiAgbGVuID0gdmVuZG9yUHJlZml4ZXMubGVuZ3RoLAogIHZlbmRvciA9ICcnOwoKICB3aGlsZSAobGVuLS0pCiAgICBpZiAoKHZlbmRvclByZWZpeGVzW2xlbl0gKyAnVHJhbnNmb3JtJykgaW4gZG9jdW1lbnQuYm9keS5zdHlsZSkKICAgICAgdmVuZG9yPSctJyt2ZW5kb3JQcmVmaXhlc1tsZW5dLnRvTG93ZXJDYXNlKCkrJy0nOwoKICByZXR1cm4gdmVuZG9yOwoKfQoKLy8gRGV0ZWN0cyB0aGUgdHJhbnNpdGlvbkVuZCBFdmVudAoKZnVuY3Rpb24gZ2V0VHJhbnNpdGlvbkVuZCgpIHsKCiAgdmFyIHQsCiAgICBlbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2Zha2VlbGVtZW50JyksCiAgICB0cmFuc2l0aW9ucyA9IHsKICAgICAgJ3RyYW5zaXRpb24nOid0cmFuc2l0aW9uZW5kJywKICAgICAgJ09UcmFuc2l0aW9uJzonb1RyYW5zaXRpb25FbmQnLAogICAgICAnTVNUcmFuc2l0aW9uJzondHJhbnNpdGlvbmVuZCcsCiAgICAgICdNb3pUcmFuc2l0aW9uJzondHJhbnNpdGlvbmVuZCcsCiAgICAgICdXZWJraXRUcmFuc2l0aW9uJzond2Via2l0VHJhbnNpdGlvbkVuZCcKICAgIH07CgogIGZvciAodCBpbiB0cmFuc2l0aW9ucykgewogICAgaWYgKGVsLnN0eWxlW3RdICE9PSB1bmRlZmluZWQpIHsKICAgICAgcmV0dXJuIHRyYW5zaXRpb25zW3RdOwogICAgfQogIH0KfQoKLy8gR3JhZGllbnRzCgpmdW5jdGlvbiBncmFkaWVudChvYmosIHAwLCBwMSwgY29sb3JzLCBudW1Db2xvcnMpIHsKCiAgdmFyIGosIGNvbHMgPSBbXTsKCiAgaWYgKHZlbmRvcj09Jy13ZWJraXQtJykgewoKICAgIGZvciAoaiA9IDA7IGo8bnVtQ29sb3JzOyBqKyspCiAgICAgIGNvbHMucHVzaCgnY29sb3Itc3RvcCgnK2NvbG9yc1tqXVswXSsnLCAnK2NvbG9yc1tqXVsxXSsnKScpOwogICAgCiAgICBvYmouY3NzKHsnYmFja2dyb3VuZC1pbWFnZSc6CiAgICAgICAgJy13ZWJraXQtZ3JhZGllbnQobGluZWFyLCAnKwogICAgICAgIHAwLngrJyUgJysKICAgICAgICBwMC55KyclLCcrCiAgICAgICAgcDEueCsnJSAnKwogICAgICAgIHAxLnkrJyUsICcrCiAgICAgICAgY29scy5qb2luKCcsJykgKyAnICknfSk7CiAgfSBlbHNlIHsKICAgIAogICAgcDAgPSB7eDpwMC54LzEwMCAqIG9iai53aWR0aCgpLCB5OnAwLnkvMTAwICogb2JqLmhlaWdodCgpfTsKICAgIHAxID0ge3g6cDEueC8xMDAgKiBvYmoud2lkdGgoKSwgeTpwMS55LzEwMCAqIG9iai5oZWlnaHQoKX07CgogICAgdmFyIGR4ID0gcDEueC1wMC54LAogICAgICBkeSA9IHAxLnktcDAueSwKICAgICAgYW5nbGUgPSBNYXRoLmF0YW4yKGR5LCBkeCksCiAgICAgIGFuZ2xlMiA9IGFuZ2xlIC0gTWF0aC5QSS8yLAogICAgICBkaWFnb25hbCA9IE1hdGguYWJzKG9iai53aWR0aCgpKk1hdGguc2luKGFuZ2xlMikpK01hdGguYWJzKG9iai5oZWlnaHQoKSpNYXRoLmNvcyhhbmdsZTIpKSwKICAgICAgZ3JhZGllbnREaWFnb25hbCA9IE1hdGguc3FydChkeSpkeSArIGR4KmR4KSwKICAgICAgY29ybmVyID0gcG9pbnQyRCgocDEueDxwMC54KSA/IG9iai53aWR0aCgpIDogMCwgKHAxLnk8cDAueSkgPyBvYmouaGVpZ2h0KCkgOiAwKSwKICAgICAgc2xvcGUgPSBNYXRoLnRhbihhbmdsZSksCiAgICAgIGludmVyc2UgPSAtMS9zbG9wZSwKICAgICAgeCA9IChpbnZlcnNlKmNvcm5lci54IC0gY29ybmVyLnkgLSBzbG9wZSpwMC54ICsgcDAueSkvKGludmVyc2Utc2xvcGUpLAogICAgICBjID0ge3g6IHgsIHk6IGludmVyc2UqeCAtIGludmVyc2UqY29ybmVyLnggKyBjb3JuZXIueX0sCiAgICAgIHNlZ0EgPSAoTWF0aC5zcXJ0KCBNYXRoLnBvdyhjLngtcDAueCwyKSArIE1hdGgucG93KGMueS1wMC55LDIpKSk7CgogICAgICBmb3IgKGogPSAwOyBqPG51bUNvbG9yczsgaisrKQogICAgICAgIGNvbHMucHVzaCgnICcrY29sb3JzW2pdWzFdKycgJysoKHNlZ0EgKyBncmFkaWVudERpYWdvbmFsKmNvbG9yc1tqXVswXSkqMTAwL2RpYWdvbmFsKSsnJScpOwoKICAgICAgb2JqLmNzcyh7J2JhY2tncm91bmQtaW1hZ2UnOiB2ZW5kb3IrJ2xpbmVhci1ncmFkaWVudCgnICsgKC1hbmdsZSkgKyAncmFkLCcgKyBjb2xzLmpvaW4oJywnKSArICcpJ30pOwogIH0KfQoKCi8vIFRyaWdnZXJzIGFuIGV2ZW50CgpmdW5jdGlvbiB0cmlnZ2VyKGV2ZW50TmFtZSwgY29udGV4dCwgYXJncykgewoKICB2YXIgZXZlbnQgPSAkLkV2ZW50KGV2ZW50TmFtZSk7CiAgY29udGV4dC50cmlnZ2VyKGV2ZW50LCBhcmdzKTsKICBpZiAoZXZlbnQuaXNEZWZhdWx0UHJldmVudGVkKCkpCiAgICByZXR1cm4gJ3ByZXZlbnRlZCc7CiAgZWxzZSBpZiAoZXZlbnQuaXNQcm9wYWdhdGlvblN0b3BwZWQoKSkKICAgIHJldHVybiAnc3RvcHBlZCc7CiAgZWxzZQogICAgcmV0dXJuICcnOwp9CgovLyBKUyBFcnJvcnMKCmZ1bmN0aW9uIHR1cm5FcnJvcihtZXNzYWdlKSB7CgogIGZ1bmN0aW9uIFR1cm5Kc0Vycm9yKG1lc3NhZ2UpIHsKICAgIHRoaXMubmFtZSA9ICJUdXJuSnNFcnJvciI7CiAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlOwogIH0KCiAgVHVybkpzRXJyb3IucHJvdG90eXBlID0gbmV3IEVycm9yKCk7CiAgVHVybkpzRXJyb3IucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gVHVybkpzRXJyb3I7CiAgcmV0dXJuIG5ldyBUdXJuSnNFcnJvcihtZXNzYWdlKTsKCn0KCi8vIEZpbmQgdGhlIG9mZnNldCBvZiBhbiBlbGVtZW50IGlnbm9yaW5nIGl0cyB0cmFuc2Zvcm1hdGlvbgoKZnVuY3Rpb24gZmluZFBvcyhvYmopIHsKCiAgdmFyIG9mZnNldCA9IHt0b3A6IDAsIGxlZnQ6IDB9OwoKICBkb3sKICAgIG9mZnNldC5sZWZ0ICs9IG9iai5vZmZzZXRMZWZ0OwogICAgb2Zmc2V0LnRvcCArPSBvYmoub2Zmc2V0VG9wOwogIH0gd2hpbGUgKChvYmogPSBvYmoub2Zmc2V0UGFyZW50KSk7CgogIHJldHVybiBvZmZzZXQ7Cgp9CgovLyBDaGVja3MgaWYgdGhlcmUncyBoYXJkIHBhZ2UgY29tcGF0aWJpbGl0eQovLyBJRTkgaXMgdGhlIG9ubHkgYnJvd3NlciB0aGF0IGRvZXMgbm90IHN1cHBvcnQgaGFyZCBwYWdlcwoKZnVuY3Rpb24gaGFzSGFyZFBhZ2UoKSB7CiAgcmV0dXJuIChuYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoJ01TSUUgOS4wJyk9PS0xKTsKfQoKLy8gUmVxdWVzdCBhbiBhbmltYXRpb24KCndpbmRvdy5yZXF1ZXN0QW5pbSA9IChmdW5jdGlvbigpIHsKICByZXR1cm4gd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSB8fAogICAgd2luZG93LndlYmtpdFJlcXVlc3RBbmltYXRpb25GcmFtZSB8fAogICAgd2luZG93Lm1velJlcXVlc3RBbmltYXRpb25GcmFtZSB8fAogICAgd2luZG93Lm9SZXF1ZXN0QW5pbWF0aW9uRnJhbWUgfHwKICAgIHdpbmRvdy5tc1JlcXVlc3RBbmltYXRpb25GcmFtZSB8fAogICAgZnVuY3Rpb24oY2FsbGJhY2spIHsKICAgICAgd2luZG93LnNldFRpbWVvdXQoY2FsbGJhY2ssIDEwMDAgLyA2MCk7CiAgICB9OwoKfSkoKTsKCi8vIEV4dGVuZCAkLmZuCgokLmV4dGVuZCgkLmZuLCB7CgogIGZsaXA6IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIGRlYygkKHRoaXNbMF0pLCBmbGlwTWV0aG9kcywgYXJndW1lbnRzKTsKICB9LAoKICB0dXJuOiBmdW5jdGlvbigpIHsKICAgIHJldHVybiBkZWMoJCh0aGlzWzBdKSwgdHVybk1ldGhvZHMsIGFyZ3VtZW50cyk7CiAgfSwKCiAgdHJhbnNmb3JtOiBmdW5jdGlvbih0cmFuc2Zvcm0sIG9yaWdpbikgewoKICAgIHZhciBwcm9wZXJ0aWVzID0ge307CiAgICAKICAgIGlmIChvcmlnaW4pCiAgICAgIHByb3BlcnRpZXNbdmVuZG9yKyd0cmFuc2Zvcm0tb3JpZ2luJ10gPSBvcmlnaW47CiAgICAKICAgIHByb3BlcnRpZXNbdmVuZG9yKyd0cmFuc2Zvcm0nXSA9IHRyYW5zZm9ybTsKICAKICAgIHJldHVybiB0aGlzLmNzcyhwcm9wZXJ0aWVzKTsKCiAgfSwKCiAgYW5pbWF0ZWY6IGZ1bmN0aW9uKHBvaW50KSB7CgogICAgdmFyIGRhdGEgPSB0aGlzLmRhdGEoKTsKCiAgICBpZiAoZGF0YS5lZmZlY3QpCiAgICAgIGRhdGEuZWZmZWN0LnN0b3AoKTsKCiAgICBpZiAocG9pbnQpIHsKCiAgICAgIGlmICghcG9pbnQudG8ubGVuZ3RoKSBwb2ludC50byA9IFtwb2ludC50b107CiAgICAgIGlmICghcG9pbnQuZnJvbS5sZW5ndGgpIHBvaW50LmZyb20gPSBbcG9pbnQuZnJvbV07CgogICAgICB2YXIgZGlmZiA9IFtdLAogICAgICAgIGxlbiA9IHBvaW50LnRvLmxlbmd0aCwKICAgICAgICBhbmltYXRpbmcgPSB0cnVlLAogICAgICAgIHRoYXQgPSB0aGlzLAogICAgICAgIHRpbWUgPSAobmV3IERhdGUoKSkuZ2V0VGltZSgpLAogICAgICAgIGZyYW1lID0gZnVuY3Rpb24oKSB7CgogICAgICAgICAgaWYgKCFkYXRhLmVmZmVjdCB8fCAhYW5pbWF0aW5nKQogICAgICAgICAgICByZXR1cm47CgogICAgICAgICAgdmFyIHYgPSBbXSwKICAgICAgICAgICAgdGltZURpZmYgPSBNYXRoLm1pbihwb2ludC5kdXJhdGlvbiwgKG5ldyBEYXRlKCkpLmdldFRpbWUoKSAtIHRpbWUpOwoKICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspCiAgICAgICAgICAgIHYucHVzaChkYXRhLmVmZmVjdC5lYXNpbmcoMSwgdGltZURpZmYsIHBvaW50LmZyb21baV0sIGRpZmZbaV0sIHBvaW50LmR1cmF0aW9uKSk7CgogICAgICAgICAgcG9pbnQuZnJhbWUoKGxlbj09MSkgPyB2WzBdIDogdik7CgogICAgICAgICAgaWYgKHRpbWVEaWZmPT1wb2ludC5kdXJhdGlvbikgewogICAgICAgICAgICBkZWxldGUgZGF0YVsnZWZmZWN0J107CiAgICAgICAgICAgIHRoYXQuZGF0YShkYXRhKTsKICAgICAgICAgICAgaWYgKHBvaW50LmNvbXBsZXRlKQogICAgICAgICAgICAgIHBvaW50LmNvbXBsZXRlKCk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB3aW5kb3cucmVxdWVzdEFuaW0oZnJhbWUpOwogICAgICAgICAgfQogICAgICAgIH07CgogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKQogICAgICAgIGRpZmYucHVzaChwb2ludC50b1tpXSAtIHBvaW50LmZyb21baV0pOwoKICAgICAgZGF0YS5lZmZlY3QgPSAkLmV4dGVuZCh7CiAgICAgICAgc3RvcDogZnVuY3Rpb24oKSB7CiAgICAgICAgICBhbmltYXRpbmcgPSBmYWxzZTsKICAgICAgICB9LAogICAgICAgIGVhc2luZzogZnVuY3Rpb24gKHgsIHQsIGIsIGMsIGRhdGEpIHsKICAgICAgICAgIHJldHVybiBjICogTWF0aC5zcXJ0KDEgLSAodD10L2RhdGEtMSkqdCkgKyBiOwogICAgICAgIH0KICAgICAgfSwgcG9pbnQpOwoKICAgICAgdGhpcy5kYXRhKGRhdGEpOwoKICAgICAgZnJhbWUoKTsKCiAgICB9IGVsc2UgewogICAgICAKICAgICAgZGVsZXRlIGRhdGFbJ2VmZmVjdCddOwoKICAgIH0KICB9Cn0pOwoKLy8gRXhwb3J0IHNvbWUgZ2xvYmFscwoKJC5pc1RvdWNoID0gaXNUb3VjaDsKJC5tb3VzZUV2ZW50cyA9IG1vdXNlRXZlbnRzOwokLmNzc1ByZWZpeCA9IGdldFByZWZpeDsKJC5jc3NUcmFuc2l0aW9uRW5kID0gZ2V0VHJhbnNpdGlvbkVuZDsKJC5maW5kUG9zID0gZmluZFBvczsKCn0pKGpRdWVyeSk7Cg=='],
//	nope: ['../../lib/turn.html4.min.js'],
//	both: ['../../lib/zoom.min.js', 'js/magazine.js', 'css/magazine.css'],
//	both: ['../../lib/zoom.min.js', 'css/magazine.css'],
//	both: ['css/magazine.css'],
//	both: [''],
	both: ['data:/text/plain;base64,LyoqCiAqIHR1cm4uanMgNHRoIHJlbGVhc2UKICogdHVybmpzLmNvbQogKiB0dXJuanMuY29tL2xpY2Vuc2UudHh0CiAqCiAqIENvcHlyaWdodCAoQykgMjAxMiBFbW1hbnVlbCBHYXJjaWEKICogQWxsIHJpZ2h0cyByZXNlcnZlZAogKiovCgooZnVuY3Rpb24oJCkgewoKJ3VzZSBzdHJpY3QnOwoKdmFyIGhhczNkLAogIAogIGhhc1JvdCwKCiAgdmVuZG9yID0gJycsCiAgCiAgdmVyc2lvbiA9ICc0LjEuMCcsCgogIFBJID0gTWF0aC5QSSwKCiAgQTkwID0gUEkvMiwKCiAgaXNUb3VjaCA9ICdvbnRvdWNoc3RhcnQnIGluIHdpbmRvdywKCiAgbW91c2VFdmVudHMgPSAoaXNUb3VjaCkgPwogICAgewogICAgICBkb3duOiAndG91Y2hzdGFydCcsCiAgICAgIG1vdmU6ICd0b3VjaG1vdmUnLAogICAgICB1cDogJ3RvdWNoZW5kJywKICAgICAgb3ZlcjogJ3RvdWNoc3RhcnQnLAogICAgICBvdXQ6ICd0b3VjaGVuZCcKICAgIH0KICAgIDoKICAgIHsKICAgICAgZG93bjogJ21vdXNlZG93bicsCiAgICAgIG1vdmU6ICdtb3VzZW1vdmUnLAogICAgICB1cDogJ21vdXNldXAnLAogICAgICBvdmVyOiAnbW91c2VvdmVyJywKICAgICAgb3V0OiAnbW91c2VvdXQnCiAgICB9LAoKICAvLyBDb250YW5zdHMgdXNlZCBmb3IgZWFjaCBjb3JuZXIKICAvLyAgIHwgdGwgKiB0ciB8CiAgLy8gbCB8ICogICAgICogfCByCiAgLy8gICB8IGJsICogYnIgfAoKICBjb3JuZXJzID0gewogICAgYmFja3dhcmQ6IFsnYmwnLCAndGwnXSwKICAgIGZvcndhcmQ6IFsnYnInLCAndHInXSwKICAgIGFsbDogWyd0bCcsICdibCcsICd0cicsICdicicsICdsJywgJ3InXQogIH0sCgogIC8vIERpc3BsYXkgdmFsdWVzCgogIGRpc3BsYXlzID0gWydzaW5nbGUnLCAnZG91YmxlJ10sCgogIC8vIERpcmVjdGlvbiB2YWx1ZXMKCiAgZGlyZWN0aW9ucyA9IFsnbHRyJywgJ3J0bCddLAoKICAvLyBEZWZhdWx0IG9wdGlvbnMKCiAgdHVybk9wdGlvbnMgPSB7CgogICAgLy8gRW5hYmxlcyBoYXJkd2FyZSBhY2NlbGVyYXRpb24KCiAgICBhY2NlbGVyYXRpb246IHRydWUsCgogICAgLy8gRGlzcGxheQoKICAgIGRpc3BsYXk6ICdkb3VibGUnLAoKICAgIC8vIER1cmF0aW9uIG9mIHRyYW5zaXRpb24gaW4gbWlsbGlzZWNvbmRzCgogICAgZHVyYXRpb246IDYwMCwKCiAgICAvLyBGaXJzdCBwYWdlCgogICAgcGFnZTogMSwKICAgIAogICAgLy8gRW5hYmxlcyBncmFkaWVudHMKCiAgICBncmFkaWVudHM6IHRydWUsCgogICAgLy8gQ29ybmVycyB1c2VkIHdoZW4gdHVybmluZyB0aGUgcGFnZQoKICAgIHR1cm5Db3JuZXJzOiAnYmwsYnInLAoKICAgIC8vIEV2ZW50cwoKICAgIHdoZW46IG51bGwKICB9LAoKICBmbGlwT3B0aW9ucyA9IHsKCiAgICAvLyBTaXplIG9mIHRoZSBhY3RpdmUgem9uZSBvZiBlYWNoIGNvcm5lcgoKICAgIGNvcm5lclNpemU6IDEwMAoKICB9LAoKICAvLyBOdW1iZXIgb2YgcGFnZXMgaW4gdGhlIERPTSwgbWluaW11bSB2YWx1ZTogNgoKICBwYWdlc0luRE9NID0gNiwKICAKCnR1cm5NZXRob2RzID0gewoKICAvLyBTaW5nbGV0b24gY29uc3RydWN0b3IKICAvLyAkKCcjc2VsZWN0b3InKS50dXJuKFtvcHRpb25zXSk7CgogIGluaXQ6IGZ1bmN0aW9uKG9wdGlvbnMpIHsKCiAgICAvLyBEZWZpbmUgY29uc3RhbnRzCiAgICAKICAgIGhhczNkID0gJ1dlYktpdENTU01hdHJpeCcgaW4gd2luZG93IHx8ICdNb3pQZXJzcGVjdGl2ZScgaW4gZG9jdW1lbnQuYm9keS5zdHlsZTsKICAgIGhhc1JvdCA9IHJvdGF0aW9uQXZhaWxhYmxlKCk7CiAgICB2ZW5kb3IgPSBnZXRQcmVmaXgoKTsKCiAgICB2YXIgaSwgdGhhdCA9IHRoaXMsIHBhZ2VOdW0gPSAwLCBkYXRhID0gdGhpcy5kYXRhKCksIGNoID0gdGhpcy5jaGlsZHJlbigpOwoKICAgIC8vIFNldCBpbml0aWFsIGNvbmZpZ3VyYXRpb24KCiAgICBvcHRpb25zID0gJC5leHRlbmQoewogICAgICB3aWR0aDogdGhpcy53aWR0aCgpLAogICAgICBoZWlnaHQ6IHRoaXMuaGVpZ2h0KCksCiAgICAgIGRpcmVjdGlvbjogdGhpcy5hdHRyKCdkaXInKSB8fCB0aGlzLmNzcygnZGlyZWN0aW9uJykgfHwgJ2x0cicKICAgIH0sIHR1cm5PcHRpb25zLCBvcHRpb25zKTsKCiAgICBkYXRhLm9wdHMgPSBvcHRpb25zOwogICAgZGF0YS5wYWdlT2JqcyA9IHt9OwogICAgZGF0YS5wYWdlcyA9IHt9OwogICAgZGF0YS5wYWdlV3JhcCA9IHt9OwogICAgZGF0YS5wYWdlWm9vbSA9IHt9OwogICAgZGF0YS5wYWdlUGxhY2UgPSB7fTsKICAgIGRhdGEucGFnZU12ID0gW107CiAgICBkYXRhLnpvb20gPSAxOwogICAgZGF0YS50b3RhbFBhZ2VzID0gb3B0aW9ucy5wYWdlcyB8fCAwOwogICAgZGF0YS5ldmVudEhhbmRsZXJzID0gewogICAgICB0b3VjaFN0YXJ0OiAkLnByb3h5KHR1cm5NZXRob2RzLl90b3VjaFN0YXJ0LCB0aGlzKSwKICAgICAgdG91Y2hNb3ZlOiAkLnByb3h5KHR1cm5NZXRob2RzLl90b3VjaE1vdmUsIHRoaXMpLAogICAgICB0b3VjaEVuZDogJC5wcm94eSh0dXJuTWV0aG9kcy5fdG91Y2hFbmQsIHRoaXMpLAogICAgICBzdGFydDogJC5wcm94eSh0dXJuTWV0aG9kcy5fZXZlbnRTdGFydCwgdGhpcykKICAgIH07CgoKCiAgICAvLyBBZGQgZXZlbnQgbGlzdGVuZXJzCgogICAgaWYgKG9wdGlvbnMud2hlbikKICAgICAgZm9yIChpIGluIG9wdGlvbnMud2hlbikKICAgICAgICBpZiAoaGFzKGksIG9wdGlvbnMud2hlbikpCiAgICAgICAgICB0aGlzLmJpbmQoaSwgb3B0aW9ucy53aGVuW2ldKTsKCiAgICAvLyBTZXQgdGhlIGNzcwoKICAgIHRoaXMuY3NzKHtwb3NpdGlvbjogJ3JlbGF0aXZlJywgd2lkdGg6IG9wdGlvbnMud2lkdGgsIGhlaWdodDogb3B0aW9ucy5oZWlnaHR9KTsKCiAgICAvLyBTZXQgdGhlIGluaXRpYWwgZGlzcGxheQoKICAgIHRoaXMudHVybignZGlzcGxheScsIG9wdGlvbnMuZGlzcGxheSk7CgogICAgLy8gU2V0IHRoZSBkaXJlY3Rpb24KCiAgICBpZiAob3B0aW9ucy5kaXJlY3Rpb24hPT0nJykKICAgICAgdGhpcy50dXJuKCdkaXJlY3Rpb24nLCBvcHRpb25zLmRpcmVjdGlvbik7CiAgICAKICAgIC8vIFByZXZlbnQgYmx1ZSBzY3JlZW4gcHJvYmxlbXMgb2Ygc3dpdGNoaW5nIHRvIGhhcmR3YXJlIGFjY2VsZXJhdGlvbiBtb2RlCiAgICAvLyBCeSBmb3JjaW5nIGhhcmR3YXJlIGFjY2VsZXJhdGlvbiBmb3IgZXZlcgoKICAgIGlmIChoYXMzZCAmJiAhaXNUb3VjaCAmJiBvcHRpb25zLmFjY2VsZXJhdGlvbikKICAgICAgdGhpcy50cmFuc2Zvcm0odHJhbnNsYXRlKDAsIDAsIHRydWUpKTsKCiAgICAvLyBBZGQgcGFnZXMgZnJvbSB0aGUgRE9NCgogICAgZm9yIChpID0gMDsgaTxjaC5sZW5ndGg7IGkrKykgewogICAgICBpZiAoJChjaFtpXSkuYXR0cignaWdub3JlJykhPScxJykgewogICAgICAgIHRoaXMudHVybignYWRkUGFnZScsIGNoW2ldLCArK3BhZ2VOdW0pOwogICAgICB9CiAgICB9CgogICAgLy8gRXZlbnQgbGlzdGVuZXJzCgogICAgJCh0aGlzKS5iaW5kKG1vdXNlRXZlbnRzLmRvd24sIGRhdGEuZXZlbnRIYW5kbGVycy50b3VjaFN0YXJ0KS4KICAgICAgYmluZCgnZW5kJywgdHVybk1ldGhvZHMuX2V2ZW50RW5kKS4KICAgICAgYmluZCgncHJlc3NlZCcsIHR1cm5NZXRob2RzLl9ldmVudFByZXNzZWQpLgogICAgICBiaW5kKCdyZWxlYXNlZCcsIHR1cm5NZXRob2RzLl9ldmVudFJlbGVhc2VkKS4KICAgICAgYmluZCgnZmxpcCcsIHR1cm5NZXRob2RzLl9mbGlwKTsKCiAgICAkKHRoaXMpLnBhcmVudCgpLmJpbmQoJ3N0YXJ0JywgZGF0YS5ldmVudEhhbmRsZXJzLnN0YXJ0KTsKCiAgICAkKGRvY3VtZW50KS5iaW5kKG1vdXNlRXZlbnRzLm1vdmUsIGRhdGEuZXZlbnRIYW5kbGVycy50b3VjaE1vdmUpLgogICAgICBiaW5kKG1vdXNlRXZlbnRzLnVwLCBkYXRhLmV2ZW50SGFuZGxlcnMudG91Y2hFbmQpOwoKICAgIC8vIFNldCB0aGUgaW5pdGlhbCBwYWdlCgogICAgdGhpcy50dXJuKCdwYWdlJywgb3B0aW9ucy5wYWdlKTsKCiAgICAvLyBUaGlzIGZsaXBib29rIGlzIHJlYWR5CgogICAgZGF0YS5kb25lID0gdHJ1ZTsKCiAgICByZXR1cm4gdGhpczsKICB9LAoKICAvLyBBZGRzIGEgcGFnZSBmcm9tIGV4dGVybmFsIGRhdGEKCiAgYWRkUGFnZTogZnVuY3Rpb24oZWxlbWVudCwgcGFnZSkgewoKICAgIHZhciBjdXJyZW50UGFnZSwKICAgICAgY2xhc3NOYW1lLAogICAgICBpbmNQYWdlcyA9IGZhbHNlLAogICAgICBkYXRhID0gdGhpcy5kYXRhKCksCiAgICAgIGxhc3RQYWdlID0gZGF0YS50b3RhbFBhZ2VzKzE7CgogICAgaWYgKGRhdGEuZGVzdHJveWluZykKICAgICAgcmV0dXJuIGZhbHNlOwoKICAgIC8vIFJlYWQgdGhlIHBhZ2UgbnVtYmVyIGZyb20gdGhlIGNsYXNzTmFtZSBvZiBgZWxlbWVudGAgLSBmb3JtYXQ6IHBbMC05XSsKCiAgICBpZiAoKGN1cnJlbnRQYWdlID0gL1xicChbMC05XSspXGIvLmV4ZWMoJChlbGVtZW50KS5hdHRyKCdjbGFzcycpKSkpCiAgICAgIHBhZ2UgPSBwYXJzZUludChjdXJyZW50UGFnZVsxXSwgMTApOwoKICAgIGlmIChwYWdlKSB7CiAgICAgIAogICAgICBpZiAocGFnZT09bGFzdFBhZ2UpCiAgICAgICAgaW5jUGFnZXMgPSB0cnVlOwogICAgICBlbHNlIGlmIChwYWdlPmxhc3RQYWdlKQogICAgICAgIHRocm93IHR1cm5FcnJvcignUGFnZSAiJytwYWdlKyciIGNhbm5vdCBiZSBpbnNlcnRlZCcpOwoKICAgIH0gZWxzZSB7CiAgICAgIAogICAgICBwYWdlID0gbGFzdFBhZ2U7CiAgICAgIGluY1BhZ2VzID0gdHJ1ZTsKCiAgICB9CgogICAgaWYgKHBhZ2U+PTEgJiYgcGFnZTw9bGFzdFBhZ2UpIHsKCiAgICAgIGlmIChkYXRhLmRpc3BsYXk9PSdkb3VibGUnKQogICAgICAgIGNsYXNzTmFtZSA9IChwYWdlJTIpID8gJyBvZGQnIDogJyBldmVuJzsKICAgICAgZWxzZQogICAgICAgIGNsYXNzTmFtZSA9ICcnOwoKICAgICAgLy8gU3RvcCBhbmltYXRpb25zCiAgICAgIGlmIChkYXRhLmRvbmUpCiAgICAgICAgdGhpcy50dXJuKCdzdG9wJyk7CgogICAgICAvLyBNb3ZlIHBhZ2VzIGlmIGl0J3MgbmVjZXNzYXJ5CiAgICAgIGlmIChwYWdlIGluIGRhdGEucGFnZU9ianMpCiAgICAgICAgdHVybk1ldGhvZHMuX21vdmVQYWdlcy5jYWxsKHRoaXMsIHBhZ2UsIDEpOwoKICAgICAgLy8gSW5jcmVhc2UgdGhlIG51bWJlciBvZiBwYWdlcwogICAgICBpZiAoaW5jUGFnZXMpCiAgICAgICAgZGF0YS50b3RhbFBhZ2VzID0gbGFzdFBhZ2U7CgogICAgICAvLyBBZGQgZWxlbWVudAogICAgICBkYXRhLnBhZ2VPYmpzW3BhZ2VdID0gJChlbGVtZW50KS4KICAgICAgICBjc3MoeydmbG9hdCc6ICdsZWZ0J30pLgogICAgICAgIGFkZENsYXNzKCdwYWdlIHAnICsgcGFnZSArIGNsYXNzTmFtZSk7CgogICAgICBpZiAoIWhhc0hhcmRQYWdlKCkgJiYgIGRhdGEucGFnZU9ianNbcGFnZV0uaGFzQ2xhc3MoJ2hhcmQnKSkgewogICAgICAgIGRhdGEucGFnZU9ianNbcGFnZV0ucmVtb3ZlQ2xhc3MoJ2hhcmQnKTsKICAgICAgfQoKICAgICAgLy8gQWRkIHBhZ2UKICAgICAgdHVybk1ldGhvZHMuX2FkZFBhZ2UuY2FsbCh0aGlzLCBwYWdlKTsKCiAgICAgIC8vIFJlbW92ZSBwYWdlcyBvdXQgb2YgcmFuZ2UKICAgICAgdHVybk1ldGhvZHMuX3JlbW92ZUZyb21ET00uY2FsbCh0aGlzKTsKICAgIH0KCiAgICByZXR1cm4gdGhpczsKICB9LAoKICAvLyBBZGRzIGEgcGFnZQoKICBfYWRkUGFnZTogZnVuY3Rpb24ocGFnZSkgewogICAgCiAgICB2YXIgZGF0YSA9IHRoaXMuZGF0YSgpLAogICAgICBlbGVtZW50ID0gZGF0YS5wYWdlT2Jqc1twYWdlXTsKCiAgICBpZiAoZWxlbWVudCkKICAgICAgaWYgKHR1cm5NZXRob2RzLl9uZWNlc3NQYWdlLmNhbGwodGhpcywgcGFnZSkpIHsKCiAgICAgICAgaWYgKCFkYXRhLnBhZ2VXcmFwW3BhZ2VdKSB7CgogICAgICAgICAgLy8gV3JhcHBlcgogICAgICAgICAgZGF0YS5wYWdlV3JhcFtwYWdlXSA9ICQoJzxkaXYvPicsCiAgICAgICAgICAgIHsnY2xhc3MnOiAncGFnZS13cmFwcGVyJywKICAgICAgICAgICAgICBwYWdlOiBwYWdlLAogICAgICAgICAgICAgIGNzczoge3Bvc2l0aW9uOiAnYWJzb2x1dGUnLAogICAgICAgICAgICAgIG92ZXJmbG93OiAnaGlkZGVuJ319KTsKCiAgICAgICAgICAvLyBBcHBlbmQgdG8gdGhpcyBmbGlwYm9vawogICAgICAgICAgdGhpcy5hcHBlbmQoZGF0YS5wYWdlV3JhcFtwYWdlXSk7CgogICAgICAgICAgaWYgKCFkYXRhLnBhZ2VQbGFjZVtwYWdlXSkgewogICAgICAgICAgICAKICAgICAgICAgICAgZGF0YS5wYWdlUGxhY2VbcGFnZV0gPSBwYWdlOwogICAgICAgICAgICAvLyBNb3ZlIGBwYWdlT2Jqc1twYWdlXWAgdG8gd3JhcHBlcgogICAgICAgICAgICBkYXRhLnBhZ2VPYmpzW3BhZ2VdLmFwcGVuZFRvKGRhdGEucGFnZVdyYXBbcGFnZV0pOwogICAgICAgICAgCiAgICAgICAgIH0KCiAgICAgICAgICAvLyBTZXQgdGhlIHNpemUgb2YgdGhlIHBhZ2UKICAgICAgICAgIHZhciBwcm9wID0gdHVybk1ldGhvZHMuX3BhZ2VTaXplLmNhbGwodGhpcywgcGFnZSwgdHJ1ZSk7CiAgICAgICAgICBlbGVtZW50LmNzcyh7d2lkdGg6IHByb3Aud2lkdGgsIGhlaWdodDogcHJvcC5oZWlnaHR9KTsKICAgICAgICAgIGRhdGEucGFnZVdyYXBbcGFnZV0uY3NzKHByb3ApOwoKICAgICAgICB9CgogICAgICAgIGlmIChkYXRhLnBhZ2VQbGFjZVtwYWdlXSA9PSBwYWdlKSB7CgogICAgICAgICAvLyBJZiB0aGUgcGFnZSBpc24ndCBpbiBhbm90aGVyIHBsYWNlLCBjcmVhdGUgdGhlIGZsaXAgZWZmZWN0CiAgICAgICAgICB0dXJuTWV0aG9kcy5fbWFrZUZsaXAuY2FsbCh0aGlzLCBwYWdlKTsKCiAgICAgIH0KICAgICAgICAKICAgICAgfSBlbHNlIHsKCiAgICAgICAgLy8gUGxhY2UKICAgICAgICBkYXRhLnBhZ2VQbGFjZVtwYWdlXSA9IDA7CgogICAgICAgIC8vIFJlbW92ZSBlbGVtZW50IGZyb20gdGhlIERPTQogICAgICAgIGlmIChkYXRhLnBhZ2VPYmpzW3BhZ2VdKQogICAgICAgICAgZGF0YS5wYWdlT2Jqc1twYWdlXS5yZW1vdmUoKTsKCiAgICAgIH0KCiAgfSwKCiAgLy8gQ2hlY2tzIGlmIGEgcGFnZSBpcyBpbiBtZW1vcnkKICAKICBoYXNQYWdlOiBmdW5jdGlvbihwYWdlKSB7CgogICAgcmV0dXJuIGhhcyhwYWdlLCB0aGlzLmRhdGEoKS5wYWdlT2Jqcyk7CiAgCiAgfSwKCiAgLy8gQ2VudGVycyB0aGUgZmxpcGJvb2sKCiAgY2VudGVyOiBmdW5jdGlvbihwYWdlKSB7CiAgICAKICAgIHZhciBkYXRhID0gdGhpcy5kYXRhKCksCiAgICAgIHNpemUgPSAkKHRoaXMpLnR1cm4oJ3NpemUnKSwKICAgICAgbGVmdCA9IDA7CgogICAgaWYgKCFkYXRhLm5vQ2VudGVyKSB7CiAgICAgIGlmIChkYXRhLmRpc3BsYXk9PSdkb3VibGUnKSB7CiAgICAgICAgdmFyIHZpZXcgPSB0aGlzLnR1cm4oJ3ZpZXcnLCBwYWdlIHx8IGRhdGEudHBhZ2UgfHwgZGF0YS5wYWdlKTsKCiAgICAgICAgaWYgKGRhdGEuZGlyZWN0aW9uPT0nbHRyJykgewogICAgICAgICAgaWYgKCF2aWV3WzBdKQogICAgICAgICAgICBsZWZ0IC09IHNpemUud2lkdGgvNDsKICAgICAgICAgIGVsc2UgaWYgKCF2aWV3WzFdKQogICAgICAgICAgICBsZWZ0ICs9IHNpemUud2lkdGgvNDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgaWYgKCF2aWV3WzBdKQogICAgICAgICAgICBsZWZ0ICs9IHNpemUud2lkdGgvNDsKICAgICAgICAgIGVsc2UgaWYgKCF2aWV3WzFdKQogICAgICAgICAgICBsZWZ0IC09IHNpemUud2lkdGgvNDsKICAgICAgICB9CiAgICAgIAogICAgICB9CgogICAgICAkKHRoaXMpLmNzcyh7bWFyZ2luTGVmdDogbGVmdH0pOwogICAgfQoKICAgIHJldHVybiB0aGlzOwoKICB9LAoKICAvLyBEZXN0cm95cyB0aGUgZmxpcGJvb2sKCiAgZGVzdHJveTogZnVuY3Rpb24gKCkgewoKICAgIHZhciBwYWdlLAogICAgICBmbGlwYm9vayA9IHRoaXMsCiAgICAgIGRhdGEgPSB0aGlzLmRhdGEoKSwKICAgICAgZXZlbnRzID0gWwogICAgICAgICdlbmQnLCAnZmlyc3QnLCAnZmxpcCcsICdsYXN0JywgJ3ByZXNzZWQnLAogICAgICAgICdyZWxlYXNlZCcsICdzdGFydCcsICd0dXJuaW5nJywgJ3R1cm5lZCcsCiAgICAgICAgJ3pvb21pbmcnLCAnbWlzc2luZyddOwoKICAgIGlmICh0cmlnZ2VyKCdkZXN0cm95aW5nJywgdGhpcyk9PSdwcmV2ZW50ZWQnKQogICAgICByZXR1cm47CgogICAgZGF0YS5kZXN0cm95aW5nID0gdHJ1ZTsKCiAgICAkLmVhY2goZXZlbnRzLCBmdW5jdGlvbihpbmRleCwgZXZlbnROYW1lKSB7CiAgICAgIGZsaXBib29rLnVuYmluZChldmVudE5hbWUpOwogICAgfSk7CgogICAgdGhpcy5wYXJlbnQoKS51bmJpbmQoJ3N0YXJ0JywgZGF0YS5ldmVudEhhbmRsZXJzLnN0YXJ0KTsKCiAgICAkKGRvY3VtZW50KS51bmJpbmQobW91c2VFdmVudHMubW92ZSwgZGF0YS5ldmVudEhhbmRsZXJzLnRvdWNoTW92ZSkuCiAgICAgIHVuYmluZChtb3VzZUV2ZW50cy51cCwgZGF0YS5ldmVudEhhbmRsZXJzLnRvdWNoRW5kKTsKICAgIAogICAgd2hpbGUgKGRhdGEudG90YWxQYWdlcyE9PTApIHsKICAgICAgdGhpcy50dXJuKCdyZW1vdmVQYWdlJywgZGF0YS50b3RhbFBhZ2VzKTsKICAgIH0KCiAgICBpZiAoZGF0YS5mcGFyZW50KQogICAgICBkYXRhLmZwYXJlbnQucmVtb3ZlKCk7CgogICAgaWYgKGRhdGEuc2hhZG93KQogICAgICBkYXRhLnNoYWRvdy5yZW1vdmUoKTsKCiAgICB0aGlzLnJlbW92ZURhdGEoKTsKICAgIGRhdGEgPSBudWxsOwoKICAgIHJldHVybiB0aGlzOwoKICB9LAoKICAvLyBDaGVja3MgaWYgdGhpcyBlbGVtZW50IGlzIGEgZmxpcGJvb2sKCiAgaXM6IGZ1bmN0aW9uKCkgewoKICAgIHJldHVybiB0eXBlb2YodGhpcy5kYXRhKCkucGFnZXMpPT0nb2JqZWN0JzsKCiAgfSwKCiAgLy8gU2V0cyBhbmQgZ2V0cyB0aGUgem9vbSB2YWx1ZQoKICB6b29tOiBmdW5jdGlvbihuZXdab29tKSB7CiAgICAKICAgIHZhciBkYXRhID0gdGhpcy5kYXRhKCk7CgogICAgaWYgKHR5cGVvZihuZXdab29tKT09J251bWJlcicpIHsKCiAgICAgIGlmIChuZXdab29tPDAuMDAxIHx8IG5ld1pvb20+MTAwKQogICAgICAgIHRocm93IHR1cm5FcnJvcihuZXdab29tKyAnIGlzIG5vdCBhIHZhbHVlIGZvciB6b29tJyk7CiAgICAgIAogICAgICBpZiAodHJpZ2dlcignem9vbWluZycsIHRoaXMsIFtuZXdab29tLCBkYXRhLnpvb21dKT09J3ByZXZlbnRlZCcpCiAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgIAogICAgICB2YXIgc2l6ZSA9IHRoaXMudHVybignc2l6ZScpLAogICAgICAgIGN1cnJlbnRWaWV3ID0gdGhpcy50dXJuKCd2aWV3JyksCiAgICAgICAgaXogPSAxL2RhdGEuem9vbSwKICAgICAgICBuZXdXaWR0aCA9IE1hdGgucm91bmQoc2l6ZS53aWR0aCAqIGl6ICogbmV3Wm9vbSksCiAgICAgICAgbmV3SGVpZ2h0ID0gTWF0aC5yb3VuZChzaXplLmhlaWdodCAqIGl6ICogbmV3Wm9vbSk7CiAgICAKICAgICAgZGF0YS56b29tID0gbmV3Wm9vbTsKCiAgICAgICQodGhpcykudHVybignc3RvcCcpLgogICAgICAgIHR1cm4oJ3NpemUnLCBuZXdXaWR0aCwgbmV3SGVpZ2h0KTsKICAgICAgICAvKi4KICAgICAgICBjc3Moe21hcmdpblRvcDogc2l6ZS5oZWlnaHQgKiBpeiAvIDIgLSBuZXdIZWlnaHQgLyAyfSk7Ki8KCiAgICAgIGlmIChkYXRhLm9wdHMuYXV0b0NlbnRlcikKICAgICAgICB0aGlzLnR1cm4oJ2NlbnRlcicpOwogICAgICAvKmVsc2UKICAgICAgICAkKHRoaXMpLmNzcyh7bWFyZ2luTGVmdDogc2l6ZS53aWR0aCAqIGl6IC8gMiAtIG5ld1dpZHRoIC8gMn0pOyovCgogICAgICB0dXJuTWV0aG9kcy5fdXBkYXRlU2hhZG93LmNhbGwodGhpcyk7CgogICAgICBmb3IgKHZhciBpID0gMDsgaTxjdXJyZW50Vmlldy5sZW5ndGg7IGkrKykgewogICAgICAgIGlmIChjdXJyZW50Vmlld1tpXSAmJiBkYXRhLnBhZ2Vab29tW2N1cnJlbnRWaWV3W2ldXSE9ZGF0YS56b29tKSB7CiAgCiAgICAgICAgICB0aGlzLnRyaWdnZXIoJ3pvb21lZCcsWwogICAgICAgICAgICBjdXJyZW50Vmlld1tpXSwKICAgICAgICAgICAgY3VycmVudFZpZXcsCiAgICAgICAgICAgIGRhdGEucGFnZVpvb21bY3VycmVudFZpZXdbaV1dLAogICAgICAgICAgICBkYXRhLnpvb21dKTsKCiAgICAgICAgICBkYXRhLnBhZ2Vab29tW2N1cnJlbnRWaWV3W2ldXSA9IGRhdGEuem9vbTsKICAgICAgfQogICAgfQoKICAgICAgcmV0dXJuIHRoaXM7CgogICAgfSBlbHNlCiAgICAgIHJldHVybiBkYXRhLnpvb207CgogIH0sCgogIC8vIEdldHMgdGhlIHNpemUgb2YgYSBwYWdlCgogIF9wYWdlU2l6ZTogZnVuY3Rpb24ocGFnZSwgcG9zaXRpb24pIHsKCiAgICB2YXIgZGF0YSA9IHRoaXMuZGF0YSgpLAogICAgICBwcm9wID0ge307CgogICAgaWYgKGRhdGEuZGlzcGxheT09J3NpbmdsZScpIHsKCiAgICAgIHByb3Aud2lkdGggPSB0aGlzLndpZHRoKCk7CiAgICAgIHByb3AuaGVpZ2h0ID0gdGhpcy5oZWlnaHQoKTsKCiAgICAgIGlmIChwb3NpdGlvbikgewogICAgICAgIHByb3AudG9wID0gMDsKICAgICAgICBwcm9wLmxlZnQgPSAwOwogICAgICAgIHByb3AucmlnaHQgPSAnYXV0byc7CiAgICAgIH0KCiAgICB9IGVsc2UgewoKICAgICAgdmFyIHBhZ2VXaWR0aCA9IHRoaXMud2lkdGgoKS8yLAogICAgICAgIHBhZ2VIZWlnaHQgPSB0aGlzLmhlaWdodCgpOwoKICAgICAgaWYgKGRhdGEucGFnZU9ianNbcGFnZV0uaGFzQ2xhc3MoJ293bi1zaXplJykpIHsKICAgICAgICBwcm9wLndpZHRoID0gZGF0YS5wYWdlT2Jqc1twYWdlXS53aWR0aCgpOwogICAgICAgIHByb3AuaGVpZ2h0ID0gZGF0YS5wYWdlT2Jqc1twYWdlXS5oZWlnaHQoKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBwcm9wLndpZHRoID0gcGFnZVdpZHRoOwogICAgICAgIHByb3AuaGVpZ2h0ID0gcGFnZUhlaWdodDsKICAgICAgfQogICAgICAKICAgICAgaWYgKHBvc2l0aW9uKSB7CiAgICAgICAgdmFyIG9kZCA9IHBhZ2UlMjsKICAgICAgICBwcm9wLnRvcCA9IChwYWdlSGVpZ2h0LXByb3AuaGVpZ2h0KS8yOwoKICAgICAgICBpZiAoZGF0YS5kaXJlY3Rpb249PSdsdHInKSB7CiAgICAgICAgICAKICAgICAgICAgIHByb3BbKG9kZCkgPyAncmlnaHQnIDogJ2xlZnQnXSA9IHBhZ2VXaWR0aC1wcm9wLndpZHRoOwogICAgICAgICAgcHJvcFsob2RkKSA/ICdsZWZ0JyA6ICdyaWdodCddID0gJ2F1dG8nOwoKICAgICAgICB9IGVsc2UgewogICAgICAgICAgCiAgICAgICAgICBwcm9wWyhvZGQpID8gJ2xlZnQnIDogJ3JpZ2h0J10gPSBwYWdlV2lkdGgtcHJvcC53aWR0aDsKICAgICAgICAgIHByb3BbKG9kZCkgPyAncmlnaHQnIDogJ2xlZnQnXSA9ICdhdXRvJzsKCiAgICAgICAgfQogICAgICAKICAgICAgfQogICAgfQoKICAgIHJldHVybiBwcm9wOwoKICB9LAoKICAvLyBQcmVwYXJlcyB0aGUgZmxpcCBlZmZlY3QgZm9yIGEgcGFnZQoKICBfbWFrZUZsaXA6IGZ1bmN0aW9uKHBhZ2UpIHsKCiAgICB2YXIgZGF0YSA9IHRoaXMuZGF0YSgpOwoKICAgIGlmICghZGF0YS5wYWdlc1twYWdlXSAmJiBkYXRhLnBhZ2VQbGFjZVtwYWdlXT09cGFnZSkgewogICAgICAKICAgICAgdmFyIHNpbmdsZSA9IGRhdGEuZGlzcGxheT09J3NpbmdsZScsCiAgICAgICAgb2RkID0gcGFnZSUyOwoKICAgICAgZGF0YS5wYWdlc1twYWdlXSA9IGRhdGEucGFnZU9ianNbcGFnZV0uCiAgICAgICAgY3NzKHR1cm5NZXRob2RzLl9wYWdlU2l6ZS5jYWxsKHRoaXMsIHBhZ2UpKS4KICAgICAgICBmbGlwKHsKICAgICAgICAgIHBhZ2U6IHBhZ2UsCiAgICAgICAgICBuZXh0OiAob2RkIHx8IHNpbmdsZSkgPyBwYWdlKzEgOiBwYWdlLTEsCiAgICAgICAgICB0dXJuOiB0aGlzCiAgICAgICAgfSkuCiAgICAgICAgZmxpcCgnZGlzYWJsZScsIGRhdGEuZGlzYWJsZWQpOwoKICAgICAgICAvLyBJc3N1ZSBhYm91dCB6LWluZGV4CiAgICAgICAgdHVybk1ldGhvZHMuX3NldFBhZ2VMb2MuY2FsbCh0aGlzLCBwYWdlKTsKCiAgICAgICAgZGF0YS5wYWdlWm9vbVtwYWdlXSA9IGRhdGEuem9vbTsKICAgICAgICAKICAgIH0KCiAgICByZXR1cm4gZGF0YS5wYWdlc1twYWdlXTsKICB9LAoKICAvLyBNYWtlcyBwYWdlcyB3aXRoaW4gYSByYW5nZQoKICBfbWFrZVJhbmdlOiBmdW5jdGlvbigpIHsKCiAgICB2YXIgcGFnZSwgcmFuZ2UsCiAgICAgIGRhdGEgPSB0aGlzLmRhdGEoKTsKCiAgICBpZiAoZGF0YS50b3RhbFBhZ2VzPDEpCiAgICAgIHJldHVybjsKCiAgICByYW5nZSA9IHRoaXMudHVybigncmFuZ2UnKTsKCiAgICBmb3IgKHBhZ2UgPSByYW5nZVswXTsgcGFnZTw9cmFuZ2VbMV07IHBhZ2UrKykKICAgICAgdHVybk1ldGhvZHMuX2FkZFBhZ2UuY2FsbCh0aGlzLCBwYWdlKTsKCiAgfSwKCiAgLy8gUmV0dXJucyBhIHJhbmdlIG9mIHBhZ2VzIHRoYXQgc2hvdWxkIGJlIGluIHRoZSBET00KICAvLyBFeGFtcGxlOgogIC8vIC0gcGFnZSBpbiB0aGUgY3VycmVudCB2aWV3LCByZXR1cm4gdHJ1ZQogIC8vICogcGFnZSBpcyBpbiB0aGUgcmFuZ2UsIHJldHVybiB0cnVlCiAgLy8gT3RoZXJ3aXNlLCByZXR1cm4gZmFsc2UKICAvLwogIC8vIDEgMi0zIDQtNSA2LTcgOC05IDEwLTExIDEyLTEzCiAgLy8gICAqKiAgKiogIC0tICAgKiogICoqCgogIHJhbmdlOiBmdW5jdGlvbihwYWdlKSB7CgogICAgdmFyIHJlbWFpbmluZ1BhZ2VzLCBsZWZ0LCByaWdodCwgdmlldywKICAgICAgZGF0YSA9IHRoaXMuZGF0YSgpOwoKICAgICAgcGFnZSA9IHBhZ2UgfHwgZGF0YS50cGFnZSB8fCBkYXRhLnBhZ2UgfHwgMTsKICAgICAgdmlldyA9IHR1cm5NZXRob2RzLl92aWV3LmNhbGwodGhpcywgcGFnZSk7CgogICAgICBpZiAocGFnZTwxIHx8IHBhZ2U+ZGF0YS50b3RhbFBhZ2VzKQogICAgICAgIHRocm93IHR1cm5FcnJvcignIicrcGFnZSsnIiBpcyBub3QgYSB2YWxpZCBwYWdlJyk7CgogICAgCiAgICAgIHZpZXdbMV0gPSB2aWV3WzFdIHx8IHZpZXdbMF07CiAgICAgIAogICAgICBpZiAodmlld1swXT49MSAmJiB2aWV3WzFdPD1kYXRhLnRvdGFsUGFnZXMpIHsKCiAgICAgICAgcmVtYWluaW5nUGFnZXMgPSBNYXRoLmZsb29yKChwYWdlc0luRE9NLTIpLzIpOwoKICAgICAgICBpZiAoZGF0YS50b3RhbFBhZ2VzLXZpZXdbMV0gPiB2aWV3WzBdKSB7CiAgICAgICAgICBsZWZ0ID0gTWF0aC5taW4odmlld1swXS0xLCByZW1haW5pbmdQYWdlcyk7CiAgICAgICAgICByaWdodCA9IDIqcmVtYWluaW5nUGFnZXMtbGVmdDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgcmlnaHQgPSBNYXRoLm1pbihkYXRhLnRvdGFsUGFnZXMtdmlld1sxXSwgcmVtYWluaW5nUGFnZXMpOwogICAgICAgICAgbGVmdCA9IDIqcmVtYWluaW5nUGFnZXMtcmlnaHQ7CiAgICAgICAgfQoKICAgICAgfSBlbHNlIHsKICAgICAgICBsZWZ0ID0gcGFnZXNJbkRPTS0xOwogICAgICAgIHJpZ2h0ID0gcGFnZXNJbkRPTS0xOwogICAgICB9CgogICAgICByZXR1cm4gW01hdGgubWF4KDEsIHZpZXdbMF0tbGVmdCksCiAgICAgICAgICBNYXRoLm1pbihkYXRhLnRvdGFsUGFnZXMsIHZpZXdbMV0rcmlnaHQpXTsKCiAgfSwKCiAgLy8gRGV0ZWN0cyBpZiBhIHBhZ2UgaXMgd2l0aGluIHRoZSByYW5nZSBvZiBgcGFnZXNJbkRPTWAgZnJvbSB0aGUgY3VycmVudCB2aWV3CgogIF9uZWNlc3NQYWdlOiBmdW5jdGlvbihwYWdlKSB7CiAgICAKICAgIGlmIChwYWdlPT09MCkKICAgICAgcmV0dXJuIHRydWU7CgogICAgdmFyIHJhbmdlID0gdGhpcy50dXJuKCdyYW5nZScpOwoKICAgIHJldHVybiB0aGlzLmRhdGEoKS5wYWdlT2Jqc1twYWdlXS5oYXNDbGFzcygnZml4ZWQnKSB8fAogICAgICAocGFnZT49cmFuZ2VbMF0gJiYgcGFnZTw9cmFuZ2VbMV0pOwogICAgCiAgfSwKCiAgLy8gUmVsZWFzZXMgbWVtb3J5IGJ5IHJlbW92aW5nIHBhZ2VzIGZyb20gdGhlIERPTQoKICBfcmVtb3ZlRnJvbURPTTogZnVuY3Rpb24oKSB7CgogICAgdmFyIHBhZ2UsIGRhdGEgPSB0aGlzLmRhdGEoKTsKCiAgICBmb3IgKHBhZ2UgaW4gZGF0YS5wYWdlV3JhcCkKICAgICAgaWYgKGhhcyhwYWdlLCBkYXRhLnBhZ2VXcmFwKSAmJgogICAgICAgICF0dXJuTWV0aG9kcy5fbmVjZXNzUGFnZS5jYWxsKHRoaXMsIHBhZ2UpKQogICAgICB0dXJuTWV0aG9kcy5fcmVtb3ZlUGFnZUZyb21ET00uY2FsbCh0aGlzLCBwYWdlKTsKICAgIAogIH0sCgogIC8vIFJlbW92ZXMgYSBwYWdlIGZyb20gRE9NIGFuZCBpdHMgaW50ZXJuYWwgcmVmZXJlbmNlcwoKICBfcmVtb3ZlUGFnZUZyb21ET006IGZ1bmN0aW9uKHBhZ2UpIHsKCiAgICB2YXIgZGF0YSA9IHRoaXMuZGF0YSgpOwoKICAgIGlmIChkYXRhLnBhZ2VzW3BhZ2VdKSB7CiAgICAgIHZhciBkZCA9IGRhdGEucGFnZXNbcGFnZV0uZGF0YSgpOwoKICAgICAgZmxpcE1ldGhvZHMuX21vdmVGb2xkaW5nUGFnZS5jYWxsKGRhdGEucGFnZXNbcGFnZV0sIGZhbHNlKTsKCiAgICAgIGlmIChkZC5mICYmIGRkLmYuZndyYXBwZXIpCiAgICAgICAgZGQuZi5md3JhcHBlci5yZW1vdmUoKTsKCiAgICAgIGRhdGEucGFnZXNbcGFnZV0ucmVtb3ZlRGF0YSgpOwogICAgICBkYXRhLnBhZ2VzW3BhZ2VdLnJlbW92ZSgpOwogICAgICBkZWxldGUgZGF0YS5wYWdlc1twYWdlXTsKICAgIH0KCiAgICBpZiAoZGF0YS5wYWdlT2Jqc1twYWdlXSkKICAgICAgZGF0YS5wYWdlT2Jqc1twYWdlXS5yZW1vdmUoKTsKCiAgICBpZiAoZGF0YS5wYWdlV3JhcFtwYWdlXSkgewogICAgICBkYXRhLnBhZ2VXcmFwW3BhZ2VdLnJlbW92ZSgpOwogICAgICBkZWxldGUgZGF0YS5wYWdlV3JhcFtwYWdlXTsKICAgIH0KCiAgICB0dXJuTWV0aG9kcy5fcmVtb3ZlTXYuY2FsbCh0aGlzLCBwYWdlKTsKCiAgICBkZWxldGUgZGF0YS5wYWdlUGxhY2VbcGFnZV07CiAgICBkZWxldGUgZGF0YS5wYWdlWm9vbVtwYWdlXTsKCiAgfSwKCiAgLy8gUmVtb3ZlcyBhIHBhZ2UKCiAgcmVtb3ZlUGFnZTogZnVuY3Rpb24ocGFnZSkgewoKICAgIHZhciBkYXRhID0gdGhpcy5kYXRhKCk7CgogICAgLy8gRGVsZXRlIGFsbCB0aGUgcGFnZXMKICAgIGlmIChwYWdlPT0nKicpIHsKICAgICAgCiAgICAgIHdoaWxlIChkYXRhLnRvdGFsUGFnZXMhPT0wKSB7CiAgICAgICAgdGhpcy50dXJuKCdyZW1vdmVQYWdlJywgZGF0YS50b3RhbFBhZ2VzKTsKICAgICAgfQoKICAgIH0gZWxzZSB7CgogICAgICBpZiAocGFnZTwxIHx8IHBhZ2U+ZGF0YS50b3RhbFBhZ2VzKQogICAgICAgIHRocm93IHR1cm5FcnJvcignVGhlIHBhZ2UgJysgcGFnZSArICcgZG9lc25cJ3QgZXhpc3QnKTsKICAgICAgICAKICAgICAgaWYgKGRhdGEucGFnZU9ianNbcGFnZV0pIHsKCiAgICAgICAgLy8gU3RvcCBhbmltYXRpb25zCiAgICAgICAgdGhpcy50dXJuKCdzdG9wJyk7CgogICAgICAgIC8vIFJlbW92ZSBgcGFnZWAKICAgICAgICB0dXJuTWV0aG9kcy5fcmVtb3ZlUGFnZUZyb21ET00uY2FsbCh0aGlzLCBwYWdlKTsKCiAgICAgICAgZGVsZXRlIGRhdGEucGFnZU9ianNbcGFnZV07CgogICAgICB9CgogICAgICAvLyBNb3ZlIHRoZSBwYWdlcwogICAgICB0dXJuTWV0aG9kcy5fbW92ZVBhZ2VzLmNhbGwodGhpcywgcGFnZSwgLTEpOwoKICAgICAgLy8gUmVzaXplIHRoZSBzaXplIG9mIHRoaXMgZmxpcGJvb2sKICAgICAgZGF0YS50b3RhbFBhZ2VzID0gZGF0YS50b3RhbFBhZ2VzLTE7CgogICAgICAvLyBDaGVjayB0aGUgY3VycmVudCB2aWV3CgogICAgICBpZiAoZGF0YS5wYWdlPmRhdGEudG90YWxQYWdlcykgewoKICAgICAgIGRhdGEucGFnZSA9IG51bGw7CiAgICAgICB0dXJuTWV0aG9kcy5fZml0UGFnZS5jYWxsKHRoaXMsIGRhdGEudG90YWxQYWdlcyk7CgogICAgICB9IGVsc2UgewoKICAgICAgICB0dXJuTWV0aG9kcy5fbWFrZVJhbmdlLmNhbGwodGhpcyk7CiAgICAgICAgdGhpcy50dXJuKCd1cGRhdGUnKTsKCiAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gdGhpczsKICAKICB9LAoKICAvLyBNb3ZlcyBwYWdlcwoKICBfbW92ZVBhZ2VzOiBmdW5jdGlvbihmcm9tLCBjaGFuZ2UpIHsKCiAgICB2YXIgcGFnZSwKICAgICAgdGhhdCA9IHRoaXMsCiAgICAgIGRhdGEgPSB0aGlzLmRhdGEoKSwKICAgICAgc2luZ2xlID0gZGF0YS5kaXNwbGF5PT0nc2luZ2xlJywKICAgICAgbW92ZSA9IGZ1bmN0aW9uKHBhZ2UpIHsKCiAgICAgICAgdmFyIG5leHQgPSBwYWdlICsgY2hhbmdlLAogICAgICAgICAgb2RkID0gbmV4dCUyLAogICAgICAgICAgY2xhc3NOYW1lID0gKG9kZCkgPyAnIG9kZCAnIDogJyBldmVuICc7CgogICAgICAgIGlmIChkYXRhLnBhZ2VPYmpzW3BhZ2VdKQogICAgICAgICAgZGF0YS5wYWdlT2Jqc1tuZXh0XSA9IGRhdGEucGFnZU9ianNbcGFnZV0uCiAgICAgICAgICAgIHJlbW92ZUNsYXNzKCdwJyArIHBhZ2UgKyAnIG9kZCBldmVuJykuCiAgICAgICAgICAgIGFkZENsYXNzKCdwJyArIG5leHQgKyBjbGFzc05hbWUpOwoKICAgICAgICBpZiAoZGF0YS5wYWdlUGxhY2VbcGFnZV0gJiYgZGF0YS5wYWdlV3JhcFtwYWdlXSkgewoKICAgICAgICAgIGRhdGEucGFnZVBsYWNlW25leHRdID0gbmV4dDsKICAgICAgICAKICAgICAgICAgIGlmIChkYXRhLnBhZ2VPYmpzW25leHRdLmhhc0NsYXNzKCdmaXhlZCcpKQogICAgICAgICAgICBkYXRhLnBhZ2VXcmFwW25leHRdID0gZGF0YS5wYWdlV3JhcFtwYWdlXS4KICAgICAgICAgICAgICBhdHRyKCdwYWdlJywgbmV4dCk7CiAgICAgICAgICBlbHNlCiAgICAgICAgICAgIGRhdGEucGFnZVdyYXBbbmV4dF0gPSBkYXRhLnBhZ2VXcmFwW3BhZ2VdLgogICAgICAgICAgICAgIGNzcyh0dXJuTWV0aG9kcy5fcGFnZVNpemUuY2FsbCh0aGF0LCBuZXh0LCB0cnVlKSkuCiAgICAgICAgICAgICAgYXR0cigncGFnZScsIG5leHQpOwogICAgICAKICAgICAgICAgICAgaWYgKGRhdGEucGFnZXNbcGFnZV0pCiAgICAgICAgICAgICAgZGF0YS5wYWdlc1tuZXh0XSA9IGRhdGEucGFnZXNbcGFnZV0uCiAgICAgICAgICAgICAgICBmbGlwKCdvcHRpb25zJywgewogICAgICAgICAgICAgICAgICBwYWdlOiBuZXh0LAogICAgICAgICAgICAgICAgICBuZXh0OiAoc2luZ2xlIHx8IG9kZCkgPyBuZXh0KzEgOiBuZXh0LTEKICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgaWYgKGNoYW5nZSkgewogICAgICAgICAgICAgIGRlbGV0ZSBkYXRhLnBhZ2VzW3BhZ2VdOwogICAgICAgICAgICAgIGRlbGV0ZSBkYXRhLnBhZ2VQbGFjZVtwYWdlXTsKICAgICAgICAgICAgICBkZWxldGUgZGF0YS5wYWdlWm9vbVtwYWdlXTsKICAgICAgICAgICAgICBkZWxldGUgZGF0YS5wYWdlT2Jqc1twYWdlXTsKICAgICAgICAgICAgICBkZWxldGUgZGF0YS5wYWdlV3JhcFtwYWdlXTsKICAgICAgICAgICAgfQoKICAgICAgICB9CgogICAgfTsKCiAgICBpZiAoY2hhbmdlPjApCiAgICAgIGZvciAocGFnZT1kYXRhLnRvdGFsUGFnZXM7IHBhZ2U+PWZyb207IHBhZ2UtLSkKICAgICAgICBtb3ZlKHBhZ2UpOwogICAgZWxzZQogICAgICBmb3IgKHBhZ2U9ZnJvbTsgcGFnZTw9ZGF0YS50b3RhbFBhZ2VzOyBwYWdlKyspCiAgICAgICAgbW92ZShwYWdlKTsKCiAgfSwKCiAgLy8gU2V0cyBvciBHZXRzIHRoZSBkaXNwbGF5IG1vZGUKCiAgZGlzcGxheTogZnVuY3Rpb24oZGlzcGxheSkgewoKICAgIHZhciBkYXRhID0gdGhpcy5kYXRhKCksCiAgICAgIGN1cnJlbnREaXNwbGF5ID0gZGF0YS5kaXNwbGF5OwoKICAgIGlmIChkaXNwbGF5PT09dW5kZWZpbmVkKSB7CiAgICAgIAogICAgICByZXR1cm4gY3VycmVudERpc3BsYXk7CgogICAgfSBlbHNlIHsKCiAgICAgIGlmICgkLmluQXJyYXkoZGlzcGxheSwgZGlzcGxheXMpPT0tMSkKICAgICAgICB0aHJvdyB0dXJuRXJyb3IoJyInK2Rpc3BsYXkgKyAnIiBpcyBub3QgYSB2YWx1ZSBmb3IgZGlzcGxheScpOwogICAgICAKICAgICAgc3dpdGNoKGRpc3BsYXkpIHsKICAgICAgICBjYXNlICdzaW5nbGUnOgoKICAgICAgICAgIC8vIENyZWF0ZSBhIHRlbXBvcmFsIHBhZ2UgdG8gdXNlIGFzIGZvbGRlZCBwYWdlCgogICAgICAgICAgaWYgKCFkYXRhLnBhZ2VPYmpzWzBdKSB7CiAgICAgICAgICAgIHRoaXMudHVybignc3RvcCcpLgogICAgICAgICAgICAgIGNzcyh7J292ZXJmbG93JzogJ2hpZGRlbid9KTsKCiAgICAgICAgICAgIGRhdGEucGFnZU9ianNbMF0gPSAkKCc8ZGl2IC8+JywKICAgICAgICAgICAgICAgIHsnY2xhc3MnOiAncGFnZSBwLXRlbXBvcmFsJ30pLgogICAgICAgICAgICAgIGNzcyh7d2lkdGg6IHRoaXMud2lkdGgoKSwgaGVpZ2h0OiB0aGlzLmhlaWdodCgpfSkuCiAgICAgICAgICAgICAgYXBwZW5kVG8odGhpcyk7CiAgICAgICAgICB9CgogICAgICAgICAgdGhpcy5hZGRDbGFzcygnc2hhZG93Jyk7CgogICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgJ2RvdWJsZSc6CgogICAgICAgICAgLy8gUmVtb3ZlIHRoZSB0ZW1wb3JhbCBwYWdlCgogICAgICAgICAgaWYgKGRhdGEucGFnZU9ianNbMF0pIHsKICAgICAgICAgICAgdGhpcy50dXJuKCdzdG9wJykuY3NzKHsnb3ZlcmZsb3cnOiAnJ30pOwogICAgICAgICAgICBkYXRhLnBhZ2VPYmpzWzBdLnJlbW92ZSgpOwogICAgICAgICAgICBkZWxldGUgZGF0YS5wYWdlT2Jqc1swXTsKICAgICAgICAgIH0KCiAgICAgICAgICB0aGlzLnJlbW92ZUNsYXNzKCdzaGFkb3cnKTsKCiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgCgogICAgICBkYXRhLmRpc3BsYXkgPSBkaXNwbGF5OwoKICAgICAgaWYgKGN1cnJlbnREaXNwbGF5KSB7CiAgICAgICAgdmFyIHNpemUgPSB0aGlzLnR1cm4oJ3NpemUnKTsKICAgICAgICB0dXJuTWV0aG9kcy5fbW92ZVBhZ2VzLmNhbGwodGhpcywgMSwgMCk7CiAgICAgICAgdGhpcy50dXJuKCdzaXplJywgc2l6ZS53aWR0aCwgc2l6ZS5oZWlnaHQpLgogICAgICAgICAgdHVybigndXBkYXRlJyk7CiAgICAgIH0KCiAgICAgIHJldHVybiB0aGlzOwoKICAgIH0KICAKICB9LAogIAogIC8vIEdldHMgYW5kIHNldHMgdGhlIGRpcmVjdGlvbiBvZiB0aGUgZmxpcGJvb2sKCiAgZGlyZWN0aW9uOiBmdW5jdGlvbihkaXIpIHsKCiAgICB2YXIgZGF0YSA9IHRoaXMuZGF0YSgpOwoKICAgIGlmIChkaXI9PT11bmRlZmluZWQpIHsKCiAgICAgIHJldHVybiBkYXRhLmRpcmVjdGlvbjsKCiAgICB9IGVsc2UgewoKICAgICAgZGlyID0gZGlyLnRvTG93ZXJDYXNlKCk7CgogICAgICBpZiAoJC5pbkFycmF5KGRpciwgZGlyZWN0aW9ucyk9PS0xKQogICAgICAgIHRocm93IHR1cm5FcnJvcignIicgKyBkaXIgKyAnIiBpcyBub3QgYSB2YWx1ZSBmb3IgZGlyZWN0aW9uJyk7CgogICAgICBpZiAoZGlyPT0ncnRsJykgewogICAgICAgICQodGhpcykuYXR0cignZGlyJywgJ2x0cicpLgogICAgICAgICAgY3NzKHtkaXJlY3Rpb246ICdsdHInfSk7CiAgICAgIH0KCiAgICAgIGRhdGEuZGlyZWN0aW9uID0gZGlyOwoKICAgICAgaWYgKGRhdGEuZG9uZSkKICAgICAgICB0aGlzLnR1cm4oJ3NpemUnLCAkKHRoaXMpLndpZHRoKCksICQodGhpcykuaGVpZ2h0KCkpOwoKICAgICAgcmV0dXJuIHRoaXM7CiAgICB9CgogIH0sCgogIC8vIERldGVjdHMgYW5pbWF0aW9uCgogIGFuaW1hdGluZzogZnVuY3Rpb24oKSB7CgogICAgcmV0dXJuIHRoaXMuZGF0YSgpLnBhZ2VNdi5sZW5ndGg+MDsKCiAgfSwKCiAgLy8gR2V0cyB0aGUgY3VycmVudCBhY3RpdmF0ZWQgY29ybmVyCgogIGNvcm5lcjogZnVuY3Rpb24oKSB7CiAgICAKICAgIHZhciBjb3JuZXIsCiAgICAgIHBhZ2UsCiAgICAgIGRhdGEgPSB0aGlzLmRhdGEoKTsKCiAgICBmb3IgKHBhZ2UgaW4gZGF0YS5wYWdlcykgewogICAgICBpZiAoaGFzKHBhZ2UsIGRhdGEucGFnZXMpKQogICAgICAgIGlmICgoY29ybmVyID0gZGF0YS5wYWdlc1twYWdlXS5mbGlwKCdjb3JuZXInKSkpIHsKICAgICAgICAgIHJldHVybiBjb3JuZXI7CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiBmYWxzZTsKICB9LAoKICAvLyBHZXRzIHRoZSBkYXRhIHN0b3JlZCBpbiB0aGUgZmxpcGJvb2sKCiAgZGF0YTogZnVuY3Rpb24oKSB7CiAgICAKICAgIHJldHVybiB0aGlzLmRhdGEoKTsKCiAgfSwKCiAgLy8gRGlzYWJsZXMgYW5kIGVuYWJsZXMgdGhlIGVmZmVjdAoKICBkaXNhYmxlOiBmdW5jdGlvbihkaXNhYmxlKSB7CgogICAgdmFyIHBhZ2UsCiAgICAgIGRhdGEgPSB0aGlzLmRhdGEoKSwKICAgICAgdmlldyA9IHRoaXMudHVybigndmlldycpOwoKICAgIGRhdGEuZGlzYWJsZWQgPSBkaXNhYmxlPT09dW5kZWZpbmVkIHx8IGRpc2FibGU9PT10cnVlOwoKICAgIGZvciAocGFnZSBpbiBkYXRhLnBhZ2VzKSB7CiAgICAgIGlmIChoYXMocGFnZSwgZGF0YS5wYWdlcykpCiAgICAgICAgZGF0YS5wYWdlc1twYWdlXS5mbGlwKCdkaXNhYmxlJywKICAgICAgICAgIChkYXRhLmRpc2FibGVkKSA/IHRydWUgOiAkLmluQXJyYXkocGFyc2VJbnQocGFnZSwgMTApLCB2aWV3KT09LTEpOwogICAgfQoKICAgIHJldHVybiB0aGlzOwoKICB9LAoKICAvLyBEaXNhYmxlcyBhbmQgZW5hYmxlcyB0aGUgZWZmZWN0CgogIGRpc2FibGVkOiBmdW5jdGlvbihkaXNhYmxlKSB7CgogICAgaWYgKGRpc2FibGU9PT11bmRlZmluZWQpIHsKICAgICAgcmV0dXJuIHRoaXMuZGF0YSgpLmRpc2FibGVkPT09dHJ1ZTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiB0aGlzLnR1cm4oJ2Rpc2FibGUnLCBkaXNhYmxlKTsKICAgIH0KCiAgfSwKCiAgLy8gR2V0cyBhbmQgc2V0cyB0aGUgc2l6ZQoKICBzaXplOiBmdW5jdGlvbih3aWR0aCwgaGVpZ2h0KSB7CgogICAgaWYgKHdpZHRoPT09dW5kZWZpbmVkIHx8IGhlaWdodD09PXVuZGVmaW5lZCkgewogICAgICAKICAgICAgcmV0dXJuIHt3aWR0aDogdGhpcy53aWR0aCgpLCBoZWlnaHQ6IHRoaXMuaGVpZ2h0KCl9OwoKICAgIH0gZWxzZSB7CgogICAgICB0aGlzLnR1cm4oJ3N0b3AnKTsKCiAgICAgIHZhciBwYWdlLCBwcm9wLAogICAgICAgIGRhdGEgPSB0aGlzLmRhdGEoKSwKICAgICAgICBwYWdlV2lkdGggPSAoZGF0YS5kaXNwbGF5PT0nZG91YmxlJykgPyB3aWR0aC8yIDogd2lkdGg7CgogICAgICB0aGlzLmNzcyh7d2lkdGg6IHdpZHRoLCBoZWlnaHQ6IGhlaWdodH0pOwoKICAgICAgaWYgKGRhdGEucGFnZU9ianNbMF0pCiAgICAgICAgZGF0YS5wYWdlT2Jqc1swXS5jc3Moe3dpZHRoOiBwYWdlV2lkdGgsIGhlaWdodDogaGVpZ2h0fSk7CiAgICAgIAogICAgICBmb3IgKHBhZ2UgaW4gZGF0YS5wYWdlV3JhcCkgewogICAgICAgIGlmICghaGFzKHBhZ2UsIGRhdGEucGFnZVdyYXApKSBjb250aW51ZTsKCiAgICAgICAgcHJvcCA9IHR1cm5NZXRob2RzLl9wYWdlU2l6ZS5jYWxsKHRoaXMsIHBhZ2UsIHRydWUpOwoKICAgICAgICBkYXRhLnBhZ2VPYmpzW3BhZ2VdLmNzcyh7d2lkdGg6IHByb3Aud2lkdGgsIGhlaWdodDogcHJvcC5oZWlnaHR9KTsKICAgICAgICBkYXRhLnBhZ2VXcmFwW3BhZ2VdLmNzcyhwcm9wKTsKICAgICAgICAKICAgICAgICBpZiAoZGF0YS5wYWdlc1twYWdlXSkKICAgICAgICAgIGRhdGEucGFnZXNbcGFnZV0uY3NzKHt3aWR0aDogcHJvcC53aWR0aCwgaGVpZ2h0OiBwcm9wLmhlaWdodH0pOwogICAgICB9CgogICAgICB0aGlzLnR1cm4oJ3Jlc2l6ZScpOwoKICAgICAgcmV0dXJuIHRoaXM7CgogICAgfQogIH0sCgogIC8vIFJlc2l6ZXMgZWFjaCBwYWdlCgogIHJlc2l6ZTogZnVuY3Rpb24oKSB7CgogICAgdmFyIHBhZ2UsIGRhdGEgPSB0aGlzLmRhdGEoKTsKCiAgICBpZiAoZGF0YS5wYWdlc1swXSkgewogICAgICBkYXRhLnBhZ2VXcmFwWzBdLmNzcyh7bGVmdDogLXRoaXMud2lkdGgoKX0pOwogICAgICBkYXRhLnBhZ2VzWzBdLmZsaXAoJ3Jlc2l6ZScsIHRydWUpOwogICAgfQoKICAgIGZvciAocGFnZSA9IDE7IHBhZ2UgPD0gZGF0YS50b3RhbFBhZ2VzOyBwYWdlKyspCiAgICAgIGlmIChkYXRhLnBhZ2VzW3BhZ2VdKQogICAgICAgIGRhdGEucGFnZXNbcGFnZV0uZmxpcCgncmVzaXplJywgdHJ1ZSk7CgogICAgdHVybk1ldGhvZHMuX3VwZGF0ZVNoYWRvdy5jYWxsKHRoaXMpOwoKICAgIGlmIChkYXRhLm9wdHMuYXV0b0NlbnRlcikKICAgICAgdGhpcy50dXJuKCdjZW50ZXInKTsKCiAgfSwKCiAgLy8gUmVtb3ZlcyBhbiBhbmltYXRpb24gZnJvbSB0aGUgY2FjaGUKCiAgX3JlbW92ZU12OiBmdW5jdGlvbihwYWdlKSB7CgogICAgdmFyIGksIGRhdGEgPSB0aGlzLmRhdGEoKTsKICAgICAgCiAgICBmb3IgKGk9MDsgaTxkYXRhLnBhZ2VNdi5sZW5ndGg7IGkrKykKICAgICAgaWYgKGRhdGEucGFnZU12W2ldPT1wYWdlKSB7CiAgICAgICAgZGF0YS5wYWdlTXYuc3BsaWNlKGksIDEpOwogICAgICAgIHJldHVybiB0cnVlOwogICAgICB9CgogICAgcmV0dXJuIGZhbHNlOwoKICB9LAoKICAvLyBBZGRzIGFuIGFuaW1hdGlvbiB0byB0aGUgY2FjaGUKICAKICBfYWRkTXY6IGZ1bmN0aW9uKHBhZ2UpIHsKCiAgICB2YXIgZGF0YSA9IHRoaXMuZGF0YSgpOwoKICAgIHR1cm5NZXRob2RzLl9yZW1vdmVNdi5jYWxsKHRoaXMsIHBhZ2UpOwogICAgZGF0YS5wYWdlTXYucHVzaChwYWdlKTsKCiAgfSwKCiAgLy8gR2V0cyBpbmRleGVzIGZvciBhIHZpZXcKCiAgX3ZpZXc6IGZ1bmN0aW9uKHBhZ2UpIHsKICAKICAgIHZhciBkYXRhID0gdGhpcy5kYXRhKCk7CiAgICAKICAgIHBhZ2UgPSBwYWdlIHx8IGRhdGEucGFnZTsKCiAgICBpZiAoZGF0YS5kaXNwbGF5PT0nZG91YmxlJykKICAgICAgcmV0dXJuIChwYWdlJTIpID8gW3BhZ2UtMSwgcGFnZV0gOiBbcGFnZSwgcGFnZSsxXTsKICAgIGVsc2UKICAgICAgcmV0dXJuIFtwYWdlXTsKCiAgfSwKCiAgLy8gR2V0cyBhIHZpZXcKCiAgdmlldzogZnVuY3Rpb24ocGFnZSkgewoKICAgIHZhciBkYXRhID0gdGhpcy5kYXRhKCksCiAgICAgIHZpZXcgPSB0dXJuTWV0aG9kcy5fdmlldy5jYWxsKHRoaXMsIHBhZ2UpOwoKICAgIGlmIChkYXRhLmRpc3BsYXk9PSdkb3VibGUnKQogICAgICByZXR1cm4gWyh2aWV3WzBdPjApID8gdmlld1swXSA6IDAsCiAgICAgICAgKHZpZXdbMV08PWRhdGEudG90YWxQYWdlcykgPyB2aWV3WzFdIDogMF07CiAgICBlbHNlCiAgICAgIHJldHVybiBbKHZpZXdbMF0+MCAmJiB2aWV3WzBdPD1kYXRhLnRvdGFsUGFnZXMpID8gdmlld1swXSA6IDBdOwoKICB9LAoKICAvLyBTdG9wcyBhbmltYXRpb25zCgogIHN0b3A6IGZ1bmN0aW9uKGlnbm9yZSwgYW5pbWF0ZSkgewoKICAgIGlmICh0aGlzLnR1cm4oJ2FuaW1hdGluZycpKSB7CiAgCiAgICAgIHZhciBpLCBvcHRzLCBwYWdlLAogICAgICAgIGRhdGEgPSB0aGlzLmRhdGEoKTsKCiAgICAgIGlmIChkYXRhLnRwYWdlKSB7CiAgICAgICAgZGF0YS5wYWdlID0gZGF0YS50cGFnZTsKICAgICAgICBkZWxldGUgZGF0YVsndHBhZ2UnXTsKICAgICAgfQoKICAgICAgZm9yIChpID0gMDsgaTxkYXRhLnBhZ2VNdi5sZW5ndGg7IGkrKykgewoKICAgICAgICBpZiAoIWRhdGEucGFnZU12W2ldIHx8IGRhdGEucGFnZU12W2ldPT09aWdub3JlKQogICAgICAgICAgY29udGludWU7CgogICAgICAgIHBhZ2UgPSBkYXRhLnBhZ2VzW2RhdGEucGFnZU12W2ldXTsKICAgICAgICBvcHRzID0gcGFnZS5kYXRhKCkuZi5vcHRzOwoKICAgICAgICBwYWdlLmZsaXAoJ2hpZGVGb2xkZWRQYWdlJywgYW5pbWF0ZSk7CgogICAgICAgIGlmICghYW5pbWF0ZSkKICAgICAgICAgIGZsaXBNZXRob2RzLl9tb3ZlRm9sZGluZ1BhZ2UuY2FsbChwYWdlLCBmYWxzZSk7CgogICAgICAgIGlmIChvcHRzLmZvcmNlKSB7CiAgICAgICAgICBvcHRzLm5leHQgPSAob3B0cy5wYWdlJTI9PT0wKSA/IG9wdHMucGFnZS0xIDogb3B0cy5wYWdlKzE7CiAgICAgICAgICBkZWxldGUgb3B0c1snZm9yY2UnXTsKICAgICAgICB9CgogICAgICB9CiAgICB9CiAgICAKICAgIHRoaXMudHVybigndXBkYXRlJyk7CgogICAgcmV0dXJuIHRoaXM7CiAgfSwKCiAgLy8gR2V0cyBhbmQgc2V0cyB0aGUgbnVtYmVyIG9mIHBhZ2VzCgogIHBhZ2VzOiBmdW5jdGlvbihwYWdlcykgewoKICAgIHZhciBkYXRhID0gdGhpcy5kYXRhKCk7CgogICAgaWYgKHBhZ2VzKSB7CgogICAgICBpZiAocGFnZXM8ZGF0YS50b3RhbFBhZ2VzKSB7CgogICAgICAgIGZvciAodmFyIHBhZ2UgPSBkYXRhLnRvdGFsUGFnZXM7IHBhZ2U+cGFnZXM7IHBhZ2UtLSkKICAgICAgICAgIHRoaXMudHVybigncmVtb3ZlUGFnZScsIHBhZ2UpOwoKICAgICAgfQoKICAgICAgICBkYXRhLnRvdGFsUGFnZXMgPSBwYWdlczsKICAgICAgICB0dXJuTWV0aG9kcy5fZml0UGFnZS5jYWxsKHRoaXMsIGRhdGEucGFnZSk7CgogICAgICByZXR1cm4gdGhpczsKCiAgICB9IGVsc2UKICAgICAgcmV0dXJuIGRhdGEudG90YWxQYWdlczsKCiAgfSwKCiAgLy8gQ2hlY2tzIG1pc3NpbmcgcGFnZXMKCiAgX21pc3NpbmcgOiBmdW5jdGlvbihwYWdlKSB7CiAgICAKICAgIHZhciBkYXRhID0gdGhpcy5kYXRhKCk7CgogICAgaWYgKGRhdGEudG90YWxQYWdlczwxKQogICAgICByZXR1cm47CgogICAgdmFyIHAsCiAgICAgICAgcmFuZ2UgPSB0aGlzLnR1cm4oJ3JhbmdlJywgcGFnZSksCiAgICAgICAgbWlzc2luZyA9IFtdOwoKICAgIGZvciAocCA9IHJhbmdlWzBdOyBwPD1yYW5nZVsxXTsgcCsrKSB7CiAgICAgIGlmICghZGF0YS5wYWdlT2Jqc1twXSkKICAgICAgICBtaXNzaW5nLnB1c2gocCk7CiAgICB9CgogICAgaWYgKG1pc3NpbmcubGVuZ3RoPjApCiAgICAgIHRoaXMudHJpZ2dlcignbWlzc2luZycsIFttaXNzaW5nXSk7CgogIH0sCgogIC8vIFNldHMgYSBwYWdlIHdpdGhvdXQgZWZmZWN0CgogIF9maXRQYWdlOiBmdW5jdGlvbihwYWdlKSB7CgogICAgdmFyIGRhdGEgPSB0aGlzLmRhdGEoKSwKICAgICAgbmV3VmlldyA9IHRoaXMudHVybigndmlldycsIHBhZ2UpOwoKICAgIHR1cm5NZXRob2RzLl9taXNzaW5nLmNhbGwodGhpcywgcGFnZSk7CiAgICAKICAgIGlmICghZGF0YS5wYWdlT2Jqc1twYWdlXSkKICAgICAgcmV0dXJuOwoKICAgIGRhdGEucGFnZSA9IHBhZ2U7CiAgCiAgICB0aGlzLnR1cm4oJ3N0b3AnKTsKCiAgICBmb3IgKHZhciBpID0gMDsgaTxuZXdWaWV3Lmxlbmd0aDsgaSsrKSB7CgogICAgICBpZiAobmV3Vmlld1tpXSAmJiBkYXRhLnBhZ2Vab29tW25ld1ZpZXdbaV1dIT1kYXRhLnpvb20pIHsKICAKICAgICAgICB0aGlzLnRyaWdnZXIoJ3pvb21lZCcsWwogICAgICAgICAgbmV3Vmlld1tpXSwKICAgICAgICAgIG5ld1ZpZXcsCiAgICAgICAgICBkYXRhLnBhZ2Vab29tW25ld1ZpZXdbaV1dLAogICAgICAgICAgZGF0YS56b29tXSk7CgogICAgICAgIGRhdGEucGFnZVpvb21bbmV3Vmlld1tpXV0gPSBkYXRhLnpvb207CgogICAgICB9CiAgICB9CgogICAgdHVybk1ldGhvZHMuX3JlbW92ZUZyb21ET00uY2FsbCh0aGlzKTsKICAgIHR1cm5NZXRob2RzLl9tYWtlUmFuZ2UuY2FsbCh0aGlzKTsKICAgIHR1cm5NZXRob2RzLl91cGRhdGVTaGFkb3cuY2FsbCh0aGlzKTsKICAgIHRoaXMudHJpZ2dlcigndHVybmVkJywgW3BhZ2UsIG5ld1ZpZXddKTsKICAgIHRoaXMudHVybigndXBkYXRlJyk7CgogICAgaWYgKGRhdGEub3B0cy5hdXRvQ2VudGVyKQogICAgICB0aGlzLnR1cm4oJ2NlbnRlcicpOwoKICB9LAogIAogIC8vIFR1cm5zIHRoZSBwYWdlCgogIF90dXJuUGFnZTogZnVuY3Rpb24ocGFnZSkgewoKICAgIHZhciBjdXJyZW50LAogICAgICBuZXh0LAogICAgICBkYXRhID0gdGhpcy5kYXRhKCksCiAgICAgIHBsYWNlID0gZGF0YS5wYWdlUGxhY2VbcGFnZV0sCiAgICAgIHZpZXcgPSB0aGlzLnR1cm4oJ3ZpZXcnKSwKICAgICAgbmV3VmlldyA9IHRoaXMudHVybigndmlldycsIHBhZ2UpOwoKCiAgICBpZiAoZGF0YS5wYWdlIT1wYWdlKSB7CgogICAgICB2YXIgY3VycmVudFBhZ2UgPSBkYXRhLnBhZ2U7CgogICAgICBpZiAodHJpZ2dlcigndHVybmluZycsIHRoaXMsIFtwYWdlLCBuZXdWaWV3XSk9PSdwcmV2ZW50ZWQnKSB7CgogICAgICAgIGlmIChjdXJyZW50UGFnZT09ZGF0YS5wYWdlICYmICQuaW5BcnJheShwbGFjZSwgZGF0YS5wYWdlTXYpIT0tMSkKICAgICAgICAgIGRhdGEucGFnZXNbcGxhY2VdLmZsaXAoJ2hpZGVGb2xkZWRQYWdlJywgdHJ1ZSk7CiAgICAgICAgCiAgICAgICAgcmV0dXJuOwoKICAgICAgfQoKICAgICAgaWYgKCQuaW5BcnJheSgxLCBuZXdWaWV3KSE9LTEpCiAgICAgICAgdGhpcy50cmlnZ2VyKCdmaXJzdCcpOwogICAgICBpZiAoJC5pbkFycmF5KGRhdGEudG90YWxQYWdlcywgbmV3VmlldykhPS0xKQogICAgICAgIHRoaXMudHJpZ2dlcignbGFzdCcpOwoKICAgIH0KCiAgICBpZiAoZGF0YS5kaXNwbGF5PT0nc2luZ2xlJykgewogICAgICBjdXJyZW50ID0gdmlld1swXTsKICAgICAgbmV4dCA9IG5ld1ZpZXdbMF07CiAgICB9IGVsc2UgaWYgKHZpZXdbMV0gJiYgcGFnZT52aWV3WzFdKSB7CiAgICAgIGN1cnJlbnQgPSB2aWV3WzFdOwogICAgICBuZXh0ID0gbmV3Vmlld1swXTsKICAgIH0gZWxzZSBpZiAodmlld1swXSAmJiBwYWdlPHZpZXdbMF0pIHsKICAgICAgY3VycmVudCA9IHZpZXdbMF07CiAgICAgIG5leHQgPSBuZXdWaWV3WzFdOwogICAgfQoKICAgIHZhciBvcHRzQ29ybmVycyA9IGRhdGEub3B0cy50dXJuQ29ybmVycy5zcGxpdCgnLCcpLAogICAgICBmbGlwRGF0YSA9IGRhdGEucGFnZXNbY3VycmVudF0uZGF0YSgpLmYsCiAgICAgIG9wdHMgPSBmbGlwRGF0YS5vcHRzLAogICAgICBhY3R1YWxQb2ludCA9IGZsaXBEYXRhLnBvaW50OwoKICAgIHR1cm5NZXRob2RzLl9taXNzaW5nLmNhbGwodGhpcywgcGFnZSk7CiAgICAKICAgIGlmICghZGF0YS5wYWdlT2Jqc1twYWdlXSkKICAgICAgcmV0dXJuOwoKICAgIHRoaXMudHVybignc3RvcCcpOwoKICAgIGRhdGEucGFnZSA9IHBhZ2U7CgogICAgdHVybk1ldGhvZHMuX21ha2VSYW5nZS5jYWxsKHRoaXMpOwoKICAgIGRhdGEudHBhZ2UgPSBuZXh0OwoKICAgIGlmIChvcHRzLm5leHQhPW5leHQpIHsKICAgICAgb3B0cy5uZXh0ID0gbmV4dDsKICAgICAgb3B0cy5mb3JjZSA9IHRydWU7CiAgICB9CgogICAgdGhpcy50dXJuKCd1cGRhdGUnKTsKCiAgICBmbGlwRGF0YS5wb2ludCA9IGFjdHVhbFBvaW50OwogICAgCiAgICBpZiAoZmxpcERhdGEuZWZmZWN0PT0naGFyZCcpCiAgICAgIGlmIChkYXRhLmRpcmVjdGlvbj09J2x0cicpCiAgICAgICAgZGF0YS5wYWdlc1tjdXJyZW50XS5mbGlwKCd0dXJuUGFnZScsCiAgICAgICAgICAocGFnZT5jdXJyZW50KSA/ICdyJyA6ICdsJyk7CiAgICAgIGVsc2UKICAgICAgICBkYXRhLnBhZ2VzW2N1cnJlbnRdLmZsaXAoJ3R1cm5QYWdlJywKICAgICAgICAgIChwYWdlPmN1cnJlbnQpID8gJ2wnIDogJ3InKTsKICAgIGVsc2UgewogICAgICBpZiAoZGF0YS5kaXJlY3Rpb249PSdsdHInKQogICAgICAgIGRhdGEucGFnZXNbY3VycmVudF0uZmxpcCgndHVyblBhZ2UnLAogICAgICAgICAgb3B0c0Nvcm5lcnNbKHBhZ2U+Y3VycmVudCkgPyAxIDogMF0pOwogICAgICBlbHNlCiAgICAgICAgZGF0YS5wYWdlc1tjdXJyZW50XS5mbGlwKCd0dXJuUGFnZScsCiAgICAgICAgICBvcHRzQ29ybmVyc1socGFnZT5jdXJyZW50KSA/IDAgOiAxXSk7CiAgICB9CgogIH0sCgogIC8vIEdldHMgYW5kIHNldHMgYSBwYWdlCgogIHBhZ2U6IGZ1bmN0aW9uKHBhZ2UpIHsKCiAgICB2YXIgZGF0YSA9IHRoaXMuZGF0YSgpOwoKICAgIGlmIChwYWdlPT09dW5kZWZpbmVkKSB7CiAgICAgIAogICAgICByZXR1cm4gZGF0YS5wYWdlOwoKICAgIH0gZWxzZSB7CgogICAgICBpZiAoIWRhdGEuZGlzYWJsZWQgJiYgIWRhdGEuZGVzdHJveWluZykgewoKICAgICAgICBwYWdlID0gcGFyc2VJbnQocGFnZSwgMTApOwoKICAgICAgICBpZiAocGFnZT4wICYmIHBhZ2U8PWRhdGEudG90YWxQYWdlcykgewoKICAgICAgICAgIGlmIChwYWdlIT1kYXRhLnBhZ2UpIHsKICAgICAgICAgICAgaWYgKCFkYXRhLmRvbmUgfHwgJC5pbkFycmF5KHBhZ2UsIHRoaXMudHVybigndmlldycpKSE9LTEpCiAgICAgICAgICAgICAgdHVybk1ldGhvZHMuX2ZpdFBhZ2UuY2FsbCh0aGlzLCBwYWdlKTsKICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgIHR1cm5NZXRob2RzLl90dXJuUGFnZS5jYWxsKHRoaXMsIHBhZ2UpOwogICAgICAgICAgfQogICAgICAKICAgICAgICAgIHJldHVybiB0aGlzOwoKICAgICAgICB9IGVsc2UgewogICAgICAgIAogICAgICAgICAgdGhyb3cgdHVybkVycm9yKCdUaGUgcGFnZSAnICsgcGFnZSArICcgZG9lcyBub3QgZXhpc3QnKTsKCiAgICAgICAgfQoKICAgICAgfQoKICAgIH0KCiAgfSwKCiAgLy8gVHVybnMgdG8gdGhlIG5leHQgdmlldwoKICBuZXh0OiBmdW5jdGlvbigpIHsKCiAgICByZXR1cm4gdGhpcy50dXJuKCdwYWdlJywgTWF0aC5taW4odGhpcy5kYXRhKCkudG90YWxQYWdlcywKICAgICAgdHVybk1ldGhvZHMuX3ZpZXcuY2FsbCh0aGlzLCB0aGlzLmRhdGEoKS5wYWdlKS5wb3AoKSArIDEpKTsKICAKICB9LAoKICAvLyBUdXJucyB0byB0aGUgcHJldmlvdXMgdmlldwoKICBwcmV2aW91czogZnVuY3Rpb24oKSB7CgogICAgcmV0dXJuIHRoaXMudHVybigncGFnZScsIE1hdGgubWF4KDEsCiAgICAgIHR1cm5NZXRob2RzLl92aWV3LmNhbGwodGhpcywgdGhpcy5kYXRhKCkucGFnZSkuc2hpZnQoKSAtIDEpKTsKCiAgfSwKCiAgLy8gU2hvd3MgYSBwZWVsaW5nIGNvcm5lcgoKICBwZWVsOiBmdW5jdGlvbihjb3JuZXIsIGFuaW1hdGUpIHsKICAgIAogICAgdmFyIGRhdGEgPSB0aGlzLmRhdGEoKSwKICAgICAgdmlldyA9IHRoaXMudHVybigndmlldycpOwoKICAgIGFuaW1hdGUgPSAoYW5pbWF0ZT09PXVuZGVmaW5lZCkgPyB0cnVlIDogYW5pbWF0ZT09PXRydWU7CgogICAgaWYgKGNvcm5lcj09PWZhbHNlKSB7CiAgICAgIAogICAgICB0aGlzLnR1cm4oJ3N0b3AnLCBudWxsLCBhbmltYXRlKTsKCiAgICB9IGVsc2UgewogICAgCiAgICAgIGlmIChkYXRhLmRpc3BsYXk9PSdzaW5nbGUnKSB7CgogICAgICAgIGRhdGEucGFnZXNbZGF0YS5wYWdlXS5mbGlwKCdwZWVsJywgY29ybmVyLCBhbmltYXRlKTsKCiAgICAgIH0gZWxzZSB7CgogICAgICAgIHZhciBwYWdlOwoKICAgICAgICBpZiAoZGF0YS5kaXJlY3Rpb249PSdsdHInKSB7CiAgICAgICAgICAKICAgICAgICAgIHBhZ2UgPSAoY29ybmVyLmluZGV4T2YoJ2wnKSE9LTEpID8gdmlld1swXSA6IHZpZXdbMV07CgogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAKICAgICAgICAgIHBhZ2UgPSAoY29ybmVyLmluZGV4T2YoJ2wnKSE9LTEpID8gdmlld1sxXSA6IHZpZXdbMF07CgogICAgICAgIH0KICAgICAgICAKICAgICAgICBpZiAoZGF0YS5wYWdlc1twYWdlXSkKICAgICAgICAgIGRhdGEucGFnZXNbcGFnZV0uZmxpcCgncGVlbCcsIGNvcm5lciwgYW5pbWF0ZSk7CgogICAgICB9CiAgICB9CgogICAgcmV0dXJuIHRoaXM7CgogIH0sCgogIC8vIEFkZHMgYSBtb3Rpb24gdG8gdGhlIGludGVybmFsIGxpc3QKICAvLyBUaGlzIGV2ZW50IGlzIGNhbGxlZCBpbiBjb250ZXh0IG9mIGZsaXAKCiAgX2FkZE1vdGlvblBhZ2U6IGZ1bmN0aW9uKCkgewoKICAgIHZhciBvcHRzID0gJCh0aGlzKS5kYXRhKCkuZi5vcHRzLAogICAgICB0dXJuID0gb3B0cy50dXJuLAogICAgICBkZCA9IHR1cm4uZGF0YSgpOwoKICAgIHR1cm5NZXRob2RzLl9hZGRNdi5jYWxsKHR1cm4sIG9wdHMucGFnZSk7CgogIH0sCgogIC8vIFRoaXMgZXZlbnQgaXMgY2FsbGVkIGluIGNvbnRleHQgb2YgZmxpcAoKICBfZXZlbnRTdGFydDogZnVuY3Rpb24oZSwgb3B0cywgY29ybmVyKSB7CgogICAgdmFyIGRhdGEgPSBvcHRzLnR1cm4uZGF0YSgpLAogICAgICBhY3R1YWxab29tID0gZGF0YS5wYWdlWm9vbVtvcHRzLnBhZ2VdOwoKICAgIGlmIChlLmlzRGVmYXVsdFByZXZlbnRlZCgpKSB7CiAgICAgIHR1cm5NZXRob2RzLl91cGRhdGVTaGFkb3cuY2FsbChvcHRzLnR1cm4pOwogICAgICByZXR1cm47CiAgICB9CgogICAgaWYgKGFjdHVhbFpvb20gJiYgYWN0dWFsWm9vbSE9ZGF0YS56b29tKSB7CiAgICAgIAogICAgICBvcHRzLnR1cm4udHJpZ2dlcignem9vbWVkJyxbCiAgICAgICAgb3B0cy5wYWdlLAogICAgICAgIG9wdHMudHVybi50dXJuKCd2aWV3Jywgb3B0cy5wYWdlKSwKICAgICAgICBhY3R1YWxab29tLAogICAgICAgIGRhdGEuem9vbV0pOwoKICAgICAgZGF0YS5wYWdlWm9vbVtvcHRzLnBhZ2VdID0gZGF0YS56b29tOwoKICAgIH0KCiAgICBpZiAoZGF0YS5kaXNwbGF5PT0nc2luZ2xlJyAmJiBjb3JuZXIpIHsKCiAgICAgIGlmICgoY29ybmVyLmNoYXJBdCgxKT09J2wnICYmIGRhdGEuZGlyZWN0aW9uPT0nbHRyJykgfHwKICAgICAgICAoY29ybmVyLmNoYXJBdCgxKT09J3InICYmIGRhdGEuZGlyZWN0aW9uPT0ncnRsJykpCiAgICAgIHsKICAgICAgICAKICAgICAgICBvcHRzLm5leHQgPSAob3B0cy5uZXh0PG9wdHMucGFnZSkgPyBvcHRzLm5leHQgOiBvcHRzLnBhZ2UtMTsKICAgICAgICBvcHRzLmZvcmNlID0gdHJ1ZTsKCiAgICAgIH0gZWxzZSB7CiAgICAgICAgCiAgICAgICAgb3B0cy5uZXh0ID0gKG9wdHMubmV4dD5vcHRzLnBhZ2UpID8gb3B0cy5uZXh0IDogb3B0cy5wYWdlKzE7CgogICAgICB9CgogICAgfQoKICAgIHR1cm5NZXRob2RzLl9hZGRNb3Rpb25QYWdlLmNhbGwoZS50YXJnZXQpOwogICAgdHVybk1ldGhvZHMuX3VwZGF0ZVNoYWRvdy5jYWxsKG9wdHMudHVybik7CiAgfSwKCiAgLy8gVGhpcyBldmVudCBpcyBjYWxsZWQgaW4gY29udGV4dCBvZiBmbGlwCgogIF9ldmVudEVuZDogZnVuY3Rpb24oZSwgb3B0cywgdHVybmVkKSB7CiAgCiAgICB2YXIgdGhhdCA9ICQoZS50YXJnZXQpLAogICAgICBkYXRhID0gdGhhdC5kYXRhKCkuZiwKICAgICAgdHVybiA9IG9wdHMudHVybiwKICAgICAgZGQgPSB0dXJuLmRhdGEoKTsKCiAgICBpZiAodHVybmVkKSB7CgogICAgICB2YXIgdHBhZ2UgPSBkZC50cGFnZSB8fCBkZC5wYWdlOwogICAgCiAgICAgIGlmICh0cGFnZT09b3B0cy5uZXh0IHx8IHRwYWdlPT1vcHRzLnBhZ2UpIHsKICAgICAgICBkZWxldGUgZGQudHBhZ2U7CgogICAgICAgIHR1cm5NZXRob2RzLl9maXRQYWdlLmNhbGwodHVybiwgdHBhZ2UgfHwgb3B0cy5uZXh0LCB0cnVlKTsKICAgICAgfQoKICAgIH0gZWxzZSB7CiAgICAgIAogICAgICB0dXJuTWV0aG9kcy5fcmVtb3ZlTXYuY2FsbCh0dXJuLCBvcHRzLnBhZ2UpOwogICAgICB0dXJuTWV0aG9kcy5fdXBkYXRlU2hhZG93LmNhbGwodHVybik7CiAgICAgIHR1cm4udHVybigndXBkYXRlJyk7CgogICAgfQogICAgCiAgfSwKICAKICAvLyBUaGlzIGV2ZW50IGlzIGNhbGxlZCBpbiBjb250ZXh0IG9mIGZsaXAKCiAgX2V2ZW50UHJlc3NlZDogZnVuY3Rpb24oZSkgewoKICAgIHZhciBwYWdlLAogICAgICBkYXRhID0gJChlLnRhcmdldCkuZGF0YSgpLmYsCiAgICAgIHR1cm4gPSBkYXRhLm9wdHMudHVybiwKICAgICAgdHVybkRhdGEgPSB0dXJuLmRhdGEoKSwKICAgICAgcGFnZXMgPSB0dXJuRGF0YS5wYWdlczsKICAgIAogICAgdHVybkRhdGEubW91c2VBY3Rpb24gPSB0cnVlOwoKICAgIHR1cm4udHVybigndXBkYXRlJyk7CgogICAgcmV0dXJuIGRhdGEudGltZSA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpOwoKICB9LAoKICAvLyBUaGlzIGV2ZW50IGlzIGNhbGxlZCBpbiBjb250ZXh0IG9mIGZsaXAKCiAgX2V2ZW50UmVsZWFzZWQ6IGZ1bmN0aW9uKGUsIHBvaW50KSB7CgogICAgdmFyIG91dEFyZWEsCiAgICAgIHBhZ2UgPSAkKGUudGFyZ2V0KSwKICAgICAgZGF0YSA9IHBhZ2UuZGF0YSgpLmYsCiAgICAgIHR1cm4gPSBkYXRhLm9wdHMudHVybiwKICAgICAgdHVybkRhdGEgPSB0dXJuLmRhdGEoKTsKICAgIAogICAgaWYgKHR1cm5EYXRhLmRpc3BsYXk9PSdzaW5nbGUnKSB7CiAgICAgIG91dEFyZWEgPSAocG9pbnQuY29ybmVyPT0nYnInIHx8IHBvaW50LmNvcm5lcj09J3RyJykgPwogICAgICAgIHBvaW50Lng8cGFnZS53aWR0aCgpLzI6CiAgICAgICAgcG9pbnQueD5wYWdlLndpZHRoKCkvMjsKICAgIH0gZWxzZSB7CiAgICAgIG91dEFyZWEgPSBwb2ludC54PDAgfHwgcG9pbnQueD5wYWdlLndpZHRoKCk7CiAgICB9CgogICAgaWYgKChuZXcgRGF0ZSgpKS5nZXRUaW1lKCktZGF0YS50aW1lPDIwMCB8fCBvdXRBcmVhKSB7CgogICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgIHR1cm5NZXRob2RzLl90dXJuUGFnZS5jYWxsKHR1cm4sIGRhdGEub3B0cy5uZXh0KTsKCiAgICB9CgogICAgdHVybkRhdGEubW91c2VBY3Rpb24gPSBmYWxzZTsKCiAgfSwKCiAgLy8gVGhpcyBldmVudCBpcyBjYWxsZWQgaW4gY29udGV4dCBvZiBmbGlwCiAgCiAgX2ZsaXA6IGZ1bmN0aW9uKGUpIHsKCiAgICBlLnN0b3BQcm9wYWdhdGlvbigpOwoKICAgIHZhciBvcHRzID0gJChlLnRhcmdldCkuZGF0YSgpLmYub3B0czsKCiAgICBvcHRzLnR1cm4udHJpZ2dlcigndHVybicsIFtvcHRzLm5leHRdKTsKCiAgICBpZiAob3B0cy50dXJuLmRhdGEoKS5vcHRzLmF1dG9DZW50ZXIpIHsKICAgICAgb3B0cy50dXJuLnR1cm4oJ2NlbnRlcicsIG9wdHMubmV4dCk7CiAgICB9CgogIH0sCgogLy8KICBfdG91Y2hTdGFydDogZnVuY3Rpb24oKSB7CiAgICB2YXIgZGF0YSA9IHRoaXMuZGF0YSgpOwogICAgZm9yICh2YXIgcGFnZSBpbiBkYXRhLnBhZ2VzKSB7CiAgICAgIGlmIChoYXMocGFnZSwgZGF0YS5wYWdlcykgJiYKICAgICAgICBmbGlwTWV0aG9kcy5fZXZlbnRTdGFydC5hcHBseShkYXRhLnBhZ2VzW3BhZ2VdLCBhcmd1bWVudHMpPT09ZmFsc2UpIHsKICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQogICAgfQogIH0sCiAgCiAgLy8KICBfdG91Y2hNb3ZlOiBmdW5jdGlvbigpIHsKICAgIHZhciBkYXRhID0gdGhpcy5kYXRhKCk7CiAgICBmb3IgKHZhciBwYWdlIGluIGRhdGEucGFnZXMpIHsKICAgICAgaWYgKGhhcyhwYWdlLCBkYXRhLnBhZ2VzKSkgewogICAgICAgIGZsaXBNZXRob2RzLl9ldmVudE1vdmUuYXBwbHkoZGF0YS5wYWdlc1twYWdlXSwgYXJndW1lbnRzKTsKICAgICAgfQogICAgfQogIH0sCgogIC8vCiAgX3RvdWNoRW5kOiBmdW5jdGlvbigpIHsKICAgIHZhciBkYXRhID0gdGhpcy5kYXRhKCk7CiAgICBmb3IgKHZhciBwYWdlIGluIGRhdGEucGFnZXMpIHsKICAgICAgaWYgKGhhcyhwYWdlLCBkYXRhLnBhZ2VzKSkgewogICAgICAgIGZsaXBNZXRob2RzLl9ldmVudEVuZC5hcHBseShkYXRhLnBhZ2VzW3BhZ2VdLCBhcmd1bWVudHMpOwogICAgICB9CiAgICB9CiAgfSwKCiAgLy8gQ2FsY3VsYXRlIHRoZSB6LWluZGV4IHZhbHVlIGZvciBwYWdlcyBkdXJpbmcgdGhlIGFuaW1hdGlvbgoKICBjYWxjdWxhdGVaOiBmdW5jdGlvbihtdikgewoKICAgIHZhciBpLCBwYWdlLCBuZXh0UGFnZSwgcGxhY2VQYWdlLCBkcGFnZSwKICAgICAgdGhhdCA9IHRoaXMsCiAgICAgIGRhdGEgPSB0aGlzLmRhdGEoKSwKICAgICAgdmlldyA9IHRoaXMudHVybigndmlldycpLAogICAgICBjdXJyZW50UGFnZSA9IHZpZXdbMF0gfHwgdmlld1sxXSwKICAgICAgdG90YWwgPSBtdi5sZW5ndGgtMSwKICAgICAgciA9IHtwYWdlWjoge30sIHBhcnRaOiB7fSwgcGFnZVY6IHt9fSwKCiAgICAgIGFkZFZpZXcgPSBmdW5jdGlvbihwYWdlKSB7CiAgICAgICAgdmFyIHZpZXcgPSB0aGF0LnR1cm4oJ3ZpZXcnLCBwYWdlKTsKICAgICAgICBpZiAodmlld1swXSkgci5wYWdlVlt2aWV3WzBdXSA9IHRydWU7CiAgICAgICAgaWYgKHZpZXdbMV0pIHIucGFnZVZbdmlld1sxXV0gPSB0cnVlOwogICAgICB9OwogICAgCiAgICBmb3IgKGkgPSAwOyBpPD10b3RhbDsgaSsrKSB7CiAgICAgIHBhZ2UgPSBtdltpXTsKICAgICAgbmV4dFBhZ2UgPSBkYXRhLnBhZ2VzW3BhZ2VdLmRhdGEoKS5mLm9wdHMubmV4dDsKICAgICAgcGxhY2VQYWdlID0gZGF0YS5wYWdlUGxhY2VbcGFnZV07CiAgICAgIGFkZFZpZXcocGFnZSk7CiAgICAgIGFkZFZpZXcobmV4dFBhZ2UpOwogICAgICBkcGFnZSA9IChkYXRhLnBhZ2VQbGFjZVtuZXh0UGFnZV09PW5leHRQYWdlKSA/IG5leHRQYWdlIDogcGFnZTsKICAgICAgci5wYWdlWltkcGFnZV0gPSBkYXRhLnRvdGFsUGFnZXMgLSBNYXRoLmFicyhjdXJyZW50UGFnZS1kcGFnZSk7CiAgICAgIHIucGFydFpbcGxhY2VQYWdlXSA9IGRhdGEudG90YWxQYWdlcyoyIC0gIHRvdGFsICsgaTsKICAgIH0KCiAgICByZXR1cm4gcjsKICB9LAoKICAvLyBVcGRhdGVzIHRoZSB6LWluZGV4IGFuZCBkaXNwbGF5IHByb3BlcnR5IG9mIGV2ZXJ5IHBhZ2UKCiAgdXBkYXRlOiBmdW5jdGlvbigpIHsKCiAgICB2YXIgcGFnZSwKICAgICAgZGF0YSA9IHRoaXMuZGF0YSgpOwoKICAgIGlmICh0aGlzLnR1cm4oJ2FuaW1hdGluZycpICYmIGRhdGEucGFnZU12WzBdIT09MCkgewoKICAgICAgLy8gVXBkYXRlIG1vdGlvbgoKICAgICAgdmFyIHAsIGFwYWdlLCBmaXhlZCwKICAgICAgICBwb3MgPSB0aGlzLnR1cm4oJ2NhbGN1bGF0ZVonLCBkYXRhLnBhZ2VNdiksCiAgICAgICAgY29ybmVyID0gdGhpcy50dXJuKCdjb3JuZXInKSwKICAgICAgICBhY3R1YWxWaWV3ID0gdGhpcy50dXJuKCd2aWV3JyksCiAgICAgICAgbmV3VmlldyA9IHRoaXMudHVybigndmlldycsIGRhdGEudHBhZ2UpOwogIAogICAgICBmb3IgKHBhZ2UgaW4gZGF0YS5wYWdlV3JhcCkgewoKICAgICAgICBpZiAoIWhhcyhwYWdlLCBkYXRhLnBhZ2VXcmFwKSkKICAgICAgICAgIGNvbnRpbnVlOwoKICAgICAgICBmaXhlZCA9IGRhdGEucGFnZU9ianNbcGFnZV0uaGFzQ2xhc3MoJ2ZpeGVkJyk7CgogICAgICAgIGRhdGEucGFnZVdyYXBbcGFnZV0uY3NzKHsKICAgICAgICAgIGRpc3BsYXk6IChwb3MucGFnZVZbcGFnZV0gfHwgZml4ZWQpID8gJycgOiAnbm9uZScsCiAgICAgICAgICB6SW5kZXg6CiAgICAgICAgICAgIChkYXRhLnBhZ2VPYmpzW3BhZ2VdLmhhc0NsYXNzKCdoYXJkJykgPwogICAgICAgICAgICAgIHBvcy5wYXJ0WltwYWdlXQogICAgICAgICAgICAgIDoKICAgICAgICAgICAgICBwb3MucGFnZVpbcGFnZV0KICAgICAgICAgICAgKSB8fCAoZml4ZWQgPyAtMSA6IDApCiAgICAgICAgfSk7CgogICAgICAgIGlmICgocCA9IGRhdGEucGFnZXNbcGFnZV0pKSB7CgogICAgICAgICAgcC5mbGlwKCd6JywgcG9zLnBhcnRaW3BhZ2VdIHx8IG51bGwpOwoKICAgICAgICAgIGlmIChwb3MucGFnZVZbcGFnZV0pCiAgICAgICAgICAgIHAuZmxpcCgncmVzaXplJyk7CiAgICAgICAgICAKICAgICAgICAgIGlmIChkYXRhLnRwYWdlKSB7IC8vIElzIGl0IHR1cm5pbmcgdGhlIHBhZ2UgdG8gYHRwYWdlYD8KCiAgICAgICAgICAgIHAuZmxpcCgnaG92ZXInLCBmYWxzZSkuCiAgICAgICAgICAgICAgZmxpcCgnZGlzYWJsZScsCiAgICAgICAgICAgICAgICAkLmluQXJyYXkocGFyc2VJbnQocGFnZSwgMTApLCBkYXRhLnBhZ2VNdik9PS0xICYmCiAgICAgICAgICAgICAgICBwYWdlIT1uZXdWaWV3WzBdICYmCiAgICAgICAgICAgICAgICBwYWdlIT1uZXdWaWV3WzFdKTsKCiAgICAgICAgICB9IGVsc2UgewoKICAgICAgICAgICAgcC5mbGlwKCdob3ZlcicsIGNvcm5lcj09PWZhbHNlKS4KICAgICAgICAgICAgICBmbGlwKCdkaXNhYmxlJywgcGFnZSE9YWN0dWFsVmlld1swXSAmJiBwYWdlIT1hY3R1YWxWaWV3WzFdKTsKCiAgICAgICAgICB9CgogICAgICAgIH0KCiAgICAgIH0KCiAgICB9IGVsc2UgewoKICAgICAgLy8gVXBkYXRlIHN0YXRpYyBwYWdlcwoKICAgICAgZm9yIChwYWdlIGluIGRhdGEucGFnZVdyYXApIHsKCiAgICAgICAgaWYgKCFoYXMocGFnZSwgZGF0YS5wYWdlV3JhcCkpCiAgICAgICAgICBjb250aW51ZTsKCiAgICAgICAgdmFyIHBhZ2VMb2NhdGlvbiA9IHR1cm5NZXRob2RzLl9zZXRQYWdlTG9jLmNhbGwodGhpcywgcGFnZSk7CgogICAgICAgIGlmIChkYXRhLnBhZ2VzW3BhZ2VdKSB7CiAgICAgICAgICBkYXRhLnBhZ2VzW3BhZ2VdLgogICAgICAgICAgICBmbGlwKCdkaXNhYmxlJywgZGF0YS5kaXNhYmxlZCB8fCBwYWdlTG9jYXRpb24hPTEpLgogICAgICAgICAgICBmbGlwKCdob3ZlcicsIHRydWUpLgogICAgICAgICAgICBmbGlwKCd6JywgbnVsbCk7CiAgICAgICAgfQogICAgICB9CiAgICB9CgogICAgcmV0dXJuIHRoaXM7CiAgfSwKCiAgLy8gVXBkYXRlcyB0aGUgcG9zaXRpb24gYW5kIHNpemUgb2YgdGhlIGZsaXBib29rJ3Mgc2hhZG93CgogIF91cGRhdGVTaGFkb3c6IGZ1bmN0aW9uKCkgewogICAgCiAgICB2YXIgdmlldywgdmlldzIsIHNoYWRvdywKICAgICAgZGF0YSA9IHRoaXMuZGF0YSgpLAogICAgICB3aWR0aCA9IHRoaXMud2lkdGgoKSwKICAgICAgaGVpZ2h0ID0gdGhpcy5oZWlnaHQoKSwKICAgICAgcGFnZVdpZHRoID0gKGRhdGEuZGlzcGxheT09J3NpbmdsZScpID8gd2lkdGggOiB3aWR0aC8yOwoKICAgIHZpZXcgPSB0aGlzLnR1cm4oJ3ZpZXcnKTsKCiAgICBpZiAoIWRhdGEuc2hhZG93KSB7CiAgICAgIGRhdGEuc2hhZG93ID0gJCgnPGRpdiAvPicsIHsKICAgICAgICAgICdjbGFzcyc6ICdzaGFkb3cnLAogICAgICAgICAgJ2Nzcyc6IGRpdkF0dCgwLCAwLCAwKS5jc3MKICAgICAgICB9KS4KICAgICAgICBhcHBlbmRUbyh0aGlzKTsKICAgIH0KCiAgICBmb3IgKHZhciBpID0gMDsgaTxkYXRhLnBhZ2VNdi5sZW5ndGg7IGkrKykgewogICAgICBpZiAoIXZpZXdbMF0gfHwgIXZpZXdbMV0pCiAgICAgICAgYnJlYWs7CiAgICAKICAgICAgdmlldyA9IHRoaXMudHVybigndmlldycsIGRhdGEucGFnZXNbZGF0YS5wYWdlTXZbaV1dLmRhdGEoKS5mLm9wdHMubmV4dCk7CiAgICAgIHZpZXcyID0gdGhpcy50dXJuKCd2aWV3JywgZGF0YS5wYWdlTXZbaV0pOwoKICAgICAgdmlld1swXSA9IHZpZXdbMF0gJiYgdmlldzJbMF07CiAgICAgIHZpZXdbMV0gPSB2aWV3WzFdICYmIHZpZXcyWzFdOwogICAgfQoKICAgIGlmICghdmlld1swXSkgc2hhZG93ID0gKGRhdGEuZGlyZWN0aW9uPT0nbHRyJykgPyAxIDogMjsKICAgIGVsc2UgaWYgKCF2aWV3WzFdKSBzaGFkb3cgPSAoZGF0YS5kaXJlY3Rpb249PSdsdHInKSA/IDIgOiAxOwogICAgZWxzZSBzaGFkb3cgPSAzOwoKICAgIHN3aXRjaCAoc2hhZG93KSB7CiAgICAgIGNhc2UgMToKICAgICAgICBkYXRhLnNoYWRvdy5jc3MoewogICAgICAgICAgd2lkdGg6IHBhZ2VXaWR0aCwKICAgICAgICAgIGhlaWdodDogaGVpZ2h0LAogICAgICAgICAgdG9wOiAwLAogICAgICAgICAgbGVmdDogcGFnZVdpZHRoCiAgICAgICAgfSk7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgMjoKICAgICAgICBkYXRhLnNoYWRvdy5jc3MoewogICAgICAgICAgd2lkdGg6IHBhZ2VXaWR0aCwKICAgICAgICAgIGhlaWdodDogaGVpZ2h0LAogICAgICAgICAgdG9wOiAwLAogICAgICAgICAgbGVmdDogMAogICAgICAgIH0pOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlIDM6CiAgICAgICAgZGF0YS5zaGFkb3cuY3NzKHsKICAgICAgICAgIHdpZHRoOiB3aWR0aCwKICAgICAgICAgIGhlaWdodDogaGVpZ2h0LAogICAgICAgICAgdG9wOiAwLAogICAgICAgICAgbGVmdDogMAogICAgICAgIH0pOwogICAgICAgIGJyZWFrOwogICAgfQoKICB9LAoKICAvLyBTZXRzIHRoZSB6LWluZGV4IGFuZCBkaXNwbGF5IHByb3BlcnR5IG9mIGEgcGFnZQogIC8vIEl0IGRlcGVuZHMgb24gdGhlIGN1cnJlbnQgdmlldwoKICBfc2V0UGFnZUxvYzogZnVuY3Rpb24ocGFnZSkgewoKICAgIHZhciBkYXRhID0gdGhpcy5kYXRhKCksCiAgICAgIHZpZXcgPSB0aGlzLnR1cm4oJ3ZpZXcnKSwKICAgICAgbG9jID0gMDsKCiAgICAKICAgIGlmIChwYWdlPT12aWV3WzBdIHx8IHBhZ2U9PXZpZXdbMV0pCiAgICAgIGxvYyA9IDE7CiAgICBlbHNlIGlmICgKICAgICAgKGRhdGEuZGlzcGxheT09J3NpbmdsZScgJiYgcGFnZT09dmlld1swXSsxKSB8fAogICAgICAoZGF0YS5kaXNwbGF5PT0nZG91YmxlJyAmJiBwYWdlPT12aWV3WzBdLTIgfHwgcGFnZT09dmlld1sxXSsyKQogICAgKQogICAgICBsb2MgPSAyOwoKICAgIGlmICghdGhpcy50dXJuKCdhbmltYXRpbmcnKSkKICAgICAgc3dpdGNoIChsb2MpIHsKICAgICAgICBjYXNlIDE6CiAgICAgICAgICBkYXRhLnBhZ2VXcmFwW3BhZ2VdLmNzcygKICAgICAgICAgIHsKICAgICAgICAgICAgekluZGV4OiBkYXRhLnRvdGFsUGFnZXMsCiAgICAgICAgICAgIGRpc3BsYXk6ICcnCiAgICAgICAgICB9KTsKICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDI6CiAgICAgICAgICBkYXRhLnBhZ2VXcmFwW3BhZ2VdLmNzcygKICAgICAgICAgIHsKICAgICAgICAgICAgekluZGV4OiBkYXRhLnRvdGFsUGFnZXMtMSwKICAgICAgICAgICAgZGlzcGxheTogJycKICAgICAgICAgIH0pOwogICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMDoKICAgICAgICAgIGRhdGEucGFnZVdyYXBbcGFnZV0uY3NzKAogICAgICAgICAgewogICAgICAgICAgICB6SW5kZXg6IDAsCiAgICAgICAgICAgIGRpc3BsYXk6IChkYXRhLnBhZ2VPYmpzW3BhZ2VdLmhhc0NsYXNzKCdmaXhlZCcpKSA/ICcnIDogJ25vbmUnfQogICAgICAgICAgKTsKICAgICAgICBicmVhazsKICAgICAgfQogICAgCiAgICByZXR1cm4gbG9jOwogIH0sCgogIC8vIEdldHMgYW5kIHNldHMgdGhlIG9wdGlvbnMKCiAgb3B0aW9uczogZnVuY3Rpb24ob3B0aW9ucykgewogICAgCiAgICBpZiAob3B0aW9ucz09PXVuZGVmaW5lZCkgewogICAgICAKICAgICAgcmV0dXJuIHRoaXMuZGF0YSgpLm9wdHM7CgogICAgfSBlbHNlIHsKCiAgICAgIHZhciBkYXRhID0gdGhpcy5kYXRhKCk7CgogICAgICAvLyBTZXQgbmV3IHZhbHVlcwoKICAgICAgJC5leHRlbmQoZGF0YS5vcHRzLCBvcHRpb25zKTsKICAgICAgCiAgICAgIC8vIFNldCBwYWdlcwoKICAgICAgaWYgKG9wdGlvbnMucGFnZXMpCiAgICAgICAgdGhpcy50dXJuKCdwYWdlcycsIG9wdGlvbnMucGFnZXMpOwoKICAgICAgLy8gU2V0IHBhZ2UKCiAgICAgIGlmIChvcHRpb25zLnBhZ2UpCiAgICAgICAgdGhpcy50dXJuKCdwYWdlJywgb3B0aW9ucy5wYWdlKTsKCiAgICAgIC8vIFNldCBkaXNwbGF5CgogICAgICBpZiAob3B0aW9ucy5kaXNwbGF5KQogICAgICAgIHRoaXMudHVybignZGlzcGxheScsIG9wdGlvbnMuZGlzcGxheSk7CiAgICAgIAogICAgICAvLyBTZXQgZGlyZWN0aW9uCgogICAgICBpZiAob3B0aW9ucy5kaXJlY3Rpb24pCiAgICAgICAgdGhpcy50dXJuKCdkaXJlY3Rpb24nLCBvcHRpb25zLmRpcmVjdGlvbik7CgogICAgICAvLyBTZXQgc2l6ZQoKICAgICAgaWYgKG9wdGlvbnMud2lkdGggJiYgb3B0aW9ucy5oZWlnaHQpCiAgICAgICAgdGhpcy50dXJuKCdzaXplJywgb3B0aW9ucy53aWR0aCwgb3B0aW9ucy5oZWlnaHQpOwogICAgICAKICAgICAgLy8gQWRkIGV2ZW50IGxpc3RlbmVycwoKICAgICAgaWYgKG9wdGlvbnMud2hlbikKICAgICAgICBmb3IgKHZhciBldmVudE5hbWUgaW4gb3B0aW9ucy53aGVuKQogICAgICAgICAgaWYgKGhhcyhldmVudE5hbWUsIG9wdGlvbnMud2hlbikpIHsKICAgICAgICAgICAgdGhpcy51bmJpbmQoZXZlbnROYW1lKS4KICAgICAgICAgICAgICBiaW5kKGV2ZW50TmFtZSwgb3B0aW9ucy53aGVuW2V2ZW50TmFtZV0pOwogICAgICAgICAgfQoKICAgICAgcmV0dXJuIHRoaXM7CiAgICB9CgogIH0sCgogIC8vIEdldHMgdGhlIGN1cnJlbnQgdmVyc2lvbgoKICB2ZXJzaW9uOiBmdW5jdGlvbigpIHsKCiAgICByZXR1cm4gdmVyc2lvbjsKCiAgfQp9LAoKLy8gTWV0aG9kcyBhbmQgcHJvcGVydGllcyBmb3IgdGhlIGZsaXAgcGFnZSBlZmZlY3QKCmZsaXBNZXRob2RzID0gewoKICAvLyBDb25zdHJ1Y3RvcgoKICBpbml0OiBmdW5jdGlvbihvcHRzKSB7CgogICAgdGhpcy5kYXRhKHtmOiB7CiAgICAgIGRpc2FibGVkOiBmYWxzZSwKICAgICAgaG92ZXI6IGZhbHNlLAogICAgICBlZmZlY3Q6ICh0aGlzLmhhc0NsYXNzKCdoYXJkJykpID8gJ2hhcmQnIDogJ3NoZWV0JwogICAgfX0pOwogIAogICAgdGhpcy5mbGlwKCdvcHRpb25zJywgb3B0cyk7CgogICAgZmxpcE1ldGhvZHMuX2FkZFBhZ2VXcmFwcGVyLmNhbGwodGhpcyk7CgogICAgcmV0dXJuIHRoaXM7CiAgfSwKCiAgc2V0RGF0YTogZnVuY3Rpb24oZCkgewogICAgCiAgICB2YXIgZGF0YSA9IHRoaXMuZGF0YSgpOwoKICAgIGRhdGEuZiA9ICQuZXh0ZW5kKGRhdGEuZiwgZCk7CgogICAgcmV0dXJuIHRoaXM7CiAgfSwKCiAgb3B0aW9uczogZnVuY3Rpb24ob3B0cykgewogICAgCiAgICB2YXIgZGF0YSA9IHRoaXMuZGF0YSgpLmY7CgogICAgaWYgKG9wdHMpIHsKICAgICAgZmxpcE1ldGhvZHMuc2V0RGF0YS5jYWxsKHRoaXMsCiAgICAgICAge29wdHM6ICQuZXh0ZW5kKHt9LCBkYXRhLm9wdHMgfHwgZmxpcE9wdGlvbnMsIG9wdHMpfSk7CiAgICAgIHJldHVybiB0aGlzOwogICAgfSBlbHNlCiAgICAgIHJldHVybiBkYXRhLm9wdHM7CgogIH0sCgogIHo6IGZ1bmN0aW9uKHopIHsKICAgIAogICAgdmFyIGRhdGEgPSB0aGlzLmRhdGEoKS5mOwoKICAgIGRhdGEub3B0c1snei1pbmRleCddID0gejsKCiAgICBpZiAoZGF0YS5md3JhcHBlcikKICAgICAgZGF0YS5md3JhcHBlci5jc3MoewogICAgICAgIHpJbmRleDogeiB8fCBwYXJzZUludChkYXRhLnBhcmVudC5jc3MoJ3otaW5kZXgnKSwgMTApIHx8IDAKICAgICAgfSk7CgogICAgcmV0dXJuIHRoaXM7CiAgfSwKCiAgX2NBbGxvd2VkOiBmdW5jdGlvbigpIHsKICAgIAogICAgdmFyIGRhdGEgPSB0aGlzLmRhdGEoKS5mLAogICAgICBwYWdlID0gZGF0YS5vcHRzLnBhZ2UsCiAgICAgIHR1cm5EYXRhID0gZGF0YS5vcHRzLnR1cm4uZGF0YSgpLAogICAgICBvZGQgPSBwYWdlJTI7CiAgICAKICAgIGlmIChkYXRhLmVmZmVjdD09J2hhcmQnKSB7CiAgICAKICAgICAgcmV0dXJuICh0dXJuRGF0YS5kaXJlY3Rpb249PSdsdHInKSA/CiAgICAgICAgWyhvZGQpID8gJ3InIDogJ2wnXSA6CiAgICAgICAgWyhvZGQpID8gJ2wnIDogJ3InXTsKCiAgICB9IGVsc2UgewoKICAgICAgaWYgKHR1cm5EYXRhLmRpc3BsYXk9PSdzaW5nbGUnKSB7CgogICAgICAgIGlmIChwYWdlPT0xKQogICAgICAgICAgcmV0dXJuICh0dXJuRGF0YS5kaXJlY3Rpb249PSdsdHInKSA/CiAgICAgICAgICAgIGNvcm5lcnNbJ2ZvcndhcmQnXSA6IGNvcm5lcnNbJ2JhY2t3YXJkJ107CiAgICAgICAgZWxzZSBpZiAocGFnZT09dHVybkRhdGEudG90YWxQYWdlcykKICAgICAgICAgIHJldHVybiAodHVybkRhdGEuZGlyZWN0aW9uPT0nbHRyJykgPwogICAgICAgICAgICBjb3JuZXJzWydiYWNrd2FyZCddIDogY29ybmVyc1snZm9yd2FyZCddOwogICAgICAgIGVsc2UKICAgICAgICAgIHJldHVybiBjb3JuZXJzWydhbGwnXTsKCiAgICAgIH0gZWxzZSB7CgogICAgICAgIHJldHVybiAodHVybkRhdGEuZGlyZWN0aW9uPT0nbHRyJykgPwogICAgICAgICAgY29ybmVyc1sob2RkKSA/ICdmb3J3YXJkJyA6ICdiYWNrd2FyZCddCiAgICAgICAgICA6CiAgICAgICAgICBjb3JuZXJzWyhvZGQpID8gJ2JhY2t3YXJkJyA6ICdmb3J3YXJkJ107CgogICAgICB9CgogICAgfQoKICB9LAoKICBfY29ybmVyQWN0aXZhdGVkOiBmdW5jdGlvbihwKSB7CgogICAgdmFyIGRhdGEgPSB0aGlzLmRhdGEoKS5mLAogICAgICB3aWR0aCA9IHRoaXMud2lkdGgoKSwKICAgICAgaGVpZ2h0ID0gdGhpcy5oZWlnaHQoKSwKICAgICAgcG9pbnQgPSB7eDogcC54LCB5OiBwLnksIGNvcm5lcjogJyd9LAogICAgICBjc3ogPSBkYXRhLm9wdHMuY29ybmVyU2l6ZTsKCiAgICBpZiAocG9pbnQueDw9MCB8fCBwb2ludC55PD0wIHx8IHBvaW50Lng+PXdpZHRoIHx8IHBvaW50Lnk+PWhlaWdodCkKICAgICAgcmV0dXJuIGZhbHNlOwoKICAgIHZhciBhbGxvd2VkQ29ybmVycyA9IGZsaXBNZXRob2RzLl9jQWxsb3dlZC5jYWxsKHRoaXMpOwoKICAgIHN3aXRjaCAoZGF0YS5lZmZlY3QpIHsKICAgICAgY2FzZSAnaGFyZCc6CiAgICAgICAgCiAgICAgICAgaWYgKHBvaW50Lng+d2lkdGgtY3N6KQogICAgICAgICAgcG9pbnQuY29ybmVyID0gJ3InOwogICAgICAgIGVsc2UgaWYgKHBvaW50Lng8Y3N6KQogICAgICAgICAgcG9pbnQuY29ybmVyID0gJ2wnOwogICAgICAgIGVsc2UKICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgCiAgICAgICAgYnJlYWs7CgogICAgICBjYXNlICdzaGVldCc6CiAgICAgICAgCiAgICAgICAgaWYgKHBvaW50Lnk8Y3N6KQogICAgICAgICAgcG9pbnQuY29ybmVyKz0gJ3QnOwogICAgICAgIGVsc2UgaWYgKHBvaW50Lnk+PWhlaWdodC1jc3opCiAgICAgICAgICBwb2ludC5jb3JuZXIrPSAnYic7CiAgICAgICAgZWxzZQogICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgCiAgICAgICAgaWYgKHBvaW50Lng8PWNzeikKICAgICAgICAgIHBvaW50LmNvcm5lcis9ICdsJzsKICAgICAgICBlbHNlIGlmIChwb2ludC54Pj13aWR0aC1jc3opCiAgICAgICAgICBwb2ludC5jb3JuZXIrPSAncic7CiAgICAgICAgZWxzZQogICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIAogICAgICAgIGJyZWFrOwogICAgICB9CgogICAgcmV0dXJuICghcG9pbnQuY29ybmVyIHx8ICQuaW5BcnJheShwb2ludC5jb3JuZXIsIGFsbG93ZWRDb3JuZXJzKT09LTEpID8KICAgICAgZmFsc2UgOiBwb2ludDsKCiAgfSwKCiAgX2lzSUFyZWE6IGZ1bmN0aW9uKGUpIHsKCiAgICB2YXIgcG9zID0gdGhpcy5kYXRhKCkuZi5wYXJlbnQub2Zmc2V0KCk7CgogICAgZSA9IChpc1RvdWNoICYmIGUub3JpZ2luYWxFdmVudCkgPyBlLm9yaWdpbmFsRXZlbnQudG91Y2hlc1swXSA6IGU7CgogICAgcmV0dXJuIGZsaXBNZXRob2RzLl9jb3JuZXJBY3RpdmF0ZWQuY2FsbCh0aGlzLAogICAgICB7CiAgICAgICAgeDogZS5wYWdlWC1wb3MubGVmdCwKICAgICAgICB5OiBlLnBhZ2VZLXBvcy50b3AKICAgICAgfSk7CgogIH0sCgogIF9jOiBmdW5jdGlvbihjb3JuZXIsIG9wdHMpIHsKCiAgICBvcHRzID0gb3B0cyB8fCAwOwoKICAgIHN3aXRjaCAoY29ybmVyKSB7CiAgICAgIGNhc2UgJ3RsJzoKICAgICAgICByZXR1cm4gcG9pbnQyRChvcHRzLCBvcHRzKTsKICAgICAgY2FzZSAndHInOgogICAgICAgIHJldHVybiBwb2ludDJEKHRoaXMud2lkdGgoKS1vcHRzLCBvcHRzKTsKICAgICAgY2FzZSAnYmwnOgogICAgICAgIHJldHVybiBwb2ludDJEKG9wdHMsIHRoaXMuaGVpZ2h0KCktb3B0cyk7CiAgICAgIGNhc2UgJ2JyJzoKICAgICAgICByZXR1cm4gcG9pbnQyRCh0aGlzLndpZHRoKCktb3B0cywgdGhpcy5oZWlnaHQoKS1vcHRzKTsKICAgICAgY2FzZSAnbCc6CiAgICAgICAgcmV0dXJuIHBvaW50MkQob3B0cywgMCk7CiAgICAgIGNhc2UgJ3InOgogICAgICAgIHJldHVybiBwb2ludDJEKHRoaXMud2lkdGgoKS1vcHRzLCAwKTsKICAgIH0KCiAgfSwKCiAgX2MyOiBmdW5jdGlvbihjb3JuZXIpIHsKCiAgICBzd2l0Y2ggKGNvcm5lcikgewogICAgICBjYXNlICd0bCc6CiAgICAgICAgcmV0dXJuIHBvaW50MkQodGhpcy53aWR0aCgpKjIsIDApOwogICAgICBjYXNlICd0cic6CiAgICAgICAgcmV0dXJuIHBvaW50MkQoLXRoaXMud2lkdGgoKSwgMCk7CiAgICAgIGNhc2UgJ2JsJzoKICAgICAgICByZXR1cm4gcG9pbnQyRCh0aGlzLndpZHRoKCkqMiwgdGhpcy5oZWlnaHQoKSk7CiAgICAgIGNhc2UgJ2JyJzoKICAgICAgICByZXR1cm4gcG9pbnQyRCgtdGhpcy53aWR0aCgpLCB0aGlzLmhlaWdodCgpKTsKICAgICAgY2FzZSAnbCc6CiAgICAgICAgcmV0dXJuIHBvaW50MkQodGhpcy53aWR0aCgpKjIsIDApOwogICAgICBjYXNlICdyJzoKICAgICAgICByZXR1cm4gcG9pbnQyRCgtdGhpcy53aWR0aCgpLCAwKTsKICAgIH0KCiAgfSwKCiAgX2ZvbGRpbmdQYWdlOiBmdW5jdGlvbigpIHsKCiAgICB2YXIgZGF0YSA9IHRoaXMuZGF0YSgpLmY7CgogICAgaWYgKCFkYXRhKQogICAgICByZXR1cm47CgogICAgdmFyIG9wdHMgPSBkYXRhLm9wdHM7CgogICAgaWYgKG9wdHMudHVybikgewogICAgICBkYXRhID0gb3B0cy50dXJuLmRhdGEoKTsKICAgICAgaWYgKGRhdGEuZGlzcGxheSA9PSAnc2luZ2xlJykKICAgICAgICByZXR1cm4gKG9wdHMubmV4dD4xIHx8IG9wdHMucGFnZT4xKSA/IGRhdGEucGFnZU9ianNbMF0gOiBudWxsOwogICAgICBlbHNlCiAgICAgICAgcmV0dXJuIGRhdGEucGFnZU9ianNbb3B0cy5uZXh0XTsKICAgIH0KCiAgfSwKCiAgX2JhY2tHcmFkaWVudDogZnVuY3Rpb24oKSB7CgogICAgdmFyIGRhdGEgPSB0aGlzLmRhdGEoKS5mLAogICAgICB0dXJuRGF0YSA9IGRhdGEub3B0cy50dXJuLmRhdGEoKSwKICAgICAgZ3JhZGllbnQgPSAgdHVybkRhdGEub3B0cy5ncmFkaWVudHMgJiYgKHR1cm5EYXRhLmRpc3BsYXk9PSdzaW5nbGUnIHx8CiAgICAgICAgIChkYXRhLm9wdHMucGFnZSE9MiAmJiBkYXRhLm9wdHMucGFnZSE9dHVybkRhdGEudG90YWxQYWdlcy0xKSk7CgogICAgaWYgKGdyYWRpZW50ICYmICFkYXRhLmJzaGFkb3cpCiAgICAgIGRhdGEuYnNoYWRvdyA9ICQoJzxkaXYvPicsIGRpdkF0dCgwLCAwLCAxKSkuCiAgICAgICAgY3NzKHsncG9zaXRpb24nOiAnJywgd2lkdGg6IHRoaXMud2lkdGgoKSwgaGVpZ2h0OiB0aGlzLmhlaWdodCgpfSkuCiAgICAgICAgYXBwZW5kVG8oZGF0YS5wYXJlbnQpOwoKICAgIHJldHVybiBncmFkaWVudDsKCiAgfSwKCiAgdHlwZTogZnVuY3Rpb24gKCkgewogICAgCiAgICByZXR1cm4gdGhpcy5kYXRhKCkuZi5lZmZlY3Q7CgogIH0sCgogIHJlc2l6ZTogZnVuY3Rpb24oZnVsbCkgewogICAgCiAgICB2YXIgZGF0YSA9IHRoaXMuZGF0YSgpLmYsCiAgICAgIHR1cm5EYXRhID0gZGF0YS5vcHRzLnR1cm4uZGF0YSgpLAogICAgICB3aWR0aCA9IHRoaXMud2lkdGgoKSwKICAgICAgaGVpZ2h0ID0gdGhpcy5oZWlnaHQoKTsKCiAgICBzd2l0Y2ggKGRhdGEuZWZmZWN0KSB7CiAgICAgIGNhc2UgJ2hhcmQnOgogICAgICAgIAogICAgICBpZiAoZnVsbCkgewogICAgICAgIGRhdGEud3JhcHBlci5jc3Moe3dpZHRoOiB3aWR0aCwgaGVpZ2h0OiBoZWlnaHR9KTsKICAgICAgICBkYXRhLmZwYWdlLmNzcyh7d2lkdGg6IHdpZHRoLCBoZWlnaHQ6IGhlaWdodH0pOwogICAgICAgIGlmICh0dXJuRGF0YS5vcHRzLmdyYWRpZW50cykgewogICAgICAgICAgZGF0YS5hc2hhZG93LmNzcyh7d2lkdGg6IHdpZHRoLCBoZWlnaHQ6IGhlaWdodH0pOwogICAgICAgICAgZGF0YS5ic2hhZG93LmNzcyh7d2lkdGg6IHdpZHRoLCBoZWlnaHQ6IGhlaWdodH0pOwogICAgICAgIH0KICAgICAgfQoKICAgICAgYnJlYWs7CiAgICAgIGNhc2UgJ3NoZWV0JzoKCiAgICAgIGlmIChmdWxsKSB7CiAgICAgICAgdmFyIHNpemUgPSBNYXRoLnJvdW5kKE1hdGguc3FydChNYXRoLnBvdyh3aWR0aCwgMikrTWF0aC5wb3coaGVpZ2h0LCAyKSkpOwoKICAgICAgICBkYXRhLndyYXBwZXIuY3NzKHt3aWR0aDogc2l6ZSwgaGVpZ2h0OiBzaXplfSk7CiAgICAgICAgZGF0YS5md3JhcHBlci5jc3Moe3dpZHRoOiBzaXplLCBoZWlnaHQ6IHNpemV9KS4KICAgICAgICAgIGNoaWxkcmVuKCc6Zmlyc3QtY2hpbGQnKS4KICAgICAgICAgIGNzcyh7d2lkdGg6IHdpZHRoLCBoZWlnaHQ6IGhlaWdodH0pOwoKICAgICAgICBkYXRhLmZwYWdlLmNzcyh7d2lkdGg6IHdpZHRoLCBoZWlnaHQ6IGhlaWdodH0pOwoKICAgICAgICBpZiAodHVybkRhdGEub3B0cy5ncmFkaWVudHMpCiAgICAgICAgICBkYXRhLmFzaGFkb3cuY3NzKHt3aWR0aDogd2lkdGgsIGhlaWdodDogaGVpZ2h0fSk7CgogICAgICAgIGlmIChmbGlwTWV0aG9kcy5fYmFja0dyYWRpZW50LmNhbGwodGhpcykpCiAgICAgICAgICBkYXRhLmJzaGFkb3cuY3NzKHt3aWR0aDogd2lkdGgsIGhlaWdodDogaGVpZ2h0fSk7CiAgICAgIH0KCiAgICAgIGlmIChkYXRhLnBhcmVudC5pcygnOnZpc2libGUnKSkgewogICAgICAgIHZhciBvZmZzZXQgPSBmaW5kUG9zKGRhdGEucGFyZW50WzBdKTsKCiAgICAgICAgZGF0YS5md3JhcHBlci5jc3Moe3RvcDogb2Zmc2V0LnRvcCwKICAgICAgICAgIGxlZnQ6IG9mZnNldC5sZWZ0fSk7CgogICAgICAgIC8vaWYgKGRhdGEub3B0cy50dXJuKSB7CiAgICAgICAgIG9mZnNldCA9IGZpbmRQb3MoZGF0YS5vcHRzLnR1cm5bMF0pOwogICAgICAgICBkYXRhLmZwYXJlbnQuY3NzKHt0b3A6IC1vZmZzZXQudG9wLCBsZWZ0OiAtb2Zmc2V0LmxlZnR9KTsKICAgICAgICAvL30KICAgICAgfQoKICAgICAgdGhpcy5mbGlwKCd6JywgZGF0YS5vcHRzWyd6LWluZGV4J10pOwoKICAgICAgYnJlYWs7CiAgICB9CgogIH0sCgogIC8vIFByZXBhcmVzIHRoZSBwYWdlIGJ5IGFkZGluZyBhIGdlbmVyYWwgd3JhcHBlciBhbmQgYW5vdGhlciBvYmplY3RzCgogIF9hZGRQYWdlV3JhcHBlcjogZnVuY3Rpb24oKSB7CgogICAgdmFyIGF0dCwKICAgICAgZGF0YSA9IHRoaXMuZGF0YSgpLmYsCiAgICAgIHR1cm5EYXRhID0gZGF0YS5vcHRzLnR1cm4uZGF0YSgpLAogICAgICBwYXJlbnQgPSB0aGlzLnBhcmVudCgpOwoKICAgIGRhdGEucGFyZW50ID0gcGFyZW50OwoKICBpZiAoIWRhdGEud3JhcHBlcikKICAgIHN3aXRjaCAoZGF0YS5lZmZlY3QpIHsKICAgICAgY2FzZSAnaGFyZCc6CiAgICAgICAgCiAgICAgICAgdmFyIGNzc1Byb3BlcnRpZXMgPSB7fTsKICAgICAgICBjc3NQcm9wZXJ0aWVzW3ZlbmRvciArICd0cmFuc2Zvcm0tc3R5bGUnXSA9ICdwcmVzZXJ2ZS0zZCc7CiAgICAgICAgY3NzUHJvcGVydGllc1t2ZW5kb3IgKyAnYmFja2ZhY2UtdmlzaWJpbGl0eSddID0gJ2hpZGRlbic7CgogICAgICAgIGRhdGEud3JhcHBlciA9ICQoJzxkaXYvPicsIGRpdkF0dCgwLCAwLCAyKSkuCiAgICAgICAgICBjc3MoY3NzUHJvcGVydGllcykuCiAgICAgICAgICBhcHBlbmRUbyhwYXJlbnQpLgogICAgICAgICAgcHJlcGVuZCh0aGlzKTsKCiAgICAgICAgZGF0YS5mcGFnZSA9ICQoJzxkaXYvPicsIGRpdkF0dCgwLCAwLCAxKSkuCiAgICAgICAgICBjc3MoY3NzUHJvcGVydGllcykuCiAgICAgICAgICBhcHBlbmRUbyhwYXJlbnQpOwogICAgICAgIAogICAgICAgIGlmICh0dXJuRGF0YS5vcHRzLmdyYWRpZW50cykgewogICAgICAgICAgZGF0YS5hc2hhZG93ID0gJCgnPGRpdi8+JywgZGl2QXR0KDAsIDAsICAwKSkuCiAgICAgICAgICAgIGhpZGUoKS4KICAgICAgICAgICAgYXBwZW5kVG8ocGFyZW50KTsKCiAgICAgICAgICBkYXRhLmJzaGFkb3cgPSAkKCc8ZGl2Lz4nLCBkaXZBdHQoMCwgMCwgIDApKTsKICAgICAgICB9CgogICAgICBicmVhazsKICAgICAgY2FzZSAnc2hlZXQnOgogICAgICAgIAogICAgICAgIHZhciB3aWR0aCA9IHRoaXMud2lkdGgoKSwKICAgICAgICAgIGhlaWdodCA9IHRoaXMuaGVpZ2h0KCksCiAgICAgICAgICBzaXplID0gTWF0aC5yb3VuZChNYXRoLnNxcnQoTWF0aC5wb3cod2lkdGgsIDIpK01hdGgucG93KGhlaWdodCwgMikpKTsKICAgICAgICAKICAgICAgICBkYXRhLmZwYXJlbnQgPSBkYXRhLm9wdHMudHVybi5kYXRhKCkuZnBhcmVudDsKCiAgICAgICAgaWYgKCFkYXRhLmZwYXJlbnQpIHsKICAgICAgICAgIHZhciBmcGFyZW50ID0gJCgnPGRpdi8+Jywge2Nzczogeydwb2ludGVyLWV2ZW50cyc6ICdub25lJ319KS5oaWRlKCk7CiAgICAgICAgICAgIGZwYXJlbnQuZGF0YSgpLmZsaXBzID0gMDsKICAgICAgICAgICAgZnBhcmVudC5jc3MoZGl2QXR0KDAsIDAsICdhdXRvJywgJ3Zpc2libGUnKS5jc3MpLgogICAgICAgICAgICBhcHBlbmRUbyhkYXRhLm9wdHMudHVybik7CiAgICAgICAgICAgIAogICAgICAgICAgICBkYXRhLm9wdHMudHVybi5kYXRhKCkuZnBhcmVudCA9IGZwYXJlbnQ7CiAgICAgICAgICAgIGRhdGEuZnBhcmVudCA9IGZwYXJlbnQ7CiAgICAgICAgfQoKICAgICAgICB0aGlzLmNzcyh7cG9zaXRpb246ICdhYnNvbHV0ZScsIHRvcDogMCwgbGVmdDogMCwgYm90dG9tOiAnYXV0bycsIHJpZ2h0OiAnYXV0byd9KTsKCiAgICAgICAgZGF0YS53cmFwcGVyID0gJCgnPGRpdi8+JywgZGl2QXR0KDAsIDAsIHRoaXMuY3NzKCd6LWluZGV4JykpKS4KICAgICAgICAgIGFwcGVuZFRvKHBhcmVudCkuCiAgICAgICAgICBwcmVwZW5kKHRoaXMpOwoKICAgICAgICBkYXRhLmZ3cmFwcGVyID0gJCgnPGRpdi8+JywgZGl2QXR0KHBhcmVudC5vZmZzZXQoKS50b3AsIHBhcmVudC5vZmZzZXQoKS5sZWZ0KSkuCiAgICAgICAgICBoaWRlKCkuCiAgICAgICAgICBhcHBlbmRUbyhkYXRhLmZwYXJlbnQpOwoKICAgICAgICBkYXRhLmZwYWdlID0gJCgnPGRpdi8+JywgZGl2QXR0KDAsIDAsIDAsICd2aXNpYmxlJykpLgogICAgICAgICAgY3NzKHtjdXJzb3I6ICdkZWZhdWx0J30pLgogICAgICAgICAgYXBwZW5kVG8oZGF0YS5md3JhcHBlcik7CgogICAgICAgIGlmICh0dXJuRGF0YS5vcHRzLmdyYWRpZW50cykKICAgICAgICAgIGRhdGEuYXNoYWRvdyA9ICQoJzxkaXYvPicsIGRpdkF0dCgwLCAwLCAgMSkpLgogICAgICAgICAgYXBwZW5kVG8oZGF0YS5mcGFnZSk7CgogICAgICAgIGZsaXBNZXRob2RzLnNldERhdGEuY2FsbCh0aGlzLCBkYXRhKTsKCiAgICAgIGJyZWFrOwogICAgfQoKICAgIC8vIFNldCBzaXplCiAgICBmbGlwTWV0aG9kcy5yZXNpemUuY2FsbCh0aGlzLCB0cnVlKTsKCiAgfSwKCiAgLy8gVGFrZXMgYSAyUCBwb2ludCBmcm9tIHRoZSBzY3JlZW4gYW5kIGFwcGxpZXMgdGhlIHRyYW5zZm9ybWF0aW9uCgogIF9mb2xkOiBmdW5jdGlvbihwb2ludCkgewoKICAgIHZhciBkYXRhID0gdGhpcy5kYXRhKCkuZiwKICAgICAgdHVybkRhdGEgPSBkYXRhLm9wdHMudHVybi5kYXRhKCksCiAgICAgIG8gPSBmbGlwTWV0aG9kcy5fYy5jYWxsKHRoaXMsIHBvaW50LmNvcm5lciksCiAgICAgIHdpZHRoID0gdGhpcy53aWR0aCgpLAogICAgICBoZWlnaHQgPSB0aGlzLmhlaWdodCgpOwoKICAgIHN3aXRjaCAoZGF0YS5lZmZlY3QpIHsKCiAgICAgIGNhc2UgJ2hhcmQnOgoKICAgICAgICBpZiAocG9pbnQuY29ybmVyPT0nbCcpCiAgICAgICAgICBwb2ludC54ID0gTWF0aC5taW4oTWF0aC5tYXgocG9pbnQueCwgMCksIHdpZHRoKjIpOwogICAgICAgIGVsc2UKICAgICAgICAgIHBvaW50LnggPSBNYXRoLm1heChNYXRoLm1pbihwb2ludC54LCB3aWR0aCksIC13aWR0aCk7CgogICAgICAgIHZhciBsZWZ0UG9zLAogICAgICAgICAgc2hhZG93LAogICAgICAgICAgZ3JhZGllbnRYLAogICAgICAgICAgZnBhZ2VPcmlnaW4sCiAgICAgICAgICBwYXJlbnRPcmlnaW4sCiAgICAgICAgICB0b3RhbFBhZ2VzID0gdHVybkRhdGEudG90YWxQYWdlcywKICAgICAgICAgIHpJbmRleCA9IGRhdGEub3B0c1snei1pbmRleCddIHx8IHRvdGFsUGFnZXMsCiAgICAgICAgICBwYXJlbnRDc3MgPSB7J292ZXJmbG93JzogJ3Zpc2libGUnfSwKICAgICAgICAgIHJlbFggPSAoby54KSA/IChvLnggLSBwb2ludC54KS93aWR0aCA6IHBvaW50Lngvd2lkdGgsCiAgICAgICAgICBhbmdsZSA9IHJlbFggKiA5MCwKICAgICAgICAgIGhhbGYgPSBhbmdsZTw5MDsKCiAgICAgICAgc3dpdGNoIChwb2ludC5jb3JuZXIpIHsKICAgICAgICAgIGNhc2UgJ2wnOgoKICAgICAgICAgICAgZnBhZ2VPcmlnaW4gPSAgJzAlIDUwJSc7CiAgICAgICAgICAgIHBhcmVudE9yaWdpbiA9ICAnMTAwJSA1MCUnOwoKICAgICAgICAgICAgaWYgKGhhbGYpIHsKICAgICAgICAgICAgICBsZWZ0UG9zID0gMDsKICAgICAgICAgICAgICBzaGFkb3cgPSBkYXRhLm9wdHMubmV4dC0xPjA7CiAgICAgICAgICAgICAgZ3JhZGllbnRYID0gMTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICBsZWZ0UG9zID0gJzEwMCUnOwogICAgICAgICAgICAgIHNoYWRvdyA9IGRhdGEub3B0cy5wYWdlKzE8dG90YWxQYWdlczsKICAgICAgICAgICAgICBncmFkaWVudFggPSAwOwogICAgICAgICAgICB9CgogICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlICdyJzoKCiAgICAgICAgICAgIGZwYWdlT3JpZ2luID0gICcxMDAlIDUwJSc7CiAgICAgICAgICAgIHBhcmVudE9yaWdpbiA9ICAnMCUgNTAlJzsKICAgICAgICAgICAgYW5nbGUgPSAtYW5nbGU7CiAgICAgICAgICAgIHdpZHRoID0gLXdpZHRoOwoKICAgICAgICAgICAgaWYgKGhhbGYpIHsKICAgICAgICAgICAgICBsZWZ0UG9zID0gMDsKICAgICAgICAgICAgICBzaGFkb3cgPSBkYXRhLm9wdHMubmV4dCsxPHRvdGFsUGFnZXM7CiAgICAgICAgICAgICAgZ3JhZGllbnRYID0gMDsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICBsZWZ0UG9zID0gJy0xMDAlJzsKICAgICAgICAgICAgICBzaGFkb3cgPSBkYXRhLm9wdHMucGFnZSE9MTsKICAgICAgICAgICAgICBncmFkaWVudFggPSAxOwogICAgICAgICAgICB9CgogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQoKICAgICAgICBwYXJlbnRDc3NbdmVuZG9yKydwZXJzcGVjdGl2ZS1vcmlnaW4nXSA9IHBhcmVudE9yaWdpbjsKCiAgICAgICAgZGF0YS53cmFwcGVyLnRyYW5zZm9ybSgncm90YXRlWSgnK2FuZ2xlKydkZWcpJyArCiAgICAgICAgICAndHJhbnNsYXRlM2QoMHB4LCAwcHgsICcrKHRoaXMuYXR0cignZGVwdGgnKXx8MCkrJ3B4KScsIHBhcmVudE9yaWdpbik7CgogICAgICAgIGRhdGEuZnBhZ2UudHJhbnNmb3JtKCd0cmFuc2xhdGVYKCcrd2lkdGgrJ3B4KSByb3RhdGVZKCcrKDE4MCthbmdsZSkrJ2RlZyknLCBmcGFnZU9yaWdpbik7CgogICAgICAgIGRhdGEucGFyZW50LmNzcyhwYXJlbnRDc3MpOwoKICAgICAgICBpZiAoaGFsZikgewogICAgICAgICAgcmVsWCA9IC1yZWxYKzE7CiAgICAgICAgICBkYXRhLndyYXBwZXIuY3NzKHt6SW5kZXg6IHpJbmRleCsxfSk7CiAgICAgICAgICBkYXRhLmZwYWdlLmNzcyh7ekluZGV4OiB6SW5kZXh9KTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgcmVsWCA9IHJlbFgtMTsKICAgICAgICAgIGRhdGEud3JhcHBlci5jc3Moe3pJbmRleDogekluZGV4fSk7CiAgICAgICAgICBkYXRhLmZwYWdlLmNzcyh7ekluZGV4OiB6SW5kZXgrMX0pOwogICAgICAgIH0KCiAgICAgICAgaWYgKHR1cm5EYXRhLm9wdHMuZ3JhZGllbnRzKSB7CiAgICAgICAgICBpZiAoc2hhZG93KQogICAgICAgICAgICBkYXRhLmFzaGFkb3cuY3NzKHsKICAgICAgICAgICAgICBkaXNwbGF5OiAnJywKICAgICAgICAgICAgICBsZWZ0OiBsZWZ0UG9zLAogICAgICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogJ3JnYmEoMCwwLDAsJysoMC41KnJlbFgpKycpJwogICAgICAgICAgICB9KS4KICAgICAgICAgICAgdHJhbnNmb3JtKCdyb3RhdGVZKDBkZWcpJyk7CiAgICAgICAgICBlbHNlCiAgICAgICAgICAgIGRhdGEuYXNoYWRvdy5oaWRlKCk7CgogICAgICAgICAgZGF0YS5ic2hhZG93LmNzcyh7b3BhY2l0eTotcmVsWCArIDF9KTsKCiAgICAgICAgICBpZiAoaGFsZikgewogICAgICAgICAgICBpZiAoZGF0YS5ic2hhZG93LnBhcmVudCgpWzBdIT1kYXRhLndyYXBwZXJbMF0pIHsKICAgICAgICAgICAgICBkYXRhLmJzaGFkb3cuYXBwZW5kVG8oZGF0YS53cmFwcGVyKTsKICAgICAgICAgICAgfQogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgaWYgKGRhdGEuYnNoYWRvdy5wYXJlbnQoKVswXSE9ZGF0YS5mcGFnZVswXSkgewogICAgICAgICAgICAgIGRhdGEuYnNoYWRvdy5hcHBlbmRUbyhkYXRhLmZwYWdlKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgLypkYXRhLmJzaGFkb3cuY3NzKHsKICAgICAgICAgICAgYmFja2dyb3VuZENvbG9yOiAncmdiYSgwLDAsMCwnKygwLjEpKycpJwogICAgICAgICAgfSkqLwogICAgICAgICAgZ3JhZGllbnQoZGF0YS5ic2hhZG93LCBwb2ludDJEKGdyYWRpZW50WCAqIDEwMCwgMCksIHBvaW50MkQoKC1ncmFkaWVudFggKyAxKSoxMDAsIDApLAogICAgICAgICAgICBbWzAsICdyZ2JhKDAsMCwwLDAuMyknXSxbMSwgJ3JnYmEoMCwwLDAsMCknXV0sMik7CiAgICAgICAgICAKICAgICAgICB9CgogICAgICAgIGJyZWFrOwogICAgICBjYXNlICdzaGVldCc6CgogICAgICAgIHZhciB0aGF0ID0gdGhpcywKICAgICAgICAgIGEgPSAwLAogICAgICAgICAgYWxwaGEgPSAwLAogICAgICAgICAgYmV0YSwKICAgICAgICAgIHB4LAogICAgICAgICAgZ3JhZGllbnRFbmRQb2ludEEsCiAgICAgICAgICBncmFkaWVudEVuZFBvaW50QiwKICAgICAgICAgIGdyYWRpZW50U3RhcnRWYWwsCiAgICAgICAgICBncmFkaWVudFNpemUsCiAgICAgICAgICBncmFkaWVudE9wYWNpdHksCiAgICAgICAgICBzaGFkb3dWYWwsCiAgICAgICAgICBtdiA9IHBvaW50MkQoMCwgMCksCiAgICAgICAgICBkZiA9IHBvaW50MkQoMCwgMCksCiAgICAgICAgICB0ciA9IHBvaW50MkQoMCwgMCksCiAgICAgICAgICBmb2xkaW5nID0gZmxpcE1ldGhvZHMuX2ZvbGRpbmdQYWdlLmNhbGwodGhpcyksCiAgICAgICAgICB0YW4gPSBNYXRoLnRhbihhbHBoYSksCiAgICAgICAgICBhYyA9IHR1cm5EYXRhLm9wdHMuYWNjZWxlcmF0aW9uLAogICAgICAgICAgaCA9IGRhdGEud3JhcHBlci5oZWlnaHQoKSwKICAgICAgICAgIHRvcCA9IHBvaW50LmNvcm5lci5zdWJzdHIoMCwgMSkgPT0gJ3QnLAogICAgICAgICAgbGVmdCA9IHBvaW50LmNvcm5lci5zdWJzdHIoMSwgMSkgPT0gJ2wnLAoKICAgICAgY29tcHV0ZSA9IGZ1bmN0aW9uKCkgewoKICAgICAgICB2YXIgcmVsID0gcG9pbnQyRCgwLCAwKTsKICAgICAgICB2YXIgbWlkZGxlID0gcG9pbnQyRCgwLCAwKTsKCiAgICAgICAgcmVsLnggPSAoby54KSA/IG8ueCAtIHBvaW50LnggOiBwb2ludC54OwoKICAgICAgICBpZiAoIWhhc1JvdCkgewogICAgICAgICAgcmVsLnkgPSAwOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICByZWwueSA9IChvLnkpID8gby55IC0gcG9pbnQueSA6IHBvaW50Lnk7CiAgICAgICAgfQoKICAgICAgICBtaWRkbGUueCA9IChsZWZ0KT8gd2lkdGggLSByZWwueC8yIDogcG9pbnQueCArIHJlbC54LzI7CiAgICAgICAgbWlkZGxlLnkgPSByZWwueS8yOwogICAgICAgIAogICAgICAgIHZhciBhbHBoYSA9ICBBOTAtTWF0aC5hdGFuMihyZWwueSwgcmVsLngpLAogICAgICAgICAgZ2FtbWEgPSBhbHBoYSAtIE1hdGguYXRhbjIobWlkZGxlLnksIG1pZGRsZS54KSwKICAgICAgICAgIGRpc3RhbmNlID0gIE1hdGgubWF4KDAsIE1hdGguc2luKGdhbW1hKSAqIE1hdGguc3FydChNYXRoLnBvdyhtaWRkbGUueCwgMikgKyBNYXRoLnBvdyhtaWRkbGUueSwgMikpKTsKICAgICAgICAgIAogICAgICAgICAgYSA9IGRlZyhhbHBoYSk7CgogICAgICAgICAgdHIgPSBwb2ludDJEKGRpc3RhbmNlICogTWF0aC5zaW4oYWxwaGEpLCBkaXN0YW5jZSAqIE1hdGguY29zKGFscGhhKSk7CgogICAgICAgICAgaWYgKGFscGhhID4gQTkwKSB7CiAgICAgICAgICAgIHRyLnggPSB0ci54ICsgTWF0aC5hYnModHIueSAqIHJlbC55L3JlbC54KTsKICAgICAgICAgICAgdHIueSA9IDA7CiAgICAgICAgICAgIGlmIChNYXRoLnJvdW5kKHRyLngqTWF0aC50YW4oUEktYWxwaGEpKSA8IGhlaWdodCkgewogICAgICAgICAgICAgIHBvaW50LnkgPSBNYXRoLnNxcnQoTWF0aC5wb3coaGVpZ2h0LCAyKSsyICogbWlkZGxlLnggKiByZWwueCk7CiAgICAgICAgICAgICAgaWYgKHRvcCkgcG9pbnQueSA9ICBoZWlnaHQgLSBwb2ludC55OwogICAgICAgICAgICAgIHJldHVybiBjb21wdXRlKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgCiAgICAgICAgICBpZiAoYWxwaGE+QTkwKSB7CiAgICAgICAgICAgIHZhciBiZXRhID0gUEktYWxwaGEsIGRkID0gaCAtIGhlaWdodC9NYXRoLnNpbihiZXRhKTsKICAgICAgICAgICAgbXYgPSBwb2ludDJEKE1hdGgucm91bmQoZGQqTWF0aC5jb3MoYmV0YSkpLCBNYXRoLnJvdW5kKGRkKk1hdGguc2luKGJldGEpKSk7CiAgICAgICAgICAgIGlmIChsZWZ0KSBtdi54ID0gLSBtdi54OwogICAgICAgICAgICBpZiAodG9wKSBtdi55ID0gLSBtdi55OwogICAgICAgICAgfQoKICAgICAgICAgIHB4ID0gTWF0aC5yb3VuZCh0ci55L01hdGgudGFuKGFscGhhKSArIHRyLngpOwogICAgICAKICAgICAgICAgIHZhciBzaWRlID0gd2lkdGggLSBweCwKICAgICAgICAgICAgc2lkZVggPSBzaWRlKk1hdGguY29zKGFscGhhKjIpLAogICAgICAgICAgICBzaWRlWSA9IHNpZGUqTWF0aC5zaW4oYWxwaGEqMik7CiAgICAgICAgICAgIGRmID0gcG9pbnQyRCgKICAgICAgICAgICAgICBNYXRoLnJvdW5kKChsZWZ0ID8gc2lkZSAtc2lkZVggOiBweCtzaWRlWCkpLAogICAgICAgICAgICAgIE1hdGgucm91bmQoKHRvcCkgPyBzaWRlWSA6IGhlaWdodCAtIHNpZGVZKSk7CiAgICAgICAgICAKICAgICAgICAvLyBHcmFkaWVudHMKICAgICAgICAgIGlmICh0dXJuRGF0YS5vcHRzLmdyYWRpZW50cykgewoKICAgICAgICAgICAgZ3JhZGllbnRTaXplID0gc2lkZSpNYXRoLnNpbihhbHBoYSk7CgogICAgICAgICAgICB2YXIgZW5kaW5nUG9pbnQgPSBmbGlwTWV0aG9kcy5fYzIuY2FsbCh0aGF0LCBwb2ludC5jb3JuZXIpLAogICAgICAgICAgICAgZmFyID0gTWF0aC5zcXJ0KE1hdGgucG93KGVuZGluZ1BvaW50LngtcG9pbnQueCwgMikrTWF0aC5wb3coZW5kaW5nUG9pbnQueS1wb2ludC55LCAyKSkvd2lkdGg7CgogICAgICAgICAgICBzaGFkb3dWYWwgPSBNYXRoLnNpbihBOTAqKChmYXI+MSkgPyAyIC0gZmFyIDogZmFyKSk7CgogICAgICAgICAgICBncmFkaWVudE9wYWNpdHkgPSBNYXRoLm1pbihmYXIsIDEpOwoKICAgICAgICAgICAKICAgICAgICAgICAgICBncmFkaWVudFN0YXJ0VmFsID0gZ3JhZGllbnRTaXplPjEwMCA/IChncmFkaWVudFNpemUtMTAwKS9ncmFkaWVudFNpemUgOiAwOwoKICAgICAgICAgICAgICBncmFkaWVudEVuZFBvaW50QSA9IHBvaW50MkQoCiAgICAgICAgICAgICAgICBncmFkaWVudFNpemUqTWF0aC5zaW4oYWxwaGEpL3dpZHRoKjEwMCwKICAgICAgICAgICAgICAgIGdyYWRpZW50U2l6ZSpNYXRoLmNvcyhhbHBoYSkvaGVpZ2h0KjEwMCk7CiAgICAgICAgICAgCgogICAgICAgICAgICAgIGlmIChmbGlwTWV0aG9kcy5fYmFja0dyYWRpZW50LmNhbGwodGhhdCkpIHsKCiAgICAgICAgICAgICAgICBncmFkaWVudEVuZFBvaW50QiA9IHBvaW50MkQoCiAgICAgICAgICAgICAgICAgIGdyYWRpZW50U2l6ZSoxLjIqTWF0aC5zaW4oYWxwaGEpL3dpZHRoKjEwMCwKICAgICAgICAgICAgICAgICAgZ3JhZGllbnRTaXplKjEuMipNYXRoLmNvcyhhbHBoYSkvaGVpZ2h0KjEwMCk7CgogICAgICAgICAgICAgICAgaWYgKCFsZWZ0KSBncmFkaWVudEVuZFBvaW50Qi54ID0gMTAwLWdyYWRpZW50RW5kUG9pbnRCLng7CiAgICAgICAgICAgICAgICBpZiAoIXRvcCkgZ3JhZGllbnRFbmRQb2ludEIueSA9IDEwMC1ncmFkaWVudEVuZFBvaW50Qi55OwoKICAgICAgICAgICAgICB9CgogICAgICAgICAgfQoKICAgICAgICAgIHRyLnggPSBNYXRoLnJvdW5kKHRyLngpOwogICAgICAgICAgdHIueSA9IE1hdGgucm91bmQodHIueSk7CgogICAgICAgIHJldHVybiB0cnVlOwogICAgICB9LAoKICAgICAgdHJhbnNmb3JtID0gZnVuY3Rpb24odHIsIGMsIHgsIGEpIHsKICAgICAgCiAgICAgICAgdmFyIGYgPSBbJzAnLCAnYXV0byddLCBtdlcgPSAod2lkdGgtaCkqeFswXS8xMDAsIG12SCA9IChoZWlnaHQtaCkqeFsxXS8xMDAsCiAgICAgICAgICBjc3NBID0ge2xlZnQ6IGZbY1swXV0sIHRvcDogZltjWzFdXSwgcmlnaHQ6IGZbY1syXV0sIGJvdHRvbTogZltjWzNdXX0sCiAgICAgICAgICBjc3NCID0ge30sCiAgICAgICAgICBhbGlhc2luZ0ZrID0gKGEhPTkwICYmIGEhPS05MCkgPyAobGVmdCA/IC0xIDogMSkgOiAwLAogICAgICAgICAgb3JpZ2luID0geFswXSArICclICcgKyB4WzFdICsgJyUnOwoKICAgICAgICB0aGF0LmNzcyhjc3NBKS4KICAgICAgICAgIHRyYW5zZm9ybShyb3RhdGUoYSkgKyB0cmFuc2xhdGUodHIueCArIGFsaWFzaW5nRmssIHRyLnksIGFjKSwgb3JpZ2luKTsKCiAgICAgICAgZGF0YS5mcGFnZS5jc3MoY3NzQSkudHJhbnNmb3JtKAogICAgICAgICAgcm90YXRlKGEpICsKICAgICAgICAgIHRyYW5zbGF0ZSh0ci54ICsgZGYueCAtIG12LnggLSB3aWR0aCp4WzBdLzEwMCwgdHIueSArIGRmLnkgLSBtdi55IC0gaGVpZ2h0KnhbMV0vMTAwLCBhYykgKwogICAgICAgICAgcm90YXRlKCgxODAvYSAtIDIpKmEpLAogICAgICAgICAgb3JpZ2luKTsKCiAgICAgICAgZGF0YS53cmFwcGVyLnRyYW5zZm9ybSh0cmFuc2xhdGUoLXRyLnggKyBtdlctYWxpYXNpbmdGaywgLXRyLnkgKyBtdkgsIGFjKSArIHJvdGF0ZSgtYSksIG9yaWdpbik7CgogICAgICAgIGRhdGEuZndyYXBwZXIudHJhbnNmb3JtKHRyYW5zbGF0ZSgtdHIueCArIG12LnggKyBtdlcsIC10ci55ICsgbXYueSArIG12SCwgYWMpICsgcm90YXRlKC1hKSwgb3JpZ2luKTsKICAgICAgCiAgICAgICAgaWYgKHR1cm5EYXRhLm9wdHMuZ3JhZGllbnRzKSB7CgogICAgICAgICAgaWYgKHhbMF0pCiAgICAgICAgICAgIGdyYWRpZW50RW5kUG9pbnRBLnggPSAxMDAtZ3JhZGllbnRFbmRQb2ludEEueDsKCiAgICAgICAgICBpZiAoeFsxXSkKICAgICAgICAgICAgZ3JhZGllbnRFbmRQb2ludEEueSA9ICgxMDAtZ3JhZGllbnRFbmRQb2ludEEueSk7CgogICAgICAgICAgY3NzQlsnYm94LXNoYWRvdyddID0gJzAgMCAyMHB4IHJnYmEoMCwwLDAsJysoMC41KnNoYWRvd1ZhbCkrJyknOwogICAgICAgICAgZm9sZGluZy5jc3MoY3NzQik7CgogICAgICAgICAgZ3JhZGllbnQoZGF0YS5hc2hhZG93LAogICAgICAgICAgICAgIHBvaW50MkQobGVmdD8xMDA6MCwgdG9wPzA6MTAwKSwKICAgICAgICAgICAgICBwb2ludDJEKGdyYWRpZW50RW5kUG9pbnRBLngsIGdyYWRpZW50RW5kUG9pbnRBLnkpLAogICAgICAgICAgICAgIFtbZ3JhZGllbnRTdGFydFZhbCwgJ3JnYmEoMCwwLDAsMCknXSwKICAgICAgICAgICAgICBbKCgxLWdyYWRpZW50U3RhcnRWYWwpKjAuOCkrZ3JhZGllbnRTdGFydFZhbCwgJ3JnYmEoMCwwLDAsJysoMC4yKmdyYWRpZW50T3BhY2l0eSkrJyknXSwKICAgICAgICAgICAgICBbMSwgJ3JnYmEoMjU1LDI1NSwyNTUsJysoMC4yKmdyYWRpZW50T3BhY2l0eSkrJyknXV0sCiAgICAgICAgICAgICAgMywKICAgICAgICAgICAgICBhbHBoYSk7CgogICAgICAgICAgaWYgKGZsaXBNZXRob2RzLl9iYWNrR3JhZGllbnQuY2FsbCh0aGF0KSkKICAgICAgICAgICAgZ3JhZGllbnQoZGF0YS5ic2hhZG93LAogICAgICAgICAgICAgICAgcG9pbnQyRChsZWZ0PzA6MTAwLCB0b3A/MDoxMDApLAogICAgICAgICAgICAgICAgcG9pbnQyRChncmFkaWVudEVuZFBvaW50Qi54LCBncmFkaWVudEVuZFBvaW50Qi55KSwKICAgICAgICAgICAgICAgIFtbMC42LCAncmdiYSgwLDAsMCwwKSddLAogICAgICAgICAgICAgICAgWzAuOCwgJ3JnYmEoMCwwLDAsJysoMC4zKmdyYWRpZW50T3BhY2l0eSkrJyknXSwKICAgICAgICAgICAgICAgIFsxLCAncmdiYSgwLDAsMCwwKSddCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgMyk7CiAgICAgICAgfQoKICAgICAgfTsKCiAgICAgIHN3aXRjaCAocG9pbnQuY29ybmVyKSB7CiAgICAgICAgY2FzZSAnbCcgOgoKCiAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAncicgOgoKCiAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAndGwnIDoKICAgICAgICAgIHBvaW50LnggPSBNYXRoLm1heChwb2ludC54LCAxKTsKICAgICAgICAgIGNvbXB1dGUoKTsKICAgICAgICAgIHRyYW5zZm9ybSh0ciwgWzEsMCwwLDFdLCBbMTAwLCAwXSwgYSk7CiAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAndHInIDoKICAgICAgICAgIHBvaW50LnggPSBNYXRoLm1pbihwb2ludC54LCB3aWR0aC0xKTsKICAgICAgICAgIGNvbXB1dGUoKTsKICAgICAgICAgIHRyYW5zZm9ybShwb2ludDJEKC10ci54LCB0ci55KSwgWzAsMCwwLDFdLCBbMCwgMF0sIC1hKTsKICAgICAgICBicmVhazsKICAgICAgICBjYXNlICdibCcgOgogICAgICAgICAgcG9pbnQueCA9IE1hdGgubWF4KHBvaW50LngsIDEpOwogICAgICAgICAgY29tcHV0ZSgpOwogICAgICAgICAgdHJhbnNmb3JtKHBvaW50MkQodHIueCwgLXRyLnkpLCBbMSwxLDAsMF0sIFsxMDAsIDEwMF0sIC1hKTsKICAgICAgICBicmVhazsKICAgICAgICBjYXNlICdicicgOgogICAgICAgICAgcG9pbnQueCA9IE1hdGgubWluKHBvaW50LngsIHdpZHRoLTEpOwogICAgICAgICAgY29tcHV0ZSgpOwogICAgICAgICAgdHJhbnNmb3JtKHBvaW50MkQoLXRyLngsIC10ci55KSwgWzAsMSwxLDBdLCBbMCwgMTAwXSwgYSk7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KCiAgICBicmVhazsKICB9CgogICAgZGF0YS5wb2ludCA9IHBvaW50OwogIAogIH0sCgogIF9tb3ZlRm9sZGluZ1BhZ2U6IGZ1bmN0aW9uKG1vdmUpIHsKCiAgICB2YXIgZGF0YSA9IHRoaXMuZGF0YSgpLmY7CgogICAgaWYgKCFkYXRhKQogICAgICByZXR1cm47CgogICAgdmFyIHR1cm4gPSBkYXRhLm9wdHMudHVybiwKICAgICAgdHVybkRhdGEgPSB0dXJuLmRhdGEoKSwKICAgICAgcGxhY2UgPSB0dXJuRGF0YS5wYWdlUGxhY2U7CiAgICAgIAogICAgaWYgKG1vdmUpIHsKCiAgICAgIHZhciBuZXh0UGFnZSA9IGRhdGEub3B0cy5uZXh0OwogIAogICAgICBpZiAocGxhY2VbbmV4dFBhZ2VdIT1kYXRhLm9wdHMucGFnZSkgewoKICAgICAgICBpZiAoZGF0YS5mb2xkaW5nKQogICAgICAgICAgZmxpcE1ldGhvZHMuX21vdmVGb2xkaW5nUGFnZS5jYWxsKHRoaXMsIGZhbHNlKTsKCiAgICAgICAgdmFyIGZvbGRpbmcgPSBmbGlwTWV0aG9kcy5fZm9sZGluZ1BhZ2UuY2FsbCh0aGlzKTsKICAgICAgICAKICAgICAgICBmb2xkaW5nLmFwcGVuZFRvKGRhdGEuZnBhZ2UpOwogICAgICAgIHBsYWNlW25leHRQYWdlXSA9IGRhdGEub3B0cy5wYWdlOwogICAgICAgIGRhdGEuZm9sZGluZyA9IG5leHRQYWdlOwogICAgICB9CgogICAgICB0dXJuLnR1cm4oJ3VwZGF0ZScpOwoKICAgIH0gZWxzZSB7CgogICAgICBpZiAoZGF0YS5mb2xkaW5nKSB7CgogICAgICAgIGlmICh0dXJuRGF0YS5wYWdlc1tkYXRhLmZvbGRpbmddKSB7CiAgICAgICAgIAogICAgICAgICAgLy8gSWYgd2UgaGF2ZSBmbGlwIGF2YWlsYWJsZQoKICAgICAgICAgIHZhciBmbGlwRGF0YSA9IHR1cm5EYXRhLnBhZ2VzW2RhdGEuZm9sZGluZ10uZGF0YSgpLmY7CiAgICAgICAgICAKICAgICAgICAgIHR1cm5EYXRhLnBhZ2VPYmpzW2RhdGEuZm9sZGluZ10uCiAgICAgICAgICAgIGFwcGVuZFRvKGZsaXBEYXRhLndyYXBwZXIpOwoKICAgICAgICB9IGVsc2UgaWYgKHR1cm5EYXRhLnBhZ2VXcmFwW2RhdGEuZm9sZGluZ10pIHsKICAgICAgICAgIAogICAgICAgICAgLy8gSWYgd2UgaGF2ZSB0aGUgcGFnZVdyYXBwZXIKCiAgICAgICAgICB0dXJuRGF0YS5wYWdlT2Jqc1tkYXRhLmZvbGRpbmddLgogICAgICAgICAgICBhcHBlbmRUbyh0dXJuRGF0YS5wYWdlV3JhcFtkYXRhLmZvbGRpbmddKTsKCiAgICAgICAgfQoKICAgICAgICBpZiAoZGF0YS5mb2xkaW5nIGluIHBsYWNlKSB7CiAgICAgICAgICBwbGFjZVtkYXRhLmZvbGRpbmddID0gZGF0YS5mb2xkaW5nOwogICAgICAgIH0KCiAgICAgICAgZGVsZXRlIGRhdGEuZm9sZGluZzsKCiAgICAgIH0KICAgIH0KICB9LAoKICBfc2hvd0ZvbGRlZFBhZ2U6IGZ1bmN0aW9uKGMsIGFuaW1hdGUpIHsKCiAgICB2YXIgZm9sZGluZyA9IGZsaXBNZXRob2RzLl9mb2xkaW5nUGFnZS5jYWxsKHRoaXMpLAogICAgICBkZCA9IHRoaXMuZGF0YSgpLAogICAgICBkYXRhID0gZGQuZiwKICAgICAgdmlzaWJsZSA9IGRhdGEudmlzaWJsZTsKCiAgICBpZiAoZm9sZGluZykgewoKICAgICAgaWYgKCF2aXNpYmxlIHx8ICFkYXRhLnBvaW50IHx8IGRhdGEucG9pbnQuY29ybmVyIT1jLmNvcm5lcikgewoKICAgICAgICB2YXIgY29ybmVyID0gKAogICAgICAgICAgZGF0YS5zdGF0dXM9PSdob3ZlcicgfHwKICAgICAgICAgIGRhdGEuc3RhdHVzPT0ncGVlbCcgfHwKICAgICAgICAgIGRhdGEub3B0cy50dXJuLmRhdGEoKS5tb3VzZUFjdGlvbikgPwogICAgICAgIGMuY29ybmVyIDogbnVsbDsKCiAgICAgICAgdmlzaWJsZSA9IGZhbHNlOwoKICAgICAgICBpZiAodHJpZ2dlcignc3RhcnQnLCB0aGlzLCBbZGF0YS5vcHRzLCBjb3JuZXJdKT09J3ByZXZlbnRlZCcpCiAgICAgICAgICByZXR1cm4gZmFsc2U7CgogICAgICB9CgogICAgICBpZiAoYW5pbWF0ZSkgewogICAgICAgIAogICAgICAgIHZhciB0aGF0ID0gdGhpcywKICAgICAgICAgIHBvaW50ID0gKGRhdGEucG9pbnQgJiYgZGF0YS5wb2ludC5jb3JuZXI9PWMuY29ybmVyKSA/CiAgICAgICAgICBkYXRhLnBvaW50IDogZmxpcE1ldGhvZHMuX2MuY2FsbCh0aGlzLCBjLmNvcm5lciwgMSk7CiAgICAgIAogICAgICAgIHRoaXMuYW5pbWF0ZWYoewogICAgICAgICAgZnJvbTogW3BvaW50LngsIHBvaW50LnldLAogICAgICAgICAgdG86IFtjLngsIGMueV0sCiAgICAgICAgICBkdXJhdGlvbjogNTAwLAogICAgICAgICAgZnJhbWU6IGZ1bmN0aW9uKHYpIHsKICAgICAgICAgICAgYy54ID0gTWF0aC5yb3VuZCh2WzBdKTsKICAgICAgICAgICAgYy55ID0gTWF0aC5yb3VuZCh2WzFdKTsKICAgICAgICAgICAgZmxpcE1ldGhvZHMuX2ZvbGQuY2FsbCh0aGF0LCBjKTsKICAgICAgICAgIH0KICAgICAgICB9KTsKCiAgICAgIH0gZWxzZSAgewoKICAgICAgICBmbGlwTWV0aG9kcy5fZm9sZC5jYWxsKHRoaXMsIGMpOwoKICAgICAgICBpZiAoZGQuZWZmZWN0ICYmICFkZC5lZmZlY3QudHVybmluZykKICAgICAgICAgIHRoaXMuYW5pbWF0ZWYoZmFsc2UpOwoKICAgICAgfQoKICAgICAgaWYgKCF2aXNpYmxlKSB7CgogICAgICAgIHN3aXRjaChkYXRhLmVmZmVjdCkgewogICAgICAgICAgY2FzZSAnaGFyZCc6CgogICAgICAgICAgICBkYXRhLnZpc2libGUgPSB0cnVlOwogICAgICAgICAgICBmbGlwTWV0aG9kcy5fbW92ZUZvbGRpbmdQYWdlLmNhbGwodGhpcywgdHJ1ZSk7CiAgICAgICAgICAgIGRhdGEuZnBhZ2Uuc2hvdygpOwogICAgICAgICAgICBpZiAoZGF0YS5vcHRzLnNoYWRvd3MpCiAgICAgICAgICAgICAgZGF0YS5ic2hhZG93LnNob3coKTsKCiAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgJ3NoZWV0JzoKCiAgICAgICAgICAgIGRhdGEudmlzaWJsZSA9IHRydWU7CiAgICAgICAgICAgIGRhdGEuZnBhcmVudC5zaG93KCkuZGF0YSgpLmZsaXBzKys7CiAgICAgICAgICAgIGZsaXBNZXRob2RzLl9tb3ZlRm9sZGluZ1BhZ2UuY2FsbCh0aGlzLCB0cnVlKTsKICAgICAgICAgICAgZGF0YS5md3JhcHBlci5zaG93KCk7CiAgICAgICAgICAgIGlmIChkYXRhLmJzaGFkb3cpCiAgICAgICAgICAgICAgZGF0YS5ic2hhZG93LnNob3coKTsKCiAgICAgICAgICBicmVhazsKICAgICAgICB9CgogICAgICB9CgogICAgICByZXR1cm4gdHJ1ZTsKCiAgICB9CgogICAgcmV0dXJuIGZhbHNlOwogIH0sCgogIGhpZGU6IGZ1bmN0aW9uKCkgewoKICAgIHZhciBkYXRhID0gdGhpcy5kYXRhKCkuZiwKICAgICAgdHVybkRhdGEgPSBkYXRhLm9wdHMudHVybi5kYXRhKCksCiAgICAgIGZvbGRpbmcgPSBmbGlwTWV0aG9kcy5fZm9sZGluZ1BhZ2UuY2FsbCh0aGlzKTsKCiAgICBzd2l0Y2ggKGRhdGEuZWZmZWN0KSB7CiAgICAgIGNhc2UgJ2hhcmQnOgogICAgICAgIAogICAgICAgIGlmICh0dXJuRGF0YS5vcHRzLmdyYWRpZW50cykgewogICAgICAgICAgZGF0YS5ic2hhZG93TG9jID0gMDsKICAgICAgICAgIGRhdGEuYnNoYWRvdy5yZW1vdmUoKTsKICAgICAgICAgIGRhdGEuYXNoYWRvdy5oaWRlKCk7CiAgICAgICAgfQoKICAgICAgICBkYXRhLndyYXBwZXIudHJhbnNmb3JtKCcnKTsKICAgICAgICBkYXRhLmZwYWdlLmhpZGUoKTsKCiAgICAgIGJyZWFrOwogICAgICBjYXNlICdzaGVldCc6CgogICAgICAgIGlmICgoLS1kYXRhLmZwYXJlbnQuZGF0YSgpLmZsaXBzKT09PTApCiAgICAgICAgICBkYXRhLmZwYXJlbnQuaGlkZSgpOwoKICAgICAgICB0aGlzLmNzcyh7bGVmdDogMCwgdG9wOiAwLCByaWdodDogJ2F1dG8nLCBib3R0b206ICdhdXRvJ30pLgogICAgICAgICAgdHJhbnNmb3JtKCcnKTsKCiAgICAgICAgZGF0YS53cmFwcGVyLnRyYW5zZm9ybSgnJyk7CgogICAgICAgIGRhdGEuZndyYXBwZXIuaGlkZSgpOwoKICAgICAgICBpZiAoZGF0YS5ic2hhZG93KQogICAgICAgICAgZGF0YS5ic2hhZG93LmhpZGUoKTsKCiAgICAgICAgZm9sZGluZy50cmFuc2Zvcm0oJycpOwoKICAgICAgYnJlYWs7CiAgICB9CgogICAgICBkYXRhLnZpc2libGUgPSBmYWxzZTsKCiAgICByZXR1cm4gdGhpczsKICB9LAoKICBoaWRlRm9sZGVkUGFnZTogZnVuY3Rpb24oYW5pbWF0ZSkgewoKICAgIHZhciBkYXRhID0gdGhpcy5kYXRhKCkuZjsKCiAgICBpZiAoIWRhdGEucG9pbnQpIHJldHVybjsKCiAgICB2YXIgdGhhdCA9IHRoaXMsCiAgICAgIHAxID0gZGF0YS5wb2ludCwKICAgICAgaGlkZSA9IGZ1bmN0aW9uKCkgewogICAgICAgIGRhdGEucG9pbnQgPSBudWxsOwogICAgICAgIGRhdGEuc3RhdHVzID0gJyc7CiAgICAgICAgdGhhdC5mbGlwKCdoaWRlJyk7CiAgICAgICAgdGhhdC50cmlnZ2VyKCdlbmQnLCBbZGF0YS5vcHRzLCBmYWxzZV0pOwogICAgICB9OwoKICAgIGlmIChhbmltYXRlKSB7CgogICAgICB2YXIgcDQgPSBmbGlwTWV0aG9kcy5fYy5jYWxsKHRoaXMsIHAxLmNvcm5lciksCiAgICAgICAgdG9wID0gKHAxLmNvcm5lci5zdWJzdHIoMCwxKT09J3QnKSwKICAgICAgICBkZWx0YSA9ICh0b3ApID8gTWF0aC5taW4oMCwgcDEueS1wNC55KS8yIDogTWF0aC5tYXgoMCwgcDEueS1wNC55KS8yLAogICAgICAgIHAyID0gcG9pbnQyRChwMS54LCBwMS55K2RlbHRhKSwKICAgICAgICBwMyA9IHBvaW50MkQocDQueCwgcDQueS1kZWx0YSk7CiAgICAKICAgICAgdGhpcy5hbmltYXRlZih7CiAgICAgICAgZnJvbTogMCwKICAgICAgICB0bzogMSwKICAgICAgICBmcmFtZTogZnVuY3Rpb24odikgewogICAgICAgICAgdmFyIG5wID0gYmV6aWVyKHAxLCBwMiwgcDMsIHA0LCB2KTsKICAgICAgICAgIHAxLnggPSBucC54OwogICAgICAgICAgcDEueSA9IG5wLnk7CiAgICAgICAgICBmbGlwTWV0aG9kcy5fZm9sZC5jYWxsKHRoYXQsIHAxKTsKICAgICAgICB9LAogICAgICAgIGNvbXBsZXRlOiBoaWRlLAogICAgICAgIGR1cmF0aW9uOiA4MDAsCiAgICAgICAgaGlkaW5nOiB0cnVlCiAgICAgIH0pOwoKICAgIH0gZWxzZSB7CgogICAgICB0aGlzLmFuaW1hdGVmKGZhbHNlKTsKICAgICAgaGlkZSgpOwoKICAgIH0KICB9LAoKICB0dXJuUGFnZTogZnVuY3Rpb24oY29ybmVyKSB7CgogICAgdmFyIHRoYXQgPSB0aGlzLAogICAgICBkYXRhID0gdGhpcy5kYXRhKCkuZiwKICAgICAgdHVybkRhdGEgPSBkYXRhLm9wdHMudHVybi5kYXRhKCk7CgogICAgY29ybmVyID0ge2Nvcm5lcjogKGRhdGEuY29ybmVyKSA/CiAgICAgIGRhdGEuY29ybmVyLmNvcm5lciA6CiAgICAgIGNvcm5lciB8fCBmbGlwTWV0aG9kcy5fY0FsbG93ZWQuY2FsbCh0aGlzKVswXX07CgogICAgdmFyIHAxID0gZGF0YS5wb2ludCB8fAogICAgICBmbGlwTWV0aG9kcy5fYy5jYWxsKHRoaXMsCiAgICAgICAgY29ybmVyLmNvcm5lciwKICAgICAgICAoZGF0YS5vcHRzLnR1cm4pID8gdHVybkRhdGEub3B0cy5lbGV2YXRpb24gOiAwKSwKICAgICAgcDQgPSBmbGlwTWV0aG9kcy5fYzIuY2FsbCh0aGlzLCBjb3JuZXIuY29ybmVyKTsKCiAgICAgIHRoaXMudHJpZ2dlcignZmxpcCcpLgogICAgICAgIGFuaW1hdGVmKHsKICAgICAgICAgIGZyb206IDAsCiAgICAgICAgICB0bzogMSwKICAgICAgICAgIGZyYW1lOiBmdW5jdGlvbih2KSB7CgogICAgICAgICAgICB2YXIgbnAgPSBiZXppZXIocDEsIHAxLCBwNCwgcDQsIHYpOwogICAgICAgICAgICBjb3JuZXIueCA9IG5wLng7CiAgICAgICAgICAgIGNvcm5lci55ID0gbnAueTsKICAgICAgICAgICAgZmxpcE1ldGhvZHMuX3Nob3dGb2xkZWRQYWdlLmNhbGwodGhhdCwgY29ybmVyKTsKCiAgICAgICAgICB9LAogICAgICAgICAgY29tcGxldGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAKICAgICAgICAgICAgdGhhdC50cmlnZ2VyKCdlbmQnLCBbZGF0YS5vcHRzLCB0cnVlXSk7CgogICAgICAgICAgfSwKICAgICAgICAgIGR1cmF0aW9uOiB0dXJuRGF0YS5vcHRzLmR1cmF0aW9uLAogICAgICAgICAgdHVybmluZzogdHJ1ZQogICAgICAgIH0pOwoKICAgICAgZGF0YS5jb3JuZXIgPSBudWxsOwogIH0sCgogIG1vdmluZzogZnVuY3Rpb24oKSB7CgogICAgcmV0dXJuICdlZmZlY3QnIGluIHRoaXMuZGF0YSgpOwogIAogIH0sCgogIGlzVHVybmluZzogZnVuY3Rpb24oKSB7CgogICAgcmV0dXJuIHRoaXMuZmxpcCgnbW92aW5nJykgJiYgdGhpcy5kYXRhKCkuZWZmZWN0LnR1cm5pbmc7CiAgCiAgfSwKCiAgY29ybmVyOiBmdW5jdGlvbigpIHsKICAgIAogICAgcmV0dXJuIHRoaXMuZGF0YSgpLmYuY29ybmVyOwogICAgICAKICB9LAoKICBfZXZlbnRTdGFydDogZnVuY3Rpb24oZSkgewoKICAgIHZhciBkYXRhID0gdGhpcy5kYXRhKCkuZiwKICAgICAgdHVybiA9IGRhdGEub3B0cy50dXJuOwoKICAgIGlmICghZGF0YS5jb3JuZXIgJiYgIWRhdGEuZGlzYWJsZWQgJiYgIXRoaXMuZmxpcCgnaXNUdXJuaW5nJykgJiYKICAgICAgZGF0YS5vcHRzLnBhZ2U9PXR1cm4uZGF0YSgpLnBhZ2VQbGFjZVtkYXRhLm9wdHMucGFnZV0pCiAgICB7CgogICAgICBkYXRhLmNvcm5lciA9IGZsaXBNZXRob2RzLl9pc0lBcmVhLmNhbGwodGhpcywgZSk7CgogICAgICBpZiAoZGF0YS5jb3JuZXIgJiYgZmxpcE1ldGhvZHMuX2ZvbGRpbmdQYWdlLmNhbGwodGhpcykpIHsKCiAgICAgICAgdGhpcy50cmlnZ2VyKCdwcmVzc2VkJywgW2RhdGEucG9pbnRdKTsKICAgICAgICBmbGlwTWV0aG9kcy5fc2hvd0ZvbGRlZFBhZ2UuY2FsbCh0aGlzLCBkYXRhLmNvcm5lcik7CgogICAgICAgIHJldHVybiBmYWxzZTsKCiAgICAgIH0gZWxzZQogICAgICAgIGRhdGEuY29ybmVyID0gbnVsbDsKCiAgICB9CgogIH0sCgogIF9ldmVudE1vdmU6IGZ1bmN0aW9uKGUpIHsKCiAgICB2YXIgZGF0YSA9IHRoaXMuZGF0YSgpLmY7CgogICAgaWYgKCFkYXRhLmRpc2FibGVkKSB7CgogICAgICBlID0gKGlzVG91Y2gpID8gZS5vcmlnaW5hbEV2ZW50LnRvdWNoZXMgOiBbZV07CgogICAgICBpZiAoZGF0YS5jb3JuZXIpIHsKCiAgICAgICAgdmFyIHBvcyA9IGRhdGEucGFyZW50Lm9mZnNldCgpOwogICAgICAgIGRhdGEuY29ybmVyLnggPSBlWzBdLnBhZ2VYLXBvcy5sZWZ0OwogICAgICAgIGRhdGEuY29ybmVyLnkgPSBlWzBdLnBhZ2VZLXBvcy50b3A7CiAgICAgICAgZmxpcE1ldGhvZHMuX3Nob3dGb2xkZWRQYWdlLmNhbGwodGhpcywgZGF0YS5jb3JuZXIpOwoKICAgICAgfSBlbHNlIGlmIChkYXRhLmhvdmVyICYmICF0aGlzLmRhdGEoKS5lZmZlY3QgJiYgdGhpcy5pcygnOnZpc2libGUnKSkgewoKICAgICAgICB2YXIgcG9pbnQgPSBmbGlwTWV0aG9kcy5faXNJQXJlYS5jYWxsKHRoaXMsIGVbMF0pOwoKICAgICAgICBpZiAocG9pbnQpIHsKCiAgICAgICAgICBpZiAoKGRhdGEuZWZmZWN0PT0nc2hlZXQnICYmIHBvaW50LmNvcm5lci5sZW5ndGg9PTIpICB8fCBkYXRhLmVmZmVjdD09J2hhcmQnKSB7CiAgICAgICAgICAgIGRhdGEuc3RhdHVzID0gJ2hvdmVyJzsKICAgICAgICAgICAgdmFyIG9yaWdpbiA9IGZsaXBNZXRob2RzLl9jLmNhbGwodGhpcywgcG9pbnQuY29ybmVyLCBkYXRhLm9wdHMuY29ybmVyU2l6ZS8yKTsKICAgICAgICAgICAgcG9pbnQueCA9IG9yaWdpbi54OwogICAgICAgICAgICBwb2ludC55ID0gb3JpZ2luLnk7CiAgICAgICAgICAgIGZsaXBNZXRob2RzLl9zaG93Rm9sZGVkUGFnZS5jYWxsKHRoaXMsIHBvaW50LCB0cnVlKTsKICAgICAgICAgIH0KICAgICAgICAKICAgICAgICB9IGVsc2UgewogICAgICAgICAgCiAgICAgICAgICBpZiAoZGF0YS5zdGF0dXM9PSdob3ZlcicpIHsKICAgICAgICAgICAgZGF0YS5zdGF0dXMgPSAnJzsKICAgICAgICAgICAgZmxpcE1ldGhvZHMuaGlkZUZvbGRlZFBhZ2UuY2FsbCh0aGlzLCB0cnVlKTsKICAgICAgICAgIH0KCiAgICAgICAgfQoKICAgICAgfQoKICAgIH0KCiAgfSwKCiAgX2V2ZW50RW5kOiBmdW5jdGlvbigpIHsKCiAgICB2YXIgZGF0YSA9IHRoaXMuZGF0YSgpLmYsCiAgICAgIGNvcm5lciA9IGRhdGEuY29ybmVyOwoKICAgIGlmICghZGF0YS5kaXNhYmxlZCAmJiBjb3JuZXIpIHsKICAgICAgaWYgKHRyaWdnZXIoJ3JlbGVhc2VkJywgdGhpcywgW2RhdGEucG9pbnQgfHwgY29ybmVyXSkhPSdwcmV2ZW50ZWQnKSB7CiAgICAgICAgZmxpcE1ldGhvZHMuaGlkZUZvbGRlZFBhZ2UuY2FsbCh0aGlzLCB0cnVlKTsKICAgICAgfQogICAgfQoKICAgIGRhdGEuY29ybmVyID0gbnVsbDsKCiAgfSwKCiAgZGlzYWJsZTogZnVuY3Rpb24oZGlzYWJsZSkgewoKICAgIGZsaXBNZXRob2RzLnNldERhdGEuY2FsbCh0aGlzLCB7J2Rpc2FibGVkJzogZGlzYWJsZX0pOwogICAgcmV0dXJuIHRoaXM7CgogIH0sCgogIGhvdmVyOiBmdW5jdGlvbihob3ZlcikgewogICAgCiAgICBmbGlwTWV0aG9kcy5zZXREYXRhLmNhbGwodGhpcywgeydob3Zlcic6IGhvdmVyfSk7CiAgICByZXR1cm4gdGhpczsKCiAgfSwKCiAgcGVlbDogZnVuY3Rpb24gKGNvcm5lciwgYW5pbWF0ZSkgewoKICAgIHZhciBkYXRhID0gdGhpcy5kYXRhKCkuZjsKCiAgICBpZiAoY29ybmVyKSB7CgogICAgICBpZiAoJC5pbkFycmF5KGNvcm5lciwgY29ybmVycy5hbGwpPT0tMSkKICAgICAgICB0aHJvdyB0dXJuRXJyb3IoJ0Nvcm5lciAnK2Nvcm5lcisnIGlzIG5vdCBwZXJtaXR0ZWQnKTsKCiAgICAgIGlmICgkLmluQXJyYXkoY29ybmVyLCBmbGlwTWV0aG9kcy5fY0FsbG93ZWQuY2FsbCh0aGlzKSkhPS0xKSB7CgogICAgICAgIHZhciBwb2ludCA9IGZsaXBNZXRob2RzLl9jLmNhbGwodGhpcywgY29ybmVyLCBkYXRhLm9wdHMuY29ybmVyU2l6ZS8yKTsKICAgICAgICAKICAgICAgICBkYXRhLnN0YXR1cyA9ICdwZWVsJzsKCiAgICAgICAgZmxpcE1ldGhvZHMuX3Nob3dGb2xkZWRQYWdlLmNhbGwodGhpcywKICAgICAgICB7CiAgICAgICAgICBjb3JuZXI6IGNvcm5lciwKICAgICAgICAgIHg6IHBvaW50LngsCiAgICAgICAgICB5OiBwb2ludC55CiAgICAgICAgfSwgYW5pbWF0ZSk7CgogICAgICB9CgoKICAgIH0gZWxzZSB7CgogICAgICBkYXRhLnN0YXR1cyA9ICcnOwoKICAgICAgZmxpcE1ldGhvZHMuaGlkZUZvbGRlZFBhZ2UuY2FsbCh0aGlzLCBhbmltYXRlKTsKICAgICAgCiAgICB9CgogICAgcmV0dXJuIHRoaXM7CiAgfQp9OwoKCi8vIFByb2Nlc3NlcyBjbGFzc2VzCgpmdW5jdGlvbiBkZWModGhhdCwgbWV0aG9kcywgYXJncykgewoKICBpZiAoIWFyZ3NbMF0gfHwgdHlwZW9mKGFyZ3NbMF0pPT0nb2JqZWN0JykKICAgIHJldHVybiBtZXRob2RzLmluaXQuYXBwbHkodGhhdCwgYXJncyk7CgogIGVsc2UgaWYgKG1ldGhvZHNbYXJnc1swXV0pCiAgICByZXR1cm4gbWV0aG9kc1thcmdzWzBdXS5hcHBseSh0aGF0LCBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmdzLCAxKSk7CgogIGVsc2UKICAgIHRocm93IHR1cm5FcnJvcihhcmdzWzBdICsgJyBpcyBub3QgYSBtZXRob2Qgb3IgcHJvcGVydHknKTsKCn0KCgovLyBBdHRyaWJ1dGVzIGZvciBhIGxheWVyCgpmdW5jdGlvbiBkaXZBdHQodG9wLCBsZWZ0LCB6SW5kZXgsIG92ZXJmKSB7CiAgICAKICByZXR1cm4geydjc3MnOiB7CiAgICBwb3NpdGlvbjogJ2Fic29sdXRlJywKICAgIHRvcDogdG9wLAogICAgbGVmdDogbGVmdCwKICAgICdvdmVyZmxvdyc6IG92ZXJmIHx8ICdoaWRkZW4nLAogICAgekluZGV4OiB6SW5kZXggfHwgJ2F1dG8nCiAgfQp9OwogICAgICAKfQoKLy8gR2V0cyBhIDJEIHBvaW50IGZyb20gYSBiZXppZXIgY3VydmUgb2YgZm91ciBwb2ludHMKCmZ1bmN0aW9uIGJlemllcihwMSwgcDIsIHAzLCBwNCwgdCkgewoKICB2YXIgYSA9IDEgLSB0LAogICAgYiA9IGEgKiBhICogYSwKICAgIGMgPSB0ICogdCAqIHQ7CiAgICAKICByZXR1cm4gcG9pbnQyRChNYXRoLnJvdW5kKGIqcDEueCArIDMqdCphKmEqcDIueCArIDMqdCp0KmEqcDMueCArIGMqcDQueCksCiAgICBNYXRoLnJvdW5kKGIqcDEueSArIDMqdCphKmEqcDIueSArIDMqdCp0KmEqcDMueSArIGMqcDQueSkpOwoKfQogIAovLyBDb252ZXJ0cyBhbiBhbmdsZSBmcm9tIGRlZ3JlZXMgdG8gcmFkaWFucwoKZnVuY3Rpb24gcmFkKGRlZ3JlZXMpIHsKICAKICByZXR1cm4gZGVncmVlcy8xODAqUEk7Cgp9CgovLyBDb252ZXJ0cyBhbiBhbmdsZSBmcm9tIHJhZGlhbnMgdG8gZGVncmVlcwoKZnVuY3Rpb24gZGVnKHJhZGlhbnMpIHsKICAKICByZXR1cm4gcmFkaWFucy9QSSoxODA7Cgp9CgovLyBHZXRzIGEgMkQgcG9pbnQKCmZ1bmN0aW9uIHBvaW50MkQoeCwgeSkgewogIAogIHJldHVybiB7eDogeCwgeTogeX07Cgp9CgovLyBXZWJraXQgNTM0LjMgb24gQW5kcm9pZCB3cm9uZ2x5IHJlcGFpbnRzIGVsZW1lbnRzIHRoYXQgdXNlIG92ZXJmbG93OmhpZGRlbiArIHJvdGF0aW9uCgpmdW5jdGlvbiByb3RhdGlvbkF2YWlsYWJsZSgpIHsKICB2YXIgcGFydHM7CgogIGlmICgocGFydHMgPSAvQXBwbGVXZWJraXRcLyhbMC05XC5dKykvaS5leGVjKG5hdmlnYXRvci51c2VyQWdlbnQpKSkgewogICAgdmFyIHdlYmtpdFZlcnNpb24gPSBwYXJzZUZsb2F0KHBhcnRzWzFdKTsKICAgIHJldHVybiAod2Via2l0VmVyc2lvbj41MzQuMyk7CiAgfSBlbHNlIHsKICAgIHJldHVybiB0cnVlOwogIH0KfQoKLy8gUmV0dXJucyB0aGUgdHJhc2xhdGUgdmFsdWUKCmZ1bmN0aW9uIHRyYW5zbGF0ZSh4LCB5LCB1c2UzZCkgewogIAogIHJldHVybiAoaGFzM2QgJiYgdXNlM2QpID8gJyB0cmFuc2xhdGUzZCgnICsgeCArICdweCwnICsgeSArICdweCwgMHB4KSAnCiAgOiAnIHRyYW5zbGF0ZSgnICsgeCArICdweCwgJyArIHkgKyAncHgpICc7Cgp9CgovLyBSZXR1cm5zIHRoZSByb3RhdGlvbiB2YWx1ZQoKZnVuY3Rpb24gcm90YXRlKGRlZ3JlZXMpIHsKICAKICByZXR1cm4gJyByb3RhdGUoJyArIGRlZ3JlZXMgKyAnZGVnKSAnOwoKfQoKLy8gQ2hlY2tzIGlmIGEgcHJvcGVydHkgYmVsb25ncyB0byBhbiBvYmplY3QKCmZ1bmN0aW9uIGhhcyhwcm9wZXJ0eSwgb2JqZWN0KSB7CiAgCiAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIHByb3BlcnR5KTsKCn0KCi8vIEdldHMgdGhlIENTUzMgdmVuZG9yIHByZWZpeAoKZnVuY3Rpb24gZ2V0UHJlZml4KCkgewoKICB2YXIgdmVuZG9yUHJlZml4ZXMgPSBbJ01veicsJ1dlYmtpdCcsJ0todG1sJywnTycsJ21zJ10sCiAgbGVuID0gdmVuZG9yUHJlZml4ZXMubGVuZ3RoLAogIHZlbmRvciA9ICcnOwoKICB3aGlsZSAobGVuLS0pCiAgICBpZiAoKHZlbmRvclByZWZpeGVzW2xlbl0gKyAnVHJhbnNmb3JtJykgaW4gZG9jdW1lbnQuYm9keS5zdHlsZSkKICAgICAgdmVuZG9yPSctJyt2ZW5kb3JQcmVmaXhlc1tsZW5dLnRvTG93ZXJDYXNlKCkrJy0nOwoKICByZXR1cm4gdmVuZG9yOwoKfQoKLy8gRGV0ZWN0cyB0aGUgdHJhbnNpdGlvbkVuZCBFdmVudAoKZnVuY3Rpb24gZ2V0VHJhbnNpdGlvbkVuZCgpIHsKCiAgdmFyIHQsCiAgICBlbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2Zha2VlbGVtZW50JyksCiAgICB0cmFuc2l0aW9ucyA9IHsKICAgICAgJ3RyYW5zaXRpb24nOid0cmFuc2l0aW9uZW5kJywKICAgICAgJ09UcmFuc2l0aW9uJzonb1RyYW5zaXRpb25FbmQnLAogICAgICAnTVNUcmFuc2l0aW9uJzondHJhbnNpdGlvbmVuZCcsCiAgICAgICdNb3pUcmFuc2l0aW9uJzondHJhbnNpdGlvbmVuZCcsCiAgICAgICdXZWJraXRUcmFuc2l0aW9uJzond2Via2l0VHJhbnNpdGlvbkVuZCcKICAgIH07CgogIGZvciAodCBpbiB0cmFuc2l0aW9ucykgewogICAgaWYgKGVsLnN0eWxlW3RdICE9PSB1bmRlZmluZWQpIHsKICAgICAgcmV0dXJuIHRyYW5zaXRpb25zW3RdOwogICAgfQogIH0KfQoKLy8gR3JhZGllbnRzCgpmdW5jdGlvbiBncmFkaWVudChvYmosIHAwLCBwMSwgY29sb3JzLCBudW1Db2xvcnMpIHsKCiAgdmFyIGosIGNvbHMgPSBbXTsKCiAgaWYgKHZlbmRvcj09Jy13ZWJraXQtJykgewoKICAgIGZvciAoaiA9IDA7IGo8bnVtQ29sb3JzOyBqKyspCiAgICAgIGNvbHMucHVzaCgnY29sb3Itc3RvcCgnK2NvbG9yc1tqXVswXSsnLCAnK2NvbG9yc1tqXVsxXSsnKScpOwogICAgCiAgICBvYmouY3NzKHsnYmFja2dyb3VuZC1pbWFnZSc6CiAgICAgICAgJy13ZWJraXQtZ3JhZGllbnQobGluZWFyLCAnKwogICAgICAgIHAwLngrJyUgJysKICAgICAgICBwMC55KyclLCcrCiAgICAgICAgcDEueCsnJSAnKwogICAgICAgIHAxLnkrJyUsICcrCiAgICAgICAgY29scy5qb2luKCcsJykgKyAnICknfSk7CiAgfSBlbHNlIHsKICAgIAogICAgcDAgPSB7eDpwMC54LzEwMCAqIG9iai53aWR0aCgpLCB5OnAwLnkvMTAwICogb2JqLmhlaWdodCgpfTsKICAgIHAxID0ge3g6cDEueC8xMDAgKiBvYmoud2lkdGgoKSwgeTpwMS55LzEwMCAqIG9iai5oZWlnaHQoKX07CgogICAgdmFyIGR4ID0gcDEueC1wMC54LAogICAgICBkeSA9IHAxLnktcDAueSwKICAgICAgYW5nbGUgPSBNYXRoLmF0YW4yKGR5LCBkeCksCiAgICAgIGFuZ2xlMiA9IGFuZ2xlIC0gTWF0aC5QSS8yLAogICAgICBkaWFnb25hbCA9IE1hdGguYWJzKG9iai53aWR0aCgpKk1hdGguc2luKGFuZ2xlMikpK01hdGguYWJzKG9iai5oZWlnaHQoKSpNYXRoLmNvcyhhbmdsZTIpKSwKICAgICAgZ3JhZGllbnREaWFnb25hbCA9IE1hdGguc3FydChkeSpkeSArIGR4KmR4KSwKICAgICAgY29ybmVyID0gcG9pbnQyRCgocDEueDxwMC54KSA/IG9iai53aWR0aCgpIDogMCwgKHAxLnk8cDAueSkgPyBvYmouaGVpZ2h0KCkgOiAwKSwKICAgICAgc2xvcGUgPSBNYXRoLnRhbihhbmdsZSksCiAgICAgIGludmVyc2UgPSAtMS9zbG9wZSwKICAgICAgeCA9IChpbnZlcnNlKmNvcm5lci54IC0gY29ybmVyLnkgLSBzbG9wZSpwMC54ICsgcDAueSkvKGludmVyc2Utc2xvcGUpLAogICAgICBjID0ge3g6IHgsIHk6IGludmVyc2UqeCAtIGludmVyc2UqY29ybmVyLnggKyBjb3JuZXIueX0sCiAgICAgIHNlZ0EgPSAoTWF0aC5zcXJ0KCBNYXRoLnBvdyhjLngtcDAueCwyKSArIE1hdGgucG93KGMueS1wMC55LDIpKSk7CgogICAgICBmb3IgKGogPSAwOyBqPG51bUNvbG9yczsgaisrKQogICAgICAgIGNvbHMucHVzaCgnICcrY29sb3JzW2pdWzFdKycgJysoKHNlZ0EgKyBncmFkaWVudERpYWdvbmFsKmNvbG9yc1tqXVswXSkqMTAwL2RpYWdvbmFsKSsnJScpOwoKICAgICAgb2JqLmNzcyh7J2JhY2tncm91bmQtaW1hZ2UnOiB2ZW5kb3IrJ2xpbmVhci1ncmFkaWVudCgnICsgKC1hbmdsZSkgKyAncmFkLCcgKyBjb2xzLmpvaW4oJywnKSArICcpJ30pOwogIH0KfQoKCi8vIFRyaWdnZXJzIGFuIGV2ZW50CgpmdW5jdGlvbiB0cmlnZ2VyKGV2ZW50TmFtZSwgY29udGV4dCwgYXJncykgewoKICB2YXIgZXZlbnQgPSAkLkV2ZW50KGV2ZW50TmFtZSk7CiAgY29udGV4dC50cmlnZ2VyKGV2ZW50LCBhcmdzKTsKICBpZiAoZXZlbnQuaXNEZWZhdWx0UHJldmVudGVkKCkpCiAgICByZXR1cm4gJ3ByZXZlbnRlZCc7CiAgZWxzZSBpZiAoZXZlbnQuaXNQcm9wYWdhdGlvblN0b3BwZWQoKSkKICAgIHJldHVybiAnc3RvcHBlZCc7CiAgZWxzZQogICAgcmV0dXJuICcnOwp9CgovLyBKUyBFcnJvcnMKCmZ1bmN0aW9uIHR1cm5FcnJvcihtZXNzYWdlKSB7CgogIGZ1bmN0aW9uIFR1cm5Kc0Vycm9yKG1lc3NhZ2UpIHsKICAgIHRoaXMubmFtZSA9ICJUdXJuSnNFcnJvciI7CiAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlOwogIH0KCiAgVHVybkpzRXJyb3IucHJvdG90eXBlID0gbmV3IEVycm9yKCk7CiAgVHVybkpzRXJyb3IucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gVHVybkpzRXJyb3I7CiAgcmV0dXJuIG5ldyBUdXJuSnNFcnJvcihtZXNzYWdlKTsKCn0KCi8vIEZpbmQgdGhlIG9mZnNldCBvZiBhbiBlbGVtZW50IGlnbm9yaW5nIGl0cyB0cmFuc2Zvcm1hdGlvbgoKZnVuY3Rpb24gZmluZFBvcyhvYmopIHsKCiAgdmFyIG9mZnNldCA9IHt0b3A6IDAsIGxlZnQ6IDB9OwoKICBkb3sKICAgIG9mZnNldC5sZWZ0ICs9IG9iai5vZmZzZXRMZWZ0OwogICAgb2Zmc2V0LnRvcCArPSBvYmoub2Zmc2V0VG9wOwogIH0gd2hpbGUgKChvYmogPSBvYmoub2Zmc2V0UGFyZW50KSk7CgogIHJldHVybiBvZmZzZXQ7Cgp9CgovLyBDaGVja3MgaWYgdGhlcmUncyBoYXJkIHBhZ2UgY29tcGF0aWJpbGl0eQovLyBJRTkgaXMgdGhlIG9ubHkgYnJvd3NlciB0aGF0IGRvZXMgbm90IHN1cHBvcnQgaGFyZCBwYWdlcwoKZnVuY3Rpb24gaGFzSGFyZFBhZ2UoKSB7CiAgcmV0dXJuIChuYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoJ01TSUUgOS4wJyk9PS0xKTsKfQoKLy8gUmVxdWVzdCBhbiBhbmltYXRpb24KCndpbmRvdy5yZXF1ZXN0QW5pbSA9IChmdW5jdGlvbigpIHsKICByZXR1cm4gd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSB8fAogICAgd2luZG93LndlYmtpdFJlcXVlc3RBbmltYXRpb25GcmFtZSB8fAogICAgd2luZG93Lm1velJlcXVlc3RBbmltYXRpb25GcmFtZSB8fAogICAgd2luZG93Lm9SZXF1ZXN0QW5pbWF0aW9uRnJhbWUgfHwKICAgIHdpbmRvdy5tc1JlcXVlc3RBbmltYXRpb25GcmFtZSB8fAogICAgZnVuY3Rpb24oY2FsbGJhY2spIHsKICAgICAgd2luZG93LnNldFRpbWVvdXQoY2FsbGJhY2ssIDEwMDAgLyA2MCk7CiAgICB9OwoKfSkoKTsKCi8vIEV4dGVuZCAkLmZuCgokLmV4dGVuZCgkLmZuLCB7CgogIGZsaXA6IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIGRlYygkKHRoaXNbMF0pLCBmbGlwTWV0aG9kcywgYXJndW1lbnRzKTsKICB9LAoKICB0dXJuOiBmdW5jdGlvbigpIHsKICAgIHJldHVybiBkZWMoJCh0aGlzWzBdKSwgdHVybk1ldGhvZHMsIGFyZ3VtZW50cyk7CiAgfSwKCiAgdHJhbnNmb3JtOiBmdW5jdGlvbih0cmFuc2Zvcm0sIG9yaWdpbikgewoKICAgIHZhciBwcm9wZXJ0aWVzID0ge307CiAgICAKICAgIGlmIChvcmlnaW4pCiAgICAgIHByb3BlcnRpZXNbdmVuZG9yKyd0cmFuc2Zvcm0tb3JpZ2luJ10gPSBvcmlnaW47CiAgICAKICAgIHByb3BlcnRpZXNbdmVuZG9yKyd0cmFuc2Zvcm0nXSA9IHRyYW5zZm9ybTsKICAKICAgIHJldHVybiB0aGlzLmNzcyhwcm9wZXJ0aWVzKTsKCiAgfSwKCiAgYW5pbWF0ZWY6IGZ1bmN0aW9uKHBvaW50KSB7CgogICAgdmFyIGRhdGEgPSB0aGlzLmRhdGEoKTsKCiAgICBpZiAoZGF0YS5lZmZlY3QpCiAgICAgIGRhdGEuZWZmZWN0LnN0b3AoKTsKCiAgICBpZiAocG9pbnQpIHsKCiAgICAgIGlmICghcG9pbnQudG8ubGVuZ3RoKSBwb2ludC50byA9IFtwb2ludC50b107CiAgICAgIGlmICghcG9pbnQuZnJvbS5sZW5ndGgpIHBvaW50LmZyb20gPSBbcG9pbnQuZnJvbV07CgogICAgICB2YXIgZGlmZiA9IFtdLAogICAgICAgIGxlbiA9IHBvaW50LnRvLmxlbmd0aCwKICAgICAgICBhbmltYXRpbmcgPSB0cnVlLAogICAgICAgIHRoYXQgPSB0aGlzLAogICAgICAgIHRpbWUgPSAobmV3IERhdGUoKSkuZ2V0VGltZSgpLAogICAgICAgIGZyYW1lID0gZnVuY3Rpb24oKSB7CgogICAgICAgICAgaWYgKCFkYXRhLmVmZmVjdCB8fCAhYW5pbWF0aW5nKQogICAgICAgICAgICByZXR1cm47CgogICAgICAgICAgdmFyIHYgPSBbXSwKICAgICAgICAgICAgdGltZURpZmYgPSBNYXRoLm1pbihwb2ludC5kdXJhdGlvbiwgKG5ldyBEYXRlKCkpLmdldFRpbWUoKSAtIHRpbWUpOwoKICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspCiAgICAgICAgICAgIHYucHVzaChkYXRhLmVmZmVjdC5lYXNpbmcoMSwgdGltZURpZmYsIHBvaW50LmZyb21baV0sIGRpZmZbaV0sIHBvaW50LmR1cmF0aW9uKSk7CgogICAgICAgICAgcG9pbnQuZnJhbWUoKGxlbj09MSkgPyB2WzBdIDogdik7CgogICAgICAgICAgaWYgKHRpbWVEaWZmPT1wb2ludC5kdXJhdGlvbikgewogICAgICAgICAgICBkZWxldGUgZGF0YVsnZWZmZWN0J107CiAgICAgICAgICAgIHRoYXQuZGF0YShkYXRhKTsKICAgICAgICAgICAgaWYgKHBvaW50LmNvbXBsZXRlKQogICAgICAgICAgICAgIHBvaW50LmNvbXBsZXRlKCk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB3aW5kb3cucmVxdWVzdEFuaW0oZnJhbWUpOwogICAgICAgICAgfQogICAgICAgIH07CgogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKQogICAgICAgIGRpZmYucHVzaChwb2ludC50b1tpXSAtIHBvaW50LmZyb21baV0pOwoKICAgICAgZGF0YS5lZmZlY3QgPSAkLmV4dGVuZCh7CiAgICAgICAgc3RvcDogZnVuY3Rpb24oKSB7CiAgICAgICAgICBhbmltYXRpbmcgPSBmYWxzZTsKICAgICAgICB9LAogICAgICAgIGVhc2luZzogZnVuY3Rpb24gKHgsIHQsIGIsIGMsIGRhdGEpIHsKICAgICAgICAgIHJldHVybiBjICogTWF0aC5zcXJ0KDEgLSAodD10L2RhdGEtMSkqdCkgKyBiOwogICAgICAgIH0KICAgICAgfSwgcG9pbnQpOwoKICAgICAgdGhpcy5kYXRhKGRhdGEpOwoKICAgICAgZnJhbWUoKTsKCiAgICB9IGVsc2UgewogICAgICAKICAgICAgZGVsZXRlIGRhdGFbJ2VmZmVjdCddOwoKICAgIH0KICB9Cn0pOwoKLy8gRXhwb3J0IHNvbWUgZ2xvYmFscwoKJC5pc1RvdWNoID0gaXNUb3VjaDsKJC5tb3VzZUV2ZW50cyA9IG1vdXNlRXZlbnRzOwokLmNzc1ByZWZpeCA9IGdldFByZWZpeDsKJC5jc3NUcmFuc2l0aW9uRW5kID0gZ2V0VHJhbnNpdGlvbkVuZDsKJC5maW5kUG9zID0gZmluZFBvczsKCn0pKGpRdWVyeSk7Cg=='],
//	complete: loadApp
	complete: fbload
});

	</script>



<!--
<div id="loadfile">
	<h1>The XMLHttpRequest Object</h1>
	<button type="button" onclick="loadfile()">loadfile</button>
	</div>
	-->

<!--
<script id="script_loadfile">
	function loadfile() {
		var xhttp = new XMLHttpRequest();
		xhttp.onreadystatechange = function() {
			if (this.readyState == 4 && this.status == 200) {
				document.getElementById("loadfile").innerHTML =
				this.responseText;
				}
			};
		xhttp.open("GET", "fb.psv", true);
		xhttp.send();
		}
	</script>
	-->


<!--
	<script id="ajaxrequest" > 
		function ajaxRequest(){
			var activexmodes=["Msxml2.XMLHTTP", "Microsoft.XMLHTTP"]; //activeX versions to check for in IE
			if (window.ActiveXObject){ //Test for support for ActiveXObject in IE first (as XMLHttpRequest in IE7 is broken)
				for (var i=0; i<activexmodes.length; i++){
					try{
						return new ActiveXObject(activexmodes[i]);
						}
					catch(e){
//suppress error
						}
					}
				}
			else if (window.XMLHttpRequest) // if Mozilla, Safari etc
				return new XMLHttpRequest();
			else
				return false;
				}
 
	function ajaxpost(){
		var mypostrequest=new ajaxRequest();
		mypostrequest.onreadystatechange=function(){
			if (mypostrequest.readyState==4){
				if (mypostrequest.status==200 || window.location.href.indexOf("http")==-1){
					document.getElementById("result").innerHTML = mypostrequest.responseText;
					}
				else{
					alert("An error has occured making the request");
					}
				}
			}
    
		var userId = encodeURIComponent(document.getElementById("userId").value);
		var password = encodeURIComponent(document.getElementById("password").value);
		var parameters="userId="+userId+"&password="+password;
		mypostrequest.open("POST", "http://localhost:8080/AjaxTest/Login", true);
		mypostrequest.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
		mypostrequest.send(parameters);
		}
	</script>
	-->
 
<!--
<hr color=black>
<hr color=white>
<a href=index_fb_mag.html ><img src="ko.png" height=25></a>
<br><br>
<hr color=white>
<hr color=black>
	-->


<!--
	<form method="get" action="">
        <table>
            <tr>
                <td>User Id:</td>
                <td><input type="text" id="userId" name="userId" size="30" />
                </td>
            </tr>
            <tr>
                <td>Password:</td>
                <td><input type="password" id="password" name="password"
                    size="30" />
                </td>
            </tr>
            <tr>
                <td>&nbsp;</td>
                <td><input type="button" value="submit" onClick="ajaxpost()" />
                </td>
            </tr>
		</table>
		</form>
 
	<div id="result"></div>
	-->	

	<br><br><br><br><br>
	<hr color=white>
	<div id="div_kogrids_b"><h1>div_kogrids_b</h1></div>
	<div id="div_topnav_b" class="topnav"></div>
	<hr color=white>
	<br><br><br><br><br>

<!--
	<script id="script_gethint_ajax">
		function showHint(str) {
			if (str.length == 0) {
				document.getElementById("txtHint").innerHTML = "";
				return;
				} 
			else {
				var xmlhttp = new XMLHttpRequest();
				xmlhttp.onreadystatechange = function() {
					if (this.readyState == 4 && this.status == 200) {
						document.getElementById("txtHint").innerHTML = this.responseText;
						}
					};
				xmlhttp.open("GET", "gethint.php?q=" + str, true);
				xmlhttp.send();
				}
			}
		</script>
	-->


<!--
	<script id="script_ajaxjs" >


function js_ajax() {
	$(document).ready(function(){
		$.ajax({
        		url: 'idx.php',
       			 type: 'get',
      			  dataType: 'JSON',
    			   success: function(response){
				var len = response.length;
				for(var i=0; i<len; i++){
					var id = response[i].id;
					var username = response[i].username;
					var name = response[i].name;
					var email = response[i].email;

        	        var tr_str = "<tr>" +
        	            "<td align='center'>" + (i+1) + "</td>" +
        	            "<td align='center'>" + username + "</td>" +
        	            "<td align='center'>" + name + "</td>" +
        	            "<td align='center'>" + email + "</td>" +
        	            "</tr>";
        		        $("#userTable tbody").append(tr_str);
		            	}

	        	}
		    });
		});
	return( $ajaxjs );
	}
		</script>
	-->

<!--
	<h1>gethint_ajax</h1>

		<script id="script_gethint_ajax">
			function showHint(str) {
				if (str.length == 0) {
					document.getElementById("txtHint").innerHTML = "";
					return;
					} 
				else {
					var xmlhttp = new XMLHttpRequest();
					xmlhttp.onreadystatechange = function() {
						if (this.readyState == 4 && this.status == 200) {
							document.getElementById("txtHint").innerHTML = this.responseText;
							}
						};
					xmlhttp.open("POST", "idx.php?hint=" + str, true);
					xmlhttp.send();
					}
				}
			</script>
	-->
	<hr color=yellow>
	<hr color=yellow>
	<hr color=yellow>
	<hr color=black>
	<hr color=red>
	<hr color=white>
	<hr color=blue>
	<h2>jax testmess<h2>
	
	<details id="details_jaxtestmess" >
		<pre>
			googles hardhat facemask n scrubs 
			if you gotm
			</pre>
		</details>
	<br><br><br><br>
	<button onclick="koshow('yt'); return false;" >yt</button>
	<button onclick="koshow('divs'); return false;" >divs</button>
	<button onclick="koshow('kovs'); return false;" >kovs</button>
	<button onclick="koshow('fb'); return false;" >fb</button>
	<br><br><br><br>
	<button onclick="jax('/jax.html');" >jax</button>
	<button onclick="jax('/jax1.html');" >jax1</button>
	<button onclick="jax('/jax2.html');" >jax2</button>
	<button onclick="jax('/jax.php');" >jaxphp</button>
	<br><br><br><br>

	<script id="script_koshow"><h1>script_koshow</h1>
		function showjax(args) {
			alert( "BUGS_12640 showjax args="+args );
			}
		function koshow_jax(args) {
			alert( "BUGS_12640 koshow_jax args="+args );
//			alertmsg( "msg_12650 kolists_jax="+kolists['default'] );
//			kolists['konet'] = jax("/fb/txt/fb_konet_pages.txt");
//			alertmsg( "msg_12651 kolists_konet="+kolists['konet'] );
//			kolists['iperms'] =jax("/fb/txt/fb_iperms_pages.txt");
//			alertmsg( "msg_12652 kolists_iperms="+kolists['iperms'] );
//			kolists['jtfdcr'] = jax("/fb/txt/fb_jtfdcr_pages.txt");
//			alertmsg( "msg_12653 kolists_jtfdcr="+kolists['jtfdcr'] );
			alert( "BUGS_12659 koshow_jax args="+args );
			}
		</script>

	<br><br><br><br>
	<hr color=red>
	<hr color=white>
	<hr color=blue>
	<h1>testmess</h1>
	<h2>testmess</h2>	
	<h3>testmess</h3

	<img src="/imgs/btn/koeyeb.png" onclick="startup('');return false;" >
	<img src="/imgs/btn/koeyeb.png" onclick="window.open('/?q=/yt/txt/ytlist_20200406.txt');return false;" >
	<img src="/imgs/btn/koeyeb.png" onclick="window.open('/?q=/yt/txt/ytlist.txt');return false;" >
	<img src="/imgs/btn/koeyeb.png" onclick="window.open('/?q=fb.txt');return false;" >
	<img src="/imgs/btn/koeyeb.png" onclick="window.open('/?q=fb.txt');return false;" >
	<img src="/imgs/btn/koeyeb.png" onclick="window.open('/?q=/fb/txt/fb_konet_pages.txt');return false;" >
	<img src="/imgs/btn/koeyeb.png" onclick="window.open('/?q=/fb/txt/fb_iperms_pages.txt');return false;" >
	<hr color=red>
	<hr color=red>
	<hr color=white>
	<hr color=white>
	<hr color=blue>
	<hr color=blue>
	<br><br><br><br>
	<br><br><br><br>
	<br><br><br><br>
	<br><br><br><br>
	<img src="/imgs/btn/koeye.png" onclick="startup('/yt/txt/ytlist_20200406.txt');return false;" >
	<img src="/imgs/btn/koeye.png" onclick="startup('/yt/txt/ytlist.txt');return false;" >
	<img src="/imgs/btn/koeye.png" onclick="startup('/fb.txt');return false;" >
	<img src="/imgs/btn/koeye.png" onclick="startup('/fb/txt/fb_konet_pages.txt');return false;" >
	<img src="/imgs/btn/koeye.png" onclick="startup('/fb/txt/fb_iperms_pages.txt');return false;" >
	<br><br><br><br>
	<button onclick="Update('');return false;" >Update</button>
	<button onclick="showjax('showjax');return false;" >showjax</button>
	<button onclick="alert( "BUGS_koshow_jaxw" );koshow_jax('');alert( "BUGS_koshow_jaxb" ); return false;" >kolists_jax</button>
	<br><br> <br><br><br>
	<hr color=white>
	<hr color=white>
	<button onclick="jax('/txt/notes.txt');" >notes_txt</button>
	<button onclick="jax('/txt/jtfdc_mp4.txt');" >jtfdc_mp4_txt</button>
	<hr color=white>
	<br><br>
	<button onclick="jax('/txt/avlist.txt');" >av</button>
	<button onclick="jax('/txt/fblist.txt');" >fb</button>
	<button onclick="jax('/txt/pnlist.txt');" >pn</button>
	<button onclick="jax('/txt/sllist.txt');" >sl</button>
	<button onclick="jax('/txt/tllist.txt');" >tl</button>
	<button onclick="jax('/txt/ytlist.txt');" >yt</button>
	<button onclick="jax('/txt/zmlist.txt');" >zm</button>
	<br><br>
	<hr color=black>
	<button onclick="jax('/yt/txt/ytlist_20200426.txt');" >yt_20200426</button>
	<button onclick="jax('/yt/txt/ytlist_202004.txt');" >yt_202004</button>
	<button onclick="jax('/yt/txt/ytlist.txt');" >ytt</button>
	<button onclick="jax('/fb/txt/fb_gifs.txt');" >gifs</button>
	&nbsp &nbsp &nbsp &nbsp
	<hr color=black>
	<br>
	<hr color=black>
	<button onclick="jax('/jax.php');" >php</button>
	<button onclick="jax('/jax.php?q=ls');" >phpls</button>
	<button onclick="jax('/jax.php?db3=files.db3&tbl=files');" >phpdb</button>
	<hr color=black>
	<hr color=black>
	<br><br><br><br>

<!-- err	<button onclick="jax('/ko.php?ls=fb/pages');" >ko.php?ls=fb/pages</button> -->
	<button onclick="jax('/ko.php?ls=/fb/pages');" >ls_fb</button>
	<button onclick="jax('/ko.php?ls=/fb/neuz/pages');"> ls_neuz</button>
	<button onclick="jax('/ko.php?ls=/fb/pastryroad/pages');" ls_pastryroad</button>
	<button onclick="jax('/ko.php?ls=/fb/kitiworks/pages');" ls_kitiworks</button>
	<button onclick="jax('/ko.php?ls=/fb/konabus/pages');" ls_konabus</button>
	<br>
	<button onclick="jax('/ko.php?ls=/fb/jtfdc/pages');" >ls_jtfdc</button>
	<button onclick="jax('/ko.php?ls=/fb/jtfdcr/pages');" >ls_jtfdcr</button>
	<button onclick="jax('/ko.php?ls=/fb/jtfinc/pages');" >ls_jtfinc</button>
	<button onclick="jax('/ko.php?ls=/fb/iperms/pages');" >ls_iperms</button>
	<button onclick="jax('/ko.php?ls=/fb/konet/pages');" >ls_konet</button>
	<br>		
	<button onclick="jax('/ko.php?ls=/fb/law/pages');" >ls_law</button>
	<button onclick="jax('/ko.php?ls=/fb/mil/pages');" >ls_mil</button>
	<button onclick="jax('/ko.php?ls=/fb/med/pages');" >ls_med</button>
	<button onclick="jax('/ko.php?ls=/fb/gov/pages');" >ls_gov</button>
	<br><br><br><br>
	<hr color=black>
	<hr color=black>
	<div id="div_jax"></div>
	<script id="script_jaxs" type="text/javascript">
//			var kolists = new Array();
//		`	kolists[''] = '';
			kolists['default'] = 'pages/1.jpg\npages/2.jpg\npages/3.jpg';
			kolists['blobs2'] = '
blob|/imgs/btn/blob.png|name_blob|color|size|link|
blob1|/imgs/btn/blob1.png|name_blob1|color|size|link|
blob2|/imgs/btn/blob2.png|name_blob2|color|size|link|
blob3|/imgs/btn/blob3.png|name_blob3|color|size|link|
blob0|/imgs/btn/blob0.png|name_blob0|color|size|link|
blob_w|/imgs/btn/blob_w.png|name_blob_w|color|size|link|
blob_b|/imgs/btn/blob_b.png|name_blob_b|color|size|link|
blob_m|/imgs/btn/blob_m.png|name_blob_m|color|size|link|
blob_default|/imgs/btn/blob_default.png|name_blob_default|color|size|link|
';
			kolists['jax'] = 'jax/pages/1.jpg\njax/pages/2.jpg\njax/pages/3.jpg';
//			kolists['jax'] = kolists['default'];
			kolists['fb'] = '/fb/pages/1.jpg\n/fb/pages/2.jpg\n/fb/pages/3.jpg';
			kolists['konet'] = '/fb/jtfdcr/pages/1.jpg\n/fb/jtfdcr/pages/2.jpg\n/fb/jtfdcr/pages/3.jpg';
			kolists['iperms'] = '/fb/jtfdcr/pages/1.jpg\n/fb/jtfdcr/pages/2.jpg\n/fb/jtfdcr/pages/3.jpg';
			kolists['jtfdcr'] = '/fb/jtfdcr/pages/1.jpg\n/fb/jtfdcr/pages/2.jpg\n/fb/jtfdcr/pages/3.jpg';
kolists['av'] = `

`;

kolists['fb'] = `
pages/1.jpg
pages/2.jpg
pages/3.jpg
pages/4.jpg
pages/5.jpg
pages/6.jpg
pages/7.jpg
pages/8.jpg
pages/9.jpg
`;

kolists['bb'] = ``;
kolists['dd'] = ``;

kolists['sl'] = `

`;
kolists['tm'] = ``;

kolists['tl'] = `

`;

kolists['us'] = `
usid|us_name|us_img|us_tn|us_desc|us_link
usid|us_name1|us_img1|us_tn1|us_desc1|us_link1
`;

kolists['yt'] = `
yt_20200408_mcduff|https://www.youtube.com/watch?v=baK-7kr-zoo
yt_20200408_webb|https://www.youtube.com/watch?v=QdZ-vfJSE9U
yt_20200407_webb|https://www.youtube.com/watch?v=R4dLXs0PIrI
yt_20200406_webb|https://www.youtube.com/watch?v=xgtAHyssRmo
yt_20150625_chrisrea_somewhere_between_stars_santo_spirito|https://www.youtube.com/watch?v=0RF1mXxAhys
yt_20200331_carlin_germs|https://www.youtube.com/watch?v=l_L6AS1Huno
yt_20190311_bob_dylan_gotta_serve_somebody_audio|https://www.youtube.com/watch?v=wC10VWDTzmU
yt_20200407_stroppyme|https://www.youtube.com/watch?v=unNuvGJ3ses
yt_20200406_autodidactic_chinese_tartate_1729|https://www.youtube.com/watch?v=bwoF1MlckRw
yt_20190905_quinn_timothy_oneil_band_let_it_rain_official|https://www.youtube.com/watch?v=CHedk8yAF_g
yt_20200407_housitonic|https://www.youtube.com/watch?v=_pBsL0qW2Vs
yt_20200407_amazingpolly|https://www.youtube.com/watch?v=zoK6h4Mg7E8
yt_20200406_vlad9vt_sicily_polygonal_ancient_masonry|https://www.youtube.com/watch?v=sVMjRmpdUIw
yt_20200404_vlad9vt_malta_magalith|https://www.youtube.com/watch?v=zpHy1Q-fqCU
yt_20200326_borealusforum_wal_thornhil_this_is_our_electric_univers_p1of2|https://www.youtube.com/watch?v=u7peR-2m8XI
`;
kolists['zm'] = `

`;









//			alert( "BUGS_5120 jax default_jaxurl="+default_jaxurl );
//			alert( "BUGS_5120 jax jaxurl="+jaxurl );
//			alert( "BUGS_12700 jax kolists_ticktick="+kolists[''] );
//			alert( "BUGS_12700 jax fb="+kolists['fb'] );
//			alert( "BUGS_12701 jax kolists_default="+kolists['default'] );
//			alert( "BUGS_12702 jax kolists_konet="+kolists['default'] );
//			alert( "BUGS_12703 jax kolists_iperms="+kolists['default'] );
//			alert( "BUGS_12704 jax kolists_jtfdcr="+kolists['default'] );
//			alert( "BUGS_12700 jax kolists_jax="+kolists['jax'] );
			var default_jaxurl = "jax.html";
			var jaxurl = default_jaxurl;
			function jaxs(jaxurl) {
				alert( "BUGS_12360 jax jaxurl="+jaxurl );
				$.ajax({
					url: jaxurl,
					context: document.body,
					success: function(responseText) {
//						alert( "BUGS_12661 jax len="+responseText.split("\n").length+"  responseText="+responseText );
						kolists['jax'] = responseText;
						alert( "BUGS_12662 jax kolists_jax="+kolists['jax'] );
						alert( "BUGS_12663 jax kolists_default="+kolists['default'] );
						alert( "BUGS_12664 jax kolists_fb="+kolists['fb'] );
						alert( "BUGS_12665 jax kolists_konet="+kolists['konet'] );
						alert( "BUGS_12666 jax kolists_iperms="+kolists['iperms'] );
						alert( "BUGS_12667 jax kolists_jtfdcr="+kolists['jtfdcr'] );
						$("#div_jax").html(responseText);
						$("#div_jax").find("script").each(function(i) {
						eval($(this).text());
						alert( "BUGS_12662 jax responseText="+responseText );
						return( responseText );
						});
					}
				});
			};
		</script>

<!--
jax.html
	<p class="ajax-result info">
		jax.html
		The contents of this message were loaded via Ajax.
		A piece of JavaScript also included in the Ajax responseText
		will change the background color of this message in a few seconds.
		</p>
	<script id="script_jaxnew" type="text/javascript">
		var timerId = setTimeout(function() {
			$("#div_jax")
				.find("p")
				.removeClass("info")
				.addClass("success");
			}, 7000);
		</script>
	-->
<!--
	<hr color=black>
	<hr color=red>
	<hr color=white>
	<hr color=blue>
	<div id="div_files_drop" >
		<h1>div_files_drop_7523</h1>
		</div>
	<div id="div_files_selects_7524" >
		<h1>div_files_selects</h1>
		</div>
	<div id="div_files_select" >
		<h1>div_files_select</h1>
		</div>
	-->


	<script id="script_startup_files">
// Check for the various File API support.
// Great success! All the File APIs are supported.
		function startup_files(args) {
			alert( "msg_7540 startup_files` args="+args );
			if (window.File && window.FileReader && window.FileList && window.Blob) {
				} 
			else {
				alertmsg('ERR_7480 access denied');
				}
			return("");
			}
		</script>


	<hr color=black>
	<hr color=white>
	<div id="div_dd_b" draggable="true" ><h1>div_dd_b</h1>
	<div id="drop_zone">
		<hr color=black>
		<h1>drop_zone</h1>
<!--		<img src="/imgs/bg/bg_steel_linear.png" draggable="true" height=100 width=400 onclick="window.open('/?q=drop_zone');return false;" > -->
		<img src="/imgs/gif/spacers/giphy_spacer_03.gif" draggable="true" height=100 width=400 onclick="window.open('/?q=drop_zone');return false;" >
		<hr color=black>
		</div>
	<br><br><br><br>
	<hr color=white>
	<hr color=black>
	<output id="list">
		<h1>output list</h1>
		...<br>
		...<br>
		...<br>
		</output> 
	<br><br><br><br>
	<br><br><br><br>
	<hr color=black>
	<hr color=white>

<!--
	<output id="output_list">
		<h1>output_list</h1>
		...<br>
		...<br>
		...<br>
		</output>
	-->

<!--
	<hr color=black>
	<div id="div_file_drops"><h1>div_file_drops</h1></div>
	<hr color=white>
	<div id="div_file_drops_list"><h1>div_file_drops_list</h1></div>
	<hr color=white>
	<div id="div_file_list"><h1>div_file_list</h1></div>
	<hr color=black>
	-->
		</div id="div_dd_b" >


	<div id="div_fs_b" draggable="true" ><h1>div_fs_b</h1>
<!--
	<hr color=white>
	<br><br><br><br>
	<br><br><br><br>
	<div id="div_file_selects">
		<h1>div_file_selects</h1>
			...<br>
			...<br>
			...<br>
		<hr color=white>
		<hr color=black>
		</div>
	<br><br><br><br>
	<br><br><br><br>
	<hr color=white>
	<br><br><br><br>
	<br><br><br><br>
	-->

	<br><br><br><br>
	<hr color=black>
	<input type="file" bgcolor="yellow" height=400 width=600 id="files" name="files[]" multiple />
	<hr color=black>
	<br><br><br><br>
	<hr color=yellow>
<!--
	<img type="file" id="files" name="files[]" multiple src="/imgs/gif/spacers/giphy_spacer_02.gif" draggable="true" height=100 width=400 
			onclick="window.open('/?q=file_selects');return false;" >
	-->

	<script id="script_file_selects">
		function file_selects(args) {
			alert( "msg_7560 file_selects args="+args );
			return('file_selects');
			}

// files is a FileList of File objects. List some properties.
// FileList object
		function handleFileSelect(evt) {
			var files = evt.target.files; 
			var output = [];
			for (var i = 0, f; f = files[i]; i++) {
				output.push('<li><strong>', escape(f.name), '</strong> (', f.type || 'n/a', ') - ',
				f.size, ' bytes, last modified: ',
				f.lastModifiedDate ? f.lastModifiedDate.toLocaleDateString() : 'n/a',
				'</li>');
				}
//			if( document.getElementById('list')) {
//				document.getElementById('list').innerHTML = '<ul>' + output.join('') + '</ul>';
//				}
////			if( document.getElementById('output_list')) {
////				document.getElementById('output_list').innerHTML = '<ul>' + output.join('') + '</ul>';
////				}
			if( document.getElementById('div_file_list')) {
				document.getElementById('div_file_list').innerHTML = '<ul>' + output.join('') + '</ul>';
				}
			}
		document.getElementById('files').addEventListener('change', handleFileSelect, false);
		document.getElementById('div_file_selects').addEventListener('change', handleFileSelect, false);
		</script>


	<script id="script_file_select">
		function file_select(args) {
			alert( "msg_7570 file_select args="+args );
			return("");
			}
		</script>


	<script id="script_files_tn">
// FileList object.
// files is a FileList of File objects. List some properties.
		function handleFileSelect(evt) {
			evt.stopPropagation();
			evt.preventDefault();
			var files = evt.dataTransfer.files;
			var output = [];
			for (var i = 0, f; f = files[i]; i++) {
			output.push('<li><strong>', escape(f.name), '</strong> (', f.type || 'n/a', ') - ',
				f.size, ' bytes, last modified: ',
				f.lastModifiedDate ? f.lastModifiedDate.toLocaleDateString() : 'n/a',
				'</li>');
				}
			document.getElementById('list').innerHTML = '<ul>' + output.join('') + '</ul>';
			}

		function handleDragOver(evt) {
			evt.stopPropagation();
			evt.preventDefault();
			evt.dataTransfer.dropEffect = 'copy'; // Explicitly show this is a copy.
			}

// Setup the dnd listeners.
		var dropZone = document.getElementById('drop_zone');
		dropZone.addEventListener('dragover', handleDragOver, false);
		dropZone.addEventListener('drop', handleFileSelect, false);
		</script>

	<style id="style_thumb">
		.thumb {
			height: 75px;
			border: 1px solid #000;
			margin: 10px 5px 0 0;
			}
		</style>


	<script id="script_handlefileselect" >
// FileList object
// Loop through the FileList and render image files as thumbnails.
// Only process image files.
// Closure to capture the file information.
// Render thumbnail.
// Read in the image file as a data URL.
			function handleFileSelect(evt) {
				var files = evt.target.files; 
				for (var i = 0, f; f = files[i]; i++) {
					if (!f.type.match('image.*')) {continue;}
					var reader = new FileReader();
					reader.onload = (function(theFile) {
						return function(e) {
							var span = document.createElement('span');
							span.innerHTML = ['<img class="thumb" src="', e.target.result,
							'" title="', escape(theFile.name), '"/>'].join('');
							document.getElementById('list').insertBefore(span, null);
							};
						})(f);

					reader.readAsDataURL(f);
					}
				}
			document.getElementById('files').addEventListener('change', handleFileSelect, false);
			</script>

<!--
		<style id="style_progressbar">
			#progress_bar {
				margin: 10px 0;
				padding: 3px;
				border: 1px solid #000;
				font-size: 14px;
				clear: both;
				opacity: 0;
				-moz-transition: opacity 1s linear;
				-o-transition: opacity 1s linear;
				-webkit-transition: opacity 1s linear;
				}
			#progress_bar.loading {
				opacity: 1.0;
				}
			#progress_bar .percent {
				background-color: #99ccff;
				height: auto;
				width: 0;
				}
			</style>
	-->
<!--
	<hr color="black">
	<hr color="white">
	<input type="file" id="files" name="file" />
	<hr color="white">
	<button onclick="abortRead(); return false;">cancelread</button>
	<img id="/imgs/btn/kow.png" onclick="abortRead(); return false;" alt="cancelread" draggable="true">
	<hr color="white">
	<div id="progress_bar"><div class="percent">0%</div></div>
	<hr color="white">
	<hr color="black">
	-->

<!--
<hr color=white>
<progress min="0" max="100" value="0">0% complete</progress>
<hr color=white>

	<form id="myform" name="myform" action="/?q=myform">
		<input type="text" name="username" value="jkwii">
		<input type="number" name="id" value="1213">
		<input type="submit" onclick="return sendForm(this.form);">
		</form>
<hr color=white>
	-->

	<hr color=white>
	<hr color=black>
	<div id='editableDiv' contenteditable='true'>
		<br><br><br><br>
		<hr color=blue>
		<hr color=blue>
		<hr color=blue>
		<hr color=blue>
		<hr color=blue>
		paste paste paste paste paste paste paste paste
		<hr color=blue>
		<hr color=blue>
		<hr color=blue>
		<hr color=blue>
		<hr color=blue>
		<br><br><br><br>
		</div>
	</div id="div_fs_b" >
	<hr color=black>
	<hr color=white>


	<hr color=black>
	<div id='div' contenteditable='true'>
		<br><br><br><br>
		<hr color=red>
		<hr color=red>
		<hr color=red>
		<hr color=red>
		<hr color=red>
		<hr color=red>
		ffpaste ffpaste ffpaste ffpaste ffpaste ffpaste ffpaste
		<hr color=red>
		<hr color=red>
		<hr color=red>
		<hr color=red>
		<hr color=red>
		<hr color=red>
		<br><br><br><br>
		</div>
	<hr color=black>
	<hr color=white>

	<script id="script_clipboard" >
		function handlePaste (e) {
			var clipboardData, pastedData;

// Stop data actually being pasted into div
			e.stopPropagation();
			e.preventDefault();

// Get pasted data via clipboard API
			clipboardData = e.clipboardData || window.clipboardData;
			pastedData = clipboardData.getData('Text');

// Do whatever with pasteddata
			alert(pastedData);
			}

		document.getElementById('editableDiv').addEventListener('paste', handlePaste);
		</script>


	<script id="script_clipboard_ff" >
		function handlepaste_ff (e) {
			var types, pastedData, savedContent;

// Browsers that support the 'text/html' type in the Clipboard API (Chrome, Firefox 22+)
			if (e && e.clipboardData && e.clipboardData.types && e.clipboardData.getData) {

// Check for 'text/html' in types list. See abligh's answer below for deatils on
// why the DOMStringList bit is needed. We cannot fall back to 'text/plain' as
// Safari/Edge don't advertise HTML data even if it is available
				types = e.clipboardData.types;
				if (((types instanceof DOMStringList) && types.contains("text/html")) || (types.indexOf && types.indexOf('text/html') !== -1)) {

// Extract data and pass it to callback
					pastedData = e.clipboardData.getData('text/html');
//					processPaste(editableDiv, pastedData);
					processPaste_ff(editableDiv, pastedData);

// Stop the data from actually being pasted
					e.stopPropagation();
					e.preventDefault();
					return false;
					}
				}

// Everything else: Move existing element contents to a DocumentFragment for safekeeping
			savedContent = document.createDocumentFragment();
			while(editableDiv.childNodes.length > 0) {
				savedContent.appendChild(editableDiv.childNodes[0]);
				}

// Then wait for browser to paste content into it and cleanup
			waitForPastedData(editableDiv, savedContent);
			return true;
			}

		function waitForPastedData (elem, savedContent) {

// If data has been processes by browser, process it
			if (elem.childNodes && elem.childNodes.length > 0) {

// Retrieve pasted content via innerHTML
// (Alternatively loop through elem.childNodes or elem.getElementsByTagName here)
				var pastedData = elem.innerHTML;

// Restore saved content
				elem.innerHTML = "";
				elem.appendChild(savedContent);

// Call callback
				processPaste_ff(elem, pastedData);
				}

// Else wait 20ms and try again
			else {
				setTimeout(function () {
					waitForPastedData(elem, savedContent)
					}, 20);
				}
			}

		function processPaste_ff (elem, pastedData) {
// Do whatever with gathered data;
			alert(pastedData);
			elem.focus();
			}

// Modern browsers. Note: 3rd argument is required for Firefox <= 6
		if (editableDiv.addEventListener) {
			editableDiv.addEventListener('paste', handlepaste, false);
			}
// IE <= 8
		else {
			editableDiv.attachEvent('onpaste', handlepaste);
			}

		$(document).on('paste','[contenteditable]',function(e) {
			e.preventDefault();
			var text = (e.originalEvent || e).clipboardData.getData('text/plain');
			window.document.execCommand('insertText', false, text);
			});
		</script>

	<script id="script_clipboard_jskit" >
		function getSelectionText(){
			var selectedText = ""
			if (window.getSelection){ // all modern browsers and IE9+
				selectedText = window.getSelection().toString()
				}
			return selectedText
			}


		document.addEventListener('mouseup', function(){
			var thetext = getSelectionText()
			if (thetext.length > 0){ // check there's some text selected
				console.log(thetext) // logs whatever textual content the user has selected on the page
				}
			}, false)

		function copySelectionText(){
			var copysuccess // var to check whether execCommand successfully executed
			try{
				copysuccess = document.execCommand("copy") // run command to copy selected text to clipboard
    				} 
			catch(e){
				copysuccess = false
				}
			return copysuccess
			}

		</script>






		<div class="topnav">
			<a href="#home" class="active">
				<img id="img_topnav_logo" src="/imgs/btn/ok.png" height=50>
				</a>
	
<!-- Navigation links (hidden by default) -->
		<div id="myLinks">
			<div id="div_kogrids_m"></div>
			<canvas id="canvas_m" onclick="window.open('/?canvas_m'); return false;" height=400 witdh=400 draggable="true"></canvas>
			<a href="#news">News</a>
			<a href="#contact">Contact</a>
			<a href="#about">About</a>
			<img src="/fb/jkwii/pages/1.jpg" onclick="window.open('/fb/jkwii');return false;" border=0 height=100>
			<hr color=white>
			<hr color=black>
			<a href="/notes.txt">notes</a>
			<a href="#about">About</a>
			<div id="div_log_m"><h1>div_log_m</h1></div>
			</div>

<!-- "Hamburger menu" / "Bar icon" to toggle the navigation links -->
		<a href="javascript:void(0);" class="icon" onclick="myFunction()">
			<i class="fa fa-bars"></i>
			</a>
		</div>

	<div id="div_canvas_anim">
		<h1>div_canvas_anim</h1>
		<canvas id="canvas_anim" onclick="startup('canvas_anim');return false;" draggable="true" height=100 width=600" >
		</div>
	<br><br><br><br>
	<br><br><br><br>
	<hr color=white>
	<hr color=white>
	<div id="div_divs"> 
		<h1>div_divs</h1> 
		<img src="/imgs/btn/koeyeb_divs.png" 
			onclick="koshow('divs'); return false;" draggable="true" border=0>
		</div>
	<hr color=white>
	<br><br><br><br>
	<br><br><br><br>
	<hr color=white>
	<div id="div_kovs"> 
		<h1>div_kovs</h1> 
		<img src="/imgs/btn/koeyeb_kovs.png" 
			onclick="koshow('kovs'); return false;" draggable="true" border=0>
		</div>
	<hr color=white>
	<br><br><br><br>
	<hr color=white>
	<script id="script_koshow" >
		function koshow(args) {
//			var kolists = new Array();
//			alert( "msg_13220 koshow args="+args);

// kolists['default'] = "neuz konet iperms kids kitiworks pastryroad konabus jtfdc jtfdcr jtfinc jtfdcr dogs memes";
// kolists['kovs'] = "neuz konet iperms kids kitiworks pastryroad konabus jtfdc jtfdcr jtfinc jtfdcr dogs memes";
// kolists['kov'] = "neuz konet iperms kids konabus jtfdc jtfdcr jtfinc jtfdcr dogs memes";
// kolists['divs'] = "av bb fb gm pn sl tl us yt zm";

//			alert( "BUGS_13230 kolists_kov="+kolists['kov'] );
			if( /kovs/.test(args)) {
				var id=args;
//				alert( "msg_13240 koshow kovs id="+id);
				var htmout = "";
				var kolist = kolists[id].split(" ");
//				var kolist = kolists[id];
//				alert( "msg_13241 koshow kovs id="+id+" len="+kolist.length+" kolist="+kolist );
				
				for( j=0; j<kolist.length; j++ ) {
					var kovid = kolist[j];
					img = '/imgs/btn/koeyeb_kov_'+kovid+'.png';
					url = '/kov_'+kovid+'.html';
					htmout += '<img src="'+img+'" ';
					htmout += '	onclick="window.open(\''+url+'\');return false;"';
					htmout += '	draggable="true" border=0 height=50 >';

					if( document.getElementById('div_kovs')) {
						document.getElementById('div_kovs').innerHTML=htmout;
						}
					if( document.getElementById('div_kov')) {
						document.getElementById('div_kov').innerHTML=htmout;
						}
					if( document.getElementById('div_kov_w')) {
						document.getElementById('div_kov_w').innerHTML=htmout;
						}
					if( document.getElementById('div_kov_b')) {
						document.getElementById('div_kov_b').innerHTML=htmout;
						}
					if( document.getElementById('div_kov_m')) {
						document.getElementById('div_kov_m').innerHTML=htmout;
						}
					}
				return( kolists[id] );
				}
			if( /divs/.test(args)) {
				var id=args;
//				alert( "msg_13270 koshow divs id="+id);
				var htmout = "";
				var kolist = kolists[id].split(" ");
//				alert( "msg_13280 koshow divs id="+id+" len="+kolist.length+" kolist="+kolist );
				
				for( j=0; j<kolist.length; j++ ) {
					var divid = kolist[j];
					var div_divid = "div_"+divid;
					var div_divid_w = "div_"+divid+"_w";
					var div_divid_b = "div_"+divid+"_b";
					var div_divid_m = "div_"+divid+"_m";
					img_b = '/imgs/btn/koeyeb_'+divid+'.png';
					img_w = '/imgs/btn/koeyew_'+divid+'.png';
					img = '/imgs/btn/koeye_'+divid+'.png';
					url = 'koshow("'+divid+'"); return false;"';
					htmout += '<div id="'+div_divid+'" draggable="true" >';
					htmout += '	<h1>'+div_divid+'</h1>';
					htmout += '	<img src="'+img_w+'" ';
					htmout += '		onclick="window.open(\'/index_'+divid+'.html\'); return false;"';
					htmout += '		draggable="true" border=0 height=50 >';
					htmout += '&nbsp &nbsp &nbsp &nbsp';
					htmout += '	<img src="'+img+'" ';
					htmout += '		onclick="koshow(\''+divid+'\'); return false;"';
					htmout += '		draggable="true" border=0 height=50 >';
					htmout += '	</div id="'+div_divid+'_tail">';

					if( document.getElementById('div_divs')) {
						document.getElementById('div_divs').innerHTML=htmout;
						}
//					if( document.getElementById('div_divs_w')) {
//						document.getElementById('div_divs_w').innerHTML=htmout;
//						}
//					if( document.getElementById('div_div_b')) {
//						document.getElementById('div_div_b').innerHTML=htmout;
//						}
//					if( document.getElementById('div_kov_m')) {
//						document.getElementById('div_kov_m').innerHTML=htmout;
//						}
					}
				return( kolists[id] );
				}

//			if( /yt/.test(args)) {
//				alert( "BUGS_13385 ___FOUND yt args="+args );
//				}
//			else {
//				alert( "BUGS_13385 NOTFOUND yt args="+args );
//				}

			if( /yt/.test(args)) {
				var id=args;
				alert( "msg_13381 koshow yt args="+args+" id="+id);
				var kolist = kolists['default'];
				alert( "msg_13382 koshow yt id="+kolist);
				var htmout = "";
//				var kolist = kolists[id].split(" ");
				alert( "msg_13391 koshow yt kolists_yt="+kolist );
				kolist = jax('/yt/txt/ytlist.txt').split("\n");
				alert( "msg_13392 koshow yt kolist_jax_yt="+kolist );
				
				for( j=0; j<kolist.length; j++ ) {
					var ytid = kolist[j];
					img = ''+ytid+'.png';
					url = ''+ytid+'';
					htmout += '<img src="'+img+'" ';
					htmout += '	onclick="window.open(\''+url+'\');return false;"';
					htmout += '	draggable="true" border=0 height=50 >';

					if( document.getElementById('div_yt')) {
						document.getElementById('div_yt').innerHTML=htmout;
						}
					if( document.getElementById('div_yt')) {
						document.getElementById('div_yt').innerHTML=htmout;
						}
					if( document.getElementById('div_yt_w')) {
						document.getElementById('div_yt_w').innerHTML=htmout;
						}
					if( document.getElementById('div_yt_b')) {
						document.getElementById('div_yt_b').innerHTML=htmout;
						}
					if( document.getElementById('div_yt_m')) {
						document.getElementById('div_yt_m').innerHTML=htmout;
						}
					}
			return( kolists[id] );
			}

			alert( "msg_13300 koshow args="+args+" kolists_default="+kolists['default']);
			return('');
			}
		</script>


	<style id="style_terminal_css">

@font-face {
  font-family: 'Inconsolata';
  font-style: normal;
  font-weight: normal;
  src: local('Inconsolata'), url('Inconsolata.woff') format('woff');
}

/*@-webkit-keyframes pulse {
 0% {
  opacity: 0;
 }
 25% {
  opacity: 0.2;
 }
 50% {
  opacity: 0;
 }
 75% {
  opacity: 0;
 }
 100% {
   opacity: 0.2;
 }
}
*/
/*
@-webkit-keyframes flicker {
  0% { opacity: 0.95; }
  10% { opacity: 0.9; }
  20% { opacity: 0.85; }
  30% { opacity: 0.9; }
  40% { opacity: 0.95; }
  50% { opacity: 0.9; }
  60% { opacity: 0.95; }
  70% { opacity: 0.92; }
  80% { opacity: 0.85; }
  90% { opacity: 0.92; }
  100% { opacity: 0.9; }
}
*/
@-webkit-keyframes flicker {
  0% { opacity: 0.75; }
  10% { opacity: 0.7; }
  20% { opacity: 0.65; }
  30% { opacity: 0.7; }
  40% { opacity: 0.75; }
  50% { opacity: 0.65; }
  60% { opacity: 0.75; }
  70% { opacity: 0.72; }
  80% { opacity: 0.65; }
  90% { opacity: 0.72; }
  100% { opacity: 0.7; }
}

::selection {
  background: #0080FF;
  text-shadow: none !important;
}
html, body {
  margin: 0;
  height: 100%;
}
		body {
			font-family: Inconsolata, monospace;
//			color: white;
			color: burlywood;
//			background: slategrey;
//  background: -webkit-radial-gradient(center center, contain, rgba(0,150,0,1), black) center center no-repeat, black; /*center center for the gradient scrolls with the page :(*/
// background: -webkit-radial-gradient(center 75%, contain, rgba(0,75,0,0.8), black) center center no-repeat, black;
			-webkit-background-size: 110% 100%;
			}

//  background: -webkit-linear-gradient(top, #000, #333);
		.offscreen {
			background: ivory;
			}
		.offscreen #container {
			background: rgba(0,0,0,0.7);
			height: 100%;
			position: fixed;
			text-shadow: none;
			box-shadow: 0 0 15px slategrey;
			}
.offscreen #container output {
  overflow-x: hidden;
  display: inline-block;
  height: 100px;
}
.offscreen .interlace {
  display: none;
}
#container {
  -webkit-transition: -webkit-transform 1.5s ease-in-out;
  width: 100%;
  -webkit-box-sizing: border-box;
  box-sizing: border-box;
}

.dropping {
  /*background: -webkit-linear-gradient(
    bottom,
    rgb(209,144,23) 13%,
    rgb(251,173,51) 57%,
    rgb(255,208,77) 79%
  );*/
  background: -webkit-radial-gradient(center center, contain, rgba(0,175,0,1), black) center center no-repeat;
  -webkit-background-size: 125% 125%;
}
/*
.crt {
  z-index: 50;
  width: 100%;
  height: 50px;
  position: fixed;
  /*margin: 15px 31px 0px 32px;
  border-bottom-left-radius: 10px;
  border-bottom-right-radius: 10px;
  background: -webkit-gradient(radial, 50% 10057%, 4999, 50% 10055%, 5000, from(transparent), to(black) ) transparent no-repeat 10% 100%;
}
.crt.top {
  top: -20px;
}
.crt.bottom {
  -webkit-transform: rotate(180deg);
  bottom: -20px;
}*/
.crt {
  z-index: 50;
  width: 100%;
  height: 50px;
  position: fixed;
  background: black;
}
.crt.top {
  top: 0;
}
.crt.bottom {
  bottom: 0;
  -webkit-transform: rotate(180deg);
}
.hz {
  -webkit-animation-name: hz;
  -webkit-animation-duration: 30s;
  -webkit-animation-iteration-count: infinite;
}

.flicker {
  -webkit-animation-name: flicker;
  -webkit-animation-duration: 1s;
  -webkit-animation-iteration-count: infinite;
  -webkit-animation-timing-function: ease-in-out;
}
.interlace {
  position: absolute;
  left: 0;
  top: 0;
  background: url(interlace.png) top left repeat, rgba(255,255,255,0.5);
  width: 100%;
  height: 100%;
  opacity: 0.2;
  z-index: 10;
  pointer-events: none;
  /*border-top-left-radius: 150px 50px;
  border-top-right-radius: 150px 50px;
  border-bottom-left-radius: 150px 50px;
  border-bottom-right-radius: 150px 50px;*/
}
.hidden {
  display: none !important;
}
.dim > * {
  opacity: 0.4;
}
.dim .help {
  opacity: 1;
}
iframe#fsn {
  position: absolute;
  height: 100%;
  width: 100%;
  border: none;
}
#container {
  padding: 1em 1.5em 1em 1em;
  text-shadow: 0 0 5px #C8C8C8;
  /*overflow: hidden;
  white-space: nowrap;*/

  /*box-shadow: 10px 5px 20px rgba(255,255,255,0.2) inset,
              -10px -5px 20px rgba(255,255,255,0.2) inset;
  border-radius: 50px;
  background: rgba(255, 255, 255, 0.1);*/
}
#container output {
  clear: both;
  width: 100%;
}
#container output h3 {
  margin: 0;
}
#container output pre {
  margin: 0;
}
#container output textarea {
  width: 100%;
  height: 200px;
  background-color: rgba(255,255,255,0.1);
  border: none;
  color: inherit;
  font: inherit;
  outline: 0;
  border-radius: 10px;
  padding: 5px;
}
#container output textarea::selection {
  background: red;
}
#container output textarea::-webkit-scrollbar {
  width: 1ex;
}
#container output textarea::-webkit-scrollbar-thumb {
  border-top: 1px solid #fff;
  background: #ccc -webkit-linear-gradient(rgb(240, 240, 240), rgb(210, 210, 210));
  border-radius: 1ex;
  box-shadow: 0 1px 3px rgba(0, 0, 0, 0.4);
}
.input-line {
  display: -webkit-box;
  -webkit-box-orient: horizontal;
  -webkit-box-align: stretch;
  display: box;
  box-orient: horizontal;
  box-align: stretch;
  clear: both;
}
.input-line > div:nth-child(2) {
  -webkit-box-flex: 1;
  box-flex: 1;
}
.prompt {
  white-space: nowrap;
  color: #ffcc00; /*green;*/
  margin-right: 7px;
  display: -webkit-box;
  -webkit-box-pack: center;
  -webkit-box-orient: vertical;
  display: box;
  box-pack: center;
  box-orient: vertical;
  -webkit-user-select: none;
  user-select: none;
}
.cmdline {
  outline: none;
  background-color: transparent;
  margin: 0;
  width: 100%;
  font: inherit;
  border: none;
  color: inherit;
}
.folder {
  color: #ffcc00;
}
.ls-files {
  /*height: 45px;*/
  /* Default, but changed by js depending on length of filename */
  -webkit-column-width: 100px;
  column-width: 100px;
}
.ls-files span {
  cursor: pointer;
}
.ls-files span:hover {
  text-decoration: underline;
}
button {
  background: -webkit-gradient(linear, 0% 40%, 0% 70%, from(#F9F9F9), to(#E3E3E3));
  border: 1px solid #ccc;
  border-radius: 3px;
  color: black;
  padding: 5px 8px;
  outline: none;
  white-space: nowrap;
  vertical-align: middle;
  -webkit-user-select:none;
  user-select: none;
  cursor: pointer;
}
button:not([disabled]):hover {
  border-color: #ffcc00;
}
button:not([disabled]):active {
  background: -webkit-gradient(linear, 0% 40%, 0% 70%, from(#E3E3E3), to(#F9F9F9));
}
button[disabled] {
  color: #ccc;
}
.help {
  font-family: 'Droid Sans', Arial, sans-serif;
  -webkit-font-smoothing: antialiased;
  position: fixed;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  z-index: 100;
  display: -webkit-box;
  -webkit-box-align: center;
  -webkit-box-pack: center;
  -webkit-box-orient: vertical;
  -webkit-user-select: none;
  user-select: none;
  font-size: 10pt;
}
.help,
.help > section {
  border-radius: 10px;
}
.help > section {
  padding: 10px;
  background: rgba(255, 255, 255, 0.3);
  -webkit-box-shadow: 3px 3px 5px rgba(0,0,0,0.6);
  border-radius: 10px;
  color: white;
  position: relative;
  width: 610px;
}
.help section > div:first-child {
  border-top-left-radius: 10px;
  border-top-right-radius: 10px;
}
.help section > div:last-child {
  padding-top: 0;
  border-bottom-left-radius: 10px;
  border-bottom-right-radius: 10px;
}
.help > section > div {
  background: rgba(0, 0, 0, 1);
  padding: 20px;
}
.help h2 {
  padding-bottom: 8px;
  margin-top: 0;
  margin-bottom: 25px;
  border-bottom: 1px solid #fff;
  color: #ffcc00;
}
.help p strong {
  width: 60px;
  display: inline-block;
}
.help #close {
  border-radius: 20px;
  padding: 2px 6px 2px 7px;
  border: 2px solid #fff;
  position: absolute;
  right: 20px;
  top: 20px;
  cursor: pointer;
  font-size: 90%;
  font-weight: bold;
  line-height: 17px;
}
.help #close:active {
  right: 19px;
  top: 21px;
}
.help .shortcuts {
  -webkit-columns: 2;
  columns: 2;
}


/* Themes */
.cream {
  color: black;
  background: #fffff3;
}
.cream .interlace {
  opacity: 0.1;
}
.cream .prompt {
  color: purple;
}
.cream .cmdline {
  color: black;
}

		</style>



<!--		<link rel="chrome-application-definition" href="./manifest.json"> -->
<!--
		<link rel="chrome-application-definition" href="data:/text/plain;base64,ewogICJuYW1lIjogIkhUTUw1IFRlcm1pbmFsIiwKICAiZGVzY3JpcHRpb24iOiAiQ29tbWFuZC1saW5lIHRlcm1pbmFsIHNoZWxsIHJ1bm5pbmcgb24gdG9wIG9mIEhUTUw1IEFQSXMiLAogICJ2ZXJzaW9uIjogIjEuMC4wIiwKICAiaWNvbnMiOiB7CiAgICAiMTYiOiAidGVybWluYWwtaWNvbi5wbmciLAogICAgIjEyOCI6ICJ0ZXJtaW5hbC1pY29uLnBuZyIKICB9LAogICJtaW5pbXVtX2Nocm9tZV92ZXJzaW9uIjogIjExIiwKICAvKiJ1cmxzIjogWwogICAgIio6Ly9sb2NhbGhvc3QvIgogIF0sKi8KICAibGF1bmNoX3VybCI6ICJ0ZXJtaW5hbC5odG1sIiwKICAicGVybWlzc2lvbnMiOiBbCiAgICAidW5saW1pdGVkU3RvcmFnZSIKICBdCn0K">
	-->
	<style id="style_terminal_json">
		{
			"name": "ht5_terminal",
			"description": "html_terminal_shell ",
			"version": "1.0.1",
			"icons": {
				"16": "terminal-icon.png",
				"128": "terminal-icon.png"
				},
			"minimum_chrome_version": "11",
/*"urls": ["*://localhost/"],*/

			"launch_url": "/?q=terminal",
			"permissions": [
				"unlimitedStorage"
				]
			}
		</style>



<!--	<div class="crt top"><h2>crt_top</h1></div> -->
<!--	<div class="crt bottom"></div> -->
<!--
	<div class="interlace"><h2>interlace</h2></div>
	<div id="container"><h2>container</h2></div>
	-->
<!--
	<aside id="terminal_aside" class="help hidden">
		<section id="section_terminal_aside" >
			<div id="div_terminal_aside">
				<span onclick="toggleHelp()" id="close">x</span>
				<h2>Keyboard shortcuts</h2>
				<div id="div_terminal_shortcuts" class="shortcuts">
					<p><strong>&lt;ctrl&gt; + s</strong> : Toggle CRT monitor flicker effect</p>
					<p><strong>&lt;esc&gt;</strong> : toggle this help menu</p>
					</div>
				</div>
<!--
			<div id="div_terminal_about">
				<h2>jkwii timejak terminal about</h2>
				<p>js terminal/shell </p>
				<p>By: Eric Bidelman n jkwii &lt;ericbidelman@chromium.org&gt;</p>
				</div>
	-->
				</section>
			</aside>
	-->


<!--	<script src="./terminal.js"></script> -->
<!--	<script src="data:/text/plain;base64,LyoKQ29weXJpZ2h0IDIwMTEgR29vZ2xlIEluYy4KCkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwp5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKClVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuClNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCgpBdXRob3I6IEVyaWMgQmlkZWxtYW4gKGVyaWNiaWRlbG1hbkBjaHJvbWl1bS5vcmcpCiovCgp2YXIgdXRpbCA9IHV0aWwgfHwge307CnV0aWwudG9BcnJheSA9IGZ1bmN0aW9uKGxpc3QpIHsKICByZXR1cm4gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwobGlzdCB8fCBbXSwgMCk7Cn07CgovLyBDcm9zcy1icm93c2VyIGltcGwgdG8gZ2V0IGRvY3VtZW50J3MgaGVpZ2h0Lgp1dGlsLmdldERvY0hlaWdodCA9IGZ1bmN0aW9uKCkgewogIHZhciBkID0gZG9jdW1lbnQ7CiAgcmV0dXJuIE1hdGgubWF4KAogICAgICBNYXRoLm1heChkLmJvZHkuc2Nyb2xsSGVpZ2h0LCBkLmRvY3VtZW50RWxlbWVudC5zY3JvbGxIZWlnaHQpLAogICAgICBNYXRoLm1heChkLmJvZHkub2Zmc2V0SGVpZ2h0LCBkLmRvY3VtZW50RWxlbWVudC5vZmZzZXRIZWlnaHQpLAogICAgICBNYXRoLm1heChkLmJvZHkuY2xpZW50SGVpZ2h0LCBkLmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpCiAgKTsKfTsKCgovLyBUT0RPKGVyaWNiaWRlbG1hbik6IGFkZCBmYWxsYmFjayB0byBodG1sNSBhdWRpby4KZnVuY3Rpb24gU291bmQob3B0X2xvb3ApIHsKICB2YXIgc2VsZl8gPSB0aGlzOwogIHZhciBjb250ZXh0XyA9IG51bGw7CiAgdmFyIHNvdXJjZV8gPSBudWxsOwogIHZhciBsb29wXyA9IG9wdF9sb29wIHx8IGZhbHNlOwoKICB3aW5kb3cuQXVkaW9Db250ZXh0ID0gd2luZG93LkF1ZGlvQ29udGV4dCB8fCB3aW5kb3cud2Via2l0QXVkaW9Db250ZXh0OwogIGlmICh3aW5kb3cuQXVkaW9Db250ZXh0KSB7CiAgICBjb250ZXh0XyA9IG5ldyB3aW5kb3cuQXVkaW9Db250ZXh0KCk7CiAgfQoKICB0aGlzLmxvYWQgPSBmdW5jdGlvbih1cmwsIG1peFRvTW9ubywgb3B0X2NhbGxiYWNrKSB7CiAgICB2YXIgeGhyID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7CiAgICB4aHIub3BlbignR0VUJywgdXJsLCB0cnVlKTsKICAgIHhoci5yZXNwb25zZVR5cGUgPSAnYXJyYXlidWZmZXInOwogICAgeGhyLm9ubG9hZCA9IGZ1bmN0aW9uKCkgewogICAgICBpZiAoY29udGV4dF8pIHsKICAgICAgICAvKnNlbGZfLnNhbXBsZSA9IGNvbnRleHRfLmNyZWF0ZUJ1ZmZlcih0aGlzLnJlc3BvbnNlLCBtaXhUb01vbm8pOwogICAgICAgIGlmIChvcHRfY2FsbGJhY2spIHsKICAgICAgICAgIG9wdF9jYWxsYmFjaygpOwogICAgICAgIH0KICAgICAgICAqLwogICAgICAgIGNvbnRleHRfLmRlY29kZUF1ZGlvRGF0YSh0aGlzLnJlc3BvbnNlLCBmdW5jdGlvbihhdWRpb0J1ZmZlcikgewogICAgICAgICAgc2VsZl8uc2FtcGxlID0gYXVkaW9CdWZmZXI7CiAgICAgICAgICBvcHRfY2FsbGJhY2sgJiYgb3B0X2NhbGxiYWNrKCk7CiAgICAgICAgfSwgZnVuY3Rpb24oZSkgewogICAgICAgICAgY29uc29sZS5sb2coZSk7CiAgICAgICAgfSk7CiAgICAgIH0KICAgIH07CiAgICB4aHIuc2VuZCgpOwogIH07CgogIHRoaXMucGxheSA9IGZ1bmN0aW9uKCkgewogICAgaWYgKGNvbnRleHRfKSB7CiAgICAgIHNvdXJjZV8gPSBjb250ZXh0Xy5jcmVhdGVCdWZmZXJTb3VyY2UoKTsKICAgICAgc291cmNlXy5idWZmZXIgPSBzZWxmXy5zYW1wbGU7CiAgICAgIHNvdXJjZV8ubG9vcGluZyA9IGxvb3BfOwogICAgICBzb3VyY2VfLmNvbm5lY3QoY29udGV4dF8uZGVzdGluYXRpb24pOwogICAgICBzb3VyY2VfLm5vdGVPbigwKTsKICAgIH0KICB9OwoKICB0aGlzLnN0b3AgPSBmdW5jdGlvbigpIHsKICAgIGlmIChzb3VyY2VfKSB7CiAgICAgIHNvdXJjZV8ubm90ZU9mZigwKTsKICAgICAgc291cmNlXy5kaXNjb25uZWN0KDApOwogICAgfQogIH07Cn0KCnZhciBUZXJtaW5hbCA9IFRlcm1pbmFsIHx8IGZ1bmN0aW9uKGNvbnRhaW5lcklkKSB7CiAgd2luZG93LlVSTCA9IHdpbmRvdy5VUkwgfHwgd2luZG93LndlYmtpdFVSTDsKICB3aW5kb3cucmVxdWVzdEZpbGVTeXN0ZW0gPSB3aW5kb3cucmVxdWVzdEZpbGVTeXN0ZW0gfHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cud2Via2l0UmVxdWVzdEZpbGVTeXN0ZW07CgogIGNvbnN0IFZFUlNJT05fID0gJzEuMC4wJzsKICBjb25zdCBDTURTXyA9IFsKICAgICczZCcsICdjYXQnLCAnY2QnLCAnY3AnLCAnY2xlYXInLCAnZGF0ZScsICdoZWxwJywgJ2luc3RhbGwnLCAnbHMnLCAnbWtkaXInLAogICAgJ212JywgJ29wZW4nLCAncHdkJywgJ3JtJywgJ3JtZGlyJywgJ3RoZW1lJywgJ3ZlcnNpb24nLCAnd2hvJywgJ3dnZXQnCiAgXTsKICBjb25zdCBUSEVNRVNfID0gWydkZWZhdWx0JywgJ2NyZWFtJ107CgogIHZhciBmc18gPSBudWxsOwogIHZhciBjd2RfID0gbnVsbDsKICB2YXIgaGlzdG9yeV8gPSBbXTsKICB2YXIgaGlzdHBvc18gPSAwOwogIHZhciBoaXN0dGVtcF8gPSAwOwoKICB2YXIgdGltZXJfID0gbnVsbDsKICB2YXIgbWFnaWNXb3JkXyA9IG51bGw7CgogIHZhciBmc25fID0gbnVsbDsKICB2YXIgaXMzRF8gPSBmYWxzZTsKCiAgLy8gRmlyZSB3b3JrZXIgdG8gcmV0dXJuIHJlY3Vyc2l2ZSBzbmFwc2hvdCBvZiBjdXJyZW50IEZTIHRyZWUuCiAgdmFyIHdvcmtlcl8gPSBuZXcgV29ya2VyKCd3b3JrZXIuanMnKTsKICB3b3JrZXJfLm9ubWVzc2FnZSA9IGZ1bmN0aW9uKGUpIHsKICAgIHZhciBkYXRhID0gZS5kYXRhOwogICAgaWYgKGRhdGEuZW50cmllcykgewogICAgICBmc25fLmNvbnRlbnRXaW5kb3cucG9zdE1lc3NhZ2Uoe2NtZDogJ2J1aWxkJywgZGF0YTogZGF0YS5lbnRyaWVzfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5vcmlnaW4pOwogICAgfQogICAgaWYgKGRhdGEubXNnKSB7CiAgICAgIG91dHB1dCgnPGRpdj4nICsgZGF0YS5tc2cgKyAnPC9kaXY+Jyk7CiAgICB9CiAgfTsKICB3b3JrZXJfLm9uZXJyb3IgPSBmdW5jdGlvbihlKSB7IGNvbnNvbGUubG9nKGUpIH07CgogIC8vIENyZWF0ZSB0ZXJtaW5hbCBhbmQgY2FjaGUgRE9NIG5vZGVzOwogIHZhciBjb250YWluZXJfID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoY29udGFpbmVySWQpOwogIGNvbnRhaW5lcl8uaW5zZXJ0QWRqYWNlbnRIVE1MKCdiZWZvcmVFbmQnLAogICAgICBbJzxvdXRwdXQ+PC9vdXRwdXQ+JywKICAgICAgICc8ZGl2IGlkPSJpbnB1dC1saW5lIiBjbGFzcz0iaW5wdXQtbGluZSI+JywKICAgICAgICc8ZGl2IGNsYXNzPSJwcm9tcHQiPiQmZ3Q7PC9kaXY+PGRpdj48aW5wdXQgY2xhc3M9ImNtZGxpbmUiIGF1dG9mb2N1cyAvPjwvZGl2PicsCiAgICAgICAnPC9kaXY+J10uam9pbignJykpOwogIHZhciBjbWRMaW5lXyA9IGNvbnRhaW5lcl8ucXVlcnlTZWxlY3RvcignI2lucHV0LWxpbmUgLmNtZGxpbmUnKTsKICB2YXIgb3V0cHV0XyA9IGNvbnRhaW5lcl8ucXVlcnlTZWxlY3Rvcignb3V0cHV0Jyk7CiAgdmFyIGludGVybGFjZV8gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuaW50ZXJsYWNlJyk7CiAgdmFyIGJlbGxfID0gbmV3IFNvdW5kKGZhbHNlKTsKICBiZWxsXy5sb2FkKCdiZWVwLm1wMycsIGZhbHNlKTsKCiAgLy8gSGFja2VyeSB0byByZXNpemUgdGhlIGludGVybGFjZSBiYWNrZ3JvdW5kIGltYWdlIGFzIHRoZSBjb250YWluZXIgZ3Jvd3MuCiAgb3V0cHV0Xy5hZGRFdmVudExpc3RlbmVyKCdET01TdWJ0cmVlTW9kaWZpZWQnLCBmdW5jdGlvbihlKSB7CiAgICB2YXIgZG9jSGVpZ2h0ID0gdXRpbC5nZXREb2NIZWlnaHQoKTsKICAgIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zdHlsZS5oZWlnaHQgPSBkb2NIZWlnaHQgKyAncHgnOwogICAgLy9kb2N1bWVudC5ib2R5LnN0eWxlLmJhY2tncm91bmQgPSAnLXdlYmtpdC1yYWRpYWwtZ3JhZGllbnQoY2VudGVyICcgKyAoTWF0aC5yb3VuZChkb2NIZWlnaHQgLyAyKSkgKyAncHgsIGNvbnRhaW4sIHJnYmEoMCw3NSwwLDAuOCksIGJsYWNrKSBjZW50ZXIgY2VudGVyIG5vLXJlcGVhdCwgYmxhY2snOwogICAgaW50ZXJsYWNlXy5zdHlsZS5oZWlnaHQgPSBkb2NIZWlnaHQgKyAncHgnOwogICAgc2V0VGltZW91dChmdW5jdGlvbigpIHsgLy8gTmVlZCB0aGlzIHdyYXBwZWQgaW4gYSBzZXRUaW1lb3V0LiBDaHJvbWUgaXMganVwbWluZyB0byB0b3AgOigKICAgICAgLy93aW5kb3cuc2Nyb2xsVG8oMCwgZG9jSGVpZ2h0KTsKICAgICAgY21kTGluZV8uc2Nyb2xsSW50b1ZpZXcoKTsKICAgIH0sIDApOwogICAgLy93aW5kb3cuc2Nyb2xsVG8oMCwgZG9jSGVpZ2h0KTsKICB9LCBmYWxzZSk7CgogIG91dHB1dF8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbihlKSB7CiAgICB2YXIgZWwgPSBlLnRhcmdldDsKICAgIGlmIChlbC5jbGFzc0xpc3QuY29udGFpbnMoJ2ZpbGUnKSB8fCBlbC5jbGFzc0xpc3QuY29udGFpbnMoJ2ZvbGRlcicpKSB7CiAgICAgIGNtZExpbmVfLnZhbHVlICs9ICcgJyArIGVsLnRleHRDb250ZW50OwogICAgfQogIH0sIGZhbHNlKTsKCiAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24oZSkgewogICAgLy9pZiAoIWRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LmNvbnRhaW5zKCdvZmZzY3JlZW4nKSkgewogICAgICBjbWRMaW5lXy5mb2N1cygpOwogICAgLy99CiAgfSwgZmFsc2UpOwoKICAvLyBBbHdheXMgZm9yY2UgdGV4dCBjdXJzb3IgdG8gZW5kIG9mIGlucHV0IGxpbmUuCiAgY21kTGluZV8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBpbnB1dFRleHRDbGlja18sIGZhbHNlKTsKCiAgLy8gSGFuZGxlIHVwL2Rvd24ga2V5IHByZXNzZXMgZm9yIHNoZWxsIGhpc3RvcnkgYW5kIGVudGVyIGZvciBuZXcgY29tbWFuZC4KICBjbWRMaW5lXy5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywga2V5Ym9hcmRTaG9ydGN1dEhhbmRsZXJfLCBmYWxzZSk7CiAgY21kTGluZV8uYWRkRXZlbnRMaXN0ZW5lcigna2V5dXAnLCBoaXN0b3J5SGFuZGxlcl8sIGZhbHNlKTsgLy8ga2V5dXAgbmVlZGVkIGZvciBpbnB1dCBibGlua2VyIHRvIGFwcGVhciBhdCBlbmQgb2YgaW5wdXQuCiAgY21kTGluZV8uYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIHByb2Nlc3NOZXdDb21tYW5kXywgZmFsc2UpOwoKICAvKndpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdiZWZvcmV1bmxvYWQnLCBmdW5jdGlvbihlKSB7CiAgICByZXR1cm4gIkRvbid0IGxlYXZlIG1lISI7CiAgfSwgZmFsc2UpOyovCgogIGZ1bmN0aW9uIGlucHV0VGV4dENsaWNrXyhlKSB7CiAgICB0aGlzLnZhbHVlID0gdGhpcy52YWx1ZTsKICB9CgogIGZ1bmN0aW9uIGtleWJvYXJkU2hvcnRjdXRIYW5kbGVyXyhlKSB7CiAgICAvLyBUb2dnbGUgQ1JUIHNjcmVlbiBmbGlja2VyLgogICAgaWYgKChlLmN0cmxLZXkgfHwgZS5tZXRhS2V5KSAmJiBlLmtleUNvZGUgPT0gODMpIHsgLy8gY3J0bCtzCiAgICAgIGNvbnRhaW5lcl8uY2xhc3NMaXN0LnRvZ2dsZSgnZmxpY2tlcicpOwogICAgICBvdXRwdXQoJzxkaXY+U2NyZWVuIGZsaWNrZXI6ICcgKwogICAgICAgICAgICAgKGNvbnRhaW5lcl8uY2xhc3NMaXN0LmNvbnRhaW5zKCdmbGlja2VyJykgPyAnb24nIDogJ29mZicpICsKICAgICAgICAgICAgICc8L2Rpdj4nKTsKICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICBlLnN0b3BQcm9wYWdhdGlvbigpOwogICAgfQogIH0KCiAgZnVuY3Rpb24gc2VsZWN0RmlsZV8oZWwpIHsKICAgIGFsZXJ0KGVsKQogIH0KCiAgZnVuY3Rpb24gaGlzdG9yeUhhbmRsZXJfKGUpIHsgLy8gVGFiIG5lZWRzIHRvIGJlIGtleWRvd24uCgogICAgaWYgKGhpc3RvcnlfLmxlbmd0aCkgewogICAgICBpZiAoZS5rZXlDb2RlID09IDM4IHx8IGUua2V5Q29kZSA9PSA0MCkgewogICAgICAgIGlmIChoaXN0b3J5X1toaXN0cG9zX10pIHsKICAgICAgICAgIGhpc3RvcnlfW2hpc3Rwb3NfXSA9IHRoaXMudmFsdWU7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGhpc3R0ZW1wXyA9IHRoaXMudmFsdWU7CiAgICAgICAgfQogICAgICB9CgogICAgICBpZiAoZS5rZXlDb2RlID09IDM4KSB7IC8vIHVwCiAgICAgICAgaGlzdHBvc18tLTsKICAgICAgICBpZiAoaGlzdHBvc18gPCAwKSB7CiAgICAgICAgICBoaXN0cG9zXyA9IDA7CiAgICAgICAgfQogICAgICB9IGVsc2UgaWYgKGUua2V5Q29kZSA9PSA0MCkgeyAvLyBkb3duCiAgICAgICAgaGlzdHBvc18rKzsKICAgICAgICBpZiAoaGlzdHBvc18gPiBoaXN0b3J5Xy5sZW5ndGgpIHsKICAgICAgICAgIGhpc3Rwb3NfID0gaGlzdG9yeV8ubGVuZ3RoOwogICAgICAgIH0KICAgICAgfQoKICAgICAgaWYgKGUua2V5Q29kZSA9PSAzOCB8fCBlLmtleUNvZGUgPT0gNDApIHsKICAgICAgICB0aGlzLnZhbHVlID0gaGlzdG9yeV9baGlzdHBvc19dID8gaGlzdG9yeV9baGlzdHBvc19dIDogaGlzdHRlbXBfOwogICAgICAgIHRoaXMudmFsdWUgPSB0aGlzLnZhbHVlOyAvLyBTZXRzIGN1cnNvciB0byBlbmQgb2YgaW5wdXQuCiAgICAgIH0KICAgIH0KICB9CgogIGZ1bmN0aW9uIHByb2Nlc3NOZXdDb21tYW5kXyhlKSB7CgogICAgLy8gQmVlcCBvbiBiYWNrc3BhY2UgYW5kIG5vIHZhbHVlIG9uIGNvbW1hbmQgbGluZS4KICAgIGlmICghdGhpcy52YWx1ZSAmJiBlLmtleUNvZGUgPT0gOCkgewogICAgICBiZWxsXy5zdG9wKCk7CiAgICAgIGJlbGxfLnBsYXkoKTsKICAgICAgcmV0dXJuOwogICAgfQoKICAgIGlmIChlLmtleUNvZGUgPT0gOSkgeyAvLyBUYWIKICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAvLyBUT0RPKGVyaWNiaWRlbG1hbik6IEltcGxlbWVudCB0YWIgc3VnZ2VzdC4KICAgIH0gZWxzZSBpZiAoZS5rZXlDb2RlID09IDEzKSB7IC8vIGVudGVyCgogICAgICAvLyBTYXZlIHNoZWxsIGhpc3RvcnkuCiAgICAgIGlmICh0aGlzLnZhbHVlKSB7CiAgICAgICAgaGlzdG9yeV9baGlzdG9yeV8ubGVuZ3RoXSA9IHRoaXMudmFsdWU7CiAgICAgICAgaGlzdHBvc18gPSBoaXN0b3J5Xy5sZW5ndGg7CiAgICAgIH0KCiAgICAgIC8vIER1cGxpY2F0ZSBjdXJyZW50IGlucHV0IGFuZCBhcHBlbmQgdG8gb3V0cHV0IHNlY3Rpb24uCiAgICAgIHZhciBsaW5lID0gdGhpcy5wYXJlbnROb2RlLnBhcmVudE5vZGUuY2xvbmVOb2RlKHRydWUpOwogICAgICBsaW5lLnJlbW92ZUF0dHJpYnV0ZSgnaWQnKQogICAgICBsaW5lLmNsYXNzTGlzdC5hZGQoJ2xpbmUnKTsKICAgICAgdmFyIGlucHV0ID0gbGluZS5xdWVyeVNlbGVjdG9yKCdpbnB1dC5jbWRsaW5lJyk7CiAgICAgIGlucHV0LmF1dG9mb2N1cyA9IGZhbHNlOwogICAgICBpbnB1dC5yZWFkT25seSA9IHRydWU7CiAgICAgIG91dHB1dF8uYXBwZW5kQ2hpbGQobGluZSk7CgogICAgICAvLyBQYXJzZSBvdXQgY29tbWFuZCwgYXJncywgYW5kIHRyaW0gb2ZmIHdoaXRlc3BhY2UuCiAgICAgIC8vIFRPRE8oZXJpY2JpZGVsbWFuKTogU3VwcG9ydCBtdWx0aXBsZSBjb21tYSBzZXBhcmF0ZWQgY29tbWFuZHMuCiAgICAgIGlmICh0aGlzLnZhbHVlICYmIHRoaXMudmFsdWUudHJpbSgpKSB7CiAgICAgICAgdmFyIGFyZ3MgPSB0aGlzLnZhbHVlLnNwbGl0KCcgJykuZmlsdGVyKGZ1bmN0aW9uKHZhbCwgaSkgewogICAgICAgICAgcmV0dXJuIHZhbDsKICAgICAgICB9KTsKICAgICAgICB2YXIgY21kID0gYXJnc1swXS50b0xvd2VyQ2FzZSgpOwogICAgICAgIGFyZ3MgPSBhcmdzLnNwbGljZSgxKTsgLy8gUmVtb3ZlIGNtZCBmcm9tIGFyZyBsaXN0LgogICAgICB9CgogICAgICBzd2l0Y2ggKGNtZCkgewogICAgICAgIGNhc2UgJzNkJzoKICAgICAgICAgIGNsZWFyXyh0aGlzKTsKICAgICAgICAgIG91dHB1dCgnSG9sZCBvbiB0byB5b3VyIGJ1dHRzIScpOwogICAgICAgICAgdG9nZ2xlM0RWaWV3XygpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAnY2F0JzoKICAgICAgICAgIHZhciBmaWxlTmFtZSA9IGFyZ3Muam9pbignICcpOwoKICAgICAgICAgIGlmICghZmlsZU5hbWUpIHsKICAgICAgICAgICAgb3V0cHV0KCd1c2FnZTogJyArIGNtZCArICcgZmlsZW5hbWUnKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CgogICAgICAgICAgcmVhZF8oY21kLCBmaWxlTmFtZSwgZnVuY3Rpb24ocmVzdWx0KSB7CiAgICAgICAgICAgIG91dHB1dCgnPHByZT4nICsgcmVzdWx0ICsgJzwvcHJlPicpOwogICAgICAgICAgfSk7CgogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAnY2xlYXInOgogICAgICAgICAgY2xlYXJfKHRoaXMpOwogICAgICAgICAgcmV0dXJuOwogICAgICAgIGNhc2UgJ2RhdGUnOgogICAgICAgICAgb3V0cHV0KChuZXcgRGF0ZSgpKS50b0xvY2FsZVN0cmluZygpKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgJ2V4aXQnOgogICAgICAgICAgaWYgKGlzM0RfKSB7CiAgICAgICAgICAgIHRvZ2dsZTNEVmlld18oKTsKICAgICAgICAgIH0KICAgICAgICAgIGlmICh0aW1lcl8gIT0gbnVsbCkgewogICAgICAgICAgICBtYWdpY1dvcmRfLnN0b3AoKTsKICAgICAgICAgICAgY2xlYXJJbnRlcnZhbCh0aW1lcl8pOwogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAnaGVscCc6CiAgICAgICAgICBvdXRwdXQoJzxkaXYgY2xhc3M9ImxzLWZpbGVzIj4nICsgQ01EU18uam9pbignPGJyPicpICsgJzwvZGl2PicpOwogICAgICAgICAgb3V0cHV0KCc8cD5BZGQgZmlsZXMgYnkgZHJhZ2dpbmcgdGhlbSBmcm9tIHlvdXIgZGVza3RvcC48L3A+Jyk7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICdpbnN0YWxsJzoKICAgICAgICAgIC8vIENoZWNrIGlzIGluc3RhbGxlZC4KICAgICAgICAgIGlmICh3aW5kb3cuY2hyb21lICYmIHdpbmRvdy5jaHJvbWUuYXBwKSB7CiAgICAgICAgICAgIGlmICghd2luZG93LmNocm9tZS5hcHAuaXNJbnN0YWxsZWQpIHsKICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgY2hyb21lLmFwcC5pbnN0YWxsKCk7CiAgICAgICAgICAgICAgfSBjYXRjaChlKSB7CiAgICAgICAgICAgICAgICBhbGVydChlICsgJ1xuRW5hYmxlIGlzIGFib3V0OmZsYWdzJyk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIG91dHB1dCgnVGhpcyBhcHAgaXMgYWxyZWFkeSBpbnN0YWxsZWQuJyk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgJ2xzJzoKICAgICAgICAgIGxzXyhmdW5jdGlvbihlbnRyaWVzKSB7CiAgICAgICAgICAgIGlmIChlbnRyaWVzLmxlbmd0aCkgewogICAgICAgICAgICAgIHZhciBodG1sID0gZm9ybWF0Q29sdW1uc18oZW50cmllcyk7CiAgICAgICAgICAgICAgdXRpbC50b0FycmF5KGVudHJpZXMpLmZvckVhY2goZnVuY3Rpb24oZW50cnksIGkpIHsKICAgICAgICAgICAgICAgIGh0bWwucHVzaCgKICAgICAgICAgICAgICAgICAgICAnPHNwYW4gY2xhc3M9IicsIGVudHJ5LmlzRGlyZWN0b3J5ID8gJ2ZvbGRlcicgOiAnZmlsZScsCiAgICAgICAgICAgICAgICAgICAgJyI+JywgZW50cnkubmFtZSwgJzwvc3Bhbj48YnI+Jyk7CiAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgaHRtbC5wdXNoKCc8L2Rpdj4nKTsKICAgICAgICAgICAgICBvdXRwdXQoaHRtbC5qb2luKCcnKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0pOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAncHdkJzoKICAgICAgICAgIG91dHB1dChjd2RfLmZ1bGxQYXRoKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgJ2NkJzoKICAgICAgICAgIHZhciBkZXN0ID0gYXJncy5qb2luKCcgJykgfHwgJy8nOwoKICAgICAgICAgIGN3ZF8uZ2V0RGlyZWN0b3J5KGRlc3QsIHt9LCBmdW5jdGlvbihkaXJFbnRyeSkgewogICAgICAgICAgICBjd2RfID0gZGlyRW50cnk7CiAgICAgICAgICAgIG91dHB1dCgnPGRpdj4nICsgZGlyRW50cnkuZnVsbFBhdGggKyAnPC9kaXY+Jyk7CgogICAgICAgICAgICAvLyBUZWxsIEZTTiB2aXN1YWxpemVyIHRoYXQgd2UncmUgY2QnaW5nLgogICAgICAgICAgICBpZiAoZnNuXykgewogICAgICAgICAgICAgIGZzbl8uY29udGVudFdpbmRvdy5wb3N0TWVzc2FnZSh7Y21kOiAnY2QnLCBkYXRhOiBkZXN0fSwgbG9jYXRpb24ub3JpZ2luKTsKICAgICAgICAgICAgfQoKICAgICAgICAgIH0sIGZ1bmN0aW9uKGUpIHsgaW52YWxpZE9wRm9yRW50cnlUeXBlXyhlLCBjbWQsIGRlc3QpOyB9KTsKCiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICdta2Rpcic6CiAgICAgICAgICB2YXIgZGFzaFAgPSBmYWxzZTsKICAgICAgICAgIHZhciBpbmRleCA9IGFyZ3MuaW5kZXhPZignLXAnKTsKICAgICAgICAgIGlmIChpbmRleCAhPSAtMSkgewogICAgICAgICAgICBhcmdzLnNwbGljZShpbmRleCwgMSk7CiAgICAgICAgICAgIGRhc2hQID0gdHJ1ZTsKICAgICAgICAgIH0KCiAgICAgICAgICBpZiAoIWFyZ3MubGVuZ3RoKSB7CiAgICAgICAgICAgIG91dHB1dCgndXNhZ2U6ICcgKyBjbWQgKyAnIFstcF0gZGlyZWN0b3J5PGJyPicpOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KCiAgICAgICAgICAvLyBDcmVhdGUgZWFjaCBkaXJlY3RvcnkgcGFzc2VkIGFzIGFuIGFyZ3VtZW50LgogICAgICAgICAgYXJncy5mb3JFYWNoKGZ1bmN0aW9uKGRpck5hbWUsIGkpIHsKICAgICAgICAgICAgaWYgKGRhc2hQKSB7CiAgICAgICAgICAgICAgdmFyIGZvbGRlcnMgPSBkaXJOYW1lLnNwbGl0KCcvJyk7CgogICAgICAgICAgICAgIC8vIFRocm93IG91dCAnLi8nIG9yICcvJyBpZiBwcmVzZW50IG9uIHRoZSBiZWdpbm5pbmcgb2Ygb3VyIHBhdGguCiAgICAgICAgICAgICAgaWYgKGZvbGRlcnNbMF0gPT0gJy4nIHx8IGZvbGRlcnNbMF0gPT0gJycpIHsKICAgICAgICAgICAgICAgIGZvbGRlcnMgPSBmb2xkZXJzLnNsaWNlKDEpOwogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgY3JlYXRlRGlyXyhjd2RfLCBmb2xkZXJzKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICBjd2RfLmdldERpcmVjdG9yeShkaXJOYW1lLCB7Y3JlYXRlOiB0cnVlLCBleGNsdXNpdmU6IHRydWV9LCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIC8vIFRlbGwgRlNOIHZpc3VhbGl6ZXIgdGhhdCB3ZSdyZSBta2RpcidpbmcuCiAgICAgICAgICAgICAgICBpZiAoZnNuXykgewogICAgICAgICAgICAgICAgICBmc25fLmNvbnRlbnRXaW5kb3cucG9zdE1lc3NhZ2Uoe2NtZDogJ21rZGlyJywgZGF0YTogZGlyTmFtZX0sIGxvY2F0aW9uLm9yaWdpbik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfSwgZnVuY3Rpb24oZSkgeyBpbnZhbGlkT3BGb3JFbnRyeVR5cGVfKGUsIGNtZCwgZGlyTmFtZSk7IH0pOwogICAgICAgICAgICB9CiAgICAgICAgICB9KTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgJ2NwJzoKICAgICAgICBjYXNlICdtdic6CiAgICAgICAgICB2YXIgc3JjID0gYXJnc1swXTsKICAgICAgICAgIHZhciBkZXN0ID0gYXJnc1sxXTsKCiAgICAgICAgICBpZiAoIXNyYyB8fCAhZGVzdCkgewogICAgICAgICAgICBvdXRwdXQoWyd1c2FnZTogJywgY21kLCAnIHNvdXJjZSB0YXJnZXQ8YnI+JywKICAgICAgICAgICAgICAgICAgICcmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsnLCBjbWQsCiAgICAgICAgICAgICAgICAgICAnIHNvdXJjZSBkaXJlY3RvcnkvJ10uam9pbignJykpOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KCiAgICAgICAgICB2YXIgcnVuQWN0aW9uID0gZnVuY3Rpb24oY21kLCBzcmNEaXJFbnRyeSwgZGVzdERpckVudHJ5LCBvcHRfbmV3TmFtZSkgewogICAgICAgICAgICB2YXIgbmV3TmFtZSA9IG9wdF9uZXdOYW1lIHx8IG51bGw7CiAgICAgICAgICAgIGlmIChjbWQgPT0gJ212JykgewogICAgICAgICAgICAgICAgc3JjRGlyRW50cnkubW92ZVRvKGRlc3REaXJFbnRyeSwgbmV3TmFtZSk7CiAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHNyY0RpckVudHJ5LmNvcHlUbyhkZXN0RGlyRW50cnksIG5ld05hbWUpOwogICAgICAgICAgICAgIH0KICAgICAgICAgIH07CgogICAgICAgICAgLy8gTW92aW5nIHRvIGEgZm9sZGVyPyAoZS5nLiBzZWNvbmQgYXJnIGVuZHMgaW4gJy8nKS4KICAgICAgICAgIGlmIChkZXN0W2Rlc3QubGVuZ3RoIC0gMV0gPT0gJy8nKSB7CiAgICAgICAgICAgIGN3ZF8uZ2V0RGlyZWN0b3J5KHNyYywge30sIGZ1bmN0aW9uKHNyY0RpckVudHJ5KSB7CiAgICAgICAgICAgICAgLy8gQ3JlYXRlIGJsYWNrbGlzdCBmb3IgZGlycyB3ZSBjYW4ndCByZS1jcmVhdGUuCiAgICAgICAgICAgICAgdmFyIGNyZWF0ZSA9IFsKICAgICAgICAgICAgICAgICcuJywgJy4vJywgJy4uJywgJy4uLycsICcvJ10uaW5kZXhPZihkZXN0KSAhPSAtMSA/IGZhbHNlIDogdHJ1ZTsKCiAgICAgICAgICAgICAgY3dkXy5nZXREaXJlY3RvcnkoZGVzdCwge2NyZWF0ZTogY3JlYXRlfSwgZnVuY3Rpb24oZGVzdERpckVudHJ5KSB7CiAgICAgICAgICAgICAgICBydW5BY3Rpb24oY21kLCBzcmNEaXJFbnRyeSwgZGVzdERpckVudHJ5KTsKICAgICAgICAgICAgICB9LCBlcnJvckhhbmRsZXJfKTsKICAgICAgICAgICAgfSwgZnVuY3Rpb24oZSkgewogICAgICAgICAgICAgIC8vIFRyeSB0aGUgc3JjIGVudHJ5IGFzIGEgZmlsZSBpbnN0ZWFkLgogICAgICAgICAgICAgIGN3ZF8uZ2V0RmlsZShzcmMsIHt9LCBmdW5jdGlvbihzcmNEaXJFbnRyeSkgewogICAgICAgICAgICAgICAgY3dkXy5nZXREaXJlY3RvcnkoZGVzdCwge30sIGZ1bmN0aW9uKGRlc3REaXJFbnRyeSkgewogICAgICAgICAgICAgICAgICBydW5BY3Rpb24oY21kLCBzcmNEaXJFbnRyeSwgZGVzdERpckVudHJ5KTsKICAgICAgICAgICAgICAgIH0sIGVycm9ySGFuZGxlcl8pOwogICAgICAgICAgICAgIH0sIGVycm9ySGFuZGxlcl8pOwogICAgICAgICAgICB9KTsKICAgICAgICAgIH0gZWxzZSB7IC8vIFRyZWF0IHNyYy9kZXN0aW5hdGlvbiBhcyBmaWxlcy4KICAgICAgICAgICAgY3dkXy5nZXRGaWxlKHNyYywge30sIGZ1bmN0aW9uKHNyY0ZpbGVFbnRyeSkgewogICAgICAgICAgICAgIHNyY0ZpbGVFbnRyeS5nZXRQYXJlbnQoZnVuY3Rpb24ocGFyZW50RGlyRW50cnkpIHsKICAgICAgICAgICAgICAgIHJ1bkFjdGlvbihjbWQsIHNyY0ZpbGVFbnRyeSwgcGFyZW50RGlyRW50cnksIGRlc3QpOwogICAgICAgICAgICAgIH0sIGVycm9ySGFuZGxlcl8pOwogICAgICAgICAgICB9LCBlcnJvckhhbmRsZXJfKTsKICAgICAgICAgIH0KCiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICdvcGVuJzoKICAgICAgICAgIHZhciBmaWxlTmFtZSA9IGFyZ3Muam9pbignICcpOwoKICAgICAgICAgIGlmICghZmlsZU5hbWUpIHsKICAgICAgICAgICAgb3V0cHV0KCd1c2FnZTogJyArIGNtZCArICcgZmlsZW5hbWUnKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CgogICAgICAgICAgb3Blbl8oY21kLCBmaWxlTmFtZSwgZnVuY3Rpb24oZmlsZUVudHJ5KSB7CiAgICAgICAgICAgIHZhciBteVdpbiA9IHdpbmRvdy5vcGVuKGZpbGVFbnRyeS50b1VSTCgpLCAnbXl3aW4nKTsKICAgICAgICAgIH0pOwoKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgJ2luaXQnOgogICAgICAgICAgaWYgKHdvcmtlcl8pIHsKICAgICAgICAgICAgd29ya2VyXy5wb3N0TWVzc2FnZSh7Y21kOiAnaW5pdCcsIHR5cGU6IHR5cGVfLCBzaXplOiBzaXplX30pOwogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAncm0nOgogICAgICAgICAgLy8gUmVtb3ZlIHJlY3Vyc2l2ZWx5PyBJZiBzbywgcmVtb3ZlIHRoZSBmbGFnKHMpIGZyb20gdGhlIGFyZyBsaXN0LgogICAgICAgICAgdmFyIHJlY3Vyc2l2ZSA9IGZhbHNlOwogICAgICAgICAgWyctcicsICctZicsICctcmYnLCAnLWZyJ10uZm9yRWFjaChmdW5jdGlvbihhcmcsIGkpIHsKICAgICAgICAgICAgdmFyIGluZGV4ID0gYXJncy5pbmRleE9mKGFyZyk7CiAgICAgICAgICAgIGlmIChpbmRleCAhPSAtMSkgewogICAgICAgICAgICAgIGFyZ3Muc3BsaWNlKGluZGV4LCAxKTsKICAgICAgICAgICAgICByZWN1cnNpdmUgPSB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgICB9KTsKCiAgICAgICAgICAvLyBSZW1vdmUgZWFjaCBmaWxlIHBhc3NlZCBhcyBhbiBhcmd1bWVudC4KICAgICAgICAgIGFyZ3MuZm9yRWFjaChmdW5jdGlvbihmaWxlTmFtZSwgaSkgewogICAgICAgICAgICBjd2RfLmdldEZpbGUoZmlsZU5hbWUsIHt9LCBmdW5jdGlvbihmaWxlRW50cnkpIHsKICAgICAgICAgICAgICBmaWxlRW50cnkucmVtb3ZlKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgLy8gVGVsbCBGU04gdmlzdWFsaXplciB0aGF0IHdlJ3JlIHJtJ2luZy4KICAgICAgICAgICAgICAgIGlmIChmc25fKSB7CiAgICAgICAgICAgICAgICAgIGZzbl8uY29udGVudFdpbmRvdy5wb3N0TWVzc2FnZSh7Y21kOiAncm0nLCBkYXRhOiBmaWxlTmFtZX0sIGxvY2F0aW9uLm9yaWdpbik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfSwgZXJyb3JIYW5kbGVyXyk7CiAgICAgICAgICAgIH0sIGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICBpZiAocmVjdXJzaXZlICYmIGUuY29kZSA9PSBGaWxlRXJyb3IuVFlQRV9NSVNNQVRDSF9FUlIpIHsKICAgICAgICAgICAgICAgIGN3ZF8uZ2V0RGlyZWN0b3J5KGZpbGVOYW1lLCB7fSwgZnVuY3Rpb24oZGlyRW50cnkpIHsKICAgICAgICAgICAgICAgICAgZGlyRW50cnkucmVtb3ZlUmVjdXJzaXZlbHkobnVsbCwgZXJyb3JIYW5kbGVyXyk7CiAgICAgICAgICAgICAgICB9LCBlcnJvckhhbmRsZXJfKTsKICAgICAgICAgICAgICB9IGVsc2UgaWYgKGUuY29kZSA9PSBGaWxlRXJyb3IuSU5WQUxJRF9TVEFURV9FUlIpIHsKICAgICAgICAgICAgICAgIG91dHB1dChjbWQgKyAnOiAnICsgZmlsZU5hbWUgKyAnOiBpcyBhIGRpcmVjdG9yeTxicj4nKTsKICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgZXJyb3JIYW5kbGVyXyhlKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgICAgfSk7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICdybWRpcic6CiAgICAgICAgICAvLyBSZW1vdmUgZWFjaCBkaXJlY3RvcnkgcGFzc2VkIGFzIGFuIGFyZ3VtZW50LgogICAgICAgICAgYXJncy5mb3JFYWNoKGZ1bmN0aW9uKGRpck5hbWUsIGkpIHsKICAgICAgICAgICAgY3dkXy5nZXREaXJlY3RvcnkoZGlyTmFtZSwge30sIGZ1bmN0aW9uKGRpckVudHJ5KSB7CiAgICAgICAgICAgICAgZGlyRW50cnkucmVtb3ZlKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgLy8gVGVsbCBGU04gdmlzdWFsaXplciB0aGF0IHdlJ3JlIHJtZGlyJ2luZy4KICAgICAgICAgICAgICAgIGlmIChmc25fKSB7CiAgICAgICAgICAgICAgICAgIGZzbl8uY29udGVudFdpbmRvdy5wb3N0TWVzc2FnZSh7Y21kOiAncm0nLCBkYXRhOiBkaXJOYW1lfSwgbG9jYXRpb24ub3JpZ2luKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9LCBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICBpZiAoZS5jb2RlID09IEZpbGVFcnJvci5JTlZBTElEX01PRElGSUNBVElPTl9FUlIpIHsKICAgICAgICAgICAgICAgICAgb3V0cHV0KGNtZCArICc6ICcgKyBkaXJOYW1lICsgJzogRGlyZWN0b3J5IG5vdCBlbXB0eTxicj4nKTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgIGVycm9ySGFuZGxlcl8oZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0sIGZ1bmN0aW9uKGUpIHsgaW52YWxpZE9wRm9yRW50cnlUeXBlXyhlLCBjbWQsIGRpck5hbWUpOyB9KTsKICAgICAgICAgIH0pOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAnc3Vkbyc6CiAgICAgICAgICBpZiAodGltZXJfICE9IG51bGwpIHsKICAgICAgICAgICAgbWFnaWNXb3JkXy5zdG9wKCk7CiAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwodGltZXJfKTsKICAgICAgICAgIH0KICAgICAgICAgIGlmICghbWFnaWNXb3JkXykgewogICAgICAgICAgICBtYWdpY1dvcmRfID0gbmV3IFNvdW5kKHRydWUpOwogICAgICAgICAgICBtYWdpY1dvcmRfLmxvYWQoJ21hZ2ljX3dvcmQubXAzJywgZmFsc2UsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgIG1hZ2ljV29yZF8ucGxheSgpOwogICAgICAgICAgICB9KTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIG1hZ2ljV29yZF8ucGxheSgpOwogICAgICAgICAgfQogICAgICAgICAgdGltZXJfID0gc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIG91dHB1dCgiPGRpdj5ZT1UgRElETidUIFNBWSBUSEUgTUFHSUMgV09SRCE8L2Rpdj4iKTsKICAgICAgICAgIH0sIDEwMCk7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICd0aGVtZSc6CiAgICAgICAgICB2YXIgdGhlbWUgPSBhcmdzLmpvaW4oJyAnKTsKICAgICAgICAgIGlmICghdGhlbWUpIHsKICAgICAgICAgICAgb3V0cHV0KFsndXNhZ2U6ICcsIGNtZCwgJyAnICsgVEhFTUVTXy5qb2luKCcsJyldLmpvaW4oJycpKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGlmIChUSEVNRVNfLmluZGV4T2YodGhlbWUpICE9IC0xKSB7CiAgICAgICAgICAgICAgc2V0VGhlbWVfKHRoZW1lKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICBvdXRwdXQoJ0Vycm9yIC0gVW5yZWNvZ25pemVkIHRoZW1lIHVzZWQnKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAndmVyc2lvbic6CiAgICAgICAgY2FzZSAndmVyJzoKICAgICAgICAgIG91dHB1dChWRVJTSU9OXyk7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICd3Z2V0JzoKICAgICAgICAgIHZhciB1cmwgPSBhcmdzWzBdOwogICAgICAgICAgaWYgKCF1cmwpIHsKICAgICAgICAgICAgb3V0cHV0KFsndXNhZ2U6ICcsIGNtZCwgJyBtaXNzaW5nIFVSTCddLmpvaW4oJycpKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9IGVsc2UgaWYgKHVybC5zZWFyY2goJ15odHRwOi8vJykgPT0gLTEpIHsKICAgICAgICAgICAgdXJsID0gJ2h0dHA6Ly8nICsgdXJsOwogICAgICAgICAgfQogICAgICAgICAgdmFyIHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpOwogICAgICAgICAgeGhyLm9ubG9hZCA9IGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgaWYgKHRoaXMuc3RhdHVzID09IDIwMCAmJiB0aGlzLnJlYWR5U3RhdGUgPT0gNCkgewogICAgICAgICAgICAgIG91dHB1dCgnPHRleHRhcmVhPicgKyB0aGlzLnJlc3BvbnNlICsgJzwvdGV4dGFyZWE+Jyk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgb3V0cHV0KCdFUlJPUjogJyArIHRoaXMuc3RhdHVzICsgJyAnICsgdGhpcy5zdGF0dXNUZXh0KTsKICAgICAgICAgICAgfQogICAgICAgICAgfTsKICAgICAgICAgIHhoci5vbmVycm9yID0gZnVuY3Rpb24oZSkgewogICAgICAgICAgICBvdXRwdXQoJ0VSUk9SOiAnICsgdGhpcy5zdGF0dXMgKyAnICcgKyB0aGlzLnN0YXR1c1RleHQpOwogICAgICAgICAgICBvdXRwdXQoJ0NvdWxkIG5vdCBmZXRjaCAnICsgdXJsKTsKICAgICAgICAgIH07CiAgICAgICAgICB4aHIub3BlbignR0VUJywgdXJsLCB0cnVlKTsKICAgICAgICAgIHhoci5zZW5kKCk7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICd3aG8nOgogICAgICAgICAgb3V0cHV0KGRvY3VtZW50LnRpdGxlICsKICAgICAgICAgICAgICAgICAnIC0gQnk6IEVyaWMgQmlkZWxtYW4gJmx0O2VyaWNiaWRlbG1hbkBjaHJvbWl1bS5vcmcmZ3Q7Jyk7CiAgICAgICAgICBicmVhazsKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgaWYgKGNtZCkgewogICAgICAgICAgICBvdXRwdXQoY21kICsgJzogY29tbWFuZCBub3QgZm91bmQnKTsKICAgICAgICAgIH0KICAgICAgfTsKCiAgICAgIHRoaXMudmFsdWUgPSAnJzsgLy8gQ2xlYXIvc2V0dXAgbGluZSBmb3IgbmV4dCBpbnB1dC4KICAgIH0KICB9CgogIGZ1bmN0aW9uIGZvcm1hdENvbHVtbnNfKGVudHJpZXMpIHsKICAgIHZhciBtYXhOYW1lID0gZW50cmllc1swXS5uYW1lOwogICAgdXRpbC50b0FycmF5KGVudHJpZXMpLmZvckVhY2goZnVuY3Rpb24oZW50cnksIGkpIHsKICAgICAgaWYgKGVudHJ5Lm5hbWUubGVuZ3RoID4gbWF4TmFtZS5sZW5ndGgpIHsKICAgICAgICBtYXhOYW1lID0gZW50cnkubmFtZTsKICAgICAgfQogICAgfSk7CgogICAgLy8gSWYgd2UgaGF2ZSAzIG9yIGxlc3MgZW50cmllcywgc2hvcnRlbiB0aGUgb3V0cHV0IGNvbnRhaW5lcidzIGhlaWdodC4KICAgIC8vIDE1cHggaGVpZ2h0IHdpdGggYSBtb25vc3BhY2UgZm9udC1zaXplIG9mIH4xMnB4OwogICAgdmFyIGhlaWdodCA9IGVudHJpZXMubGVuZ3RoID09IDEgPyAnaGVpZ2h0OiAnICsgKGVudHJpZXMubGVuZ3RoICogMzApICsgJ3B4OycgOgogICAgICAgICAgICAgICAgIGVudHJpZXMubGVuZ3RoIDw9IDMgPyAnaGVpZ2h0OiAnICsgKGVudHJpZXMubGVuZ3RoICogMTgpICsgJ3B4OycgOiAnJzsKCiAgICAvLyB+MTJweCBtb25vc3BhY2UgZm9udCB5aWVsZHMgfjhweCBzY3JlZW4gd2lkdGguCiAgICB2YXIgY29sV2lkdGggPSBtYXhOYW1lLmxlbmd0aCAqIDE2Oy8vOzg7CgogICAgcmV0dXJuIFsnPGRpdiBjbGFzcz0ibHMtZmlsZXMiIHN0eWxlPSItd2Via2l0LWNvbHVtbi13aWR0aDonLAogICAgICAgICAgICBjb2xXaWR0aCwgJ3B4OycsIGhlaWdodCwgJyI+J107CiAgfQoKICBmdW5jdGlvbiBpbnZhbGlkT3BGb3JFbnRyeVR5cGVfKGUsIGNtZCwgZGVzdCkgewogICAgaWYgKGUuY29kZSA9PSBGaWxlRXJyb3IuTk9UX0ZPVU5EX0VSUikgewogICAgICBvdXRwdXQoY21kICsgJzogJyArIGRlc3QgKyAnOiBObyBzdWNoIGZpbGUgb3IgZGlyZWN0b3J5PGJyPicpOwogICAgfSBlbHNlIGlmIChlLmNvZGUgPT0gRmlsZUVycm9yLklOVkFMSURfU1RBVEVfRVJSKSB7CiAgICAgIG91dHB1dChjbWQgKyAnOiAnICsgZGVzdCArICc6IE5vdCBhIGRpcmVjdG9yeTxicj4nKTsKICAgIH0gZWxzZSBpZiAoZS5jb2RlID09IEZpbGVFcnJvci5JTlZBTElEX01PRElGSUNBVElPTl9FUlIpIHsKICAgICAgb3V0cHV0KGNtZCArICc6ICcgKyBkZXN0ICsgJzogRmlsZSBhbHJlYWR5IGV4aXN0czxicj4nKTsKICAgIH0gZWxzZSB7CiAgICAgIGVycm9ySGFuZGxlcl8oZSk7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBlcnJvckhhbmRsZXJfKGUpIHsKICAgIHZhciBtc2cgPSAnJzsKICAgIHN3aXRjaCAoZS5jb2RlKSB7CiAgICAgIGNhc2UgRmlsZUVycm9yLlFVT1RBX0VYQ0VFREVEX0VSUjoKICAgICAgICBtc2cgPSAnUVVPVEFfRVhDRUVERURfRVJSJzsKICAgICAgICBicmVhazsKICAgICAgY2FzZSBGaWxlRXJyb3IuTk9UX0ZPVU5EX0VSUjoKICAgICAgICBtc2cgPSAnTk9UX0ZPVU5EX0VSUic7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgRmlsZUVycm9yLlNFQ1VSSVRZX0VSUjoKICAgICAgICBtc2cgPSAnU0VDVVJJVFlfRVJSJzsKICAgICAgICBicmVhazsKICAgICAgY2FzZSBGaWxlRXJyb3IuSU5WQUxJRF9NT0RJRklDQVRJT05fRVJSOgogICAgICAgIG1zZyA9ICdJTlZBTElEX01PRElGSUNBVElPTl9FUlInOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlIEZpbGVFcnJvci5JTlZBTElEX1NUQVRFX0VSUjoKICAgICAgICBtc2cgPSAnSU5WQUxJRF9TVEFURV9FUlInOwogICAgICAgIGJyZWFrOwogICAgICBkZWZhdWx0OgogICAgICAgIG1zZyA9ICdVbmtub3duIEVycm9yJzsKICAgICAgICBicmVhazsKICAgIH07CiAgICBvdXRwdXQoJzxkaXY+RXJyb3I6ICcgKyBtc2cgKyAnPC9kaXY+Jyk7CiAgfQoKICBmdW5jdGlvbiBjcmVhdGVEaXJfKHJvb3REaXJFbnRyeSwgZm9sZGVycywgb3B0X2Vycm9yQ2FsbGJhY2spIHsKICAgIHZhciBlcnJvckNhbGxiYWNrID0gb3B0X2Vycm9yQ2FsbGJhY2sgfHwgZXJyb3JIYW5kbGVyXzsKCiAgICByb290RGlyRW50cnkuZ2V0RGlyZWN0b3J5KGZvbGRlcnNbMF0sIHtjcmVhdGU6IHRydWV9LCBmdW5jdGlvbihkaXJFbnRyeSkgewoKICAgICAgLy8gUmVjdXJzaXZlbHkgYWRkIHRoZSBuZXcgc3ViZm9sZGVyIGlmIHdlIHN0aWxsIGhhdmUgYSBzdWJmb2xkZXIgdG8gY3JlYXRlLgogICAgICBpZiAoZm9sZGVycy5sZW5ndGgpIHsKICAgICAgICBjcmVhdGVEaXJfKGRpckVudHJ5LCBmb2xkZXJzLnNsaWNlKDEpKTsKICAgICAgfQogICAgfSwgZXJyb3JDYWxsYmFjayk7CiAgfQoKICBmdW5jdGlvbiBvcGVuXyhjbWQsIHBhdGgsIHN1Y2Nlc3NDYWxsYmFjaykgewogICAgaWYgKCFmc18pIHsKICAgICAgcmV0dXJuOwogICAgfQoKICAgIGN3ZF8uZ2V0RmlsZShwYXRoLCB7fSwgc3VjY2Vzc0NhbGxiYWNrLCBmdW5jdGlvbihlKSB7CiAgICAgIGlmIChlLmNvZGUgPT0gRmlsZUVycm9yLk5PVF9GT1VORF9FUlIpIHsKICAgICAgICBvdXRwdXQoY21kICsgJzogJyArIHBhdGggKyAnOiBObyBzdWNoIGZpbGUgb3IgZGlyZWN0b3J5PGJyPicpOwogICAgICB9CiAgICB9KTsKICB9CgogIGZ1bmN0aW9uIHJlYWRfKGNtZCwgcGF0aCwgc3VjY2Vzc0NhbGxiYWNrKSB7CiAgICBpZiAoIWZzXykgewogICAgICByZXR1cm47CiAgICB9CgogICAgY3dkXy5nZXRGaWxlKHBhdGgsIHt9LCBmdW5jdGlvbihmaWxlRW50cnkpIHsKICAgICAgZmlsZUVudHJ5LmZpbGUoZnVuY3Rpb24oZmlsZSkgewogICAgICAgIHZhciByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpOwoKICAgICAgICByZWFkZXIub25sb2FkZW5kID0gZnVuY3Rpb24oZSkgewogICAgICAgICAgc3VjY2Vzc0NhbGxiYWNrKHRoaXMucmVzdWx0KTsKICAgICAgICB9OwoKICAgICAgICByZWFkZXIucmVhZEFzVGV4dChmaWxlKTsKICAgICAgfSwgZXJyb3JIYW5kbGVyXyk7CiAgICB9LCBmdW5jdGlvbihlKSB7CiAgICAgIGlmIChlLmNvZGUgPT0gRmlsZUVycm9yLklOVkFMSURfU1RBVEVfRVJSKSB7CiAgICAgICAgb3V0cHV0KGNtZCArICc6ICcgKyBwYXRoICsgJzogaXMgYSBkaXJlY3Rvcnk8YnI+Jyk7CiAgICAgIH0gZWxzZSBpZiAoZS5jb2RlID09IEZpbGVFcnJvci5OT1RfRk9VTkRfRVJSKSB7CiAgICAgICAgb3V0cHV0KGNtZCArICc6ICcgKyBwYXRoICsgJzogTm8gc3VjaCBmaWxlIG9yIGRpcmVjdG9yeTxicj4nKTsKICAgICAgfQogICAgfSk7CiAgfQoKICBmdW5jdGlvbiBsc18oc3VjY2Vzc0NhbGxiYWNrKSB7CiAgICBpZiAoIWZzXykgewogICAgICByZXR1cm47CiAgICB9CgogICAgLy8gUmVhZCBjb250ZW50cyBvZiBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5LiBBY2NvcmRpbmcgdG8gc3BlYywgbmVlZCB0bwogICAgLy8ga2VlcCBjYWxsaW5nIHJlYWRFbnRyaWVzKCkgdW50aWwgbGVuZ3RoIG9mIHJlc3VsdCBhcnJheSBpcyAwLiBXZSdyZQogICAgLy8gZ3VhcmVudGVlZCB0aGUgc2FtZSBlbnRyeSB3b24ndCBiZSByZXR1cm5lZCBhZ2Fpbi4KICAgIHZhciBlbnRyaWVzID0gW107CiAgICB2YXIgcmVhZGVyID0gY3dkXy5jcmVhdGVSZWFkZXIoKTsKCiAgICB2YXIgcmVhZEVudHJpZXMgPSBmdW5jdGlvbigpIHsKICAgICAgcmVhZGVyLnJlYWRFbnRyaWVzKGZ1bmN0aW9uKHJlc3VsdHMpIHsKICAgICAgICBpZiAoIXJlc3VsdHMubGVuZ3RoKSB7CiAgICAgICAgICBlbnRyaWVzID0gZW50cmllcy5zb3J0KCk7CiAgICAgICAgICBzdWNjZXNzQ2FsbGJhY2soZW50cmllcyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGVudHJpZXMgPSBlbnRyaWVzLmNvbmNhdCh1dGlsLnRvQXJyYXkocmVzdWx0cykpOwogICAgICAgICAgcmVhZEVudHJpZXMoKTsKICAgICAgICB9CiAgICAgIH0sIGVycm9ySGFuZGxlcl8pOwogICAgfTsKCiAgICByZWFkRW50cmllcygpOwogIH0KCiAgZnVuY3Rpb24gY2xlYXJfKGlucHV0KSB7CiAgICBvdXRwdXRfLmlubmVySFRNTCA9ICcnOwogICAgaW5wdXQudmFsdWUgPSAnJzsKICAgIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zdHlsZS5oZWlnaHQgPSAnMTAwJSc7CiAgICBpbnRlcmxhY2VfLnN0eWxlLmhlaWdodCA9ICcxMDAlJzsKICB9CgogIGZ1bmN0aW9uIHNldFRoZW1lXyh0aGVtZSkgewogICAgdmFyIGN1cnJlbnRVcmwgPSBkb2N1bWVudC5sb2NhdGlvbi5wYXRobmFtZTsKCiAgICBpZiAoIXRoZW1lIHx8IHRoZW1lID09ICdkZWZhdWx0JykgewogICAgICAvL2hpc3RvcnkucmVwbGFjZVN0YXRlKHt9LCAnJywgY3VycmVudFVybCk7CiAgICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKCd0aGVtZScpOwogICAgICBkb2N1bWVudC5ib2R5LmNsYXNzTmFtZSA9ICcnOwogICAgICByZXR1cm47CiAgICB9CgogICAgaWYgKHRoZW1lKSB7CiAgICAgIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LmFkZCh0aGVtZSk7CiAgICAgIGxvY2FsU3RvcmFnZS50aGVtZSA9IHRoZW1lOwogICAgICAvL2hpc3RvcnkucmVwbGFjZVN0YXRlKHt9LCAnJywgY3VycmVudFVybCArICcjdGhlbWU9JyArIHRoZW1lKTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIHRvZ2dsZTNEVmlld18oKSB7CiAgICB2YXIgYm9keSA9IGRvY3VtZW50LmJvZHk7CiAgICBib2R5LmNsYXNzTGlzdC50b2dnbGUoJ29mZnNjcmVlbicpOwoKICAgIGlzM0RfID0gIWlzM0RfOwoKICAgIGlmIChib2R5LmNsYXNzTGlzdC5jb250YWlucygnb2Zmc2NyZWVuJykpIHsKCiAgICAgIGNvbnRhaW5lcl8uc3R5bGUud2Via2l0VHJhbnNmb3JtID0KICAgICAgICAgICd0cmFuc2xhdGVZKCcgKyAodXRpbC5nZXREb2NIZWlnaHQoKSAtIDE3NSkgKyAncHgpJzsKCiAgICAgIHZhciB0cmFuc0VuZF8gPSBmdW5jdGlvbihlKSB7CiAgICAgICAgdmFyIGlmcmFtZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lmcmFtZScpOwogICAgICAgIGlmcmFtZS5pZCA9ICdmc24nOwogICAgICAgIGlmcmFtZS5zcmMgPSAnLi4vZnNuL2Zzbl9wcm90by5odG1sJzsKCiAgICAgICAgZnNuXyA9IGJvZHkuaW5zZXJ0QmVmb3JlKGlmcmFtZSwgYm9keS5maXJzdEVsZW1lbnRDaGlsZCk7CgogICAgICAgIGlmcmFtZS5jb250ZW50V2luZG93Lm9ubG9hZCA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgd29ya2VyXy5wb3N0TWVzc2FnZSh7Y21kOiAncmVhZCcsIHR5cGU6IHR5cGVfLCBzaXplOiBzaXplX30pOwogICAgICAgIH0KICAgICAgICBjb250YWluZXJfLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3dlYmtpdFRyYW5zaXRpb25FbmQnLCB0cmFuc0VuZF8sIGZhbHNlKTsKICAgICAgfTsKICAgICAgY29udGFpbmVyXy5hZGRFdmVudExpc3RlbmVyKCd3ZWJraXRUcmFuc2l0aW9uRW5kJywgdHJhbnNFbmRfLCBmYWxzZSk7CiAgICB9IGVsc2UgewogICAgICBjb250YWluZXJfLnN0eWxlLndlYmtpdFRyYW5zZm9ybSA9ICd0cmFuc2xhdGVZKDApJzsKICAgICAgYm9keS5yZW1vdmVDaGlsZChmc25fKTsKICAgICAgZnNuXyA9IG51bGw7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBvdXRwdXQoaHRtbCkgewogICAgb3V0cHV0Xy5pbnNlcnRBZGphY2VudEhUTUwoJ2JlZm9yZUVuZCcsIGh0bWwpOwogICAgLy9vdXRwdXRfLnNjcm9sbEludG9WaWV3KCk7CiAgICBjbWRMaW5lXy5zY3JvbGxJbnRvVmlldygpOwogIH0KCiAgcmV0dXJuIHsKICAgIGluaXRGUzogZnVuY3Rpb24ocGVyc2lzdGVudCwgc2l6ZSkgewogICAgICBvdXRwdXQoJzxkaXY+V2VsY29tZSB0byAnICsgZG9jdW1lbnQudGl0bGUgKwogICAgICAgICAgICAgJyEgKHYnICsgVkVSU0lPTl8gKyAnKTwvZGl2PicpOwogICAgICBvdXRwdXQoKG5ldyBEYXRlKCkpLnRvTG9jYWxlU3RyaW5nKCkpOwogICAgICBvdXRwdXQoJzxwPkRvY3VtZW50YXRpb246IHR5cGUgImhlbHAiPC9wPicpOwoKICAgICAgaWYgKCEhIXdpbmRvdy5yZXF1ZXN0RmlsZVN5c3RlbSkgewogICAgICAgIG91dHB1dCgnPGRpdj5Tb3JyeSEgVGhlIEZpbGVTeXN0ZW0gQVBJcyBhcmUgbm90IGF2YWlsYWJsZSBpbiB5b3VyIGJyb3dzZXIuPC9kaXY+Jyk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CgogICAgICB2YXIgdHlwZSA9IHBlcnNpc3RlbnQgPyB3aW5kb3cuUEVSU0lTVEVOVCA6IHdpbmRvdy5URU1QT1JBUlk7CiAgICAgIHdpbmRvdy5yZXF1ZXN0RmlsZVN5c3RlbSh0eXBlLCBzaXplLCBmdW5jdGlvbihmaWxlc3lzdGVtKSB7CiAgICAgICAgZnNfID0gZmlsZXN5c3RlbTsKICAgICAgICBjd2RfID0gZnNfLnJvb3Q7CiAgICAgICAgdHlwZV8gPSB0eXBlOwogICAgICAgIHNpemVfID0gc2l6ZTsKCiAgICAgICAgLy8gSWYgd2UgZ2V0IHRoaXMgZmFyLCBhdHRlbXB0IHRvIGNyZWF0ZSBhIGZvbGRlciB0byB0ZXN0IGlmIHRoZQogICAgICAgIC8vIC0tdW5saW1pdGVkLXF1b3RhLWZvci1maWxlcyBmYWcgaXMgc2V0LgogICAgICAgIGN3ZF8uZ2V0RGlyZWN0b3J5KCd0ZXN0cXVvdGFmb3Jmc2ZvbGRlcicsIHtjcmVhdGU6IHRydWV9LCBmdW5jdGlvbihkaXJFbnRyeSkgewogICAgICAgICAgZGlyRW50cnkucmVtb3ZlKGZ1bmN0aW9uKCkgeyAvLyBJZiBzdWNjZXNzZnVsbHkgY3JlYXRlZCwganVzdCBkZWxldGUgaXQuCiAgICAgICAgICAgIC8vIG5vb3AuCiAgICAgICAgICB9KTsKICAgICAgICB9LCBmdW5jdGlvbihlKSB7CiAgICAgICAgICBpZiAoZS5jb2RlID09IEZpbGVFcnJvci5RVU9UQV9FWENFRURFRF9FUlIpIHsKICAgICAgICAgICAgb3V0cHV0KCdFUlJPUjogV3JpdGUgYWNjZXNzIHRvIHRoZSBGaWxlU3lzdGVtIGlzIHVuYXZhaWxhYmxlLjxicj4nKTsKICAgICAgICAgICAgb3V0cHV0KCdUeXBlICJpbnN0YWxsIiBvciBydW4gQ2hyb21lIHdpdGggdGhlIC0tdW5saW1pdGVkLXF1b3RhLWZvci1maWxlcyBmbGFnLicpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgZXJyb3JIYW5kbGVyXyhlKTsKICAgICAgICAgIH0KICAgICAgICB9KTsKCiAgICAgIH0sIGVycm9ySGFuZGxlcl8pOwogICAgfSwKICAgIG91dHB1dDogb3V0cHV0LAogICAgc2V0VGhlbWU6IHNldFRoZW1lXywKICAgIGdldENtZExpbmU6IGZ1bmN0aW9uKCkgeyByZXR1cm4gY21kTGluZV87IH0sCiAgICBhZGREcm9wcGVkRmlsZXM6IGZ1bmN0aW9uKGZpbGVzKSB7CiAgICAgIHV0aWwudG9BcnJheShmaWxlcykuZm9yRWFjaChmdW5jdGlvbihmaWxlLCBpKSB7CiAgICAgICAgY3dkXy5nZXRGaWxlKGZpbGUubmFtZSwge2NyZWF0ZTogdHJ1ZSwgZXhjbHVzaXZlOiB0cnVlfSwgZnVuY3Rpb24oZmlsZUVudHJ5KSB7CgogICAgICAgICAgLy8gVGVsbCBGU04gdmlzdWFsaXplciB3ZSd2ZSBhZGRlZCBhIGZpbGUuCiAgICAgICAgICBpZiAoZnNuXykgewogICAgICAgICAgICBmc25fLmNvbnRlbnRXaW5kb3cucG9zdE1lc3NhZ2Uoe2NtZDogJ3RvdWNoJywgZGF0YTogZmlsZS5uYW1lfSwgbG9jYXRpb24ub3JpZ2luKTsKICAgICAgICAgIH0KICAgICAgICAgIAogICAgICAgICAgZmlsZUVudHJ5LmNyZWF0ZVdyaXRlcihmdW5jdGlvbihmaWxlV3JpdGVyKSB7CiAgICAgICAgICAgIGZpbGVXcml0ZXIud3JpdGUoZmlsZSk7CiAgICAgICAgICB9LCBlcnJvckhhbmRsZXJfKTsKICAgICAgICB9LCBlcnJvckhhbmRsZXJfKTsKICAgICAgfSk7CiAgICB9LAogICAgdG9nZ2xlM0RWaWV3OiB0b2dnbGUzRFZpZXdfLAogICAgc2VsZWN0RmlsZTogc2VsZWN0RmlsZV8KICB9Cn07Cgo="></script> -->
	<script id="script_terminal_js" >
/*
Copyright 2011 Google Inc.

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

     http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

Author: Eric Bidelman (ericbidelman@chromium.org)
*/

var util = util || {};
util.toArray = function(list) {
  return Array.prototype.slice.call(list || [], 0);
};

// Cross-browser impl to get document's height.
util.getDocHeight = function() {
  var d = document;
  return Math.max(
      Math.max(d.body.scrollHeight, d.documentElement.scrollHeight),
      Math.max(d.body.offsetHeight, d.documentElement.offsetHeight),
      Math.max(d.body.clientHeight, d.documentElement.clientHeight)
  );
};


// TODO(ericbidelman): add fallback to html5 audio.
function Sound(opt_loop) {
  var self_ = this;
  var context_ = null;
  var source_ = null;
  var loop_ = opt_loop || false;

  window.AudioContext = window.AudioContext || window.webkitAudioContext;
  if (window.AudioContext) {
    context_ = new window.AudioContext();
  }

  this.load = function(url, mixToMono, opt_callback) {
    var xhr = new XMLHttpRequest();
    xhr.open('GET', url, true);
    xhr.responseType = 'arraybuffer';
    xhr.onload = function() {
      if (context_) {
        /*self_.sample = context_.createBuffer(this.response, mixToMono);
        if (opt_callback) {
          opt_callback();
        }
        */
        context_.decodeAudioData(this.response, function(audioBuffer) {
          self_.sample = audioBuffer;
          opt_callback && opt_callback();
        }, function(e) {
          console.log(e);
        });
      }
    };
    xhr.send();
  };

  this.play = function() {
    if (context_) {
      source_ = context_.createBufferSource();
      source_.buffer = self_.sample;
      source_.looping = loop_;
      source_.connect(context_.destination);
      source_.noteOn(0);
    }
  };

  this.stop = function() {
    if (source_) {
      source_.noteOff(0);
      source_.disconnect(0);
    }
  };
}

var Terminal = Terminal || function(containerId) {
  window.URL = window.URL || window.webkitURL;
  window.requestFileSystem = window.requestFileSystem ||
                             window.webkitRequestFileSystem;

  const VERSION_ = '1.0.0';
  const CMDS_ = [
    'vi', ':', '/', '?', '3d', 'cat', 'cd', 'cp', 'clear', 'date', 'help', 'install', 'ls', 'mkdir',
    'mv', 'open', 'pwd', 'rm', 'rmdir', 'theme', 'version', 'who', 'wget'
  ];
  const THEMES_ = ['default', 'cream'];

  var fs_ = null;
  var cwd_ = null;
  var history_ = [];
  var histpos_ = 0;
  var histtemp_ = 0;

  var timer_ = null;
  var magicWord_ = null;

  var fsn_ = null;
  var is3D_ = false;

  // Fire worker to return recursive snapshot of current FS tree.
  var worker_ = new Worker('worker.js');
  worker_.onmessage = function(e) {
    var data = e.data;
    if (data.entries) {
      fsn_.contentWindow.postMessage({cmd: 'build', data: data.entries},
                                     window.location.origin);
    }
    if (data.msg) {
      output('<div>' + data.msg + '</div>');
    }
  };
  worker_.onerror = function(e) { console.log(e) };

  // Create terminal and cache DOM nodes;
  var container_ = document.getElementById(containerId);
  container_.insertAdjacentHTML('beforeEnd',
      ['<output></output>',
       '<div id="input-line" class="input-line">',
       '<div class="prompt">$&gt;</div><div><input class="cmdline" autofocus /></div>',
       '</div>'].join(''));
  var cmdLine_ = container_.querySelector('#input-line .cmdline');
  var output_ = container_.querySelector('output');
  var interlace_ = document.querySelector('.interlace');
  var bell_ = new Sound(false);
  bell_.load('beep.mp3', false);

  // Hackery to resize the interlace background image as the container grows.
  output_.addEventListener('DOMSubtreeModified', function(e) {
    var docHeight = util.getDocHeight();
    document.documentElement.style.height = docHeight + 'px';
    //document.body.style.background = '-webkit-radial-gradient(center ' + (Math.round(docHeight / 2)) + 'px, contain, rgba(0,75,0,0.8), black) center center no-repeat, black';
    interlace_.style.height = docHeight + 'px';
    setTimeout(function() { // Need this wrapped in a setTimeout. Chrome is jupming to top :(
      //window.scrollTo(0, docHeight);
      cmdLine_.scrollIntoView();
    }, 0);
    //window.scrollTo(0, docHeight);
  }, false);

  output_.addEventListener('click', function(e) {
    var el = e.target;
    if (el.classList.contains('file') || el.classList.contains('folder')) {
      cmdLine_.value += ' ' + el.textContent;
    }
  }, false);

  window.addEventListener('click', function(e) {
    //if (!document.body.classList.contains('offscreen')) {
      cmdLine_.focus();
    //}
  }, false);

  // Always force text cursor to end of input line.
  cmdLine_.addEventListener('click', inputTextClick_, false);

  // Handle up/down key presses for shell history and enter for new command.
  cmdLine_.addEventListener('keydown', keyboardShortcutHandler_, false);
  cmdLine_.addEventListener('keyup', historyHandler_, false); // keyup needed for input blinker to appear at end of input.
  cmdLine_.addEventListener('keydown', processNewCommand_, false);

  /*window.addEventListener('beforeunload', function(e) {
    return "Don't leave me!";
  }, false);*/

  function inputTextClick_(e) {
    this.value = this.value;
  }

  function keyboardShortcutHandler_(e) {
    // Toggle CRT screen flicker.
    if ((e.ctrlKey || e.metaKey) && e.keyCode == 83) { // crtl+s
      container_.classList.toggle('flicker');
      output('<div>Screen flicker: ' +
             (container_.classList.contains('flicker') ? 'on' : 'off') +
             '</div>');
      e.preventDefault();
      e.stopPropagation();
    }
  }

  function selectFile_(el) {
    alert(el)
  }

  function historyHandler_(e) { // Tab needs to be keydown.

    if (history_.length) {
      if (e.keyCode == 38 || e.keyCode == 40) {
        if (history_[histpos_]) {
          history_[histpos_] = this.value;
        } else {
          histtemp_ = this.value;
        }
      }

      if (e.keyCode == 38) { // up
        histpos_--;
        if (histpos_ < 0) {
          histpos_ = 0;
        }
      } else if (e.keyCode == 40) { // down
        histpos_++;
        if (histpos_ > history_.length) {
          histpos_ = history_.length;
        }
      }

      if (e.keyCode == 38 || e.keyCode == 40) {
        this.value = history_[histpos_] ? history_[histpos_] : histtemp_;
        this.value = this.value; // Sets cursor to end of input.
      }
    }
  }

  function processNewCommand_(e) {

    // Beep on backspace and no value on command line.
    if (!this.value && e.keyCode == 8) {
      bell_.stop();
      bell_.play();
      return;
    }

    if (e.keyCode == 9) { // Tab
      e.preventDefault();
      // TODO(ericbidelman): Implement tab suggest.
    } else if (e.keyCode == 13) { // enter

      // Save shell history.
      if (this.value) {
        history_[history_.length] = this.value;
        histpos_ = history_.length;
      }

      // Duplicate current input and append to output section.
      var line = this.parentNode.parentNode.cloneNode(true);
      line.removeAttribute('id')
      line.classList.add('line');
      var input = line.querySelector('input.cmdline');
      input.autofocus = false;
      input.readOnly = true;
      output_.appendChild(line);

      // Parse out command, args, and trim off whitespace.
      // TODO(ericbidelman): Support multiple comma separated commands.
      if (this.value && this.value.trim()) {
        var args = this.value.split(' ').filter(function(val, i) {
          return val;
        });
        var cmd = args[0].toLowerCase();
        args = args.splice(1); // Remove cmd from arg list.
      }

      switch (cmd) {
        case '3d':
          clear_(this);
          output('Hold on to your butts!');
          toggle3DView_();
          break;
        case 'cat':
          var fileName = args.join(' ');

          if (!fileName) {
            output('usage: ' + cmd + ' filename');
            break;
          }

          read_(cmd, fileName, function(result) {
            output('<pre>' + result + '</pre>');
          });

          break;
        case 'clear':
          clear_(this);
          return;
        case 'date':
          output((new Date()).toLocaleString());
          break;
        case 'exit':
          if (is3D_) {
            toggle3DView_();
          }
          if (timer_ != null) {
            magicWord_.stop();
            clearInterval(timer_);
          }
          break;
        case 'help':
          output('<div class="ls-files">' + CMDS_.join('<br>') + '</div>');
          output('<p>Add files by dragging them from your desktop.</p>');
          break;
        case 'install':
          // Check is installed.
          if (window.chrome && window.chrome.app) {
            if (!window.chrome.app.isInstalled) {
              try {
                chrome.app.install();
              } catch(e) {
                alert(e + '\nEnable is about:flags');
              }
            } else {
              output('This app is already installed.');
            }
          }
          break;
        case 'ls':
          ls_(function(entries) {
            if (entries.length) {
              var html = formatColumns_(entries);
              util.toArray(entries).forEach(function(entry, i) {
                html.push(
                    '<span class="', entry.isDirectory ? 'folder' : 'file',
                    '">', entry.name, '</span><br>');
              });
              html.push('</div>');
              output(html.join(''));
            }
          });
          break;
        case 'pwd':
          output(cwd_.fullPath);
          break;
        case 'cd':
          var dest = args.join(' ') || '/';

          cwd_.getDirectory(dest, {}, function(dirEntry) {
            cwd_ = dirEntry;
            output('<div>' + dirEntry.fullPath + '</div>');

            // Tell FSN visualizer that we're cd'ing.
            if (fsn_) {
              fsn_.contentWindow.postMessage({cmd: 'cd', data: dest}, location.origin);
            }

          }, function(e) { invalidOpForEntryType_(e, cmd, dest); });

          break;
        case 'mkdir':
          var dashP = false;
          var index = args.indexOf('-p');
          if (index != -1) {
            args.splice(index, 1);
            dashP = true;
          }

          if (!args.length) {
            output('usage: ' + cmd + ' [-p] directory<br>');
            break;
          }

          // Create each directory passed as an argument.
          args.forEach(function(dirName, i) {
            if (dashP) {
              var folders = dirName.split('/');

              // Throw out './' or '/' if present on the beginning of our path.
              if (folders[0] == '.' || folders[0] == '') {
                folders = folders.slice(1);
              }

              createDir_(cwd_, folders);
            } else {
              cwd_.getDirectory(dirName, {create: true, exclusive: true}, function() {
                // Tell FSN visualizer that we're mkdir'ing.
                if (fsn_) {
                  fsn_.contentWindow.postMessage({cmd: 'mkdir', data: dirName}, location.origin);
                }
              }, function(e) { invalidOpForEntryType_(e, cmd, dirName); });
            }
          });
          break;
        case 'cp':
        case 'mv':
          var src = args[0];
          var dest = args[1];

          if (!src || !dest) {
            output(['usage: ', cmd, ' source target<br>',
                   '&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;', cmd,
                   ' source directory/'].join(''));
            break;
          }

          var runAction = function(cmd, srcDirEntry, destDirEntry, opt_newName) {
            var newName = opt_newName || null;
            if (cmd == 'mv') {
                srcDirEntry.moveTo(destDirEntry, newName);
              } else {
                srcDirEntry.copyTo(destDirEntry, newName);
              }
          };

          // Moving to a folder? (e.g. second arg ends in '/').
          if (dest[dest.length - 1] == '/') {
            cwd_.getDirectory(src, {}, function(srcDirEntry) {
              // Create blacklist for dirs we can't re-create.
              var create = [
                '.', './', '..', '../', '/'].indexOf(dest) != -1 ? false : true;

              cwd_.getDirectory(dest, {create: create}, function(destDirEntry) {
                runAction(cmd, srcDirEntry, destDirEntry);
              }, errorHandler_);
            }, function(e) {
              // Try the src entry as a file instead.
              cwd_.getFile(src, {}, function(srcDirEntry) {
                cwd_.getDirectory(dest, {}, function(destDirEntry) {
                  runAction(cmd, srcDirEntry, destDirEntry);
                }, errorHandler_);
              }, errorHandler_);
            });
          } else { // Treat src/destination as files.
            cwd_.getFile(src, {}, function(srcFileEntry) {
              srcFileEntry.getParent(function(parentDirEntry) {
                runAction(cmd, srcFileEntry, parentDirEntry, dest);
              }, errorHandler_);
            }, errorHandler_);
          }

          break;
        case 'open':
          var fileName = args.join(' ');

          if (!fileName) {
            output('usage: ' + cmd + ' filename');
            break;
          }

          open_(cmd, fileName, function(fileEntry) {
            var myWin = window.open(fileEntry.toURL(), 'mywin');
          });

          break;
        case 'init':
          if (worker_) {
            worker_.postMessage({cmd: 'init', type: type_, size: size_});
          }
          break;
        case 'rm':
          // Remove recursively? If so, remove the flag(s) from the arg list.
          var recursive = false;
          ['-r', '-f', '-rf', '-fr'].forEach(function(arg, i) {
            var index = args.indexOf(arg);
            if (index != -1) {
              args.splice(index, 1);
              recursive = true;
            }
          });

          // Remove each file passed as an argument.
          args.forEach(function(fileName, i) {
            cwd_.getFile(fileName, {}, function(fileEntry) {
              fileEntry.remove(function() {
                // Tell FSN visualizer that we're rm'ing.
                if (fsn_) {
                  fsn_.contentWindow.postMessage({cmd: 'rm', data: fileName}, location.origin);
                }
              }, errorHandler_);
            }, function(e) {
              if (recursive && e.code == FileError.TYPE_MISMATCH_ERR) {
                cwd_.getDirectory(fileName, {}, function(dirEntry) {
                  dirEntry.removeRecursively(null, errorHandler_);
                }, errorHandler_);
              } else if (e.code == FileError.INVALID_STATE_ERR) {
                output(cmd + ': ' + fileName + ': is a directory<br>');
              } else {
                errorHandler_(e);
              }
            });
          });
          break;
        case 'rmdir':
          // Remove each directory passed as an argument.
          args.forEach(function(dirName, i) {
            cwd_.getDirectory(dirName, {}, function(dirEntry) {
              dirEntry.remove(function() {
                // Tell FSN visualizer that we're rmdir'ing.
                if (fsn_) {
                  fsn_.contentWindow.postMessage({cmd: 'rm', data: dirName}, location.origin);
                }
              }, function(e) {
                if (e.code == FileError.INVALID_MODIFICATION_ERR) {
                  output(cmd + ': ' + dirName + ': Directory not empty<br>');
                } else {
                  errorHandler_(e);
                }
              });
            }, function(e) { invalidOpForEntryType_(e, cmd, dirName); });
          });
          break;
        case 'sudo':
          if (timer_ != null) {
            magicWord_.stop();
            clearInterval(timer_);
          }
          if (!magicWord_) {
            magicWord_ = new Sound(true);
            magicWord_.load('magic_word.mp3', false, function() {
              magicWord_.play();
            });
          } else {
            magicWord_.play();
          }
          timer_ = setInterval(function() {
            output("<div>YOU DIDN'T SAY THE MAGIC WORD!</div>");
          }, 100);
          break;
        case 'theme':
          var theme = args.join(' ');
          if (!theme) {
            output(['usage: ', cmd, ' ' + THEMES_.join(',')].join(''));
          } else {
            if (THEMES_.indexOf(theme) != -1) {
              setTheme_(theme);
            } else {
              output('Error - Unrecognized theme used');
            }
          }
          break;

        case 'vi':
        case 'vi':
		alert( "vi" );
//        output(VERSION_);
          break;

        case ':':
		alert( ":" );
		break;

        case '/':
		alert( "/" );
		break;

        case '?':
		alert( "?" );
		break;














        case 'version':
        case 'ver':
          output(VERSION_);
          break;
        case 'wget':
          var url = args[0];
          if (!url) {
            output(['usage: ', cmd, ' missing URL'].join(''));
            break;
          } else if (url.search('^http://') == -1) {
            url = 'http://' + url;
          }
          var xhr = new XMLHttpRequest();
          xhr.onload = function(e) {
            if (this.status == 200 && this.readyState == 4) {
              output('<textarea>' + this.response + '</textarea>');
            } else {
              output('ERROR: ' + this.status + ' ' + this.statusText);
            }
          };
          xhr.onerror = function(e) {
            output('ERROR: ' + this.status + ' ' + this.statusText);
            output('Could not fetch ' + url);
          };
          xhr.open('GET', url, true);
          xhr.send();
          break;
        case 'who':
          output(document.title +
                 ' - By: jkwii &ltadminiwii@ko0.us&gt & Eric Bidelman &lt;ericbidelman@chromium.org&gt;');
          break;
        default:
          if (cmd) {
            output(cmd + ': command not found');
          }
      };

      this.value = ''; // Clear/setup line for next input.
    }
  }

  function formatColumns_(entries) {
    var maxName = entries[0].name;
    util.toArray(entries).forEach(function(entry, i) {
      if (entry.name.length > maxName.length) {
        maxName = entry.name;
      }
    });

    // If we have 3 or less entries, shorten the output container's height.
    // 15px height with a monospace font-size of ~12px;
    var height = entries.length == 1 ? 'height: ' + (entries.length * 30) + 'px;' :
                 entries.length <= 3 ? 'height: ' + (entries.length * 18) + 'px;' : '';

    // ~12px monospace font yields ~8px screen width.
    var colWidth = maxName.length * 16;//;8;

    return ['<div class="ls-files" style="-webkit-column-width:',
            colWidth, 'px;', height, '">'];
  }

  function invalidOpForEntryType_(e, cmd, dest) {
    if (e.code == FileError.NOT_FOUND_ERR) {
      output(cmd + ': ' + dest + ': No such file or directory<br>');
    } else if (e.code == FileError.INVALID_STATE_ERR) {
      output(cmd + ': ' + dest + ': Not a directory<br>');
    } else if (e.code == FileError.INVALID_MODIFICATION_ERR) {
      output(cmd + ': ' + dest + ': File already exists<br>');
    } else {
      errorHandler_(e);
    }
  }

  function errorHandler_(e) {
    var msg = '';
    switch (e.code) {
      case FileError.QUOTA_EXCEEDED_ERR:
        msg = 'QUOTA_EXCEEDED_ERR';
        break;
      case FileError.NOT_FOUND_ERR:
        msg = 'NOT_FOUND_ERR';
        break;
      case FileError.SECURITY_ERR:
        msg = 'SECURITY_ERR';
        break;
      case FileError.INVALID_MODIFICATION_ERR:
        msg = 'INVALID_MODIFICATION_ERR';
        break;
      case FileError.INVALID_STATE_ERR:
        msg = 'INVALID_STATE_ERR';
        break;
      default:
        msg = 'Unknown Error';
        break;
    };
    output('<div>Error: ' + msg + '</div>');
  }

  function createDir_(rootDirEntry, folders, opt_errorCallback) {
    var errorCallback = opt_errorCallback || errorHandler_;

    rootDirEntry.getDirectory(folders[0], {create: true}, function(dirEntry) {

      // Recursively add the new subfolder if we still have a subfolder to create.
      if (folders.length) {
        createDir_(dirEntry, folders.slice(1));
      }
    }, errorCallback);
  }

  function open_(cmd, path, successCallback) {
    if (!fs_) {
      return;
    }

    cwd_.getFile(path, {}, successCallback, function(e) {
      if (e.code == FileError.NOT_FOUND_ERR) {
        output(cmd + ': ' + path + ': No such file or directory<br>');
      }
    });
  }

  function read_(cmd, path, successCallback) {
    if (!fs_) {
      return;
    }

    cwd_.getFile(path, {}, function(fileEntry) {
      fileEntry.file(function(file) {
        var reader = new FileReader();

        reader.onloadend = function(e) {
          successCallback(this.result);
        };

        reader.readAsText(file);
      }, errorHandler_);
    }, function(e) {
      if (e.code == FileError.INVALID_STATE_ERR) {
        output(cmd + ': ' + path + ': is a directory<br>');
      } else if (e.code == FileError.NOT_FOUND_ERR) {
        output(cmd + ': ' + path + ': No such file or directory<br>');
      }
    });
  }

  function ls_(successCallback) {
    if (!fs_) {
      return;
    }

    // Read contents of current working directory. According to spec, need to
    // keep calling readEntries() until length of result array is 0. We're
    // guarenteed the same entry won't be returned again.
    var entries = [];
    var reader = cwd_.createReader();

    var readEntries = function() {
      reader.readEntries(function(results) {
        if (!results.length) {
          entries = entries.sort();
          successCallback(entries);
        } else {
          entries = entries.concat(util.toArray(results));
          readEntries();
        }
      }, errorHandler_);
    };

    readEntries();
  }

  function clear_(input) {
    output_.innerHTML = '';
    input.value = '';
    document.documentElement.style.height = '100%';
    interlace_.style.height = '100%';
  }

  function setTheme_(theme) {
    var currentUrl = document.location.pathname;

    if (!theme || theme == 'default') {
      //history.replaceState({}, '', currentUrl);
      localStorage.removeItem('theme');
      document.body.className = '';
      return;
    }

    if (theme) {
      document.body.classList.add(theme);
      localStorage.theme = theme;
      //history.replaceState({}, '', currentUrl + '#theme=' + theme);
    }
  }

  function toggle3DView_() {
    var body = document.body;
    body.classList.toggle('offscreen');

    is3D_ = !is3D_;

    if (body.classList.contains('offscreen')) {

      container_.style.webkitTransform =
          'translateY(' + (util.getDocHeight() - 175) + 'px)';

      var transEnd_ = function(e) {
        var iframe = document.createElement('iframe');
        iframe.id = 'fsn';
        iframe.src = '../fsn/fsn_proto.html';

        fsn_ = body.insertBefore(iframe, body.firstElementChild);

        iframe.contentWindow.onload = function() {
          worker_.postMessage({cmd: 'read', type: type_, size: size_});
        }
        container_.removeEventListener('webkitTransitionEnd', transEnd_, false);
      };
      container_.addEventListener('webkitTransitionEnd', transEnd_, false);
    } else {
      container_.style.webkitTransform = 'translateY(0)';
      body.removeChild(fsn_);
      fsn_ = null;
    }
  }

  function output(html) {
    output_.insertAdjacentHTML('beforeEnd', html);
    //output_.scrollIntoView();
    cmdLine_.scrollIntoView();
  }

			return {
				initFS: function(persistent, size) {
				output('<div>koterm: ' + document.title +
				'! (v' + VERSION_ + ')</div>');
				output((new Date()).toLocaleString());
				output('<p>quickref: type "help"</p>');

				if (!!!window.requestFileSystem) {
					output('<div>MSG_9000 unauthorized access logged terminal disabled</div>');
					return;
					}

      var type = persistent ? window.PERSISTENT : window.TEMPORARY;
      window.requestFileSystem(type, size, function(filesystem) {
        fs_ = filesystem;
        cwd_ = fs_.root;
        type_ = type;
        size_ = size;

        // If we get this far, attempt to create a folder to test if the
        // --unlimited-quota-for-files fag is set.
        cwd_.getDirectory('testquotaforfsfolder', {create: true}, function(dirEntry) {
          dirEntry.remove(function() { // If successfully created, just delete it.
            // noop.
          });
        }, function(e) {
          if (e.code == FileError.QUOTA_EXCEEDED_ERR) {
            output('ERROR: Write access to the FileSystem is unavailable.<br>');
            output('Type "install" or run Chrome with the --unlimited-quota-for-files flag.');
          } else {
            errorHandler_(e);
          }
        });

      }, errorHandler_);
    },
    output: output,
    setTheme: setTheme_,
    getCmdLine: function() { return cmdLine_; },
    addDroppedFiles: function(files) {
      util.toArray(files).forEach(function(file, i) {
        cwd_.getFile(file.name, {create: true, exclusive: true}, function(fileEntry) {

          // Tell FSN visualizer we've added a file.
          if (fsn_) {
            fsn_.contentWindow.postMessage({cmd: 'touch', data: file.name}, location.origin);
          }
          
          fileEntry.createWriter(function(fileWriter) {
            fileWriter.write(file);
          }, errorHandler_);
        }, errorHandler_);
      });
    },
    toggle3DView: toggle3DView_,
    selectFile: selectFile_
  }
};


		</script>
	<script>
		function toggleHelp() {
			document.querySelector('.help').classList.toggle('hidden');
			document.body.classList.toggle('dim');
			}

		(function() {
			var term = new Terminal('container');
			term.initFS(false, 1024 * 1024);

			if (document.location.hash) {
    var theme = document.location.hash.substring(1).split('=')[1];
    term.setTheme(theme);
  } else if (localStorage.theme) {
    term.setTheme(localStorage.theme);
  }

  document.body.addEventListener('keydown', function(e) {
	if (e.keyCode == 'h' ) { // help
		toggleHelp();
		e.stopPropagation();
		e.preventDefault();
		}

	if (e.keyCode == 27) { // Esc
		alert( "esc" );
//		toggleHelp();
		e.stopPropagation();
		e.preventDefault();
		}
	if (e.keyCode == ":" ) { // colon
		alert( ":" );
		}
	if (e.keyCode == "/" ) { // slash
		alert( "/" );
		}
	if (e.keyCode == "?" ) { // question
		alert( "?" );
		}

	}, false);

  // Setup the DnD listeners for file drop.
  document.body.addEventListener('dragenter', function(e) {
    e.stopPropagation();
    e.preventDefault();
    this.classList.add('dropping');
  }, false);

  document.body.addEventListener('dragover', function(e) {
    e.stopPropagation();
    e.preventDefault();
    e.dataTransfer.dropEffect = 'copy'; // Explicitly show this is a copy.
  }, false);

  document.body.addEventListener('dragleave', function(e) {
   this.classList.remove('dropping');
  }, false);
  
  document.body.addEventListener('drop', function(e) {
    e.stopPropagation();
    e.preventDefault();
    this.classList.remove('dropping');
    term.addDroppedFiles(e.dataTransfer.files);
    term.output('<div>File(s) added!</div>');
  }, false);
})();
		</script>


	<div id="div_csv">
	<style type="text/css">
		body {
			font-family: Arial;
			font-size: 10pt;
			}
		table {
			border: 1px solid #ccc;
			}
		table th {
			background-color: #F7F7F7;
			color: #333;
			font-weight: bold;
			}
		table th, table td {
			padding: 5px;
			border-color: #ccc;
			}
		</style>
	
	<script type="text/javascript">
		function Upload() {
			var fileUpload = document.getElementById("fileUpload");
			var regex = /^([a-zA-Z0-9\s_\\.\-:])+(.csv|.txt|.psv|.py|.htm|.html|.php)$/;
			if (regex.test(fileUpload.value.toLowerCase())) {
				if (typeof (FileReader) != "undefined") {
					var reader = new FileReader();
					reader.onload = function (e) {
						var table = document.createElement("table");
						var rows = e.target.result.split("\n");
						for (var i = 0; i < rows.length; i++) {
							var row = table.insertRow(-1);
					
//							var cells = rows[i].split("|");
							var cells = rows[i].split(",");
							for (var j = 0; j < cells.length; j++) {
								var cell = row.insertCell(-1);
								cell.innerHTML = cells[j];
								}
							}
						var csv2tbl = document.getElementById("csv2tbl");
						csv2tbl.innerHTML = "";
						csv2tbl.appendChild(table);
						}
					reader.readAsText(fileUpload.files[0]);
					} 
				else {
					alert("csv2tbl warn:  unauthorized access noted");
					}
				} 
			else {
				alert("csv2tbl fail:  unsuppoted format");
				}
			}
			</script>



				<input id="fileUpload" type="file">
<!--				<input id="upload" value="Upload" onclick="Upload()" type="button"> -->
				</div>
			<div id="csv2tbl"> </div>
<!--        		<button type="button" id="fileUpload" type="file" >select</button> -->
        		<button type="button" id="upload" value="Upload" onclick="Upload()">.txt.csv.psv</button>
<!--	</div> </div> -->
<!--	<div id="div_showhide" hidden> -->
	<div id="div_showhide_b" ><h1>div_showhide_b</h1></div>
	<div id="div_hideshow_b" ><h1>div_hideshow_b</h1></div>
	<hr color=black>
	<hr color=white>
	<div id="div_blobs" ><h1>div_blobs</h1></div>
	<hr color=white>
	<div id="div_bbwii" ><h1>div_bbwii</h1></div>
	<hr color=white>
	<hr color=black>
zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz
		<script id="script_showhide" >
			function show_files() {
				var div_files = document.getElementbyID("div_files");
				div_files.show();
				}
			function hide_files() {
				var div_files = document.getElementbyID("div_files");
				div_files.hide();
				}
			</script>

<div id="div_av"><h1>div_av</h1></div>
<div id="div_bb"><h1>div_dd</h1></div>
<div id="div_dd"><h1>div_dd</h1></div>
<div id="div_fb"><h1>div_fb</h1></div>
<div id="div_pn"><h1>div_pn</h1></div>
<div id="div_sl"><h1>div_sl</h1></div>
<div id="div_tl"><h1>div_tl</h1></div>
<div id="div_tm"><h1>div_tm</h1></div>
<div id="div_us"><h1>div_us</h1></div>
<div id="div_yt"><h1>div_yt</h1></div>
<div id="div_zm"><h1>div_zm</h1></div>
<div id="div_jtfdcr"><h1>div_jtfdcr</h1></div>
<div id="div_jtfdc"><h1>div_jtfdc</h1></div>
<div id="div_jtfinc"><h1>div_jtfinc</h1></div>
<div id="div_head"><h1>div_head</h1></div>
<div id="div_body"><h1>div_body</h1></div>
<div id="div_memes"><h1>div_memes</h1></div>
<div id="div_kov"><h1>div_kovs</h1></div>
<div id="div_tail"><h1>div_tail</h1></div>
	<br><br><br><br>
	<div id="div_buttons_hideshow_m">
		<img src="/imgs/btn/koeye_alloff.png" height=50 onclick="script_hideshow('alloff');return false;" alt="btn_alloff">
		<img src="/imgs/btn/koeye.png" height=50 onclick="script_hideshow('toggle');return false;" alt="btn_alloff">
		<img src="/imgs/btn/koeye_allon.png" height=50 onclick="script_hideshow('allon');return false;" alt="btn_allon">
		<br><br><br>
		<img src="/imgs/btn/koeye_alloff.png" height=50 onclick="script_hideshow('alloff');return false;" alt="btn_alloff">
		<img src="/imgs/btn/koeye.png" height=50 onclick="script_hideshow('toggle');return false;" alt="btn_alloff">
		<img src="/imgs/btn/koeye_allon.png" height=50 onclick="script_hideshow('allon');return false;" alt="btn_allon">
		<br>
		<hr color=white>
		<hr color=black>
<!--		<img src="/imgs/btn/koeyew_slots.png" height=50 onclick="script_hideshow('div_slots');return false;" alt="btn_slots"> -->
<!--		<img src="/imgs/btn/koeyew_hl.png" height=50 onclick="script_hideshow('div_hl');return false;" alt="btn_hl"> -->
<!--		<img src="/imgs/btn/koeyew_hllinks.png" height=50 onclick="script_hideshow('div_hllinks');return false;" alt="btn_hllinks"> -->
<!--		<img src="/imgs/btn/koeyew_hltext.png" height=50 onclick="script_hideshow('div_hltext');return false;" alt="btn_hltext"> -->
<!--		<img src="/imgs/btn/koeyew_hlmedia.png" height=50 onclick="script_hideshow('div_hltext');return false;" alt="btn_hlmedia"> -->
<!--		<img src="/imgs/btn/koeyew_games.png" height=50 onclick="script_hideshow('div_games');return false;" alt="btn_games"> -->
		<img src="/imgs/btn/koeyew_av_jtfdc.png" height=50 onclick="script_hideshow('div_av_jtfdc');return false;" alt="btn_av_jtfdc">
		<img src="/imgs/btn/koeyew_av_jtfinc.png" height=50 onclick="script_hideshow('div_av_jtfinc');return false;" alt="btn_av_jtfinc">
		<img src="/imgs/btn/koeyew_av_jtfdcr.png" height=50 onclick="script_hideshow('div_av_jtfdcr');return false;" alt="btn_av_jtfdcr">
		<br>
		<img src="/imgs/btn/koeyew_av.png" height=50 onclick="script_hideshow('div_av');return false;" alt="btn_av">
		<img src="/imgs/btn/koeyew_bb.png" height=50 onclick="script_hideshow('div_db');return false;" alt="btn_db">
		<img src="/imgs/btn/koeyew_dd.png" height=50 onclick="script_hideshow('div_dd');return false;" alt="btn_dd">
		<img src="/imgs/btn/koeyew_fb.png" height=50 onclick="script_hideshow('div_fb');return false;" alt="btn_fb">
<!--		<img src="/imgs/btn/koeyew_fs.png" height=50 onclick="script_hideshow('div_fs');return false;" alt="btn_fs"> -->
		<img src="/imgs/btn/koeyew_pn.png" height=50 onclick="script_hideshow('div_pn');return false;" alt="btn_pn">
		<img src="/imgs/btn/koeyew_sl.png" height=50 onclick="script_hideshow('div_sl');return false;" alt="btn_sl">
		<img src="/imgs/btn/koeyew_tl.png" height=50 onclick="script_hideshow('div_tl');return false;" alt="btn_tl">
		<br>
		<img src="/imgs/btn/koeyew_tm.png" height=50 onclick="script_hideshow('div_tm');return false;" alt="btn_tm">
		<img src="/imgs/btn/koeyew_us.png" height=50 onclick="script_hideshow('div_us');return false;" alt="btn_us">
		<img src="/imgs/btn/koeyew_yt.png" height=50 onclick="script_hideshow('div_yt');return false;" alt="btn_yt">
		<img src="/imgs/btn/koeyew_zm.png" height=50 onclick="script_hideshow('div_zm');return false;" alt="btn_zm">
		<br>
		<img src="/imgs/btn/koeyew_jtfdc.png" height=50 onclick="script_hideshow('div_jtfdc');return false;" alt="btn_jtfdc">
		<img src="/imgs/btn/koeyew_jtfinc.png" height=50 onclick="script_hideshow('div_jtfinc');return false;" alt="btn_jtfinc">
		<img src="/imgs/btn/koeyew_jtfdcr.png" height=50 onclick="script_hideshow('div_jtfdcr');return false;" alt="btn_jtfdcr">
		<br>
		<img src="/imgs/btn/koeyew_head.png" height=50 onclick="script_hideshow('div_head');return false;" alt="btn_head">
		<img src="/imgs/btn/koeyew_body.png" height=50 onclick="script_hideshow('div_body');return false;" alt="btn_body">
		<img src="/imgs/btn/koeyew_memes.png" height=50 onclick="script_hideshow('div_memes');return false;" alt="btn_memes">
		<img src="/imgs/btn/koeyew_kov.png" height=50 onclick="script_hideshow('div_kov');return false;" alt="btn_kov">
		<img src="/imgs/btn/koeyew_tail.png" height=50 onclick="script_hideshow('div_tail');return false;" alt="btn_tail">
		</div>

	yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy
		<div id="div_htmbugs" hidden><h1>div_htmbugs</h1></div>
	zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz
	<hr color=black>
	<hr color=black>
	<hr color=black>
	<hr color=black>
	<hr color=black>
	<hr color=black>
	<hr color=blue>
	<hr color=white>
	<hr color=red>

	<div id="div_jaxgrid" >
		<h1>div_jaxgrid</h1>

		</div>
	<br><br><br><br>
	<br><br><br><br>
	<img id="img_jaxgrid" src="imgs/gif/gif_202004/giphy_onoff_grid_candls.gif" onclick="jaxgrid('');return false;" height=100>
	<br><br><br><br>
	<br><br><br><br>
	<img id="img_jaxgrid" src="imgs/gif/gif_202004/giphy_onoff_grid_candls.gif" onclick="jaxgrid1('');return false;" height=100>

	<script id="script_jaxgrid" >
		function jaxgrid(args) {
//			alert( "BUGS_10000 jaxgrid args="+args );
			htmout_head = "";
			htmout_head += '<div id="div_jaxgrid">';
			htmout_head += '	<h1>div_jaxgrid</h1>';
			if( document.getElementById("div_jaxgrid")) {
				document.getElementById("div_jaxgrid").innerHTML = htmout_head;
				}
//			divids = kolists['divids'].split(" ");
			divids = "av fb pn sl tl us yt zm".split(" ");
			divids_len=divids.length;
//			alert( "BUGS_10001 len="+divids_len+" divids="+divids )
			var j=0;
			for( j=0; j<divids_len; j++ ) {
				divid=divids[j];
				if( /alloff/.test(divid)) {continue; }
				if( /allon/.test(divid)) { continue; }
				if( /toggle/.test(divid)) { continue; }
				if( /</.test(divid)) { htmout += divid; continue;}

				canvas_id = "canvas_jax_"+divid;
				img_id = "img_jax_"+divid;
//				alert( "BUGS_10011 canvas_id="+canvas_id );
				htmout_img = "";
				htmout_img += '<img id="'+img_id+'" ';
				htmout_img += ' src="/imgs/btn/kow.png" ';
				htmout_img += '	onclick="jaxgrid1(\''+img_id+'\');return false;" ';
				htmout_img += '	height=50>';
//				alert( "BUGS_10012 htmout_img="+htmout_img );

				htmout_canvas = "";
				htmout_canvas += '<canvas id="'+canvas_id+'" ';
				htmout_canvas += ' onclick="jaxgrid1(\''+canvas_id+'\');return false;" ';
				htmout_canvas += ' height=100 width=200 >';
				htmout_canvas += ' </canvas>';
//				htmout = htmout_img+htmout_canvas;
				htmout = htmout_canvas;

//				alert( "BUGS_10013 htmout_canvas="+htmout_canvas );
//				alert( "BUGS_10012 canvas_id="+canvas_id );

				if( document.getElementById("div_jaxgrid")) {
//					alert( "BUGS_10015 htmout="+htmout );
					document.getElementById("div_jaxgrid").insertAdjacentHTML("beforeend", htmout);
					}

//				alert( "BUGS_10050 canvas_id="+canvas_id );
				imgsrc="/imgs/btn/kob.png";
//				alert( "BUGS_10051 imgsrc="+imgsrc );

//				var my_gradient = ctx.createLinearGradient(0, 0, 0, 170);
//				my_gradient.addColorStop(0, "black");
//				my_gradient.addColorStop(1, "white");



				var img = new Image();
				imgsrc="/imgs/btn/kob.png";
				img.src = imgsrc;
				if( document.getElementById(canvas_id)) {
					ctx=document.getElementById(canvas_id).getContext('2d');
//					ctx.fillStyle = my_gradient;
					ctx.fillStyle="wheat";
					ctx.drawImage(img, 0, 0);
					ctx.font = '18px yokkmokkOT';
					ctx.fillStyle="wheat";
					ctx.fillRect(0,0,200,100);
					ctx.fillStyle="black";
					ctx.fillText(divid,10,10);
					}

//				alert( "BUGS_10055 htmout_canvas="+htmout_canvas );
//				htmout += 'j='+j+' divid='+divid+'<br>';
				}

			htmout_tail = "	</div>";
			document.getElementById("div_jaxgrid").insertAdjacentHTML("beforeend", htmout_tail );
//			document.getElementById('div_jaxgrid').innerHTML=htmout_tail;
			}
		</script>

	<script id="script_jaxgrid1" >
		function jaxgrid1(args) {
			alert( "BUGS_20002 jaxgrid2 args="+args );
			divid=args;
			return(args);
			}
		</script>

	<script id="script_jaxgrid2" >
		function jaxgrid2(args) {
			alert( "BUGS_20002 jaxgrid1 args="+args );
			divid=args;
			var htmout = "";
			alert( "BUG_20000 jaxgrid1 divid="+divid );
			jaxurl="/txt/"+divid+".txt";
			list=""; list_len=0;
			if( filecheck(jaxurl)) {
				jax(jaxurl);
				list=kolists('jax').split("\n");
				list_len=list.length;
				}
			canvasid="canvas_jax_"+divid;
			if( document.getElementById(canvasid)) {
				var ctx=document.getElementById(canvasid)).getContext('2d');
				ctx.fillStyle="black';
				ctx.fillText(divid,10,10);
				ctx.fillText(list_len,20,20);
				}
				
			htmout += '<canvas id="canvas_jax_'+divid+'" ';
			return(args);
			}
		</script>

	</body>
	</html>
//


koh5_pano



Your browser does not support the HTML5 canvas element.


Drag mouse to navigate.

Navigation





17.Aug.2010, Martin Wengenmayer