韓吉的房潮箱 – 專業不動產買賣
Ci8vID09PT09IEdvb2dsZSBTaGVldCDoqK3lrpogPT09PT0KLy8g5Y6f5aeLIFNoZWV077yaaHR0cHM6Ly9kb2NzLmdvb2dsZS5jb20vc3ByZWFkc2hlZXRzL2QvMS04YnVIZ2pGY3Z4cUJUaUpERnJOeTZaUGFUdTdZNWZiV2drdnh2Mng4S0UvZWRpdD9naWQ9MTE2MTYxOTU2NgovLyDlt7LpgI/pgY7jgIzmqpTmoYgg4oaSIOWFseeUqCDihpIg55m85L2I5Yiw57ay6Lev44CN55Si55Sf5YWs6ZaLIENTViDpgKPntZDvvIjlkKvmraPnorogQ09SUyBoZWFkZXLvvIkKY29uc3QgQ1NWX1VSTCA9ICdodHRwczovL2RvY3MuZ29vZ2xlLmNvbS9zcHJlYWRzaGVldHMvZC9lLzJQQUNYLTF2VEFvVWhOaENmVUFiR1dERFdYRXk2QkxQeUhfb3dmSTFLanRQZ3RYYVJ0RXJmS1FPbjFsSXZVN1JzRUNRR21tam1fUHlCM0hzMEs2ZUd3L3B1Yj9naWQ9MTE2MTYxOTU2NiZzaW5nbGU9dHJ1ZSZvdXRwdXQ9Y3N2JzsKY29uc3QgQ0FDSEVfS0VZID0gJ3NjX2ljZ19saXN0aW5nc19jYWNoZV92MSc7CmNvbnN0IENBQ0hFX1RUTCA9IDMwICogMTAwMDsgLy8gMzAg56eS77yIR29vZ2xlIHB1Ymxpc2gg6Ieq6Lqr6YKE5pyJIH41IOWIhumQmCBzZXJ2ZXIgY2FjaGXvvIkKCmxldCBfbGlzdGluZ3MgPSBbXTsKbGV0IGN1cnJlbnRHYWxsZXJ5SWR4ID0gMDsKbGV0IGN1cnJlbnREZXRhaWxJZCA9IG51bGw7CgovLyA9PT09PSBDU1Yg6Kej5p6Q77yIUkZDIDQxODDvvIk9PT09PQpmdW5jdGlvbiBwYXJzZUNTVih0ZXh0KSB7CiAgY29uc3Qgcm93cyA9IFtdOwogIGxldCByb3cgPSBbXSwgY2VsbCA9ICcnLCBpblF1b3RlID0gZmFsc2U7CiAgZm9yIChsZXQgaSA9IDA7IGkgPCB0ZXh0Lmxlbmd0aDsgaSsrKSB7CiAgICBjb25zdCBjID0gdGV4dFtpXTsKICAgIGlmIChpblF1b3RlKSB7CiAgICAgIGlmIChjID09PSAnIicpIHsKICAgICAgICBpZiAodGV4dFtpICsgMV0gPT09ICciJykgeyBjZWxsICs9ICciJzsgaSsrOyB9CiAgICAgICAgZWxzZSBpblF1b3RlID0gZmFsc2U7CiAgICAgIH0gZWxzZSBjZWxsICs9IGM7CiAgICB9IGVsc2UgewogICAgICBpZiAoYyA9PT0gJyInKSBpblF1b3RlID0gdHJ1ZTsKICAgICAgZWxzZSBpZiAoYyA9PT0gJywnKSB7IHJvdy5wdXNoKGNlbGwpOyBjZWxsID0gJyc7IH0KICAgICAgZWxzZSBpZiAoYyA9PT0gJ1xuJykgeyByb3cucHVzaChjZWxsKTsgcm93cy5wdXNoKHJvdyk7IHJvdyA9IFtdOyBjZWxsID0gJyc7IH0KICAgICAgZWxzZSBpZiAoYyA9PT0gJ1xyJykgeyAvKiBza2lwICovIH0KICAgICAgZWxzZSBjZWxsICs9IGM7CiAgICB9CiAgfQogIGlmIChjZWxsICE9PSAnJyB8fCByb3cubGVuZ3RoKSB7IHJvdy5wdXNoKGNlbGwpOyByb3dzLnB1c2gocm93KTsgfQogIHJldHVybiByb3dzOwp9CgovLyDmioogQ1NWIOi9ieaIkOeJqeS7tumZo+WIl++8iOashOS9jeWQjeavlOWwjeaOoeWvrOmshuaooeW8j++8jOWQq+mXnOmNteWtl+WNs+WPr++8iQpmdW5jdGlvbiBjc3ZUb0xpc3RpbmdzKHRleHQpIHsKICBjb25zdCByb3dzID0gcGFyc2VDU1YodGV4dCk7CiAgaWYgKHJvd3MubGVuZ3RoIDwgMikgcmV0dXJuIFtdOwogIGNvbnN0IGhlYWRlcnMgPSByb3dzWzBdLm1hcChoID0+IChoIHx8ICcnKS50cmltKCkpOwoKICBjb25zdCBmaW5kSWR4ID0gKC4uLmt3cykgPT4gewogICAgZm9yIChjb25zdCBrdyBvZiBrd3MpIHsKICAgICAgY29uc3QgaSA9IGhlYWRlcnMuZmluZEluZGV4KGggPT4gaC5yZXBsYWNlKC9ccysvZywgJycpLmluY2x1ZGVzKGt3KSk7CiAgICAgIGlmIChpID49IDApIHJldHVybiBpOwogICAgfQogICAgcmV0dXJuIC0xOwogIH07CgogIGNvbnN0IGNvbCA9IHsKICAgIGlkOiBmaW5kSWR4KCdpZCcsICdJRCcpLAogICAgc3RhdHVzOiBmaW5kSWR4KCfni4DmhYsnKSwKICAgIHR5cGU6IGZpbmRJZHgoJ+mhnuWeiycsICfnianku7bpoZ7lnosnKSwKICAgIHRpdGxlOiBmaW5kSWR4KCfmqJnpoYwnKSwKICAgIGNpdHk6IGZpbmRJZHgoJ+e4o+W4gicpLAogICAgZGlzdHJpY3Q6IGZpbmRJZHgoJ+WNgOWfnycsICfooYzmlL/ljYAnKSwKICAgIGFkZHJlc3M6IGZpbmRJZHgoJ+WcsOWdgCcpLAogICAgcHJpY2U6IGZpbmRJZHgoJ+WUruWDuScpLAogICAgcHJldmlvdXNQcmljZTogZmluZElkeCgn5Y6f5YO5JywgJ+WOn+WUruWDuScpLAogICAgc2l6ZTogZmluZElkeCgn5Z2q5pW4JyksCiAgICBsYXlvdXQ6IGZpbmRJZHgoJ+agvOWxgCcpLAogICAgZmxvb3I6IGZpbmRJZHgoJ+aok+WxpCcpLAogICAgYWdlOiBmaW5kSWR4KCflsYvpvaEnKSwKICAgIHBhcmtpbmc6IGZpbmRJZHgoJ+i7iuS9jScpLAogICAgZmVhdHVyZXM6IGZpbmRJZHgoJ+eJueiJsuaomeexpCcsICfnibnoibInKSwKICAgIGRlc2M6IGZpbmRJZHgoJ+eJqeS7tuiqquaYjicsICfoqqrmmI4nLCAn5o+P6L+wJyksCiAgICBpbWFnZXM6IGZpbmRJZHgoJ+WclueJh+e2suWdgCcsICflnJbniYcnKSwKICAgIHZpZGVvVXJsOiBmaW5kSWR4KCflvbHniYfpgKPntZAnLCAn5b2x54mHJyksCiAgICBjb250YWN0OiBmaW5kSWR4KCfoga/ntaHkuronLCAn6IGv57Wh6LOH6KiKJyksCiAgICBsaW5lSWQ6IGZpbmRJZHgoJ0xJTkXpgKPntZAnLCAnTElORScsICdsaW5lJyksCiAgICBjcmVhdGVkOiBmaW5kSWR4KCfkuIrmnrbml6XmnJ8nLCAn5bu656uL5pel5pyfJywgJ+aXpeacnycpLAogIH07CgogIGNvbnN0IG51bSA9IHYgPT4gewogICAgaWYgKHYgPT0gbnVsbCB8fCB2ID09PSAnJykgcmV0dXJuIDA7CiAgICBjb25zdCBuID0gcGFyc2VGbG9hdChTdHJpbmcodikucmVwbGFjZSgvWyzvvIxcc10vZywgJycpKTsKICAgIHJldHVybiBpc05hTihuKSA/IDAgOiBuOwogIH07CiAgY29uc3QgZ2V0ID0gKHIsIGkpID0+IChpID49IDAgJiYgcltpXSAhPSBudWxsKSA/IFN0cmluZyhyW2ldKS50cmltKCkgOiAnJzsKICBjb25zdCBzcGxpdEltZ3MgPSBzID0+IHMuc3BsaXQoL1t8772cXS8pLm1hcCh4ID0+IHgudHJpbSgpKS5maWx0ZXIoQm9vbGVhbik7CiAgY29uc3Qgc3BsaXRUYWdzID0gcyA9PiBzLnNwbGl0KC9bfO+9nFwv77yP44CBLO+8jF0vKS5tYXAoeCA9PiB4LnRyaW0oKSkuZmlsdGVyKEJvb2xlYW4pOwogIGNvbnN0IGlzSGlkZGVuID0gcyA9PiAvXihoaWRkZW58aW5hY3RpdmV85LiL5p62fOmaseiXj3zlkKZ8bm98b2ZmKSQvaS50ZXN0KHMudHJpbSgpKTsKCiAgcmV0dXJuIHJvd3Muc2xpY2UoMSkKICAgIC5maWx0ZXIociA9PiByLnNvbWUoYyA9PiBjICYmIFN0cmluZyhjKS50cmltKCkpKQogICAgLm1hcCgociwgaSkgPT4gKHsKICAgICAgaWQ6IGdldChyLCBjb2wuaWQpIHx8ICgncm93XycgKyBpKSwKICAgICAgc3RhdHVzOiBpc0hpZGRlbihnZXQociwgY29sLnN0YXR1cykpID8gJ2hpZGRlbicgOiAnYWN0aXZlJywKICAgICAgdHlwZTogZ2V0KHIsIGNvbC50eXBlKSwKICAgICAgdGl0bGU6IGdldChyLCBjb2wudGl0bGUpLAogICAgICBjaXR5OiBnZXQociwgY29sLmNpdHkpLAogICAgICBkaXN0cmljdDogZ2V0KHIsIGNvbC5kaXN0cmljdCksCiAgICAgIGFkZHJlc3M6IGdldChyLCBjb2wuYWRkcmVzcyksCiAgICAgIHByaWNlOiBudW0oZ2V0KHIsIGNvbC5wcmljZSkpLAogICAgICBwcmV2aW91c1ByaWNlOiBudW0oZ2V0KHIsIGNvbC5wcmV2aW91c1ByaWNlKSksCiAgICAgIHNpemU6IG51bShnZXQociwgY29sLnNpemUpKSwKICAgICAgbGF5b3V0OiBnZXQociwgY29sLmxheW91dCksCiAgICAgIGZsb29yOiBnZXQociwgY29sLmZsb29yKSwKICAgICAgYWdlOiBnZXQociwgY29sLmFnZSksCiAgICAgIHBhcmtpbmc6IGdldChyLCBjb2wucGFya2luZyksCiAgICAgIGZlYXR1cmVzOiBzcGxpdFRhZ3MoZ2V0KHIsIGNvbC5mZWF0dXJlcykpLAogICAgICBkZXNjOiBnZXQociwgY29sLmRlc2MpLAogICAgICBpbWFnZXM6IHNwbGl0SW1ncyhnZXQociwgY29sLmltYWdlcykpLAogICAgICB2aWRlb1VybDogZ2V0KHIsIGNvbC52aWRlb1VybCksCiAgICAgIGNvbnRhY3Q6IGdldChyLCBjb2wuY29udGFjdCksCiAgICAgIGxpbmVJZDogZ2V0KHIsIGNvbC5saW5lSWQpLAogICAgICBjcmVhdGVkOiBEYXRlLnBhcnNlKGdldChyLCBjb2wuY3JlYXRlZCkpIHx8IDAsCiAgICB9KSk7Cn0KCi8vID09PT09IOi8ieWFpeizh+aWmSA9PT09PQphc3luYyBmdW5jdGlvbiBsb2FkTGlzdGluZ3MoZm9yY2VGcmVzaCkgewogIGlmICghZm9yY2VGcmVzaCkgewogICAgdHJ5IHsKICAgICAgY29uc3QgY2FjaGVkID0gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbShDQUNIRV9LRVkpIHx8ICdudWxsJyk7CiAgICAgIGlmIChjYWNoZWQgJiYgRGF0ZS5ub3coKSAtIGNhY2hlZC50cyA8IENBQ0hFX1RUTCAmJiBBcnJheS5pc0FycmF5KGNhY2hlZC5kYXRhKSkgewogICAgICAgIF9saXN0aW5ncyA9IGNhY2hlZC5kYXRhOwogICAgICAgIHJlbmRlckxpc3RpbmdzKCk7CiAgICAgICAgb3BlbkRldGFpbEZyb21IYXNoKCk7CiAgICAgIH0KICAgIH0gY2F0Y2ggKF8pIHt9CiAgfQoKICB0cnkgewogICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goQ1NWX1VSTCArICcmXz0nICsgRGF0ZS5ub3coKSwgeyBjYWNoZTogJ25vLXN0b3JlJyB9KTsKICAgIGlmICghcmVzLm9rKSB0aHJvdyBuZXcgRXJyb3IoJ0hUVFAgJyArIHJlcy5zdGF0dXMpOwogICAgY29uc3QgdGV4dCA9IGF3YWl0IHJlcy50ZXh0KCk7CiAgICBpZiAoIXRleHQgfHwgdGV4dC5sZW5ndGggPCA1MCkgdGhyb3cgbmV3IEVycm9yKCdFbXB0eSByZXNwb25zZScpOwogICAgX2xpc3RpbmdzID0gY3N2VG9MaXN0aW5ncyh0ZXh0KTsKICAgIHRyeSB7CiAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKENBQ0hFX0tFWSwgSlNPTi5zdHJpbmdpZnkoeyB0czogRGF0ZS5ub3coKSwgZGF0YTogX2xpc3RpbmdzIH0pKTsKICAgIH0gY2F0Y2ggKF8pIHt9CiAgICByZW5kZXJMaXN0aW5ncygpOwogICAgb3BlbkRldGFpbEZyb21IYXNoKCk7CiAgfSBjYXRjaCAoZXJyKSB7CiAgICBpZiAoIV9saXN0aW5ncy5sZW5ndGgpIHNob3dMb2FkRXJyb3IoKTsKICB9Cn0KCmZ1bmN0aW9uIHNob3dMb2FkRXJyb3IoKSB7CiAgY29uc3QgZ3JpZCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsaXN0aW5nc0dyaWQnKTsKICBpZiAoZ3JpZCkgewogICAgZ3JpZC5pbm5lckhUTUwgPSBgPGRpdiBjbGFzcz0iZW1wdHktc3RhdGUiPjxwIGNsYXNzPSJlcnIiPueEoeazlei8ieWFpeeJqeS7tuizh+aWmTwvcD4KICAgICAgPHAgc3R5bGU9Im1hcmdpbi10b3A6OHB4O2ZvbnQtc2l6ZToxM3B4Ij7oq4vnorroqo0gR29vZ2xlIFNoZWV0IOW3suioreeCuuOAjOefpemBk+mAo+e1kOeahOS7u+S9leS6uuOAjeWPr+aqouimlu+8jOaIlueojeW+jOmHjeippuOAgjwvcD48L2Rpdj5gOwogIH0KfQoKLy8gPT09PT0g56+p6YG46aGv56S6ID09PT09CmZ1bmN0aW9uIG9uUGFya2luZ0NoYW5nZSgpIHsKICBjb25zdCB2YWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZmlsdGVyUGFya2luZycpLnZhbHVlOwogIGNvbnN0IHN1YiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwYXJraW5nU3ViRmlsdGVyJyk7CiAgaWYgKHZhbCA9PT0gJ+aciei7iuS9jScpIHsKICAgIHN1Yi5zdHlsZS5zZXRQcm9wZXJ0eSgnZGlzcGxheScsICdmbGV4JywgJ2ltcG9ydGFudCcpOwogIH0gZWxzZSB7CiAgICBzdWIuc3R5bGUuc2V0UHJvcGVydHkoJ2Rpc3BsYXknLCAnbm9uZScsICdpbXBvcnRhbnQnKTsKICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjaGtGbGF0JykuY2hlY2tlZCA9IGZhbHNlOwogICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Noa01lY2gnKS5jaGVja2VkID0gZmFsc2U7CiAgfQogIHJlbmRlckxpc3RpbmdzKCk7Cn0KCmZ1bmN0aW9uIHJlbmRlckxpc3RpbmdzKCkgewogIGxldCBkYXRhID0gX2xpc3RpbmdzLmZpbHRlcihwID0+IHAuc3RhdHVzID09PSAnYWN0aXZlJyk7CiAgY29uc3QgcSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZWFyY2hJbnB1dCcpLnZhbHVlLnRyaW0oKS50b0xvd2VyQ2FzZSgpOwogIGNvbnN0IHR5cGUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZmlsdGVyVHlwZScpLnZhbHVlOwogIGNvbnN0IGNpdHkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZmlsdGVyQ2l0eScpLnZhbHVlOwogIGNvbnN0IHByaWNlTWluID0gcGFyc2VGbG9hdChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZmlsdGVyUHJpY2VNaW4nKS52YWx1ZSk7CiAgY29uc3QgcHJpY2VNYXggPSBwYXJzZUZsb2F0KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdmaWx0ZXJQcmljZU1heCcpLnZhbHVlKTsKICBjb25zdCBsYXlvdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZmlsdGVyTGF5b3V0JykudmFsdWU7CiAgY29uc3QgcGFya2luZ01haW4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZmlsdGVyUGFya2luZycpLnZhbHVlOwogIGNvbnN0IHBhcmtpbmdDaGVja2VkID0gcGFya2luZ01haW4gPT09ICfmnInou4rkvY0nCiAgICA/IFsuLi5kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcjcGFya2luZ1N1YkZpbHRlciBpbnB1dDpjaGVja2VkJyldLm1hcChlbCA9PiBlbC52YWx1ZSkKICAgIDogW107CgogIGlmIChxKSBkYXRhID0gZGF0YS5maWx0ZXIocCA9PgogICAgKHAudGl0bGUgfHwgJycpLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMocSkgfHwKICAgIChwLmFkZHJlc3MgfHwgJycpLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMocSkgfHwKICAgIChwLmRpc3RyaWN0IHx8ICcnKS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHEpIHx8CiAgICAocC5jaXR5IHx8ICcnKS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHEpCiAgKTsKICBpZiAodHlwZSkgZGF0YSA9IGRhdGEuZmlsdGVyKHAgPT4gcC50eXBlID09PSB0eXBlKTsKICBpZiAoY2l0eSkgZGF0YSA9IGRhdGEuZmlsdGVyKHAgPT4gcC5jaXR5ID09PSBjaXR5KTsKICBpZiAoIWlzTmFOKHByaWNlTWluKSkgZGF0YSA9IGRhdGEuZmlsdGVyKHAgPT4gcC5wcmljZSA+PSBwcmljZU1pbik7CiAgaWYgKCFpc05hTihwcmljZU1heCkpIGRhdGEgPSBkYXRhLmZpbHRlcihwID0+IHAucHJpY2UgPD0gcHJpY2VNYXgpOwogIGlmIChsYXlvdXQpIGRhdGEgPSBkYXRhLmZpbHRlcihwID0+IChwLmxheW91dCB8fCAnJykuaW5jbHVkZXMobGF5b3V0LnJlcGxhY2UoJ+aIvycsICcnKSkpOwogIGlmIChwYXJraW5nTWFpbiA9PT0gJ+eEoei7iuS9jScpIHsKICAgIGRhdGEgPSBkYXRhLmZpbHRlcihwID0+ICFwLnBhcmtpbmcgfHwgcC5wYXJraW5nID09PSAn54Sh6LuK5L2NJyk7CiAgfSBlbHNlIGlmIChwYXJraW5nTWFpbiA9PT0gJ+aciei7iuS9jScpIHsKICAgIGlmIChwYXJraW5nQ2hlY2tlZC5sZW5ndGgpIHsKICAgICAgZGF0YSA9IGRhdGEuZmlsdGVyKHAgPT4gcGFya2luZ0NoZWNrZWQuaW5jbHVkZXMocC5wYXJraW5nKSk7CiAgICB9IGVsc2UgewogICAgICBkYXRhID0gZGF0YS5maWx0ZXIocCA9PiBwLnBhcmtpbmcgJiYgcC5wYXJraW5nICE9PSAn54Sh6LuK5L2NJyk7CiAgICB9CiAgfQoKICBjb25zdCBncmlkID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xpc3RpbmdzR3JpZCcpOwogIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdmaWx0ZXJDb3VudCcpLnRleHRDb250ZW50ID0gYOWFsSAke2RhdGEubGVuZ3RofSDnrYbnianku7ZgOwoKICBpZiAoIWRhdGEubGVuZ3RoKSB7CiAgICBncmlkLmlubmVySFRNTCA9IGA8ZGl2IGNsYXNzPSJlbXB0eS1zdGF0ZSI+PHA+55uu5YmN5rKS5pyJ56ym5ZCI5qKd5Lu255qE54mp5Lu2PC9wPjwvZGl2PmA7CiAgICByZXR1cm47CiAgfQoKICBncmlkLmlubmVySFRNTCA9IGRhdGEubWFwKHAgPT4gewogICAgY29uc3QgaW1nID0gcC5pbWFnZXMgJiYgcC5pbWFnZXMubGVuZ3RoID8gcC5pbWFnZXNbMF0gOiBudWxsOwogICAgY29uc3QgcHJpY2VEaWZmID0gcC5wcmV2aW91c1ByaWNlICYmIHAucHJldmlvdXNQcmljZSAhPT0gcC5wcmljZSA/IHAucHJldmlvdXNQcmljZSAtIHAucHJpY2UgOiAwOwogICAgcmV0dXJuIGAKICAgICAgPGRpdiBjbGFzcz0iY2FyZCIgb25jbGljaz0ib3BlbkRldGFpbCgnJHtwLmlkfScpIj4KICAgICAgICA8ZGl2IGNsYXNzPSJjYXJkLWltZy13cmFwIj4KICAgICAgICAgICR7aW1nCiAgICAgICAgICAgID8gYDxpbWcgc3JjPSIke2VzY0h0bWwoaW1nKX0iIGFsdD0iJHtlc2NIdG1sKHAudGl0bGUpfSIgbG9hZGluZz0ibGF6eSIgb25lcnJvcj0idGhpcy5wYXJlbnROb2RlLmlubmVySFRNTD0nPGRpdiBjbGFzcz1jYXJkLWltZy1wbGFjZWhvbGRlcj48L2Rpdj4nIj5gCiAgICAgICAgICAgIDogYDxkaXYgY2xhc3M9ImNhcmQtaW1nLXBsYWNlaG9sZGVyIj48L2Rpdj5gfQogICAgICAgICAgPHNwYW4gY2xhc3M9ImJhZGdlIGJhZGdlLXNhbGUiPuWHuuWUrjwvc3Bhbj4KICAgICAgICAgICR7cC52aWRlb1VybCA/IGA8c3BhbiBjbGFzcz0iaGFzLXZpZGVvLXRhZyI+5b2x54mHPC9zcGFuPmAgOiAnJ30KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJjYXJkLWJvZHkiPgogICAgICAgICAgPGRpdiBjbGFzcz0iY2FyZC10eXBlIj4ke2VzY0h0bWwocC50eXBlIHx8ICcnKX0g772cICR7ZXNjSHRtbChwLmNpdHkgfHwgJycpfSR7ZXNjSHRtbChwLmRpc3RyaWN0IHx8ICcnKX08L2Rpdj4KICAgICAgICAgIDxkaXYgY2xhc3M9ImNhcmQtdGl0bGUiPiR7ZXNjSHRtbChwLnRpdGxlKX08L2Rpdj4KICAgICAgICAgIDxkaXYgY2xhc3M9ImNhcmQtYWRkciI+JHtlc2NIdG1sKHAuYWRkcmVzcyB8fCAnJyl9PC9kaXY+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJjYXJkLXN0YXRzIj4KICAgICAgICAgICAgJHtwLnNpemUgPyBgPHNwYW4gY2xhc3M9ImNhcmQtc3RhdCI+JHtwLnNpemV95Z2qPC9zcGFuPmAgOiAnJ30KICAgICAgICAgICAgJHtwLmxheW91dCA/IGA8c3BhbiBjbGFzcz0iY2FyZC1zdGF0Ij4ke2VzY0h0bWwocC5sYXlvdXQpfTwvc3Bhbj5gIDogJyd9CiAgICAgICAgICAgICR7cC5mbG9vciA/IGA8c3BhbiBjbGFzcz0iY2FyZC1zdGF0Ij4ke2VzY0h0bWwocC5mbG9vcil9PC9zcGFuPmAgOiAnJ30KICAgICAgICAgIDwvZGl2PgogICAgICAgICAgJHtwcmljZURpZmYgIT09IDAgPyBgPGRpdiBjbGFzcz0iY2FyZC1wcmljZS1vbGQiPiR7cC5wcmV2aW91c1ByaWNlLnRvTG9jYWxlU3RyaW5nKCl96JCsPC9kaXY+YCA6ICcnfQogICAgICAgICAgPGRpdiBjbGFzcz0iY2FyZC1wcmljZS1yb3ciPgogICAgICAgICAgICAke3ByaWNlRGlmZiA+IDAgPyBgPHNwYW4gY2xhc3M9InByaWNlLWRpZmYtZG93biI+4oaTJHtwcmljZURpZmYudG9Mb2NhbGVTdHJpbmcoKX3okKw8L3NwYW4+YCA6ICcnfQogICAgICAgICAgICAke3ByaWNlRGlmZiA8IDAgPyBgPHNwYW4gY2xhc3M9InByaWNlLWRpZmYtdXAiPuKGkSR7TWF0aC5hYnMocHJpY2VEaWZmKS50b0xvY2FsZVN0cmluZygpfeiQrDwvc3Bhbj5gIDogJyd9CiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNhcmQtcHJpY2UiPiR7cC5wcmljZSA/IHAucHJpY2UudG9Mb2NhbGVTdHJpbmcoKSA6ICctLSd9PHNwYW4gY2xhc3M9ImNhcmQtcHJpY2UtdW5pdCI+6JCsPC9zcGFuPjwvZGl2PgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvZGl2PmA7CiAgfSkuam9pbignJyk7Cn0KCi8vID09PT09IOips+e0sOmggSA9PT09PQpmdW5jdGlvbiBvcGVuRGV0YWlsKGlkKSB7CiAgY29uc3QgcCA9IF9saXN0aW5ncy5maW5kKHggPT4geC5pZCA9PT0gaWQpOwogIGlmICghcCkgcmV0dXJuOwogIGN1cnJlbnREZXRhaWxJZCA9IGlkOwogIGN1cnJlbnRHYWxsZXJ5SWR4ID0gMDsKICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGV0YWlsQ29udGVudCcpLmlubmVySFRNTCA9IGJ1aWxkRGV0YWlsSFRNTChwKTsKICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGV0YWlsT3ZlcmxheScpLmNsYXNzTGlzdC5hZGQoJ2FjdGl2ZScpOwogIGRvY3VtZW50LmJvZHkuc3R5bGUub3ZlcmZsb3cgPSAnaGlkZGVuJzsKICAvLyDmm7TmlrDntrLlnYAgaGFzaCDku6Xkvr/liIbkuqvllq7kuIDnianku7YKICB0cnkgewogICAgY29uc3QgbmV3SGFzaCA9ICcjaWQ9JyArIGVuY29kZVVSSUNvbXBvbmVudChpZCk7CiAgICBpZiAobG9jYXRpb24uaGFzaCAhPT0gbmV3SGFzaCkgewogICAgICBoaXN0b3J5LnJlcGxhY2VTdGF0ZShudWxsLCAnJywgbG9jYXRpb24ucGF0aG5hbWUgKyBsb2NhdGlvbi5zZWFyY2ggKyBuZXdIYXNoKTsKICAgIH0KICB9IGNhdGNoIChfKSB7fQp9CgovLyDlvp7ntrLlnYAgaGFzaCDoh6rli5XplovllZ/nianku7bvvIjnlKjmlrzliIbkuqvpgKPntZDvvIkKZnVuY3Rpb24gb3BlbkRldGFpbEZyb21IYXNoKCkgewogIGNvbnN0IG0gPSBsb2NhdGlvbi5oYXNoLm1hdGNoKC8jaWQ9KFteJl0rKS8pOwogIGlmICghbSkgcmV0dXJuOwogIGNvbnN0IGlkID0gZGVjb2RlVVJJQ29tcG9uZW50KG1bMV0pOwogIGlmIChjdXJyZW50RGV0YWlsSWQgPT09IGlkKSByZXR1cm47CiAgaWYgKF9saXN0aW5ncy5maW5kKHAgPT4gcC5pZCA9PT0gaWQpKSBvcGVuRGV0YWlsKGlkKTsKfQoKLy8g6KSH6KO955W25YmN54mp5Lu255qE5YiG5Lqr6YCj57WQCmFzeW5jIGZ1bmN0aW9uIHNoYXJlUHJvcGVydHkoKSB7CiAgaWYgKCFjdXJyZW50RGV0YWlsSWQpIHJldHVybjsKICBjb25zdCB1cmwgPSBsb2NhdGlvbi5vcmlnaW4gKyBsb2NhdGlvbi5wYXRobmFtZSArIGxvY2F0aW9uLnNlYXJjaCArICcjaWQ9JyArIGVuY29kZVVSSUNvbXBvbmVudChjdXJyZW50RGV0YWlsSWQpOwogIGNvbnN0IGJ0biA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5zaGFyZS1idG4nKTsKICBsZXQgb2sgPSBmYWxzZTsKICB0cnkgewogICAgY29uc3QgaXNNb2JpbGUgPSAvTW9iaXxBbmRyb2lkfGlQaG9uZXxpUGFkL2kudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KTsKICAgIGlmIChuYXZpZ2F0b3Iuc2hhcmUgJiYgaXNNb2JpbGUpIHsKICAgICAgY29uc3QgcCA9IF9saXN0aW5ncy5maW5kKHggPT4geC5pZCA9PT0gY3VycmVudERldGFpbElkKTsKICAgICAgYXdhaXQgbmF2aWdhdG9yLnNoYXJlKHsgdGl0bGU6IHAgPyBwLnRpdGxlIDogJ+eJqeS7tuWIhuS6qycsIHVybCB9KTsKICAgICAgcmV0dXJuOwogICAgfQogICAgaWYgKG5hdmlnYXRvci5jbGlwYm9hcmQgJiYgbmF2aWdhdG9yLmNsaXBib2FyZC53cml0ZVRleHQpIHsKICAgICAgYXdhaXQgbmF2aWdhdG9yLmNsaXBib2FyZC53cml0ZVRleHQodXJsKTsKICAgICAgb2sgPSB0cnVlOwogICAgfQogIH0gY2F0Y2ggKF8pIHsgLyog5pS56LWw6YCA6LevICovIH0KICBpZiAoIW9rKSB7CiAgICB0cnkgewogICAgICBjb25zdCB0YSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RleHRhcmVhJyk7CiAgICAgIHRhLnZhbHVlID0gdXJsOwogICAgICB0YS5zdHlsZS5wb3NpdGlvbiA9ICdmaXhlZCc7CiAgICAgIHRhLnN0eWxlLnRvcCA9ICcwJzsKICAgICAgdGEuc3R5bGUubGVmdCA9ICcwJzsKICAgICAgdGEuc3R5bGUub3BhY2l0eSA9ICcwJzsKICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0YSk7CiAgICAgIHRhLmZvY3VzKCk7CiAgICAgIHRhLnNlbGVjdCgpOwogICAgICBvayA9IGRvY3VtZW50LmV4ZWNDb21tYW5kKCdjb3B5Jyk7CiAgICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQodGEpOwogICAgfSBjYXRjaCAoXykge30KICB9CiAgaWYgKCFvaykgewogICAgcHJvbXB0KCfoq4vmiYvli5XopIfoo73mraTpgKPntZDvvJonLCB1cmwpOwogICAgcmV0dXJuOwogIH0KICBpZiAoYnRuKSB7CiAgICBjb25zdCBvcmlnID0gYnRuLnRleHRDb250ZW50OwogICAgYnRuLnRleHRDb250ZW50ID0gJ+KckyDlt7LopIfoo70nOwogICAgYnRuLmNsYXNzTGlzdC5hZGQoJ2NvcGllZCcpOwogICAgc2V0VGltZW91dCgoKSA9PiB7CiAgICAgIGJ0bi50ZXh0Q29udGVudCA9IG9yaWc7CiAgICAgIGJ0bi5jbGFzc0xpc3QucmVtb3ZlKCdjb3BpZWQnKTsKICAgIH0sIDE4MDApOwogIH0KfQoKZnVuY3Rpb24gYnVpbGREZXRhaWxIVE1MKHApIHsKICBjb25zdCBpbWdzID0gcC5pbWFnZXMgJiYgcC5pbWFnZXMubGVuZ3RoID8gcC5pbWFnZXMgOiBbXTsKICBsZXQgZ2FsbGVyeUhUTUwgPSBpbWdzLmxlbmd0aAogICAgPyBgPGRpdiBjbGFzcz0iZGV0YWlsLWdhbGxlcnkiIGlkPSJnYWxsZXJ5Ij4KICAgICAgICAgPGltZyBzcmM9IiR7ZXNjSHRtbChpbWdzWzBdKX0iIGlkPSJnYWxsZXJ5SW1nIiBhbHQ9IueJqeS7tuWclueJhyIKICAgICAgICAgICBvbmVycm9yPSJ0aGlzLnBhcmVudE5vZGUuaW5uZXJIVE1MPSc8ZGl2IGNsYXNzPWRldGFpbC1nYWxsZXJ5LXBsYWNlaG9sZGVyPjwvZGl2PiciPgogICAgICAgICAke2ltZ3MubGVuZ3RoID4gMSA/IGAKICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJnYWxsZXJ5LW5hdiBnYWxsZXJ5LXByZXYiIG9uY2xpY2s9Im5hdkdhbGxlcnkoLTEpIj7igLk8L2J1dHRvbj4KICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJnYWxsZXJ5LW5hdiBnYWxsZXJ5LW5leHQiIG9uY2xpY2s9Im5hdkdhbGxlcnkoMSkiPuKAujwvYnV0dG9uPgogICAgICAgICAgIDxkaXYgY2xhc3M9ImdhbGxlcnktZG90cyI+JHtpbWdzLm1hcCgoXywgaSkgPT4gYDxkaXYgY2xhc3M9ImdhbGxlcnktZG90JHtpID09PSAwID8gJyBhY3RpdmUnIDogJyd9IiBvbmNsaWNrPSJnb3RvR2FsbGVyeSgke2l9KSI+PC9kaXY+YCkuam9pbignJyl9PC9kaXY+CiAgICAgICAgIGAgOiAnJ30KICAgICAgIDwvZGl2PmAKICAgIDogYDxkaXYgY2xhc3M9ImRldGFpbC1nYWxsZXJ5LXBsYWNlaG9sZGVyIj48L2Rpdj5gOwoKICBjb25zdCB0YWdzID0gKHAuZmVhdHVyZXMgfHwgW10pLm1hcCh0ID0+IGA8c3BhbiBjbGFzcz0iZGV0YWlsLXRhZyI+JHtlc2NIdG1sKHQpfTwvc3Bhbj5gKS5qb2luKCcnKTsKICBsZXQgdmlkZW9IVE1MID0gJyc7CiAgaWYgKHAudmlkZW9VcmwpIHsKICAgIGNvbnN0IGVtYmVkVXJsID0gdG9FbWJlZFVybChwLnZpZGVvVXJsKTsKICAgIHZpZGVvSFRNTCA9IGVtYmVkVXJsCiAgICAgID8gYDxkaXYgY2xhc3M9ImRldGFpbC1zZWN0aW9uIj48aDM+5b2x54mH5LuL57S5PC9oMz48ZGl2IGNsYXNzPSJ2aWRlby13cmFwIj48aWZyYW1lIHNyYz0iJHtlc2NIdG1sKGVtYmVkVXJsKX0iIGFsbG93ZnVsbHNjcmVlbiBhbGxvdz0iYWNjZWxlcm9tZXRlcjsgYXV0b3BsYXk7IGNsaXBib2FyZC13cml0ZTsgZW5jcnlwdGVkLW1lZGlhOyBneXJvc2NvcGU7IHBpY3R1cmUtaW4tcGljdHVyZSI+PC9pZnJhbWU+PC9kaXY+PC9kaXY+YAogICAgICA6IGA8ZGl2IGNsYXNzPSJkZXRhaWwtc2VjdGlvbiI+PGgzPuW9seeJh+S7i+e0uTwvaDM+PGEgY2xhc3M9InZpZGVvLWxpbmstYnRuIiBocmVmPSIke2VzY0h0bWwocC52aWRlb1VybCl9IiB0YXJnZXQ9Il9ibGFuayIgcmVsPSJub29wZW5lciI+6KeA55yL5b2x54mHPC9hPjwvZGl2PmA7CiAgfQoKICByZXR1cm4gYAogICAgJHtnYWxsZXJ5SFRNTH0KICAgIDxkaXYgY2xhc3M9ImRldGFpbC1ib2R5Ij4KICAgICAgPGRpdiBjbGFzcz0iZGV0YWlsLWhlYWRlciI+CiAgICAgICAgPGRpdiBjbGFzcz0iZGV0YWlsLXR5cGUtYmFkZ2UiPiR7ZXNjSHRtbChwLnR5cGUgfHwgJycpfTwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9ImRldGFpbC10aXRsZS1yb3ciPgogICAgICAgICAgPGRpdiBjbGFzcz0iZGV0YWlsLXRpdGxlIj4ke2VzY0h0bWwocC50aXRsZSl9PC9kaXY+CiAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJzaGFyZS1idG4iIG9uY2xpY2s9InNoYXJlUHJvcGVydHkoKSIgdGl0bGU9Iuikh+ijveatpOeJqeS7tueahOWIhuS6q+mAo+e1kCI+6KSH6KO96YCj57WQPC9idXR0b24+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0iZGV0YWlsLWFkZHIiPiR7ZXNjSHRtbChwLmNpdHkgfHwgJycpfSR7ZXNjSHRtbChwLmRpc3RyaWN0IHx8ICcnKX0gJHtlc2NIdG1sKHAuYWRkcmVzcyB8fCAnJyl9PC9kaXY+CiAgICAgIDwvZGl2PgogICAgICA8ZGl2IGNsYXNzPSJkZXRhaWwtcHJpY2Utcm93Ij4KICAgICAgICA8c3BhbiBzdHlsZT0iZm9udC1zaXplOjE1cHg7Y29sb3I6I2UxMWQ0OCI+5ZSu5YO5PC9zcGFuPgogICAgICAgIDxkaXY+CiAgICAgICAgICAke3AucHJldmlvdXNQcmljZSAmJiBwLnByZXZpb3VzUHJpY2UgIT09IHAucHJpY2UgPyBgPGRpdiBzdHlsZT0iZm9udC1zaXplOjEzcHg7Y29sb3I6dmFyKC0tZ3JheS00MDApO3RleHQtZGVjb3JhdGlvbjpsaW5lLXRocm91Z2g7bWFyZ2luLWJvdHRvbToycHgiPiR7cC5wcmV2aW91c1ByaWNlLnRvTG9jYWxlU3RyaW5nKCl96JCsPC9kaXY+YCA6ICcnfQogICAgICAgICAgPGRpdiBzdHlsZT0iZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtnYXA6OHB4Ij4KICAgICAgICAgICAgJHtwLnByZXZpb3VzUHJpY2UgJiYgcC5wcmV2aW91c1ByaWNlID4gcC5wcmljZSA/IGA8c3BhbiBjbGFzcz0icHJpY2UtZGlmZi1kb3duIj7ihpMkeyhwLnByZXZpb3VzUHJpY2UgLSBwLnByaWNlKS50b0xvY2FsZVN0cmluZygpfeiQrDwvc3Bhbj5gIDogJyd9CiAgICAgICAgICAgICR7cC5wcmV2aW91c1ByaWNlICYmIHAucHJldmlvdXNQcmljZSA8IHAucHJpY2UgPyBgPHNwYW4gY2xhc3M9InByaWNlLWRpZmYtdXAiPuKGkSR7KHAucHJpY2UgLSBwLnByZXZpb3VzUHJpY2UpLnRvTG9jYWxlU3RyaW5nKCl96JCsPC9zcGFuPmAgOiAnJ30KICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImRldGFpbC1wcmljZSI+JHtwLnByaWNlID8gcC5wcmljZS50b0xvY2FsZVN0cmluZygpIDogJy0tJ308L3NwYW4+CiAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJkZXRhaWwtcHJpY2UtdW5pdCI+6JCs5YWDPC9zcGFuPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvZGl2PgogICAgICA8ZGl2IGNsYXNzPSJkZXRhaWwtc3RhdHMiPgogICAgICAgICR7cC5zaXplID8gYDxkaXYgY2xhc3M9ImRldGFpbC1zdGF0Ij48ZGl2IGNsYXNzPSJkZXRhaWwtc3RhdC1sYWJlbCI+5Z2q5pW4PC9kaXY+PGRpdiBjbGFzcz0iZGV0YWlsLXN0YXQtdmFsdWUiPiR7cC5zaXplfSDlnao8L2Rpdj48L2Rpdj5gIDogJyd9CiAgICAgICAgJHtwLmxheW91dCA/IGA8ZGl2IGNsYXNzPSJkZXRhaWwtc3RhdCI+PGRpdiBjbGFzcz0iZGV0YWlsLXN0YXQtbGFiZWwiPuagvOWxgDwvZGl2PjxkaXYgY2xhc3M9ImRldGFpbC1zdGF0LXZhbHVlIj4ke2VzY0h0bWwocC5sYXlvdXQpfTwvZGl2PjwvZGl2PmAgOiAnJ30KICAgICAgICAke3AuZmxvb3IgPyBgPGRpdiBjbGFzcz0iZGV0YWlsLXN0YXQiPjxkaXYgY2xhc3M9ImRldGFpbC1zdGF0LWxhYmVsIj7mqJPlsaQ8L2Rpdj48ZGl2IGNsYXNzPSJkZXRhaWwtc3RhdC12YWx1ZSI+JHtlc2NIdG1sKHAuZmxvb3IpfTwvZGl2PjwvZGl2PmAgOiAnJ30KICAgICAgICAke3AuYWdlID8gYDxkaXYgY2xhc3M9ImRldGFpbC1zdGF0Ij48ZGl2IGNsYXNzPSJkZXRhaWwtc3RhdC1sYWJlbCI+5bGL6b2hPC9kaXY+PGRpdiBjbGFzcz0iZGV0YWlsLXN0YXQtdmFsdWUiPiR7ZXNjSHRtbChwLmFnZSl9PC9kaXY+PC9kaXY+YCA6ICcnfQogICAgICAgICR7cC5wYXJraW5nID8gYDxkaXYgY2xhc3M9ImRldGFpbC1zdGF0Ij48ZGl2IGNsYXNzPSJkZXRhaWwtc3RhdC1sYWJlbCI+6LuK5L2NPC9kaXY+PGRpdiBjbGFzcz0iZGV0YWlsLXN0YXQtdmFsdWUiPiR7ZXNjSHRtbChwLnBhcmtpbmcpfTwvZGl2PjwvZGl2PmAgOiAnJ30KICAgICAgPC9kaXY+CiAgICAgICR7dGFncyA/IGA8ZGl2IGNsYXNzPSJkZXRhaWwtc2VjdGlvbiI+PGgzPueJqeS7tueJueiJsjwvaDM+PGRpdiBjbGFzcz0iZGV0YWlsLXRhZ3MiPiR7dGFnc308L2Rpdj48L2Rpdj5gIDogJyd9CiAgICAgICR7cC5kZXNjID8gYDxkaXYgY2xhc3M9ImRldGFpbC1zZWN0aW9uIj48aDM+54mp5Lu26Kqq5piOPC9oMz48ZGl2IGNsYXNzPSJkZXRhaWwtZGVzYyI+JHtsaW5raWZ5KHAuZGVzYyl9PC9kaXY+PC9kaXY+YCA6ICcnfQogICAgICAke3ZpZGVvSFRNTH0KICAgICAgJHsocC5jb250YWN0IHx8IHAubGluZUlkKSA/IGA8ZGl2IGNsYXNzPSJjb250YWN0LWJveCI+CiAgICAgICAgPGRpdj48ZGl2IGNsYXNzPSJjb250YWN0LW5hbWUiPumgkOe0hOiznuWxizwvZGl2PjxkaXYgY2xhc3M9ImNvbnRhY3QtaW5mbyI+JHtlc2NIdG1sKHAuY29udGFjdCB8fCAnJyl9PC9kaXY+PC9kaXY+CiAgICAgICAgPGRpdiBzdHlsZT0iZGlzcGxheTpmbGV4O2dhcDo4cHg7ZmxleC13cmFwOndyYXAiPgogICAgICAgICAgJHtleHRyYWN0UGhvbmUocC5jb250YWN0KSA/IGA8YnV0dG9uIGNsYXNzPSJjb250YWN0LXRlbCIgb25jbGljaz0ic2hvd1Bob25lUG9wdXAoJyR7ZXh0cmFjdFBob25lKHAuY29udGFjdCl9JykiPueri+WNs+iBr+e1oTwvYnV0dG9uPmAgOiAnJ30KICAgICAgICAgICR7cC5saW5lSWQgPyBgPGEgY2xhc3M9ImNvbnRhY3QtbGluZSIgaHJlZj0iJHtlc2NIdG1sKHAubGluZUlkKX0iIHRhcmdldD0iX2JsYW5rIiByZWw9Im5vb3BlbmVyIj7liqAgTElORTwvYT5gIDogJyd9CiAgICAgICAgPC9kaXY+CiAgICAgIDwvZGl2PmAgOiAnJ30KICAgIDwvZGl2PmA7Cn0KCmZ1bmN0aW9uIG5hdkdhbGxlcnkoZGlyKSB7CiAgY29uc3QgcCA9IF9saXN0aW5ncy5maW5kKHggPT4geC5pZCA9PT0gY3VycmVudERldGFpbElkKTsKICBpZiAoIXAgfHwgIXAuaW1hZ2VzIHx8IHAuaW1hZ2VzLmxlbmd0aCA8IDIpIHJldHVybjsKICBjdXJyZW50R2FsbGVyeUlkeCA9IChjdXJyZW50R2FsbGVyeUlkeCArIGRpciArIHAuaW1hZ2VzLmxlbmd0aCkgJSBwLmltYWdlcy5sZW5ndGg7CiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2dhbGxlcnlJbWcnKS5zcmMgPSBwLmltYWdlc1tjdXJyZW50R2FsbGVyeUlkeF07CiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmdhbGxlcnktZG90JykuZm9yRWFjaCgoZCwgaSkgPT4gZC5jbGFzc0xpc3QudG9nZ2xlKCdhY3RpdmUnLCBpID09PSBjdXJyZW50R2FsbGVyeUlkeCkpOwp9CmZ1bmN0aW9uIGdvdG9HYWxsZXJ5KGkpIHsKICBjb25zdCBwID0gX2xpc3RpbmdzLmZpbmQoeCA9PiB4LmlkID09PSBjdXJyZW50RGV0YWlsSWQpOwogIGlmICghcCB8fCAhcC5pbWFnZXMpIHJldHVybjsKICBjdXJyZW50R2FsbGVyeUlkeCA9IGk7CiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2dhbGxlcnlJbWcnKS5zcmMgPSBwLmltYWdlc1tpXTsKICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuZ2FsbGVyeS1kb3QnKS5mb3JFYWNoKChkLCBqKSA9PiBkLmNsYXNzTGlzdC50b2dnbGUoJ2FjdGl2ZScsIGogPT09IGkpKTsKfQoKZnVuY3Rpb24gdG9FbWJlZFVybCh1cmwpIHsKICBpZiAoIXVybCkgcmV0dXJuIG51bGw7CiAgY29uc3QgeXQgPSB1cmwubWF0Y2goLyg/OnlvdXR1XC5iZVwvfHlvdXR1YmVcLmNvbVwvKD86d2F0Y2hcP3Y9fGVtYmVkXC98c2hvcnRzXC8pKShbQS1aYS16MC05Xy1dezExfSkvKTsKICBpZiAoeXQpIHJldHVybiBgaHR0cHM6Ly93d3cueW91dHViZS5jb20vZW1iZWQvJHt5dFsxXX1gOwogIGNvbnN0IHZtID0gdXJsLm1hdGNoKC92aW1lb1wuY29tXC8oXGQrKS8pOwogIGlmICh2bSkgcmV0dXJuIGBodHRwczovL3BsYXllci52aW1lby5jb20vdmlkZW8vJHt2bVsxXX1gOwogIHJldHVybiBudWxsOwp9CgpmdW5jdGlvbiBleHRyYWN0UGhvbmUoc3RyKSB7CiAgaWYgKCFzdHIpIHJldHVybiBudWxsOwogIGNvbnN0IG0gPSBTdHJpbmcoc3RyKS5tYXRjaCgvWzAtOV17NH0tP1swLTldezN9LT9bMC05XXszfXwwOVswLTldezh9fFwoMFswLTldK1wpWzAtOSAtXSsvKTsKICByZXR1cm4gbSA/IG1bMF0ucmVwbGFjZSgvLS9nLCAnJykgOiBudWxsOwp9CgovLyA9PT09PSBQaG9uZSBwb3B1cCA9PT09PQpmdW5jdGlvbiBzaG93UGhvbmVQb3B1cChwaG9uZSkgewogIGNvbnN0IGZvcm1hdHRlZCA9IHBob25lLnJlcGxhY2UoLyhcZHs0fSkoXGR7M30pKFxkezN9KS8sICckMS0kMi0kMycpOwogIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwaG9uZVBvcHVwTnVtYmVyJykudGV4dENvbnRlbnQgPSBmb3JtYXR0ZWQ7CiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Bob25lUG9wdXBMaW5rJykuaHJlZiA9ICd0ZWw6JyArIHBob25lOwogIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwaG9uZVBvcHVwJykuY2xhc3NMaXN0LmFkZCgnYWN0aXZlJyk7CiAgZG9jdW1lbnQuYm9keS5zdHlsZS5vdmVyZmxvdyA9ICdoaWRkZW4nOwp9CmZ1bmN0aW9uIGNsb3NlUGhvbmVQb3B1cCgpIHsKICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncGhvbmVQb3B1cCcpLmNsYXNzTGlzdC5yZW1vdmUoJ2FjdGl2ZScpOwogIGRvY3VtZW50LmJvZHkuc3R5bGUub3ZlcmZsb3cgPSAnJzsKfQoKLy8gPT09PT0g5YWx55SoID09PT09CmZ1bmN0aW9uIGNsb3NlTW9kYWwoaWQpIHsKICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCkuY2xhc3NMaXN0LnJlbW92ZSgnYWN0aXZlJyk7CiAgZG9jdW1lbnQuYm9keS5zdHlsZS5vdmVyZmxvdyA9ICcnOwogIC8vIOmXnOmWieeJqeS7tuips+e0sOmggeaZgu+8jOa4heaOiee2suWdgOijoeeahCAjaWQ9eHh4CiAgaWYgKGlkID09PSAnZGV0YWlsT3ZlcmxheScpIHsKICAgIGN1cnJlbnREZXRhaWxJZCA9IG51bGw7CiAgICB0cnkgewogICAgICBpZiAobG9jYXRpb24uaGFzaCkgewogICAgICAgIGhpc3RvcnkucmVwbGFjZVN0YXRlKG51bGwsICcnLCBsb2NhdGlvbi5wYXRobmFtZSArIGxvY2F0aW9uLnNlYXJjaCk7CiAgICAgIH0KICAgIH0gY2F0Y2ggKF8pIHt9CiAgfQp9CmZ1bmN0aW9uIGNsb3NlT3ZlcmxheShldmVudCwgaWQpIHsKICBpZiAoZXZlbnQudGFyZ2V0ID09PSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCkpIGNsb3NlTW9kYWwoaWQpOwp9CmZ1bmN0aW9uIGVzY0h0bWwoc3RyKSB7CiAgcmV0dXJuIFN0cmluZyhzdHIgfHwgJycpLnJlcGxhY2UoLyYvZywgJyZhbXA7JykucmVwbGFjZSgvPC9nLCAnJmx0OycpLnJlcGxhY2UoLz4vZywgJyZndDsnKS5yZXBsYWNlKC8iL2csICcmcXVvdDsnKTsKfQoKLy8g5oqK5paH5a2X5YWn55qEIFVSTCDoh6rli5XovYnmiJDlj6/pu57mk4rpgKPntZDvvIjpgKPntZDlhaflrrnku40gZXNjYXBlIOmYsiBYU1PvvIkKZnVuY3Rpb24gbGlua2lmeSh0ZXh0KSB7CiAgY29uc3QgcGFydHMgPSBTdHJpbmcodGV4dCB8fCAnJykuc3BsaXQoLyhodHRwcz86XC9cL1teXHM8PiIn77yJKe+8jCzjgILjgIFdKykvZyk7CiAgcmV0dXJuIHBhcnRzLm1hcChmdW5jdGlvbiAocGFydCwgaSkgewogICAgY29uc3Qgc2FmZSA9IGVzY0h0bWwocGFydCk7CiAgICBpZiAoaSAlIDIgPT09IDEpIHsKICAgICAgcmV0dXJuICc8YSBocmVmPSInICsgc2FmZSArICciIHRhcmdldD0iX2JsYW5rIiByZWw9Im5vb3BlbmVyIiBzdHlsZT0iY29sb3I6dmFyKC0tcHJpbWFyeSk7dGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZTt3b3JkLWJyZWFrOmJyZWFrLWFsbCI+JyArIHNhZmUgKyAnPC9hPic7CiAgICB9CiAgICByZXR1cm4gc2FmZTsKICB9KS5qb2luKCcnKTsKfQoKZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIGUgPT4gewogIGlmIChlLmtleSA9PT0gJ0VzY2FwZScpIHsKICAgIGNsb3NlTW9kYWwoJ2RldGFpbE92ZXJsYXknKTsKICAgIGNsb3NlUGhvbmVQb3B1cCgpOwogIH0KfSk7CgovLyA9PT09PSDllZ/li5UgPT09PT0KY29uc3QgZm9yY2VGcmVzaCA9IC9bPyZdbm9jYWNoZT0xLy50ZXN0KGxvY2F0aW9uLnNlYXJjaCk7CmxvYWRMaXN0aW5ncyhmb3JjZUZyZXNoKTsKCi8vIOaQnOWwi+ahhiBpbnB1dCDljbPmmYLmkJzlsIsKKGZ1bmN0aW9uIGF0dGFjaFNlYXJjaCgpIHsKICBjb25zdCBlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZWFyY2hJbnB1dCcpOwogIGlmICghZWwpIHJldHVybjsKICBlbC5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsIHJlbmRlckxpc3RpbmdzKTsKfSkoKTsKCi8vIOebo+iBvee2suWdgCBoYXNoIOiuiuWMlu+8iOS+i+WmguiyvOS4iuWIhuS6q+mAo+e1kOaZgu+8iQp3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignaGFzaGNoYW5nZScsIG9wZW5EZXRhaWxGcm9tSGFzaCk7CgovLyDmioogaW5saW5lIG9uY2xpY2sgLyBvbmNoYW5nZSDnlKjliLDnmoTlh73lvI/mjpvliLAgd2luZG93Ci8vIO+8iOWboOeCuumAmeS7vSBKUyDmmK/nlLEgYmFzZTY0IGxvYWRlciDnlKggbmV3IEZ1bmN0aW9uIOWft+ihjO+8jOmgkOioreWcqOeNqOeri+S9nOeUqOWfn++8iQp3aW5kb3cucmVuZGVyTGlzdGluZ3MgPSByZW5kZXJMaXN0aW5nczsKd2luZG93Lm9uUGFya2luZ0NoYW5nZSA9IG9uUGFya2luZ0NoYW5nZTsKd2luZG93Lm9wZW5EZXRhaWwgPSBvcGVuRGV0YWlsOwp3aW5kb3cubmF2R2FsbGVyeSA9IG5hdkdhbGxlcnk7CndpbmRvdy5nb3RvR2FsbGVyeSA9IGdvdG9HYWxsZXJ5Owp3aW5kb3cuY2xvc2VPdmVybGF5ID0gY2xvc2VPdmVybGF5Owp3aW5kb3cuY2xvc2VNb2RhbCA9IGNsb3NlTW9kYWw7CndpbmRvdy5zaG93UGhvbmVQb3B1cCA9IHNob3dQaG9uZVBvcHVwOwp3aW5kb3cuY2xvc2VQaG9uZVBvcHVwID0gY2xvc2VQaG9uZVBvcHVwOwp3aW5kb3cuc2hhcmVQcm9wZXJ0eSA9IHNoYXJlUHJvcGVydHk7CndpbmRvdy5vcGVuRGV0YWlsRnJvbUhhc2ggPSBvcGVuRGV0YWlsRnJvbUhhc2g7Cg==