DIR : /home/kozerus/public_html/js/turnjs4/b64_turnjs4_zoom_js.txt /home/kozerus/public_html/js/turnjs4 LyoqCiAqIHpvb20uanMKICogd3d3LnR1cm5qcy5jb20KICogdHVybmpzLmNvbS9saWNlbnNlLnR4dAogKgogKiBDb3B5cmlnaHQgKEMpIDIwMTIgRW1tYW51ZWwgR2FyY2lhCiAqKi8KCihmdW5jdGlvbigkKSB7CgondXNlIHN0cmljdCc7Cgp2YXIgaGFzM2QsCgp6b29tT3B0aW9ucyA9IHsKICBtYXg6IDIsCiAgZmxpcGJvb2s6IG51bGwsCiAgZWFzZUZ1bmN0aW9uOiAnZWFzZS1pbi1vdXQnLAogIGR1cmF0aW9uOiA1MDAsCiAgd2hlbjoge30KfSwKCnpvb21NZXRob2RzID0gewogIGluaXQ6IGZ1bmN0aW9uKG9wdHMpIHsKCiAgICB2YXIgdGhhdCA9IHRoaXMsCiAgICBkYXRhID0gdGhpcy5kYXRhKCksCiAgICBvcHRpb25zID0gJC5leHRlbmQoe30sIHpvb21PcHRpb25zLCBvcHRzKTsKCiAgICBpZiAoIW9wdGlvbnMuZmxpcGJvb2sgfHwgIW9wdGlvbnMuZmxpcGJvb2sudHVybignaXMnKSkgewogICAgICB0aHJvdyBlcnJvcignb3B0aW9ucy5mbGlwYm9vayBpcyByZXF1aXJlZCcpOwogICAgfQoKICAgIGhhczNkID0gJ1dlYktpdENTU01hdHJpeCcgaW4gd2luZG93IHx8ICdNb3pQZXJzcGVjdGl2ZScgaW4gZG9jdW1lbnQuYm9keS5zdHlsZTsKCiAgICBpZiAodHlwZW9mKG9wdGlvbnMubWF4KSE9J2Z1bmN0aW9uJykgewogICAgICB2YXIgbWF4ID0gb3B0aW9ucy5tYXg7CiAgICAgIG9wdGlvbnMubWF4ID0gZnVuY3Rpb24oKSB7IHJldHVybiBtYXg7IH07CiAgICB9CgogICAgZGF0YS56b29tID0gewogICAgICBvcHRzOiBvcHRpb25zLAogICAgICBheGlzOiBwb2ludDJEKDAsIDApLAogICAgICBzY3JvbGxQb3M6IHBvaW50MkQoMCwgMCksCiAgICAgIGV2ZW50UXVldWU6IFtdLAogICAgICBtb3VzZXVwRXZlbnQ6IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiB6b29tTWV0aG9kcy5fZU1vdXNlVXAuYXBwbHkodGhhdCwgYXJndW1lbnRzKTsKICAgICAgfSwKICAgICAgZXZlbnRUb3VjaFN0YXJ0OiBiaW5kKHpvb21NZXRob2RzLl9lVG91Y2hTdGFydCwgdGhhdCksCiAgICAgIGV2ZW50VG91Y2hNb3ZlOiBiaW5kKHpvb21NZXRob2RzLl9lVG91Y2hNb3ZlLCB0aGF0KSwKICAgICAgZXZlbnRUb3VjaEVuZDogYmluZCh6b29tTWV0aG9kcy5fZVRvdWNoRW5kLCB0aGF0KSwKICAgICAgZmxpcGJvb2tFdmVudHM6IHsKICAgICAgICB6b29taW5nOiBiaW5kKHpvb21NZXRob2RzLl9lWm9vbSwgdGhhdCksCiAgICAgICAgcHJlc3NlZDogYmluZCh6b29tTWV0aG9kcy5fZVByZXNzZWQsIHRoYXQpLAogICAgICAgIHJlbGVhc2VkOiBiaW5kKHpvb21NZXRob2RzLl9lUmVsZWFzZWQsIHRoYXQpLAogICAgICAgIHN0YXJ0OiBiaW5kKHpvb21NZXRob2RzLl9lU3RhcnQsIHRoYXQpLAogICAgICAgIHR1cm5pbmc6IGJpbmQoem9vbU1ldGhvZHMuX2VUdXJuaW5nLCB0aGF0KSwKICAgICAgICB0dXJuZWQ6IGJpbmQoem9vbU1ldGhvZHMuX2VUdXJuZWQsIHRoYXQpLAogICAgICAgIGRlc3Ryb3lpbmc6IGJpbmQoem9vbU1ldGhvZHMuX2VEZXN0cm95aW5nLCB0aGF0KQogICAgICB9CiAgICB9OwoKICAgIGZvciAodmFyIGV2ZW50TmFtZSBpbiBvcHRpb25zLndoZW4pIHsKICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvcHRpb25zLndoZW4sIGV2ZW50TmFtZSkpIHsKICAgICAgICB0aGlzLmJpbmQoJ3pvb20uJytldmVudE5hbWUsIG9wdGlvbnMud2hlbltldmVudE5hbWVdKTsKICAgICAgfQogICAgfQoKICAgIGZvciAoZXZlbnROYW1lIGluIGRhdGEuem9vbS5mbGlwYm9va0V2ZW50cykgewogICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGRhdGEuem9vbS5mbGlwYm9va0V2ZW50cywgZXZlbnROYW1lKSkgewogICAgICAgIG9wdGlvbnMuZmxpcGJvb2suYmluZChldmVudE5hbWUsIGRhdGEuem9vbS5mbGlwYm9va0V2ZW50c1tldmVudE5hbWVdKTsKICAgICAgfQogICAgfQoKICAgIHRoaXMuY3NzKHsKICAgICAgcG9zaXRpb246ICdyZWxhdGl2ZScsCiAgICAgIG92ZXJmbG93IDogJ2hpZGRlbicKICAgIH0pOwoKICAgIGlmICgkLmlzVG91Y2gpIHsKCiAgICAgIG9wdGlvbnMuZmxpcGJvb2suCiAgICAgICAgYmluZCgndG91Y2hzdGFydCcsIGRhdGEuem9vbS5ldmVudFRvdWNoU3RhcnQgKS4KICAgICAgICBiaW5kKCd0b3VjaG1vdmUnLCBkYXRhLnpvb20uZXZlbnRUb3VjaE1vdmUpLgogICAgICAgIGJpbmQoJ3RvdWNoZW5kJywgZGF0YS56b29tLmV2ZW50VG91Y2hFbmQpOwoKICAgICAgdGhpcy5iaW5kKCd0b3VjaHN0YXJ0Jywgem9vbU1ldGhvZHMuX3RhcCk7CgogICAgfSBlbHNlIHsKICAgICAgdGhpcy5tb3VzZWRvd24oem9vbU1ldGhvZHMuX21vdXNlZG93bikuCiAgICAgICAgY2xpY2soem9vbU1ldGhvZHMuX3RhcCk7CiAgICB9CiAgfSwKCiAgX3RhcDogZnVuY3Rpb24oZXZlbnQpIHsKICAgIAogICAgdmFyIHRoYXQgPSAkKHRoaXMpLAogICAgICBkYXRhID0gdGhhdC5kYXRhKCkuem9vbSwKICAgICAgZmxpcCA9IGRhdGEub3B0cy5mbGlwYm9vazsKCiAgICBpZiAoZGF0YS5kcmFnZ2luZ0Nvcm5lciB8fCBkYXRhLmRyYWdnaW5nKSB7CiAgICAgIHJldHVybjsKICAgIH0KCiAgICBpZiAoaXNQYWdlKCQoZXZlbnQudGFyZ2V0KSwgdGhhdCkpIHsKCiAgICAgIHpvb21NZXRob2RzLl9hZGRFdmVudC5jYWxsKHRoYXQsICd0YXAnLCBldmVudCk7CiAgICAgIAogICAgICB2YXIgc2VjdWVuY2UgPSB6b29tTWV0aG9kcy5fZXZlbnRTZXEuY2FsbCh0aGF0KTsKCiAgICAgIGlmIChzZWN1ZW5jZSkKICAgICAgICB0aGF0LnRyaWdnZXIoc2VjdWVuY2UpOwoKICAgIH0KCiAgfSwKCiAgX2FkZEV2ZW50OiBmdW5jdGlvbihldmVudE5hbWUsIGV2ZW50KSB7CiAgICAKICAgIHZhciBkYXRhID0gdGhpcy5kYXRhKCkuem9vbSwKICAgICAgdGltZSA9IChuZXcgRGF0ZSgpKS5nZXRUaW1lKCksCiAgICAgIGV2ZW50T2JqZWN0ID0ge25hbWU6IGV2ZW50TmFtZSwgdGltZXN0YW1wOiB0aW1lLCBldmVudDogZXZlbnR9OwoKICAgIGRhdGEuZXZlbnRRdWV1ZS5wdXNoKGV2ZW50T2JqZWN0KTsKCiAgICBpZiAoZGF0YS5ldmVudFF1ZXVlLmxlbmd0aD4xMCkKICAgICAgZGF0YS5ldmVudFF1ZXVlLnNwbGljZSgwLCAxKTsKCiAgfSwKCiAgX2V2ZW50U2VxOiBmdW5jdGlvbigpIHsKCiAgICB2YXIgZGF0YSA9IHRoaXMuZGF0YSgpLnpvb20sCiAgICAgIGxpc3QgPSBkYXRhLmV2ZW50UXVldWUsCiAgICAgIGxhc3RFdmVudCA9IGxpc3QubGVuZ3RoLTE7CgogICAgaWYgKGxhc3RFdmVudD4wICYmCiAgICAgIGxpc3RbbGFzdEV2ZW50XS5uYW1lPT0ndGFwJyAmJgogICAgICBsaXN0W2xhc3RFdmVudC0xXS5uYW1lPT0ndGFwJyAmJgogICAgICBsaXN0W2xhc3RFdmVudF0uZXZlbnQucGFnZVggPT0gbGlzdFtsYXN0RXZlbnQtMV0uZXZlbnQucGFnZVggJiYKICAgICAgbGlzdFtsYXN0RXZlbnRdLmV2ZW50LnBhZ2VZID09IGxpc3RbbGFzdEV2ZW50LTFdLmV2ZW50LnBhZ2VZICYmCiAgICAgIGxpc3RbbGFzdEV2ZW50XS50aW1lc3RhbXAtbGlzdFtsYXN0RXZlbnQtMV0udGltZXN0YW1wIDwgMjAwICYmCiAgICAgIGxpc3RbbGFzdEV2ZW50XS50aW1lc3RhbXAtbGlzdFtsYXN0RXZlbnQtMV0udGltZXN0YW1wID4gNTApCiAgICB7CiAgCiAgICAgIHJldHVybiAkLmV4dGVuZChsaXN0W2xhc3RFdmVudF0uZXZlbnQsIHt0eXBlOiAnem9vbS5kb3VibGVUYXAnfSk7CgogICAgfSBlbHNlIGlmIChsaXN0W2xhc3RFdmVudF0ubmFtZT09J3RhcCcpIHsKICAgICAgCiAgICAgIHJldHVybiAkLmV4dGVuZChsaXN0W2xhc3RFdmVudF0uZXZlbnQsIHt0eXBlOiAnem9vbS50YXAnfSk7CgogICAgfQogICAgICAKICB9LAoKICBfcHJlcGFyZVpvb206IGZ1bmN0aW9uICgpIHsKICAgIAogICAgdmFyIGZsaXBQb3MsIG9mZnNldExlZnQgPSAwLAogICAgICBkYXRhID0gdGhpcy5kYXRhKCkuem9vbSwKICAgICAgaW52eiA9IDEvdGhpcy56b29tKCd2YWx1ZScpLAogICAgICBmbGlwID0gZGF0YS5vcHRzLmZsaXBib29rLAogICAgICBkaXIgPSBmbGlwLnR1cm4oJ2RpcmVjdGlvbicpLAogICAgICBmbGlwRGF0YSA9IGZsaXAuZGF0YSgpLAogICAgICBmbGlwT2Zmc2V0ID0gZmxpcC5vZmZzZXQoKSwKICAgICAgdGhpc09mZnNldCA9IHRoaXMub2Zmc2V0KCksCiAgICAgIGZsaXBTaXplID0ge2hlaWdodDogZmxpcC5oZWlnaHQoKX0sCiAgICAgIHZpZXcgPSBmbGlwLnR1cm4oJ3ZpZXcnKTsKCiAgICAgIGlmIChmbGlwLnR1cm4oJ2Rpc3BsYXknKT09J2RvdWJsZScgJiYgZmxpcC5kYXRhKCkub3B0cy5hdXRvQ2VudGVyKSB7CiAgICAgICAgaWYgKCF2aWV3WzBdKSB7CiAgICAgICAgICBmbGlwU2l6ZS53aWR0aCA9IGZsaXAud2lkdGgoKS8yOwogICAgICAgICAgb2Zmc2V0TGVmdCA9IChkaXI9PSdsdHInKSA/IGZsaXBTaXplLndpZHRoIDogMDsKICAgICAgICAgIGZsaXBQb3MgPSBwb2ludDJEKAogICAgICAgICAgICAoZGlyPT0nbHRyJykgPyBmbGlwT2Zmc2V0LmxlZnQtdGhpc09mZnNldC5sZWZ0K2ZsaXBTaXplLndpZHRoIDogZmxpcE9mZnNldC5sZWZ0LXRoaXNPZmZzZXQubGVmdCwKICAgICAgICAgICAgZmxpcE9mZnNldC50b3AtdGhpc09mZnNldC50b3AKICAgICAgICAgICk7CgogICAgICAgIH0gZWxzZSBpZiAoIXZpZXdbMV0pIHsKICAgICAgICAgIGZsaXBTaXplLndpZHRoID0gZmxpcC53aWR0aCgpLzI7CiAgICAgICAgICBvZmZzZXRMZWZ0ID0gKGRpcj09J2x0cicpID8gMCA6IGZsaXBTaXplLndpZHRoOwogICAgICAgICAgZmxpcFBvcyA9IHBvaW50MkQoCiAgICAgICAgICAgIChkaXI9PSdsdHInKSA/IGZsaXBPZmZzZXQubGVmdC10aGlzT2Zmc2V0LmxlZnQgOiBmbGlwT2Zmc2V0LmxlZnQtdGhpc09mZnNldC5sZWZ0K2ZsaXBTaXplLndpZHRoLAogICAgICAgICAgICBmbGlwT2Zmc2V0LnRvcC10aGlzT2Zmc2V0LnRvcAogICAgICAgICAgKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgZmxpcFNpemUud2lkdGggPSBmbGlwLndpZHRoKCk7CiAgICAgICAgICBmbGlwUG9zID0gcG9pbnQyRCgKICAgICAgICAgICAgZmxpcE9mZnNldC5sZWZ0LXRoaXNPZmZzZXQubGVmdCwKICAgICAgICAgICAgZmxpcE9mZnNldC50b3AtdGhpc09mZnNldC50b3AKICAgICAgICAgICk7CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIGZsaXBTaXplLndpZHRoID0gZmxpcC53aWR0aCgpOwogICAgICAgIGZsaXBQb3MgPSBwb2ludDJEKAogICAgICAgICAgZmxpcE9mZnNldC5sZWZ0LXRoaXNPZmZzZXQubGVmdCwKICAgICAgICAgIGZsaXBPZmZzZXQudG9wLXRoaXNPZmZzZXQudG9wCiAgICAgICAgKTsKICAgICAgfQoKICAgIGlmICghZGF0YS56b29tZXIpIHsKICAgICAgZGF0YS56b29tZXIgPSAkKCc8ZGl2IC8+JywKICAgICAgICB7J2NsYXNzJzogJ3pvb21lcicsCiAgICAgICAgICBjc3M6IHsKICAgICAgICAgICAgb3ZlcmZsb3c6J2hpZGRlbicsCiAgICAgICAgICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLAogICAgICAgICAgICB6SW5kZXg6ICcxMDAwMDAwJwogICAgICAgICAgfQogICAgICAgIH0pLgogICAgICBtb3VzZWRvd24oZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9KS5hcHBlbmRUbyh0aGlzKTsKICAgIH0KCgogICAgZGF0YS56b29tZXIuY3NzKHsKICAgICAgdG9wOiBmbGlwUG9zLnksCiAgICAgIGxlZnQ6IGZsaXBQb3MueCwKICAgICAgd2lkdGg6IGZsaXBTaXplLndpZHRoLAogICAgICBoZWlnaHQ6IGZsaXBTaXplLmhlaWdodAogICAgfSk7CiAgICAKICAgIHZhciB6b29tZXJWaWV3ID0gdmlldy5qb2luKCcsJyk7CgogICAgaWYgKHpvb21lclZpZXchPWRhdGEuem9vbWVyVmlldykgewoKICAgICAgZGF0YS56b29tZXJWaWV3ID0gem9vbWVyVmlldzsKICAgICAgZGF0YS56b29tZXIuZmluZCgnKicpLnJlbW92ZSgpOwoKICAgICAgZm9yICh2YXIgcCA9IDA7IHA8dmlldy5sZW5ndGg7IHArKykgewoKICAgICAgICBpZiAoIXZpZXdbcF0pCiAgICAgICAgICBjb250aW51ZTsKCiAgICAgICAgdmFyIHBvcyA9IGZsaXBEYXRhLnBhZ2VPYmpzW3ZpZXdbcF1dLm9mZnNldCgpLAogICAgICAgICAgcGFnZUVsZW1lbnQgPSAkKGZsaXBEYXRhLnBhZ2VPYmpzW3ZpZXdbcF1dKTsKICAgICAgICAgIAogICAgICAgIHBhZ2VFbGVtZW50LgogICAgICAgICAgY2xvbmUoKS4KICAgICAgICAgIHRyYW5zZm9ybSgnJykuCiAgICAgICAgICBjc3MoewogICAgICAgICAgICB3aWR0aDogcGFnZUVsZW1lbnQud2lkdGgoKSppbnZ6LAogICAgICAgICAgICBoZWlnaHQ6IHBhZ2VFbGVtZW50LmhlaWdodCgpKmludnosCiAgICAgICAgICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLAogICAgICAgICAgICBkaXNwbGF5OiAnJywKICAgICAgICAgICAgdG9wOiAocG9zLnRvcCAtIGZsaXBPZmZzZXQudG9wKSppbnZ6LAogICAgICAgICAgICBsZWZ0OiAocG9zLmxlZnQgLSBmbGlwT2Zmc2V0LmxlZnQgLSBvZmZzZXRMZWZ0KSppbnZ6CiAgICAgICAgICB9KS4KICAgICAgICAgIGFwcGVuZFRvKGRhdGEuem9vbWVyKTsKICAgICAgfQogICAgfQogICAgCiAgICAKICAgIHJldHVybiB7cG9zOiBmbGlwUG9zLCBzaXplOiBmbGlwU2l6ZX07CgogIH0sCgogIHZhbHVlOiBmdW5jdGlvbigpIHsKCiAgICB2YXIgZGF0YSA9IHRoaXMuZGF0YSgpLnpvb207CgogICAgcmV0dXJuIGRhdGEub3B0cy5mbGlwYm9vay50dXJuKCd6b29tJyk7CiAgfSwKCiAgem9vbUluOiBmdW5jdGlvbihldmVudCkgewoKICAgIHZhciBwb3MsCiAgICAgIHRoYXQgPSB0aGlzLAogICAgICBkYXRhID0gdGhpcy5kYXRhKCkuem9vbSwKICAgICAgZmxpcCA9IGRhdGEub3B0cy5mbGlwYm9vaywKICAgICAgem9vbSA9IGRhdGEub3B0cy5tYXgoKSwKICAgICAgZmxpcE9mZnNldCA9IGZsaXAub2Zmc2V0KCksCiAgICAgIHRoaXNPZmZzZXQgPSB0aGlzLm9mZnNldCgpOwoKICAgIGlmIChkYXRhLnpvb21JbikKICAgICAgcmV0dXJuIHRoaXM7CgogICAgZmxpcC50dXJuKCdzdG9wJyk7CiAgICAKICAgIHZhciBldiA9ICQuRXZlbnQoJ3pvb20uY2hhbmdlJyk7CiAgICB0aGlzLnRyaWdnZXIoZXYsIFt6b29tXSk7CgogICAgaWYgKGV2LmlzRGVmYXVsdFByZXZlbnRlZCgpKQogICAgICByZXR1cm4gdGhpczsKCiAgICB2YXIgYm91bmQgPSB6b29tTWV0aG9kcy5fcHJlcGFyZVpvb20uY2FsbCh0aGlzKSwKICAgICAgZmxpcFBvcyA9IGJvdW5kLnBvcywKICAgICAgY2VudGVyID0gcG9pbnQyRChib3VuZC5zaXplLndpZHRoLzIsIGJvdW5kLnNpemUuaGVpZ2h0LzIpLAogICAgICBwcmVmaXggPSAkLmNzc1ByZWZpeCgpLAogICAgICB0cmFuc2l0aW9uRW5kID0gJC5jc3NUcmFuc2l0aW9uRW5kKCksCiAgICAgIGF1dG9DZW50ZXIgPSBmbGlwLmRhdGEoKS5vcHRzLmF1dG9DZW50ZXI7CgogICAgZGF0YS5zY2FsZSA9IHpvb207CiAgICBmbGlwLmRhdGEoKS5ub0NlbnRlciA9IHRydWU7CgogICAgaWYgKHR5cGVvZihldmVudCkhPSd1bmRlZmluZWQnKSB7CgogICAgICBpZiAoJ3gnIGluIGV2ZW50ICYmICd5JyBpbiBldmVudCkgewogICAgICAgIAogICAgICAgIHBvcyA9IHBvaW50MkQoZXZlbnQueC1mbGlwUG9zLngsIGV2ZW50LnktZmxpcFBvcy55KTsKICAgICAgCiAgICAgIH0gZWxzZSB7CgogICAgICAgIHBvcyA9ICgkLmlzVG91Y2gpID8KICAgICAgICAgIHBvaW50MkQoCiAgICAgICAgICAgIGV2ZW50Lm9yaWdpbmFsRXZlbnQudG91Y2hlc1swXS5wYWdlWC1mbGlwUG9zLngtdGhpc09mZnNldC5sZWZ0LAogICAgICAgICAgICBldmVudC5vcmlnaW5hbEV2ZW50LnRvdWNoZXNbMF0ucGFnZVktZmxpcFBvcy55LXRoaXNPZmZzZXQudG9wCiAgICAgICAgICApCiAgICAgICAgICA6CiAgICAgICAgICBwb2ludDJEKAogICAgICAgICAgICBldmVudC5wYWdlWC1mbGlwUG9zLngtdGhpc09mZnNldC5sZWZ0LAogICAgICAgICAgICBldmVudC5wYWdlWS1mbGlwUG9zLnktdGhpc09mZnNldC50b3AKICAgICAgICAgICk7CgogICAgICB9CgogICAgfSBlbHNlIHsKICAgICAgcG9zID0gcG9pbnQyRChjZW50ZXIueCwgY2VudGVyLnkpOwogICAgfQoKCgogICAgaWYgKHBvcy54PDAgfHwgcG9zLnk8MCB8fCBwb3MueD5ib3VuZC53aWR0aCB8fCBwb3MueT5ib3VuZC5oZWlnaHQpIHsKICAgICAgcG9zLnggPSBjZW50ZXIueDsKICAgICAgcG9zLnkgPSBjZW50ZXIueTsKICAgIH0KCgogICAgdmFyIGNvbXBvc2UgPSBwb2ludDJEKAogICAgICAgIChwb3MueC1jZW50ZXIueCkqem9vbSArIGNlbnRlci54LAogICAgICAgIChwb3MueS1jZW50ZXIueSkqem9vbSArIGNlbnRlci55CiAgICAgICksCiAgICAgIG1vdmUgPSBwb2ludDJEKAogICAgICAgIChib3VuZC5zaXplLndpZHRoKnpvb20+dGhpcy53aWR0aCgpKSA/IHBvcy54LWNvbXBvc2UueCA6IDAsCiAgICAgICAgKGJvdW5kLnNpemUuaGVpZ2h0Knpvb20+dGhpcy5oZWlnaHQoKSkgPyBwb3MueS1jb21wb3NlLnkgOiAwCiAgICAgICksCiAgICAgIG1heE1vdmUgPSBwb2ludDJEKAogICAgICAgIE1hdGguYWJzKGJvdW5kLnNpemUud2lkdGgqem9vbS10aGlzLndpZHRoKCkpLAogICAgICAgIE1hdGguYWJzKGJvdW5kLnNpemUuaGVpZ2h0Knpvb20tdGhpcy5oZWlnaHQoKSkKICAgICAgKSwKICAgICAgbWluTW92ZSA9IHBvaW50MkQoCiAgICAgICAgTWF0aC5taW4oMCwgYm91bmQuc2l6ZS53aWR0aCp6b29tLXRoaXMud2lkdGgoKSksCiAgICAgICAgTWF0aC5taW4oMCwgYm91bmQuc2l6ZS5oZWlnaHQqem9vbS10aGlzLmhlaWdodCgpKQogICAgICApLAogICAgICByZWFsUG9zID0gcG9pbnQyRCgKICAgICAgICBjZW50ZXIueCp6b29tIC0gY2VudGVyLnggLSBmbGlwUG9zLnggLSBtb3ZlLngsCiAgICAgICAgY2VudGVyLnkqem9vbSAtIGNlbnRlci55IC0gZmxpcFBvcy55IC0gbW92ZS55CiAgICAgICk7CgogICAgaWYgKHJlYWxQb3MueT5tYXhNb3ZlLnkpCiAgICAgIG1vdmUueSA9IHJlYWxQb3MueSAtIG1heE1vdmUueSArICBtb3ZlLnk7CiAgICBlbHNlIGlmIChyZWFsUG9zLnk8bWluTW92ZS55KQogICAgICBtb3ZlLnkgPSByZWFsUG9zLnkgLSBtaW5Nb3ZlLnkgKyAgbW92ZS55OwoKICAgIGlmIChyZWFsUG9zLng+bWF4TW92ZS54KQogICAgICBtb3ZlLnggPSByZWFsUG9zLnggLSBtYXhNb3ZlLnggKyAgbW92ZS54OwogICAgZWxzZSBpZiAocmVhbFBvcy54PG1pbk1vdmUueCkKICAgICAgbW92ZS54ID0gcmVhbFBvcy54IC0gbWluTW92ZS54ICsgIG1vdmUueDsKCiAgICByZWFsUG9zID0gcG9pbnQyRCgKICAgICAgY2VudGVyLngqem9vbSAtIGNlbnRlci54IC0gZmxpcFBvcy54IC0gbW92ZS54LAogICAgICBjZW50ZXIueSp6b29tIC0gY2VudGVyLnkgLSBmbGlwUG9zLnkgLSBtb3ZlLnkKICAgICk7CgogICAgdmFyIGNzcyA9IHt9OwoKICAgIGNzc1twcmVmaXgrJ3RyYW5zaXRpb24nXSA9IHByZWZpeCArCiAgICAgICd0cmFuc2Zvcm0gJyArCiAgICAgIGRhdGEub3B0cy5lYXNlRnVuY3Rpb24gKwogICAgICAnICcgKwogICAgICBkYXRhLm9wdHMuZHVyYXRpb24gKwogICAgICAnbXMnOwoKICAgIHZhciB0cmFuc2l0aW9uRW5kQ2FsbGJhY2sgPSBmdW5jdGlvbigpIHsKCiAgICAgIHRoYXQudHJpZ2dlcignem9vbS56b29tSW4nKTsKCiAgICAgIGRhdGEuem9vbUluID0gdHJ1ZTsKCiAgICAgIGRhdGEuZmxpcFBvc2l0aW9uID0gcG9pbnQyRChmbGlwLmNzcygnbGVmdCcpLCBmbGlwLmNzcygndG9wJykpOwoKICAgICAgZmxpcC50dXJuKCd6b29tJywgem9vbSkuY3NzKHsKICAgICAgICBwb3NpdGlvbjogJ2Fic29sdXRlJywKICAgICAgICBtYXJnaW46ICcnLAogICAgICAgIHRvcDowLAogICAgICAgIGxlZnQ6MAogICAgICB9KTsKCiAgICAgIHZhciBmbGlwT2Zmc2V0ID0gZmxpcC5vZmZzZXQoKTsKICAgICAgCiAgICAgIGRhdGEuYXhpcyA9IHBvaW50MkQoCiAgICAgICAgZmxpcE9mZnNldC5sZWZ0IC0gdGhpc09mZnNldC5sZWZ0LAogICAgICAgIGZsaXBPZmZzZXQudG9wIC0gdGhpc09mZnNldC50b3AKICAgICAgKTsKCgogICAgICBpZiAoYXV0b0NlbnRlciAmJiBmbGlwLnR1cm4oJ2Rpc3BsYXknKT09J2RvdWJsZScpCiAgICAgICAgaWYgKChmbGlwLnR1cm4oJ2RpcmVjdGlvbicpPT0nbHRyJyAmJiAhZmxpcC50dXJuKCd2aWV3JylbMF0pIHx8CiAgICAgICAgICAoZmxpcC50dXJuKCdkaXJlY3Rpb24nKT09J3J0bCcgJiYgIWZsaXAudHVybigndmlldycpWzFdKQogICAgICAgICkKICAgICAgICAgIGRhdGEuYXhpcy54ID0gZGF0YS5heGlzLnggKyBmbGlwLndpZHRoKCkvMjsKCiAgICAgIHRoYXQuem9vbSgnc2Nyb2xsJywgcmVhbFBvcyk7CiAgICAgIHRoYXQuYmluZCgkLm1vdXNlRXZlbnRzLmRvd24sIHpvb21NZXRob2RzLl9lTW91c2VEb3duKTsKICAgICAgdGhhdC5iaW5kKCQubW91c2VFdmVudHMubW92ZSwgem9vbU1ldGhvZHMuX2VNb3VzZU1vdmUpOwogICAgICAkKGRvY3VtZW50KS5iaW5kKCQubW91c2VFdmVudHMudXAsIGRhdGEubW91c2V1cEV2ZW50KTsKICAgICAgdGhhdC5iaW5kKCdtb3VzZXdoZWVsJywgem9vbU1ldGhvZHMuX2VNb3VzZVdoZWVsKTsKCiAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CiAgICAgICAgZGF0YS56b29tZXIuaGlkZSgpOwogICAgICAgIGRhdGEuem9vbWVyLnJlbW92ZSgpOwogICAgICAgIGRhdGEuem9vbWVyID0gbnVsbDsKICAgICAgICBkYXRhLnpvb21lclZpZXcgPSBudWxsOwogICAgICB9LCA1MCk7CgogICAgfTsKCiAgICBkYXRhLnpvb21lci5jc3MoY3NzKS5zaG93KCk7CgogICAgaWYgKHRyYW5zaXRpb25FbmQpCiAgICAgIGRhdGEuem9vbWVyLmJpbmQodHJhbnNpdGlvbkVuZCwgZnVuY3Rpb24oKSB7CiAgICAgICAgJCh0aGlzKS51bmJpbmQodHJhbnNpdGlvbkVuZCk7CiAgICAgICAgdHJhbnNpdGlvbkVuZENhbGxiYWNrKCk7CiAgICAgIH0pOwogICAgZWxzZQogICAgICBzZXRUaW1lb3V0KHRyYW5zaXRpb25FbmRDYWxsYmFjaywgZGF0YS5vcHRzLmR1cmF0aW9uKTsKCiAgICBkYXRhLnpvb21lci50cmFuc2Zvcm0odHJhbnNsYXRlKG1vdmUueCwgbW92ZS55LCB0cnVlKSArIHNjYWxlKHpvb20sIHRydWUpKTsKICAgIAogICAgcmV0dXJuIHRoaXM7CiAgfSwKCiAgem9vbU91dDogZnVuY3Rpb24oZHVyYXRpb24pIHsKCiAgICB2YXIgcG9zLCBtb3ZlLAogICAgICB0aGF0ID0gdGhpcywKICAgICAgZGF0YSA9IHRoaXMuZGF0YSgpLnpvb20sCiAgICAgIGZsaXAgPSBkYXRhLm9wdHMuZmxpcGJvb2ssCiAgICAgIHpvb20gPSAxLAogICAgICBzY2FsaW5nID0gem9vbS9kYXRhLnNjYWxlLAogICAgICBwcmVmaXggPSAkLmNzc1ByZWZpeCgpLAogICAgICB0cmFuc2l0aW9uRW5kID0gJC5jc3NUcmFuc2l0aW9uRW5kKCksCiAgICAgIHRoaXNPZmZzZXQgPSB0aGlzLm9mZnNldCgpOwoKICAgIGR1cmF0aW9uID0gKHR5cGVvZihkdXJhdGlvbikhPSd1bmRlZmluZWQnKSA/IGR1cmF0aW9uIDogZGF0YS5vcHRzLmR1cmF0aW9uOwoKICAgIGlmICghZGF0YS56b29tSW4pCiAgICAgIHJldHVybjsKICAgICAgCiAgICB2YXIgZXYgPSAkLkV2ZW50KCd6b29tLmNoYW5nZScpOwogICAgdGhpcy50cmlnZ2VyKGV2LCBbem9vbV0pOwoKICAgIGlmIChldi5pc0RlZmF1bHRQcmV2ZW50ZWQoKSkKICAgICAgcmV0dXJuIHRoaXM7CgogICAgZGF0YS56b29tSW4gPSBmYWxzZTsKICAgIGRhdGEuc2NhbGUgPSB6b29tOwoKICAgIGZsaXAuZGF0YSgpLm5vQ2VudGVyID0gZmFsc2U7CgogICAgdGhhdC51bmJpbmQoJC5tb3VzZUV2ZW50cy5kb3duLCB6b29tTWV0aG9kcy5fZU1vdXNlRG93bik7CiAgICB0aGF0LnVuYmluZCgkLm1vdXNlRXZlbnRzLm1vdmUsIHpvb21NZXRob2RzLl9lTW91c2VNb3ZlKTsKICAgICQoZG9jdW1lbnQpLnVuYmluZCgkLm1vdXNlRXZlbnRzLnVwLCBkYXRhLm1vdXNldXBFdmVudCk7CiAgICB0aGF0LnVuYmluZCgnbW91c2V3aGVlbCcsIHpvb21NZXRob2RzLl9lTW91c2VXaGVlbCk7CgogICAgdmFyIGNzcyA9IHt9OwoKICAgIGNzc1twcmVmaXgrJ3RyYW5zaXRpb24nXSA9IHByZWZpeCArCiAgICAgICd0cmFuc2Zvcm0gJyArCiAgICAgIGRhdGEub3B0cy5lYXNlRnVuY3Rpb24gKwogICAgICAnICcgKwogICAgICBkdXJhdGlvbiArCiAgICAgICdtcyc7CgogICAgZmxpcC5jc3MoY3NzKTsKCiAgICB2YXIgZmxpcERlc1BvcywKICAgICAgdG1wID0gJCgnPGRpdiAvPicsIHsKICAgICAgICBjc3M6IHsKICAgICAgICAgIHBvc2l0aW9uOiAncmVsYXRpdmUnLAogICAgICAgICAgdG9wOiBkYXRhLmZsaXBQb3NpdGlvbi55LAogICAgICAgICAgbGVmdDogZGF0YS5mbGlwUG9zaXRpb24ueCwKICAgICAgICAgIHdpZHRoOiBmbGlwLndpZHRoKCkqc2NhbGluZywKICAgICAgICAgIGhlaWdodDogZmxpcC5oZWlnaHQoKSpzY2FsaW5nLAogICAgICAgICAgYmFja2dyb3VuZDogJ2JsdWUnCiAgICAgICAgfQogICAgICB9KS5hcHBlbmRUbyhmbGlwLnBhcmVudCgpKTsKCiAgICBmbGlwRGVzUG9zID0gcG9pbnQyRCgKICAgICAgdG1wLm9mZnNldCgpLmxlZnQtdGhpc09mZnNldC5sZWZ0LAogICAgICB0bXAub2Zmc2V0KCkudG9wLXRoaXNPZmZzZXQudG9wCiAgICApOwogICAgCgogICAgdG1wLnJlbW92ZSgpOwoKICAgIHZhciBhdXRvQ2VudGVyID0gZmxpcC5kYXRhKCkub3B0cy5hdXRvQ2VudGVyOwoKICAgIGlmIChhdXRvQ2VudGVyICYmIGZsaXAudHVybignZGlzcGxheScpPT0nZG91YmxlJykgewoKICAgICAgaWYgKCFmbGlwLnR1cm4oJ3ZpZXcnKVswXSkKICAgICAgICBmbGlwRGVzUG9zLnggPSAoZmxpcC50dXJuKCdkaXJlY3Rpb24nKT09J2x0cicpID8KICAgICAgICAgIGZsaXBEZXNQb3MueC10bXAud2lkdGgoKS80IDoKICAgICAgICAgIGZsaXBEZXNQb3MueCt0bXAud2lkdGgoKS80OwogICAgICBlbHNlIGlmICghZmxpcC50dXJuKCd2aWV3JylbMV0pCiAgICAgICAgZmxpcERlc1Bvcy54ID0gKGZsaXAudHVybignZGlyZWN0aW9uJyk9PSdsdHInKSA/CiAgICAgICAgICBmbGlwRGVzUG9zLngrdG1wLndpZHRoKCkvNCA6CiAgICAgICAgICBmbGlwRGVzUG9zLngtdG1wLndpZHRoKCkvNDsKICAgIH0KCiAgICB2YXIgZmxpcFJlYWxQb3MgPSAkLmZpbmRQb3MoZmxpcFswXSk7CiAgICAgIAogICAgbW92ZSA9IHBvaW50MkQoCiAgICAgIC1mbGlwLndpZHRoKCkvMiAtIGZsaXBSZWFsUG9zLmxlZnQgKyB0bXAud2lkdGgoKS8yICsgZmxpcERlc1Bvcy54ICsgdGhpc09mZnNldC5sZWZ0LAogICAgICAtZmxpcC5oZWlnaHQoKS8yIC0gZmxpcFJlYWxQb3MudG9wICsgdG1wLmhlaWdodCgpLzIgKyBmbGlwRGVzUG9zLnkgKyB0aGlzT2Zmc2V0LnRvcCk7CgogICAgdmFyIHRyYW5zaXRpb25FbmRDYWxsYmFjayA9IGZ1bmN0aW9uKCkgewogICAgCiAgICAgIGlmIChmbGlwWzBdLnN0eWxlLnJlbW92ZVByb3BlcnR5KSB7CiAgICAgICAgCiAgICAgICAgZmxpcFswXS5zdHlsZS5yZW1vdmVQcm9wZXJ0eShwcmVmaXgrJ3RyYW5zaXRpb24nKTsKICAgICAgICBmbGlwLnRyYW5zZm9ybSgKICAgICAgICAgIChmbGlwLnR1cm4oJ29wdGlvbnMnKS5hY2NlbGVyYXRpb24pID8gdHJhbnNsYXRlKDAsIDAsIHRydWUpIDogJycpLnR1cm4oJ3pvb20nLCAxKTsKICAgICAgICBmbGlwWzBdLnN0eWxlLnJlbW92ZVByb3BlcnR5KCdtYXJnaW4nKTsKICAgICAgICBmbGlwLmNzcyh7CiAgICAgICAgICBwb3NpdGlvbjogJ3JlbGF0aXZlJywKICAgICAgICAgIHRvcDogZGF0YS5mbGlwUG9zaXRpb24ueSwKICAgICAgICAgIGxlZnQ6IGRhdGEuZmxpcFBvc2l0aW9uLngKICAgICAgICB9KTsKCiAgICAgIH0gZWxzZSB7CiAgICAgICAgCiAgICAgICAgZmxpcC50cmFuc2Zvcm0oJ25vbmUnKS4KICAgICAgICAgIHR1cm4oJ3pvb20nLCAxKS4KICAgICAgICAgIGNzcyh7CiAgICAgICAgICAgIG1hcmdpbjogJycsCiAgICAgICAgICAgIHRvcDogZGF0YS5mbGlwUG9zaXRpb24ueSwKICAgICAgICAgICAgbGVmdDogZGF0YS5mbGlwUG9zaXRpb24ueCwKICAgICAgICAgICAgcG9zaXRpb246ICdyZWxhdGl2ZScKICAgICAgICB9KTsKCiAgICAgIH0KCiAgICAgIGlmIChhdXRvQ2VudGVyKQogICAgICAgIGZsaXAudHVybignY2VudGVyJyk7CgogICAgICB0aGF0LnRyaWdnZXIoJ3pvb20uem9vbU91dCcpOwoKICAgIH07CgogICAgaWYgKGR1cmF0aW9uPT09MCkgewogIAogICAgICB0cmFuc2l0aW9uRW5kQ2FsbGJhY2soKTsKCiAgICB9IGVsc2UgaWYgKHRyYW5zaXRpb25FbmQpIHsKCiAgICAgIGZsaXAuYmluZCh0cmFuc2l0aW9uRW5kLCBmdW5jdGlvbigpIHsKCiAgICAgICAgJCh0aGlzKS51bmJpbmQodHJhbnNpdGlvbkVuZCk7CiAgICAgICAgdHJhbnNpdGlvbkVuZENhbGxiYWNrKCk7CgogICAgICB9KTsKCiAgICAgIGZsaXAudHJhbnNmb3JtKHRyYW5zbGF0ZShtb3ZlLngsIG1vdmUueSwgdHJ1ZSkgKyBzY2FsZShzY2FsaW5nLCB0cnVlKSk7CgogICAgfSBlbHNlIHsKCiAgICAgIHNldFRpbWVvdXQodHJhbnNpdGlvbkVuZENhbGxiYWNrLCBkdXJhdGlvbik7CiAgICAgIGZsaXAudHJhbnNmb3JtKHRyYW5zbGF0ZShtb3ZlLngsIG1vdmUueSwgdHJ1ZSkgKyBzY2FsZShzY2FsaW5nLCB0cnVlKSk7CgogICAgfQoKICAgIHJldHVybiB0aGlzOwogIH0sCgogIGZsaXBib29rV2lkdGg6IGZ1bmN0aW9uKCkgewogICAgCiAgICB2YXIgZGF0YSA9IHRoaXMuZGF0YSgpLnpvb20sCiAgICAgIGZsaXBib29rID0gZGF0YS5vcHRzLmZsaXBib29rLAogICAgICB2aWV3ID0gZmxpcGJvb2sudHVybigndmlldycpOwoKICAgIHJldHVybiAoZmxpcGJvb2sudHVybignZGlzcGxheScpPT0nZG91YmxlJyAmJiAoIXZpZXdbMF0gfHwgIXZpZXdbMV0pKSA/CiAgICAgIGZsaXBib29rLndpZHRoKCkvMgogICAgICA6CiAgICAgIGZsaXBib29rLndpZHRoKCk7CgogIH0sCgogIHNjcm9sbDogZnVuY3Rpb24odG8sIHVubGltaXRlZCwgYW5pbWF0ZSkgewogICAgCiAgICB2YXIgZGF0YSA9IHRoaXMuZGF0YSgpLnpvb20sCiAgICAgIGZsaXAgPSBkYXRhLm9wdHMuZmxpcGJvb2ssCiAgICAgIGZsaXBXaWR0aCA9IHRoaXMuem9vbSgnZmxpcGJvb2tXaWR0aCcpLAogICAgICBwcmVmaXggPSAkLmNzc1ByZWZpeCgpOwogICAgCiAgICBpZiAoaGFzM2QpIHsKCiAgICAgIHZhciBjc3MgPSB7fTsKCiAgICAgIGlmIChhbmltYXRlKSB7CiAgICAgICAgY3NzW3ByZWZpeCsndHJhbnNpdGlvbiddID0gcHJlZml4ICsgJ3RyYW5zZm9ybSAyMDBtcyc7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgY3NzW3ByZWZpeCsndHJhbnNpdGlvbiddID0gJ25vbmUnOwogICAgICB9CgogICAgICBmbGlwLmNzcyhjc3MpOwogICAgICBmbGlwLnRyYW5zZm9ybSh0cmFuc2xhdGUoLWRhdGEuYXhpcy54IC0gdG8ueCwgLWRhdGEuYXhpcy55IC0gdG8ueSwgdHJ1ZSkpOwoKICAgIH0gZWxzZSB7CiAgICAgIAogICAgICBmbGlwLmNzcyh7dG9wOiAtZGF0YS5heGlzLnkgLSB0by55LCBsZWZ0OiAtZGF0YS5heGlzLnggLSB0by54fSk7CgogICAgfQoKICAgIGlmICghdW5saW1pdGVkKSB7CgogICAgICB2YXIgb3V0LAogICAgICAgIG1pbkJvdW5kID0gcG9pbnQyRCgKICAgICAgICAgIE1hdGgubWluKDAsIChmbGlwV2lkdGgtdGhpcy53aWR0aCgpKS8yKSwKICAgICAgICAgIE1hdGgubWluKDAsIChmbGlwLmhlaWdodCgpLXRoaXMuaGVpZ2h0KCkpLzIpKSwKICAgICAgICBtYXhCb3VuZCA9IHBvaW50MkQoCiAgICAgICAgICAoZmxpcFdpZHRoPnRoaXMud2lkdGgoKSkgPyBmbGlwV2lkdGgtdGhpcy53aWR0aCgpIDogKGZsaXBXaWR0aC10aGlzLndpZHRoKCkpLzIsCiAgICAgICAgICAoZmxpcC5oZWlnaHQoKT50aGlzLmhlaWdodCgpKSA/IGZsaXAuaGVpZ2h0KCktdGhpcy5oZWlnaHQoKSA6IChmbGlwLmhlaWdodCgpLXRoaXMuaGVpZ2h0KCkpLzIKICAgICAgICApOwoKICAgICAgaWYgKHRvLnk8bWluQm91bmQueSkgewogICAgICAgIHRvLnkgPSBtaW5Cb3VuZC55OwogICAgICAgIG91dCA9IHRydWU7CiAgICAgIH0gZWxzZSBpZiAodG8ueT5tYXhCb3VuZC55KSB7CiAgICAgICAgdG8ueSA9IG1heEJvdW5kLnk7CiAgICAgICAgb3V0ID0gdHJ1ZTsKICAgICAgfQoKICAgICAgaWYgKHRvLng8bWluQm91bmQueCkgewogICAgICAgIHRvLnggPSBtaW5Cb3VuZC54OwogICAgICAgIG91dCA9IHRydWU7CiAgICAgIH0gZWxzZSBpZiAodG8ueD5tYXhCb3VuZC54KSB7CiAgICAgICAgdG8ueCA9IG1heEJvdW5kLng7CiAgICAgICAgb3V0ID0gdHJ1ZTsKICAgICAgfQoKICAgICAgaWYgKG91dCkgewogICAgICAgIHRoaXMuem9vbSgnc2Nyb2xsJywgdG8sIHRydWUsIHRydWUpOwogICAgICB9CgogICAgfQoKICAgIGRhdGEuc2Nyb2xsUG9zID0gcG9pbnQyRCh0by54LCB0by55KTsKCiAgfSwKCiAgcmVzaXplOiBmdW5jdGlvbigpIHsKCiAgICB2YXIgZGF0YSA9IHRoaXMuZGF0YSgpLnpvb20sCiAgICAgIGZsaXAgPSBkYXRhLm9wdHMuZmxpcGJvb2s7CiAgICAKICAgIGlmICh0aGlzLnpvb20oJ3ZhbHVlJyk+MSkgewoKICAgICAgdmFyICBmbGlwT2Zmc2V0ID0gZmxpcC5vZmZzZXQoKSwKICAgICAgICB0aGlzT2Zmc2V0ID0gdGhpcy5vZmZzZXQoKTsKCiAgICAgIGRhdGEuYXhpcyA9ICBwb2ludDJEKAogICAgICAgIChmbGlwT2Zmc2V0LmxlZnQgLSB0aGlzT2Zmc2V0LmxlZnQpICsgKGRhdGEuYXhpcy54ICsgZGF0YS5zY3JvbGxQb3MueCksCiAgICAgICAgKGZsaXBPZmZzZXQudG9wIC0gdGhpc09mZnNldC50b3ApICsgKGRhdGEuYXhpcy55ICsgZGF0YS5zY3JvbGxQb3MueSkKICAgICAgKTsKCiAgICAgIGlmIChmbGlwLnR1cm4oJ2Rpc3BsYXknKT09J2RvdWJsZScgJiYKICAgICAgICBmbGlwLnR1cm4oJ2RpcmVjdGlvbicpPT0nbHRyJyAmJgogICAgICAgICFmbGlwLnR1cm4oJ3ZpZXcnKVswXSkKICAgICAgICAgIGRhdGEuYXhpcy54ID0gZGF0YS5heGlzLnggKyBmbGlwLndpZHRoKCkvMjsKCiAgICAgIHRoaXMuem9vbSgnc2Nyb2xsJywgZGF0YS5zY3JvbGxQb3MpOwogICAgfQoKICB9LAoKICBfZVpvb206IGZ1bmN0aW9uKCkgewogICAgCiAgICB2YXIgZmxpcFBvcywKICAgICAgZGF0YSA9IHRoaXMuZGF0YSgpLnpvb20sCiAgICAgIGZsaXAgPSBkYXRhLm9wdHMuZmxpcGJvb2ssCiAgICAgIHZpZXcgPSBmbGlwLnR1cm4oJ3ZpZXcnKTsKCiAgICBmb3IgKHZhciBwID0gMDsgcDx2aWV3Lmxlbmd0aDsgcCsrKSB7CiAgICAgIGlmICh2aWV3W3BdKQogICAgICAgIHRoaXMudHJpZ2dlcignem9vbS5yZXNpemUnLAogICAgICAgICAgW2RhdGEuc2NhbGUsIHZpZXdbcF0sIGZsaXAuZGF0YSgpLnBhZ2VPYmpzW3ZpZXdbcF1dXQogICAgICAgICk7CiAgICB9CiAgfSwKCiAgX2VTdGFydDogZnVuY3Rpb24oZXZlbnQsIHBhZ2VPYmopIHsKCiAgICBpZiAodGhpcy56b29tKCd2YWx1ZScpIT0xKSB7CiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7CiAgICB9CgoKICB9LAoKICBfZVR1cm5pbmc6IGZ1bmN0aW9uKGV2ZW50LCBwYWdlLCB2aWV3KSB7CgogICAgdmFyIHRoYXQgPSB0aGlzLAogICAgICB6b29tID0gdGhpcy56b29tKCd2YWx1ZScpLAogICAgICBkYXRhID0gdGhpcy5kYXRhKCkuem9vbSwKICAgICAgZmxpcCA9IGRhdGEub3B0cy5mbGlwYm9vazsKCiAgICBkYXRhLnBhZ2UgPSBmbGlwLnR1cm4oJ3BhZ2UnKTsKCiAgICBpZiAoem9vbSE9MSkgewogICAgICBmb3IgKHZhciBwID0gMDsgcDx2aWV3Lmxlbmd0aDsgcCsrKSB7CiAgICAgICAgaWYgKHZpZXdbcF0pCiAgICAgICAgICB0aGlzLnRyaWdnZXIoJ3pvb20ucmVzaXplJywKICAgICAgICAgICAgW3pvb20sIHZpZXdbcF0sIGZsaXAuZGF0YSgpLnBhZ2VPYmpzW3ZpZXdbcF1dXQogICAgICAgICAgKTsKICAgICAgfQoKICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpIHsKICAgICAgICB0aGF0Lnpvb20oJ3Jlc2l6ZScpOwogICAgICB9LCAwKTsKICAgIH0KCiAgfSwKCiAgX2VUdXJuZWQ6IGZ1bmN0aW9uIChldmVudCwgcGFnZSkgewogICAgCiAgICBpZiAodGhpcy56b29tKCd2YWx1ZScpIT0xKSB7CiAgICAgIHZhciB0aGF0ID0gdGhpcywKICAgICAgICBkYXRhID0gdGhpcy5kYXRhKCkuem9vbSwKICAgICAgICBmbGlwID0gZGF0YS5vcHRzLmZsaXBib29rOwoKICAgICAgaWYgKHBhZ2U+ZGF0YS5wYWdlKQogICAgICAgIHRoaXMuem9vbSgnc2Nyb2xsJywKICAgICAgICAgIHBvaW50MkQoMCwgZGF0YS5zY3JvbGxQb3MueSksIGZhbHNlLCB0cnVlKTsKICAgICAgICAKICAgICAgZWxzZSBpZiAocGFnZTxkYXRhLnBhZ2UpCiAgICAgICAgdGhpcy56b29tKCdzY3JvbGwnLAogICAgICAgICAgcG9pbnQyRChmbGlwLndpZHRoKCksIGRhdGEuc2Nyb2xsUG9zLnkpLCBmYWxzZSwgdHJ1ZSk7CiAgICAKICAgIH0KICB9LAoKICBfZVByZXNzZWQ6IGZ1bmN0aW9uKCkgewogICAgCiAgICB2YXIgZGF0YSA9ICQodGhpcykuZGF0YSgpLnpvb207CiAgICBkYXRhLmRyYWdnaW5nQ29ybmVyID0gdHJ1ZTsKCiAgfSwKCiAgX2VSZWxlYXNlZDogZnVuY3Rpb24oKSB7CgogICAgdmFyIGRhdGEgPSAkKHRoaXMpLmRhdGEoKS56b29tOwoKICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CiAgICAgIGRhdGEuZHJhZ2dpbmdDb3JuZXIgPSBmYWxzZTsKICAgIH0sIDEpOwoKICB9LAoKICBfZU1vdXNlRG93bjogZnVuY3Rpb24oZXZlbnQpIHsKICAgIAogICAgdmFyIGRhdGEgPSAkKHRoaXMpLmRhdGEoKS56b29tOwoKICAgIGRhdGEuZHJhZ2dpbmdDdXIgPSAoJC5pc1RvdWNoKSA/CiAgICAgIHBvaW50MkQoCiAgICAgICAgZXZlbnQub3JpZ2luYWxFdmVudC50b3VjaGVzWzBdLnBhZ2VYLAogICAgICAgIGV2ZW50Lm9yaWdpbmFsRXZlbnQudG91Y2hlc1swXS5wYWdlWQogICAgICApCiAgICAgIDoKICAgICAgcG9pbnQyRChldmVudC5wYWdlWCwgZXZlbnQucGFnZVkpOwogICAgCiAgICByZXR1cm4gZmFsc2U7CiAgfSwKCiAgX2VNb3VzZU1vdmU6IGZ1bmN0aW9uKGV2ZW50KSB7CgogICAgdmFyIGRhdGEgPSAkKHRoaXMpLmRhdGEoKS56b29tOwogICAgICAgIAogICAgaWYgKGRhdGEuZHJhZ2dpbmdDdXIpIHsKCiAgICAgIGRhdGEuZHJhZ2dpbmcgPSB0cnVlOwoKICAgICAgdmFyIGN1ciA9ICgkLmlzVG91Y2gpID8KICAgICAgICBwb2ludDJEKAogICAgICAgICAgZXZlbnQub3JpZ2luYWxFdmVudC50b3VjaGVzWzBdLnBhZ2VYLAogICAgICAgICAgZXZlbnQub3JpZ2luYWxFdmVudC50b3VjaGVzWzBdLnBhZ2VZCiAgICAgICAgKQogICAgICAgIDoKICAgICAgICBwb2ludDJEKGV2ZW50LnBhZ2VYLCBldmVudC5wYWdlWSksCiAgICAgICAgbW90aW9uID0gcG9pbnQyRCgKICAgICAgICAgIGN1ci54LSBkYXRhLmRyYWdnaW5nQ3VyLngsCiAgICAgICAgICBjdXIueS1kYXRhLmRyYWdnaW5nQ3VyLnkKICAgICAgICApOwoKICAgICAgJCh0aGlzKS56b29tKCdzY3JvbGwnLAogICAgICAgIHBvaW50MkQoCiAgICAgICAgICBkYXRhLnNjcm9sbFBvcy54LW1vdGlvbi54LAogICAgICAgICAgZGF0YS5zY3JvbGxQb3MueS1tb3Rpb24ueQogICAgICAgICksIHRydWUKICAgICAgKTsKCiAgICAgIGRhdGEuZHJhZ2dpbmdDdXIgPSBjdXI7CgogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CgogIH0sCgogIF9lTW91c2VVcDogZnVuY3Rpb24oZXZlbnQpIHsKCiAgICB2YXIgZGF0YSA9ICQodGhpcykuZGF0YSgpLnpvb207CgogICAgaWYgKGRhdGEuZHJhZ2dpbmcpIHsKICAgICAgJCh0aGlzKS56b29tKCdzY3JvbGwnLCBkYXRhLnNjcm9sbFBvcyk7CiAgICB9CgogICAgZGF0YS5kcmFnZ2luZ0N1ciA9IG51bGw7CgogICAgc2V0VGltZW91dChmdW5jdGlvbigpIHsKICAgICAgZGF0YS5kcmFnZ2luZyA9IGZhbHNlOwogICAgfSwgMSk7CgogIH0sCgogIF9lTW91c2VXaGVlbDogZnVuY3Rpb24oZXZlbnQsIGRlbHRhLCBkZWx0YVgsIGRlbHRhWSkgewogICAgCiAgICB2YXIgZGF0YSA9ICQodGhpcykuZGF0YSgpLnpvb20sCiAgICAgIGN1ciA9IHBvaW50MkQoCiAgICAgICAgZGF0YS5zY3JvbGxQb3MueCArIGRlbHRhWCoxMCwKICAgICAgICBkYXRhLnNjcm9sbFBvcy55IC0gZGVsdGFZKjEwCiAgICAgICk7CiAgICAKICAgICQodGhpcykuem9vbSgnc2Nyb2xsJywgY3VyLCBmYWxzZSwgdHJ1ZSk7CiAgICAKICB9LAoKICBfZVRvdWNoU3RhcnQ6IGZ1bmN0aW9uKGV2ZW50LCBwYWdlKSB7CgogICAgdmFyIGRhdGEgPSAkKHRoaXMpLmRhdGEoKS56b29tLAogICAgICBmbGlwID0gZGF0YS5vcHRzLmZsaXBib29rLAogICAgICBmaW5nZXIgPSBwb2ludDJEKAogICAgICAgIGV2ZW50Lm9yaWdpbmFsRXZlbnQudG91Y2hlc1swXS5wYWdlWCwKICAgICAgICBldmVudC5vcmlnaW5hbEV2ZW50LnRvdWNoZXNbMF0ucGFnZVkKICAgICAgKTsKCiAgICBkYXRhLnRvdWNoID0ge307CiAgICBkYXRhLnRvdWNoLmluaXRpYWwgPSBmaW5nZXI7CiAgICBkYXRhLnRvdWNoLmxhc3QgPSBmaW5nZXI7CiAgICBkYXRhLnRvdWNoLnRpbWVzdGFtcCA9IChuZXcgRGF0ZSgpKS5nZXRUaW1lKCk7CiAgICBkYXRhLnRvdWNoLnNwZWVkID0gcG9pbnQyRCgwLCAwKTsKCiAgfSwKCiAgX2VUb3VjaE1vdmU6IGZ1bmN0aW9uKGV2ZW50KSB7CiAgICAKICAgIHZhciBkYXRhID0gJCh0aGlzKS5kYXRhKCkuem9vbSwKICAgICAgem9vbSA9ICQodGhpcykuem9vbSgndmFsdWUnKSwKICAgICAgZmxpcCA9IGRhdGEub3B0cy5mbGlwYm9vaywKICAgICAgdGltZSA9IChuZXcgRGF0ZSgpKS5nZXRUaW1lKCksCiAgICAgIGZpbmdlciA9IHBvaW50MkQoCiAgICAgICAgZXZlbnQub3JpZ2luYWxFdmVudC50b3VjaGVzWzBdLnBhZ2VYLAogICAgICAgIGV2ZW50Lm9yaWdpbmFsRXZlbnQudG91Y2hlc1swXS5wYWdlWQogICAgICApOwogICAgCiAgICBpZiAoZGF0YS50b3VjaCAmJiB6b29tPT0xICYmICFmbGlwLmRhdGEoKS5tb3VzZUFjdGlvbikgewogICAgICBkYXRhLnRvdWNoLm1vdGlvbiA9IHBvaW50MkQoCiAgICAgICAgZmluZ2VyLngtZGF0YS50b3VjaC5sYXN0LngsCiAgICAgICAgZmluZ2VyLnktZGF0YS50b3VjaC5sYXN0LnkpOwoKICAgIAogICAgICBkYXRhLnRvdWNoLnNwZWVkLnggPSAoZGF0YS50b3VjaC5zcGVlZC54PT09MCkgPwogICAgICAgIGRhdGEudG91Y2gubW90aW9uLnggLyAodGltZS1kYXRhLnRvdWNoLnRpbWVzdGFtcCkgOgogICAgICAgIChkYXRhLnRvdWNoLnNwZWVkLnggKyAoZGF0YS50b3VjaC5tb3Rpb24ueCAvICh0aW1lLWRhdGEudG91Y2gudGltZXN0YW1wKSkpLzI7CgogICAgICBkYXRhLnRvdWNoLmxhc3QgPSBmaW5nZXI7CiAgICAgIGRhdGEudG91Y2gudGltZXN0YW1wID0gdGltZTsKICAgIH0KCiAgfSwKCiAgX2VUb3VjaEVuZDogZnVuY3Rpb24oZXZlbnQpIHsKCiAgICB2YXIgZGF0YSA9ICQodGhpcykuZGF0YSgpLnpvb207CgogICAgaWYgKGRhdGEudG91Y2ggJiYgJCh0aGlzKS56b29tKCd2YWx1ZScpPT0xKSB7CgogICAgICB2YXIgeSA9IE1hdGguYWJzKGRhdGEudG91Y2guaW5pdGlhbC55IC0gZGF0YS50b3VjaC5sYXN0LnkpOwoKICAgICAgaWYgKHk8NTAgJiYgKGRhdGEudG91Y2guc3BlZWQueDwtMSB8fCBkYXRhLnRvdWNoLmxhc3QueC1kYXRhLnRvdWNoLmluaXRpYWwueDwtMTAwKSkgewogICAgICAgIAogICAgICAgIHRoaXMudHJpZ2dlcignem9vbS5zd2lwZUxlZnQnKTsKCiAgICAgIH0gZWxzZSBpZih5PDUwICYmIChkYXRhLnRvdWNoLnNwZWVkLng+MSB8fCBkYXRhLnRvdWNoLmxhc3QueC1kYXRhLnRvdWNoLmluaXRpYWwueD4xMDApKXsKICAgICAgICAKICAgICAgICB0aGlzLnRyaWdnZXIoJ3pvb20uc3dpcGVSaWdodCcpOwoKICAgICAgfQoKICAgIH0KICB9LAoKICBfZURlc3Ryb3lpbmc6IGZ1bmN0aW9uKCkgewoKICAgIHZhciB0aGF0ID0gdGhpcywKICAgICAgZGF0YSA9IHRoaXMuZGF0YSgpLnpvb20sCiAgICAgIGZsaXAgPSBkYXRhLm9wdHMuZmxpcGJvb2ssCiAgICAgIGV2ZW50cyA9IFsKICAgICAgICAndGFwJywKICAgICAgICAnZG91YmxlVGFwJywKICAgICAgICAncmVzaXplJywKICAgICAgICAnem9vbUluJywKICAgICAgICAnem9vbU91dCcsCiAgICAgICAgJ3N3aXBlTGVmdCcsCiAgICAgICAgJ3N3aXBlUmlnaHQnCiAgICAgIF07CgogICAgdGhpcy56b29tKCd6b29tT3V0JywgMCk7CgogICAgJC5lYWNoKGV2ZW50cywgZnVuY3Rpb24oaW5kZXgsIGV2ZW50TmFtZSkgewogICAgICB0aGF0LnVuYmluZCgnem9vbS4nICsgZXZlbnROYW1lKTsKICAgIH0pOwogICAgCiAgICBmb3IgKHZhciBldmVudE5hbWUgaW4gZGF0YS5mbGlwYm9va0V2ZW50cykgewogICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGRhdGEuZmxpcGJvb2tFdmVudHMsIGV2ZW50TmFtZSkpIHsKICAgICAgICBmbGlwLnVuYmluZChldmVudE5hbWUsIGRhdGEuZmxpcGJvb2tFdmVudHNbZXZlbnROYW1lXSk7CiAgICAgIH0KICAgIH0KCiAgICBmbGlwLnVuYmluZCgndG91Y2hzdGFydCcsIGRhdGEuZXZlbnRUb3VjaFN0YXJ0ICkuCiAgICAgIHVuYmluZCgndG91Y2htb3ZlJywgZGF0YS5ldmVudFRvdWNoTW92ZSkuCiAgICAgIHVuYmluZCgndG91Y2hlbmQnLCBkYXRhLmV2ZW50VG91Y2hFbmQpOwogICAgICAgIAogICAgdGhpcy51bmJpbmQoJ3RvdWNoc3RhcnQnLCB6b29tTWV0aG9kcy5fdGFwKS4KICAgICAgdW5iaW5kKCdjbGljaycsIHpvb21NZXRob2RzLl90YXApOwoKICAgIGRhdGEgPSBudWxsOwogICAgdGhpcy5kYXRhKCkuem9vbSA9IG51bGw7CgogIH0KfTsKCmZ1bmN0aW9uIGlzUGFnZShlbGVtZW50LCBsYXN0KSB7CgogIGlmIChlbGVtZW50WzBdPT1sYXN0WzBdKQogICAgcmV0dXJuIGZhbHNlOwoKICBpZiAoZWxlbWVudC5hdHRyKCdwYWdlJykpCiAgICByZXR1cm4gdHJ1ZTsKICAKICByZXR1cm4gKGVsZW1lbnQucGFyZW50KClbMF0pID8KICAgIGlzUGFnZShlbGVtZW50LnBhcmVudCgpLCBsYXN0KQogICAgOgogIGZhbHNlOwoKfQoKZnVuY3Rpb24gZXJyb3IobWVzc2FnZSkgewoKICBmdW5jdGlvbiBUdXJuSnNFcnJvcihtZXNzYWdlKSB7CiAgICB0aGlzLm5hbWUgPSAiVHVybkpzRXJyb3IiOwogICAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZTsKICB9CgogIFR1cm5Kc0Vycm9yLnByb3RvdHlwZSA9IG5ldyBFcnJvcigpOwogIFR1cm5Kc0Vycm9yLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFR1cm5Kc0Vycm9yOwogIHJldHVybiBuZXcgVHVybkpzRXJyb3IobWVzc2FnZSk7Cgp9CgpmdW5jdGlvbiB0cmFuc2xhdGUoeCwgeSwgdXNlM2QpIHsKICAKICByZXR1cm4gKGhhczNkICYmIHVzZTNkKSA/ICcgdHJhbnNsYXRlM2QoJyArIHggKyAncHgsJyArIHkgKyAncHgsIDBweCkgJwogIDogJyB0cmFuc2xhdGUoJyArIHggKyAncHgsICcgKyB5ICsgJ3B4KSAnOwoKfQoKZnVuY3Rpb24gc2NhbGUodiwgdXNlM2QpIHsKICAKICByZXR1cm4gKGhhczNkICYmIHVzZTNkKSA/ICcgc2NhbGUzZCgnICsgdiArICcsICcgKyB2ICsgJywgMSkgJwogIDogJyBzY2FsZSgnICsgdiArICcpICc7Cgp9CgpmdW5jdGlvbiBwb2ludDJEKHgsIHkpIHsKICAKICByZXR1cm4ge3g6IHgsIHk6IHl9OwoKfQoKZnVuY3Rpb24gYmluZChmdW5jLCBjb250ZXh0KSB7CgogIHJldHVybiBmdW5jdGlvbigpIHsKICAgIHJldHVybiBmdW5jLmFwcGx5KGNvbnRleHQsIGFyZ3VtZW50cyk7CiAgfTsKCn0KCiQuZXh0ZW5kKCQuZm4sIHsKICB6b29tOiBmdW5jdGlvbigpIHsKICAgIAogICAgdmFyIGFyZ3MgPSBhcmd1bWVudHM7CgogICAgaWYgKCFhcmdzWzBdIHx8IHR5cGVvZihhcmdzWzBdKT09J29iamVjdCcpCiAgICAgIHJldHVybiB6b29tTWV0aG9kcy5pbml0LmFwcGx5KCQodGhpc1swXSksIGFyZ3MpOwogICAgZWxzZSBpZiAoem9vbU1ldGhvZHNbYXJnc1swXV0pCiAgICAgIHJldHVybiB6b29tTWV0aG9kc1thcmdzWzBdXS5hcHBseSgkKHRoaXNbMF0pLCBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmdzLCAxKSk7CiAgICBlbHNlCiAgICAgIHRocm93IGVycm9yKGFyZ3NbMF0gKyAnIGlzIG5vdCBhIG1ldGhvZCcpOwoKICB9Cn0pOwoKfSkoalF1ZXJ5KTsK//