8月10日でパソコン版の「Google ドライブ」アプリによる「Googleフォト」へのバックアップ機能が利用出来なくなるようです。Immichの写真をVM上のWindowsで公式クライアントソフトを使ってリアルタイムにクラウドへも同期したりしているのですが(参考記事)、このためだけにVMでWindowsを起動しておくのも無駄だなと感じていたので、この機会にとrcloneへ移行してみることに。
rcloneの使い方は過去に紹介した事がありますが、多数のフォルダやスケジュールを登録していたりすると少し分かりにくいです。公式でGUIも用意されているようですが、自分専用にとrcloneのWeb-UI「EasyRclone」を作ってみました。
ひとまずGoogleドライブとOneDrive限定にしています。

LXDコンテナにインストール
いつものように、LXDコンテナで下記を貼り付けるだけでインストールできます。3348番ポートで公開しています。
#!/bin/bash
set -e
INSTALL_DIR="/opt/easyrclone"
PORT="${PORT:-3348}"
echo "========================================="
echo " EasyRclone Installer v6"
echo "========================================="
echo ""
if [ "$(id -u)" -ne 0 ]; then
echo "エラー: root で実行してください"
echo " sudo bash $0"
exit 1
fi
echo "[1/6] タイムゾーン設定 (JST)..."
if command -v timedatectl &>/dev/null; then
timedatectl set-timezone Asia/Tokyo 2>/dev/null || true
elif [ -f /usr/share/zoneinfo/Asia/Tokyo ]; then
ln -sf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
echo "Asia/Tokyo" > /etc/timezone
fi
echo " $(date)"
echo ""
if [ -f /etc/os-release ]; then . /etc/os-release; OS=$ID; else OS=$(uname -s | tr '[:upper:]' '[:lower:]'); fi
echo "OS: $OS"
echo ""
echo "[Tailscale] IP / MagicDNS 検出..."
TS_IP=""
TS_HOSTNAME=""
if command -v tailscale &>/dev/null; then
TS_JSON=$(tailscale status --json 2>/dev/null || true)
if [ -n "$TS_JSON" ]; then
TS_IP=$(echo "$TS_JSON" | python3 -c "import json,sys
try:
d=json.load(sys.stdin)
print(d.get('Self',{}).get('TailscaleIPs',[''])[0])
except Exception:
print('')" 2>/dev/null)
TS_HOSTNAME=$(echo "$TS_JSON" | python3 -c "import json,sys
try:
d=json.load(sys.stdin)
print(d.get('Self',{}).get('DNSName','').rstrip('.'))
except Exception:
print('')" 2>/dev/null)
fi
fi
if [ -n "$TS_IP" ]; then
echo " Tailscale IP: $TS_IP"
else
echo " Tailscale 未検出(ローカルURLのみ表示します)"
fi
echo ""
echo "[2/6] Node.js インストール..."
if command -v node &>/dev/null && [ "$(node -v | sed 's/v//' | cut -d. -f1)" -ge 18 ]; then
echo " Node.js $(node -v) は既にインストール済み"
else
case "$OS" in
ubuntu|debian) curl -fsSL https://deb.nodesource.com/setup_22.x | bash - && apt-get install -y nodejs ;;
centos|rhel|rocky|alma|fedora) curl -fsSL https://rpm.nodesource.com/setup_22.x | bash - && yum install -y nodejs ;;
*) curl -fsSL https://deb.nodesource.com/setup_22.x | bash - && apt-get install -y nodejs 2>/dev/null || yum install -y nodejs ;;
esac
fi
echo " Node.js $(node -v)"
echo ""
echo "[3/6] rclone インストール..."
if ! command -v rclone &>/dev/null; then
curl -fsSL https://rclone.org/install.sh | bash
fi
echo " rclone $(rclone version | head -1)"
echo ""
echo "[4/6] プロジェクト作成..."
mkdir -p "$INSTALL_DIR"/{public/css,public/js,config,sync-jobs}
B64_SERVER='Y29uc3QgZXhwcmVzcyA9IHJlcXVpcmUoJ2V4cHJlc3MnKTsKY29uc3QgeyBleGVjU3luYywgc3Bhd24gfSA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKTsKY29uc3QgZnMgPSByZXF1aXJlKCdmcycpOwpjb25zdCBwYXRoID0gcmVxdWlyZSgncGF0aCcpOwoKY29uc3QgYXBwID0gZXhwcmVzcygpOwpjb25zdCBQT1JUID0gcHJvY2Vzcy5lbnYuUE9SVCB8fCAzMzQ4Owpjb25zdCBSQ0xPTkVfQ09ORklHX0RJUiA9IHBhdGguam9pbihfX2Rpcm5hbWUsICdjb25maWcnKTsKY29uc3QgU1lOQ19KT0JTX0RJUiA9IHBhdGguam9pbihfX2Rpcm5hbWUsICdzeW5jLWpvYnMnKTsKY29uc3QgQ09ORklHX1BBVEggPSBwYXRoLmpvaW4oUkNMT05FX0NPTkZJR19ESVIsICdyY2xvbmUuY29uZicpOwoKaWYgKCFmcy5leGlzdHNTeW5jKFJDTE9ORV9DT05GSUdfRElSKSkgZnMubWtkaXJTeW5jKFJDTE9ORV9DT05GSUdfRElSLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTsKaWYgKCFmcy5leGlzdHNTeW5jKFNZTkNfSk9CU19ESVIpKSBmcy5ta2RpclN5bmMoU1lOQ19KT0JTX0RJUiwgeyByZWN1cnNpdmU6IHRydWUgfSk7Cgpwcm9jZXNzLmVudi5SQ0xPTkVfQ09ORklHID0gQ09ORklHX1BBVEg7CgphcHAudXNlKGV4cHJlc3MuanNvbigpKTsKYXBwLnVzZShleHByZXNzLnN0YXRpYyhwYXRoLmpvaW4oX19kaXJuYW1lLCAncHVibGljJykpKTsKCmZ1bmN0aW9uIHJlYWRDb25maWcoKSB7CiAgaWYgKCFmcy5leGlzdHNTeW5jKENPTkZJR19QQVRIKSkgcmV0dXJuICcnOwogIHJldHVybiBmcy5yZWFkRmlsZVN5bmMoQ09ORklHX1BBVEgsICd1dGYtOCcpOwp9CgpmdW5jdGlvbiB3cml0ZUNvbmZpZyhjb250ZW50KSB7CiAgZnMud3JpdGVGaWxlU3luYyhDT05GSUdfUEFUSCwgY29udGVudC50cmltKCkgKyAnXG4nKTsKfQoKZnVuY3Rpb24gcGFyc2VSZW1vdGVzKCkgewogIGNvbnN0IGNvbnRlbnQgPSByZWFkQ29uZmlnKCk7CiAgaWYgKCFjb250ZW50LnRyaW0oKSkgcmV0dXJuIFtdOwogIGNvbnN0IHJlbW90ZXMgPSBbXTsKICBsZXQgY3VycmVudCA9IG51bGw7CiAgZm9yIChjb25zdCBsaW5lIG9mIGNvbnRlbnQuc3BsaXQoJ1xuJykpIHsKICAgIGNvbnN0IG0gPSBsaW5lLm1hdGNoKC9eXFsoLispXF0kLyk7CiAgICBpZiAobSkgewogICAgICBpZiAoY3VycmVudCkgcmVtb3Rlcy5wdXNoKGN1cnJlbnQpOwogICAgICBjdXJyZW50ID0geyBuYW1lOiBtWzFdLCB0eXBlOiAnJywgcGFyYW1zOiB7fSB9OwogICAgfSBlbHNlIGlmIChjdXJyZW50ICYmIGxpbmUuaW5jbHVkZXMoJz0nKSkgewogICAgICBjb25zdCBlcSA9IGxpbmUuaW5kZXhPZignPScpOwogICAgICBjb25zdCBrZXkgPSBsaW5lLnN1YnN0cmluZygwLCBlcSkudHJpbSgpOwogICAgICBjb25zdCB2YWwgPSBsaW5lLnN1YnN0cmluZyhlcSArIDEpLnRyaW0oKTsKICAgICAgY3VycmVudC5wYXJhbXNba2V5XSA9IHZhbDsKICAgICAgaWYgKGtleSA9PT0gJ3R5cGUnKSBjdXJyZW50LnR5cGUgPSB2YWw7CiAgICB9CiAgfQogIGlmIChjdXJyZW50KSByZW1vdGVzLnB1c2goY3VycmVudCk7CiAgcmV0dXJuIHJlbW90ZXM7Cn0KCmZ1bmN0aW9uIHJjbG9uZShhcmdzKSB7CiAgdHJ5IHsKICAgIGNvbnN0IG91dCA9IGV4ZWNTeW5jKGByY2xvbmUgJHthcmdzLmpvaW4oJyAnKX1gLCB7CiAgICAgIHRpbWVvdXQ6IDMwMDAwLAogICAgICBlbmNvZGluZzogJ3V0Zi04JywKICAgICAgZW52OiB7IC4uLnByb2Nlc3MuZW52LCBSQ0xPTkVfQ09ORklHOiBDT05GSUdfUEFUSCB9CiAgICB9KTsKICAgIHJldHVybiB7IG9rOiB0cnVlLCBkYXRhOiBvdXQudHJpbSgpIH07CiAgfSBjYXRjaCAoZSkgewogICAgcmV0dXJuIHsgb2s6IGZhbHNlLCBlcnJvcjogKGUuc3RkZXJyIHx8IGUubWVzc2FnZSkudHJpbSgpIH07CiAgfQp9CgovLyA9PT0gQ29uZmlnIEFQSSA9PT0KYXBwLmdldCgnL2FwaS9yZW1vdGVzJywgKHJlcSwgcmVzKSA9PiB7CiAgcmVzLmpzb24oeyByZW1vdGVzOiBwYXJzZVJlbW90ZXMoKSB9KTsKfSk7CgphcHAucG9zdCgnL2FwaS9yZW1vdGVzJywgKHJlcSwgcmVzKSA9PiB7CiAgY29uc3QgeyBuYW1lLCB0eXBlLCBwYXJhbXMgfSA9IHJlcS5ib2R5OwogIGlmICghbmFtZSB8fCAhdHlwZSkgcmV0dXJuIHJlcy5zdGF0dXMoNDAwKS5qc29uKHsgZXJyb3I6ICflkI3liY3jgajjgr/jgqTjg5fjga/lv4XpoIjjgafjgZknIH0pOwogIGlmICghL15bYS16QS1aMC05Xy1dKyQvLnRlc3QobmFtZSkpIHJldHVybiByZXMuc3RhdHVzKDQwMCkuanNvbih7IGVycm9yOiAn5ZCN5YmN44Gv6Iux5pWw5a2X44CB44OP44Kk44OV44Oz44CB44Ki44Oz44OA44O844K544Kz44Ki44Gu44G/JyB9KTsKCiAgY29uc3QgcmVtb3RlcyA9IHBhcnNlUmVtb3RlcygpOwogIGlmIChyZW1vdGVzLmZpbmQociA9PiByLm5hbWUgPT09IG5hbWUpKSByZXR1cm4gcmVzLnN0YXR1cyg0MDkpLmpzb24oeyBlcnJvcjogYOOAjCR7bmFtZX3jgI3jga/ml6LjgavlrZjlnKjjgZfjgb7jgZlgIH0pOwoKICBsZXQgc2VjdGlvbiA9IGBbJHtuYW1lfV1cbnR5cGUgPSAke3R5cGV9YDsKICBmb3IgKGNvbnN0IFtrLCB2XSBvZiBPYmplY3QuZW50cmllcyhwYXJhbXMgfHwge30pKSB7CiAgICBpZiAodiAhPT0gJycgJiYgdiAhPSBudWxsKSBzZWN0aW9uICs9IGBcbiR7a30gPSAke3Z9YDsKICB9CiAgY29uc3Qgc2VwID0gcmVhZENvbmZpZygpLnRyaW0oKSA/ICdcbicgOiAnJzsKICBmcy5hcHBlbmRGaWxlU3luYyhDT05GSUdfUEFUSCwgc2VwICsgc2VjdGlvbiArICdcbicpOwogIHJlcy5qc29uKHsgb2s6IHRydWUgfSk7Cn0pOwoKYXBwLmRlbGV0ZSgnL2FwaS9yZW1vdGVzLzpuYW1lJywgKHJlcSwgcmVzKSA9PiB7CiAgY29uc3QgeyBuYW1lIH0gPSByZXEucGFyYW1zOwogIGxldCBjb250ZW50ID0gcmVhZENvbmZpZygpOwogIGNvbnN0IHJlID0gbmV3IFJlZ0V4cChgXFxuP1xcWyR7bmFtZS5yZXBsYWNlKC9bLiorP14ke30oKXxbXF1cXF0vZywgJ1xcJCYnKX1cXF1bXlxcW10qYCwgJ2cnKTsKICBpZiAoIXJlLnRlc3QoY29udGVudCkpIHJldHVybiByZXMuc3RhdHVzKDQwNCkuanNvbih7IGVycm9yOiBg44CMJHtuYW1lfeOAjeOBjOimi+OBpOOBi+OCiuOBvuOBm+OCk2AgfSk7CiAgY29udGVudCA9IGNvbnRlbnQucmVwbGFjZShyZSwgJycpLnJlcGxhY2UoL1xuezMsfS9nLCAnXG5cbicpLnRyaW0oKTsKICB3cml0ZUNvbmZpZyhjb250ZW50KTsKICByZXMuanNvbih7IG9rOiB0cnVlIH0pOwp9KTsKCmFwcC5wb3N0KCcvYXBpL3JlbW90ZXMvOm5hbWUvdGVzdCcsIChyZXEsIHJlcykgPT4gewogIGNvbnN0IHsgbmFtZSB9ID0gcmVxLnBhcmFtczsKICBjb25zdCByZXN1bHQgPSByY2xvbmUoWydsc2QnLCBgJHtuYW1lfTpgLCAnLS1tYXgtZGVwdGgnLCAnMSddKTsKICBpZiAocmVzdWx0Lm9rKSB7CiAgICByZXMuanNvbih7IG9rOiB0cnVlLCBmb2xkZXJzOiByZXN1bHQuZGF0YSA/IHJlc3VsdC5kYXRhLnNwbGl0KCdcbicpLmZpbHRlcihCb29sZWFuKS5tYXAobCA9PiBsLnNwbGl0KC9ccysvKS5wb3AoKSkgOiBbXSB9KTsKICB9IGVsc2UgewogICAgcmVzLmpzb24oeyBvazogZmFsc2UsIGVycm9yOiByZXN1bHQuZXJyb3IgfSk7CiAgfQp9KTsKCi8vID09PSBTeW5jIFNldHRpbmdzID09PQpjb25zdCBTWU5DX1NFVFRJTkdTX1BBVEggPSBwYXRoLmpvaW4oX19kaXJuYW1lLCAnY29uZmlnJywgJ3N5bmMtc2V0dGluZ3MuanNvbicpOwoKYXBwLmdldCgnL2FwaS9zeW5jLXNldHRpbmdzJywgKHJlcSwgcmVzKSA9PiB7CiAgdHJ5IHsKICAgIGlmIChmcy5leGlzdHNTeW5jKFNZTkNfU0VUVElOR1NfUEFUSCkpIHsKICAgICAgY29uc3QgZGF0YSA9IEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKFNZTkNfU0VUVElOR1NfUEFUSCwgJ3V0Zi04JykpOwogICAgICByZXMuanNvbih7IG9rOiB0cnVlLCBzZXR0aW5nczogZGF0YSB9KTsKICAgIH0gZWxzZSB7CiAgICAgIHJlcy5qc29uKHsgb2s6IHRydWUsIHNldHRpbmdzOiB7IHBhaXJzOiBbXSwgc2NoZWR1bGU6IFtdIH0gfSk7CiAgICB9CiAgfSBjYXRjaCAoZSkgewogICAgcmVzLmpzb24oeyBvazogdHJ1ZSwgc2V0dGluZ3M6IHsgcGFpcnM6IFtdLCBzY2hlZHVsZTogW10gfSB9KTsKICB9Cn0pOwoKY29uc3QgQ1JPTl9NQVJLRVIgPSAnIyBlYXN5cmNsb25lLXNjaGVkdWxlJzsKY29uc3QgQ1JPTl9TQ1JJUFQgPSBwYXRoLmpvaW4oX19kaXJuYW1lLCAnY3Jvbi1zeW5jLnNoJyk7CgpmdW5jdGlvbiB3cml0ZUNyb25TY3JpcHQocGFpcnMpIHsKICBsZXQgc2NyaXB0ID0gYCMhL2Jpbi9iYXNoCmV4cG9ydCBSQ0xPTkVfQ09ORklHPSIke0NPTkZJR19QQVRIfSIKSk9CU19ESVI9IiR7U1lOQ19KT0JTX0RJUn0iCgpydW5fcGFpcigpIHsKICBsb2NhbCBzcmM9IiQxIiBkZXN0PSIkMiIgZGVsPSIkMyIgbmFtZT0iJDQiCiAgbG9jYWwgamlkPSJqb2JfJChkYXRlICslcyVOIHwgY3V0IC1jMS0xMylfJChzaHVmIC1pIDEwMDAtOTk5OSAtbjEpIgogIGxvY2FsIGpmaWxlPSIkSk9CU19ESVIvJGppZC5qc29uIgogIGxvY2FsIGp0bXA9IiRKT0JTX0RJUi8kamlkLnRtcCIKICBsb2NhbCBhcmdzPSIiCiAgaWYgWyAiJGRlbCIgPSAidHJ1ZSIgXTsgdGhlbiBhcmdzPSJzeW5jIjsgZWxzZSBhcmdzPSJjb3B5IjsgZmkKICBhcmdzPSIkYXJncyAtLXN0YXRzIDJzIC0tc3RhdHMtb25lLWxpbmUgLXYiCiAgcmNsb25lICRhcmdzICIkc3JjIiAiJGRlc3QiID4gIiRqdG1wIiAyPiYxCiAgbG9jYWwgY29kZT0kPwogIGxvY2FsIHN0YXR1cz0iY29tcGxldGVkIgogIGlmIFsgJGNvZGUgLW5lIDAgXTsgdGhlbiBzdGF0dXM9ImZhaWxlZCI7IGZpCiAgbG9jYWwgbG9nY29udGVudD0iIgogIGlmIFsgLWYgIiRqdG1wIiBdOyB0aGVuIGxvZ2NvbnRlbnQ9JChjYXQgIiRqdG1wIiB8IHRyICJcXG4iICIgIiB8IGhlYWQgLWMgNTAwMCk7IGZpCiAgbG9jYWwgdHM9JChkYXRlIC1Jc2Vjb25kcykKICBwcmludGYgJ3tcXG4gICJpZCI6ICIlcyIsXFxuICAibmFtZSI6ICIlcyIsXFxuICAic291cmNlIjogIiVzIixcXG4gICJkZXN0IjogIiVzIixcXG4gICJtb2RlIjogImNvcHkiLFxcbiAgImRlbGV0ZUV4dHJhIjogJXMsXFxuICAic3RhdHVzIjogIiVzIixcXG4gICJsb2ciOiAiJXMiLFxcbiAgImNyZWF0ZWRBdCI6ICIlcyIsXFxuICAiY29tcGxldGVkQXQiOiAiJXMiXFxufScgXFwKICAgICIkamlkIiAiJG5hbWUiICIkc3JjIiAiJGRlc3QiICIkZGVsIiAiJHN0YXR1cyIgIiRsb2djb250ZW50IiAiJHRzIiAiJHRzIiA+ICIkamZpbGUiCiAgcm0gLWYgIiRqdG1wIgp9CgpgOwogIGZvciAobGV0IGkgPSAwOyBpIDwgcGFpcnMubGVuZ3RoOyBpKyspIHsKICAgIGNvbnN0IHAgPSBwYWlyc1tpXTsKICAgIHNjcmlwdCArPSBgIyBQYWlyICR7aSArIDF9OiAke3Auc291cmNlfSAtPiAke3AuZGVzdH1cbmA7CiAgICBzY3JpcHQgKz0gYHJ1bl9wYWlyICIke3Auc291cmNlfSIgIiR7cC5kZXN0fSIgIiR7cC5kZWxldGVFeHRyYSB8fCBmYWxzZX0iICIke3Auc291cmNlfSAtPiAke3AuZGVzdH0iXG5cbmA7CiAgfQogIGZzLndyaXRlRmlsZVN5bmMoQ1JPTl9TQ1JJUFQsIHNjcmlwdCk7CiAgZnMuY2htb2RTeW5jKENST05fU0NSSVBULCAnNzU1Jyk7Cn0KCmZ1bmN0aW9uIGJ1aWxkQ3JvbkxpbmUoc2NoZWR1bGUpIHsKICBpZiAoIXNjaGVkdWxlLmxlbmd0aCkgcmV0dXJuICcnOwogIGNvbnN0IHNvcnRlZCA9IFsuLi5zY2hlZHVsZV0uc29ydCgpOwogIGNvbnN0IGdyb3VwcyA9IHt9OwogIHNvcnRlZC5mb3JFYWNoKHQgPT4gewogICAgY29uc3QgW2gsIG1dID0gdC5zcGxpdCgnOicpOwogICAgY29uc3QgbWluID0gcGFyc2VJbnQobSk7CiAgICBpZiAoIWdyb3Vwc1ttaW5dKSBncm91cHNbbWluXSA9IFtdOwogICAgZ3JvdXBzW21pbl0ucHVzaChwYXJzZUludChoKSk7CiAgfSk7CiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKGdyb3VwcykubWFwKChbbWluLCBob3Vyc10pID0+IHsKICAgIHJldHVybiBgJHttaW59ICR7aG91cnMuam9pbignLCcpfSAqICogKiAke0NST05fU0NSSVBUfSA+PiAke1NZTkNfSk9CU19ESVJ9L2Nyb24ubG9nIDI+JjFgOwogIH0pLmpvaW4oJ1xuJyk7Cn0KCmFwcC5wb3N0KCcvYXBpL3N5bmMtc2V0dGluZ3MnLCAocmVxLCByZXMpID0+IHsKICB0cnkgewogICAgY29uc3Qgc2V0dGluZ3MgPSByZXEuYm9keTsKICAgIGZzLndyaXRlRmlsZVN5bmMoU1lOQ19TRVRUSU5HU19QQVRILCBKU09OLnN0cmluZ2lmeShzZXR0aW5ncywgbnVsbCwgMikpOwoKICAgIC8vIFdyaXRlIHN5bmMgc2NyaXB0CiAgICB3cml0ZUNyb25TY3JpcHQoc2V0dGluZ3MucGFpcnMgfHwgW10pOwoKICAgIC8vIFVwZGF0ZSBjcm9uIC0gcmVtb3ZlIEFMTCBvbGQgZWFzeXJjbG9uZSBlbnRyaWVzCiAgICBsZXQgY3JvbkxpbmVzID0gW107CiAgICB0cnkgewogICAgICBjb25zdCBleGlzdGluZyA9IGV4ZWNTeW5jKCdjcm9udGFiIC1sIDI+L2Rldi9udWxsJywgeyBlbmNvZGluZzogJ3V0Zi04JywgdGltZW91dDogNTAwMCB9KTsKICAgICAgY3JvbkxpbmVzID0gZXhpc3Rpbmcuc3BsaXQoJ1xuJykuZmlsdGVyKGwgPT4gIWwuaW5jbHVkZXMoJ2Nyb24tc3luYy5zaCcpICYmICFsLmluY2x1ZGVzKENST05fTUFSS0VSKSAmJiBsLnRyaW0oKSk7CiAgICB9IGNhdGNoIHt9CgogICAgY29uc3QgY3JvbkxpbmUgPSBidWlsZENyb25MaW5lKHNldHRpbmdzLnNjaGVkdWxlIHx8IFtdKTsKICAgIGlmIChjcm9uTGluZSkgewogICAgICBjcm9uTGluZXMucHVzaCgnJyk7CiAgICAgIGNyb25MaW5lcy5wdXNoKENST05fTUFSS0VSKTsKICAgICAgY3JvbkxpbmVzLnB1c2goY3JvbkxpbmUpOwogICAgfQoKICAgIGNvbnN0IG5ld0Nyb24gPSBjcm9uTGluZXMuam9pbignXG4nKSArICdcbic7CiAgICBjb25zdCB0bXBGaWxlID0gJy90bXAvZWFzeXJjbG9uZV9jcm9uX3RtcCc7CiAgICBmcy53cml0ZUZpbGVTeW5jKHRtcEZpbGUsIG5ld0Nyb24pOwogICAgZXhlY1N5bmMoYGNyb250YWIgJHt0bXBGaWxlfWAsIHsgdGltZW91dDogNTAwMCB9KTsKICAgIGZzLnVubGlua1N5bmModG1wRmlsZSk7CgogICAgcmVzLmpzb24oeyBvazogdHJ1ZSB9KTsKICB9IGNhdGNoIChlKSB7CiAgICByZXMuanNvbih7IG9rOiBmYWxzZSwgZXJyb3I6IGUubWVzc2FnZSB9KTsKICB9Cn0pOwoKYXBwLmdldCgnL2FwaS9jcm9uLWluZm8nLCAocmVxLCByZXMpID0+IHsKICB0cnkgewogICAgbGV0IG91dHB1dCA9ICcnOwoKICAgIC8vIENoZWNrIHVzZXIgY3JvbnRhYiBmaXJzdCAobW9zdCByZWxldmFudCkKICAgIG91dHB1dCArPSAnPT09IHJvb3Qg44GuIGNyb250YWIgPT09XG4nOwogICAgdHJ5IHsKICAgICAgY29uc3QgdXNlckNyb24gPSBleGVjU3luYygnY3JvbnRhYiAtbCAyPi9kZXYvbnVsbCB8fCBlY2hvICIoY3JvbnRhYuOBquOBlykiJywgeyBlbmNvZGluZzogJ3V0Zi04JywgdGltZW91dDogNTAwMCB9KTsKICAgICAgb3V0cHV0ICs9IHVzZXJDcm9uOwogICAgfSBjYXRjaCB7IG91dHB1dCArPSAnKGNyb250YWLjgarjgZcpXG4nOyB9CgogICAgLy8gQ2hlY2sgcmNsb25lIHJlbGF0ZWQgKGZyb20gYWxsIHNvdXJjZXMpCiAgICBvdXRwdXQgKz0gJ1xuPT09IHJjbG9uZSDplqLpgKPjga4gY3JvbiDjgqjjg7Pjg4jjg6ogPT09XG4nOwogICAgdHJ5IHsKICAgICAgY29uc3QgcmNsb25lQ3JvbiA9IGV4ZWNTeW5jKCdjcm9udGFiIC1sIDI+L2Rldi9udWxsIHwgZ3JlcCAtaSByY2xvbmUgfHwgZWNobyAiKHJjbG9uZemWoumAo+OBrmNyb27jgqjjg7Pjg4jjg6rjgarjgZcpIicsIHsgZW5jb2Rpbmc6ICd1dGYtOCcsIHRpbWVvdXQ6IDUwMDAgfSk7CiAgICAgIG91dHB1dCArPSByY2xvbmVDcm9uOwogICAgfSBjYXRjaCB7IG91dHB1dCArPSAnKHJjbG9uZemWoumAo+OBrmNyb27jgqjjg7Pjg4jjg6rjgarjgZcpXG4nOyB9CgogICAgLy8gQ2hlY2sgc2NoZWR1bGVkIHN5bmMgc2V0dGluZ3MKICAgIG91dHB1dCArPSAnXG49PT0gRWFzeVJjbG9uZSDjgrnjgrHjgrjjg6Xjg7zjg6voqK3lrpogPT09XG4nOwogICAgdHJ5IHsKICAgICAgaWYgKGZzLmV4aXN0c1N5bmMoU1lOQ19TRVRUSU5HU19QQVRIKSkgewogICAgICAgIGNvbnN0IHNldHRpbmdzID0gSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmMoU1lOQ19TRVRUSU5HU19QQVRILCAndXRmLTgnKSk7CiAgICAgICAgb3V0cHV0ICs9IGDlkIzmnJ/jg5rjgqLmlbA6ICR7KHNldHRpbmdzLnBhaXJzIHx8IFtdKS5sZW5ndGh9XG5gOwogICAgICAgIG91dHB1dCArPSBg44K544Kx44K444Ol44O844OrOiAkeyhzZXR0aW5ncy5zY2hlZHVsZSB8fCBbXSkuam9pbignLCAnKSB8fCAn5pyq6Kit5a6aJ31cbmA7CiAgICAgICAgKHNldHRpbmdzLnBhaXJzIHx8IFtdKS5mb3JFYWNoKChwLCBpKSA9PiB7CiAgICAgICAgICBvdXRwdXQgKz0gYCAgWyR7aSArIDF9XSAke3Auc291cmNlfSDihpIgJHtwLmRlc3R9JHtwLmRlbGV0ZUV4dHJhID8gJyAo5YmK6Zmk44GC44KKKScgOiAnJ31cbmA7CiAgICAgICAgfSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgb3V0cHV0ICs9ICco6Kit5a6a44OV44Kh44Kk44Or44Gq44GXKVxuJzsKICAgICAgfQogICAgfSBjYXRjaCB7IG91dHB1dCArPSAnKOioreWumuiqreOBv+WPluOCiuOCqOODqeODvClcbic7IH0KCiAgICAvLyBTeXN0ZW0gY3JvbnRhYiAoYnJpZWYpCiAgICBvdXRwdXQgKz0gJ1xuPT09IOOCt+OCueODhuODoCBjcm9udGFiICjmipznsospID09PVxuJzsKICAgIHRyeSB7CiAgICAgIGNvbnN0IHN5c0Nyb24gPSBleGVjU3luYygnY2F0IC9ldGMvY3JvbnRhYiAyPi9kZXYvbnVsbCB8IGdyZXAgLXYgIl4jIiB8IGdyZXAgLXYgIl4kIiB8fCBlY2hvICIo44OV44Kh44Kk44Or44Gq44GXKSInLCB7IGVuY29kaW5nOiAndXRmLTgnLCB0aW1lb3V0OiA1MDAwIH0pOwogICAgICBvdXRwdXQgKz0gc3lzQ3JvbjsKICAgIH0gY2F0Y2ggeyBvdXRwdXQgKz0gJyjoqq3jgb/lj5bjgorkuI3lj68pXG4nOyB9CgogICAgLy8gQ2hlY2sgc3lzdGVtZCB0aW1lcnMgKHJjbG9uZSByZWxhdGVkKQogICAgb3V0cHV0ICs9ICdcbj09PSBzeXN0ZW1kIOOCv+OCpOODnuODvCAocmNsb25l6Zai6YCjKSA9PT1cbic7CiAgICB0cnkgewogICAgICBjb25zdCB0aW1lcnMgPSBleGVjU3luYygnc3lzdGVtY3RsIGxpc3QtdGltZXJzIC0tYWxsIC0tbm8tcGFnZXIgMj4vZGV2L251bGwgfCBncmVwIC1pIHJjbG9uZSB8fCBlY2hvICIocmNsb25l6Zai6YCj44Gu44K/44Kk44Oe44O844Gq44GXKSInLCB7IGVuY29kaW5nOiAndXRmLTgnLCB0aW1lb3V0OiA1MDAwIH0pOwogICAgICBvdXRwdXQgKz0gdGltZXJzOwogICAgfSBjYXRjaCB7IG91dHB1dCArPSAnKHJjbG9uZemWoumAo+OBruOCv+OCpOODnuODvOOBquOBlylcbic7IH0KCiAgICByZXMuanNvbih7IG9rOiB0cnVlLCBvdXRwdXQgfSk7CiAgfSBjYXRjaCAoZSkgewogICAgcmVzLmpzb24oeyBvazogZmFsc2UsIGVycm9yOiBlLm1lc3NhZ2UgfSk7CiAgfQp9KTsKCi8vID09PSBUZW1wIFNTSCBzZXR1cCA9PT0KYXBwLnBvc3QoJy9hcGkvc3NoL3NldHVwJywgKHJlcSwgcmVzKSA9PiB7CiAgdHJ5IHsKICAgIGNvbnN0IHBhc3N3b3JkID0gJ3JjbG9uZSc7CiAgICBleGVjU3luYyhgZWNobyAicm9vdDoke3Bhc3N3b3JkfSIgfCBjaHBhc3N3ZGAsIHsgdGltZW91dDogNTAwMCB9KTsKICAgIGV4ZWNTeW5jKGBzZWQgLWkgJ3MvXlBhc3N3b3JkQXV0aGVudGljYXRpb24gbm8vUGFzc3dvcmRBdXRoZW50aWNhdGlvbiB5ZXMvJyAvZXRjL3NzaC9zc2hkX2NvbmZpZy5kLzYwLWNsb3VkaW1nLXNldHRpbmdzLmNvbmYgMj4vZGV2L251bGwgfHwgc2VkIC1pICdzL14jKlBhc3N3b3JkQXV0aGVudGljYXRpb24uKi9QYXNzd29yZEF1dGhlbnRpY2F0aW9uIHllcy8nIC9ldGMvc3NoL3NzaGRfY29uZmlnIDI+L2Rldi9udWxsIHx8IHRydWVgLCB7IHRpbWVvdXQ6IDMwMDAgfSk7CiAgICBleGVjU3luYyhgZ3JlcCAtcSAiS2JkSW50ZXJhY3RpdmVBdXRoZW50aWNhdGlvbiB5ZXMiIC9ldGMvc3NoL3NzaGRfY29uZmlnLmQvNjAtY2xvdWRpbWctc2V0dGluZ3MuY29uZiAyPi9kZXYvbnVsbCB8fCBlY2hvICJLYmRJbnRlcmFjdGl2ZUF1dGhlbnRpY2F0aW9uIHllcyIgPj4gL2V0Yy9zc2gvc3NoZF9jb25maWcuZC82MC1jbG91ZGltZy1zZXR0aW5ncy5jb25mIDI+L2Rldi9udWxsIHx8IHRydWVgLCB7IHRpbWVvdXQ6IDMwMDAgfSk7CiAgICBleGVjU3luYyhgZ3JlcCAtcSAiUGVybWl0Um9vdExvZ2luIHllcyIgL2V0Yy9zc2gvc3NoZF9jb25maWcuZC82MC1jbG91ZGltZy1zZXR0aW5ncy5jb25mIDI+L2Rldi9udWxsIHx8IGVjaG8gIlBlcm1pdFJvb3RMb2dpbiB5ZXMiID4+IC9ldGMvc3NoL3NzaGRfY29uZmlnLmQvNjAtY2xvdWRpbWctc2V0dGluZ3MuY29uZiAyPi9kZXYvbnVsbCB8fCB0cnVlYCwgeyB0aW1lb3V0OiAzMDAwIH0pOwogICAgZXhlY1N5bmMoYHN5c3RlbWN0bCByZXN0YXJ0IHNzaGRgLCB7IHRpbWVvdXQ6IDUwMDAgfSk7CiAgICBjb25zdCBob3N0bmFtZSA9IGV4ZWNTeW5jKCdob3N0bmFtZSAtSSB8IGF3ayBcJ3twcmludCAkMX1cJycsIHsgZW5jb2Rpbmc6ICd1dGYtOCcgfSkudHJpbSgpOwogICAgcmVzLmpzb24oeyBvazogdHJ1ZSwgcGFzc3dvcmQsIGhvc3RuYW1lIH0pOwogIH0gY2F0Y2ggKGUpIHsKICAgIHJlcy5qc29uKHsgb2s6IGZhbHNlLCBlcnJvcjogZS5tZXNzYWdlIH0pOwogIH0KfSk7CgphcHAucG9zdCgnL2FwaS9zc2gvdGVhcmRvd24nLCAocmVxLCByZXMpID0+IHsKICB0cnkgewogICAgZXhlY1N5bmMoYHBhc3N3ZCAtZCByb290IDI+L2Rldi9udWxsOyB0cnVlYCwgeyB0aW1lb3V0OiA1MDAwIH0pOwogICAgZXhlY1N5bmMoYHNlZCAtaSAncy9eUGFzc3dvcmRBdXRoZW50aWNhdGlvbiB5ZXMvUGFzc3dvcmRBdXRoZW50aWNhdGlvbiBuby8nIC9ldGMvc3NoL3NzaGRfY29uZmlnLmQvNjAtY2xvdWRpbWctc2V0dGluZ3MuY29uZmAsIHsgdGltZW91dDogMzAwMCB9KTsKICAgIGV4ZWNTeW5jKGBzZWQgLWkgJy9eS2JkSW50ZXJhY3RpdmVBdXRoZW50aWNhdGlvbiB5ZXMkL2QnIC9ldGMvc3NoL3NzaGRfY29uZmlnLmQvNjAtY2xvdWRpbWctc2V0dGluZ3MuY29uZmAsIHsgdGltZW91dDogMzAwMCB9KTsKICAgIGV4ZWNTeW5jKGBzeXN0ZW1jdGwgcmVzdGFydCBzc2hkYCwgeyB0aW1lb3V0OiA1MDAwIH0pOwogICAgcmVzLmpzb24oeyBvazogdHJ1ZSB9KTsKICB9IGNhdGNoIChlKSB7CiAgICByZXMuanNvbih7IG9rOiBmYWxzZSwgZXJyb3I6IGUubWVzc2FnZSB9KTsKICB9Cn0pOwoKYXBwLnBvc3QoJy9hcGkvc3NoL3N0YXR1cycsIChyZXEsIHJlcykgPT4gewogIHRyeSB7CiAgICBjb25zdCBvdXQgPSBleGVjU3luYygnc3NoZCAtVCAyPi9kZXYvbnVsbCB8IGdyZXAgcGFzc3dvcmRhdXRoZW50aWNhdGlvbicsIHsgZW5jb2Rpbmc6ICd1dGYtOCcgfSk7CiAgICBjb25zdCBlbmFibGVkID0gb3V0LmluY2x1ZGVzKCd5ZXMnKTsKICAgIHJlcy5qc29uKHsgb2s6IHRydWUsIGVuYWJsZWQgfSk7CiAgfSBjYXRjaCAoZSkgewogICAgcmVzLmpzb24oeyBvazogZmFsc2UsIGVycm9yOiBlLm1lc3NhZ2UgfSk7CiAgfQp9KTsKCi8vID09PSBBdXRoOiBydW4gcmNsb25lIGF1dGhvcml6ZSB0byBnZXQgdG9rZW4gPT09CmNvbnN0IGF1dGhTZXNzaW9ucyA9IG5ldyBNYXAoKTsKCmFwcC5wb3N0KCcvYXBpL2F1dGgvc3RhcnQnLCAocmVxLCByZXMpID0+IHsKICBjb25zdCB7IHR5cGUsIHJlbW90ZU5hbWUgfSA9IHJlcS5ib2R5OwogIGlmICghWydkcml2ZScsICdvbmVkcml2ZSddLmluY2x1ZGVzKHR5cGUpKSByZXR1cm4gcmVzLnN0YXR1cyg0MDApLmpzb24oeyBlcnJvcjogJ+OCteODneODvOODiOOBleOCjOOBpuOBhOOBquOBhOOCv+OCpOODl+OBp+OBmScgfSk7CgogIC8vIEtpbGwgYW55IGxpbmdlcmluZyByY2xvbmUgYXV0aG9yaXplIHByb2Nlc3NlcwogIHRyeSB7IGV4ZWNTeW5jKCdwa2lsbCAtOSAtZiAicmNsb25lIGF1dGhvcml6ZSInLCB7IHRpbWVvdXQ6IDMwMDAgfSk7IH0gY2F0Y2gge30KCiAgY29uc3Qgc2Vzc2lvbklkID0gYGF1dGhfJHtEYXRlLm5vdygpfWA7CiAgY29uc3QgYXJncyA9IFsnYXV0aG9yaXplJywgdHlwZSwgJy0tYXV0aC1uby1vcGVuLWJyb3dzZXInXTsKCiAgY29uc3QgcHJvYyA9IHNwYXduKCdyY2xvbmUnLCBhcmdzLCB7CiAgICBlbnY6IHsgLi4ucHJvY2Vzcy5lbnYsIFJDTE9ORV9DT05GSUc6IENPTkZJR19QQVRIIH0sCiAgICBzdGRpbzogWydwaXBlJywgJ3BpcGUnLCAncGlwZSddCiAgfSk7CgogIGxldCBhdXRoVXJsID0gJyc7CiAgbGV0IHN0ZG91dEJ1ZiA9ICcnOwoKICBwcm9jLnN0ZGVyci5vbignZGF0YScsIGQgPT4gewogICAgY29uc3QgdGV4dCA9IGQudG9TdHJpbmcoKTsKICAgIGNvbnN0IG1hdGNoID0gdGV4dC5tYXRjaCgvKGh0dHBzPzpcL1wvW15ccyInXStcL2F1dGhcP3N0YXRlPVteXHMiJ10rKS8pOwogICAgaWYgKG1hdGNoICYmICFhdXRoVXJsKSB7CiAgICAgIGF1dGhVcmwgPSBtYXRjaFsxXS5yZXBsYWNlKC9bIiddJC8sICcnKTsKICAgIH0KICB9KTsKCiAgY29uc3Qgc2Vzc2lvbiA9IHsgcHJvYywgdHlwZSwgcmVtb3RlTmFtZSwgdG9rZW46IG51bGwsIGRvbmU6IGZhbHNlLCBhdXRoVXJsOiAnJyB9OwogIGF1dGhTZXNzaW9ucy5zZXQoc2Vzc2lvbklkLCBzZXNzaW9uKTsKCiAgcHJvYy5zdGRvdXQub24oJ2RhdGEnLCBkID0+IHsKICAgIHN0ZG91dEJ1ZiArPSBkLnRvU3RyaW5nKCk7CiAgfSk7CgogIHByb2Mub24oJ2Nsb3NlJywgKGNvZGUpID0+IHsKICAgIGNvbnN0IHJhdyA9IHN0ZG91dEJ1Zi50cmltKCk7CiAgICBjb25zb2xlLmxvZyhgW0F1dGggJHtzZXNzaW9uSWR9XSByY2xvbmUgY2xvc2VkIGNvZGU9JHtjb2RlfSBzdGRvdXQ9JHtyYXcuc3Vic3RyaW5nKDAsIDMwMCl9YCk7CiAgICAvLyByY2xvbmUgYXV0aG9yaXplIHdyYXBzIEpTT04gaW4gIlBhc3RlIHRoZSBmb2xsb3dpbmcuLi4iIHRleHQKICAgIGNvbnN0IGpzb25NYXRjaCA9IHJhdy5tYXRjaCgvKFx7W1xzXFNdKlx9KS8pOwogICAgaWYgKGpzb25NYXRjaCkgewogICAgICB0cnkgewogICAgICAgIHNlc3Npb24udG9rZW4gPSBKU09OLnBhcnNlKGpzb25NYXRjaFsxXSk7CiAgICAgICAgY29uc29sZS5sb2coYFtBdXRoICR7c2Vzc2lvbklkfV0gdG9rZW4gcGFyc2VkIE9LYCk7CiAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICBjb25zb2xlLmxvZyhgW0F1dGggJHtzZXNzaW9uSWR9XSB0b2tlbiBwYXJzZSBGQUlMRUQ6ICR7ZS5tZXNzYWdlfWApOwogICAgICB9CiAgICB9CiAgICBzZXNzaW9uLmRvbmUgPSB0cnVlOwogIH0pOwoKICBjb25zdCBjaGVjayA9IHNldEludGVydmFsKCgpID0+IHsKICAgIGlmIChhdXRoVXJsICYmICFzZXNzaW9uLmF1dGhVcmwpIHNlc3Npb24uYXV0aFVybCA9IGF1dGhVcmw7CiAgICBpZiAoc2Vzc2lvbi5kb25lICYmIHNlc3Npb24udG9rZW4pIHsKICAgICAgY29uc29sZS5sb2coYFtBdXRoICR7c2Vzc2lvbklkfV0gd3JpdGluZyB0b2tlbiB0byBjb25maWdgKTsKICAgICAgY2xlYXJJbnRlcnZhbChjaGVjayk7CiAgICAgIHdyaXRlVG9rZW5Ub0NvbmZpZyhzZXNzaW9uLnJlbW90ZU5hbWUgfHwgYHJlbW90ZV8ke0RhdGUubm93KCl9YCwgc2Vzc2lvbi50eXBlLCBzZXNzaW9uLnRva2VuKTsKICAgICAgYXV0aFNlc3Npb25zLmRlbGV0ZShzZXNzaW9uSWQpOwogICAgfSBlbHNlIGlmIChzZXNzaW9uLmRvbmUgJiYgIXNlc3Npb24udG9rZW4pIHsKICAgICAgY29uc29sZS5sb2coYFtBdXRoICR7c2Vzc2lvbklkfV0gZG9uZSBidXQgbm8gdG9rZW4sIHN0ZG91dCB3YXM6ICR7c3Rkb3V0QnVmLnN1YnN0cmluZygwLCAyMDApfWApOwogICAgfQogIH0sIDUwMCk7CgogIHNldFRpbWVvdXQoKCkgPT4gewogICAgY2xlYXJJbnRlcnZhbChjaGVjayk7CiAgICBpZiAoYXV0aFNlc3Npb25zLmhhcyhzZXNzaW9uSWQpKSB7CiAgICAgIHNlc3Npb24ucHJvYy5raWxsKCk7CiAgICAgIGF1dGhTZXNzaW9ucy5kZWxldGUoc2Vzc2lvbklkKTsKICAgIH0KICB9LCAzMDAwMDApOwoKICByZXMuanNvbih7IG9rOiB0cnVlLCBzZXNzaW9uSWQsIGF1dGhVcmw6IG51bGwgfSk7Cn0pOwoKYXBwLmdldCgnL2FwaS9hdXRoL3BvbGwvOnNlc3Npb25JZCcsIChyZXEsIHJlcykgPT4gewogIGNvbnN0IHNlc3Npb24gPSBhdXRoU2Vzc2lvbnMuZ2V0KHJlcS5wYXJhbXMuc2Vzc2lvbklkKTsKICBpZiAoIXNlc3Npb24pIHJldHVybiByZXMuanNvbih7IGRvbmU6IHRydWUsIHN1Y2Nlc3M6IGZhbHNlLCBlcnJvcjogJ+OCu+ODg+OCt+ODp+ODs+OBjOimi+OBpOOBi+OCiuOBvuOBm+OCkycgfSk7CiAgaWYgKHNlc3Npb24uZG9uZSAmJiBzZXNzaW9uLnRva2VuKSB7CiAgICByZXR1cm4gcmVzLmpzb24oeyBkb25lOiB0cnVlLCBzdWNjZXNzOiB0cnVlIH0pOwogIH0KICBpZiAoc2Vzc2lvbi5kb25lICYmICFzZXNzaW9uLnRva2VuKSB7CiAgICByZXR1cm4gcmVzLmpzb24oeyBkb25lOiB0cnVlLCBzdWNjZXNzOiBmYWxzZSwgZXJyb3I6ICfjg4jjg7zjgq/jg7Plj5blvpfjgavlpLHmlZfjgZfjgb7jgZfjgZ8nIH0pOwogIH0KICByZXMuanNvbih7IGRvbmU6IGZhbHNlLCBhdXRoVXJsOiBzZXNzaW9uLmF1dGhVcmwgfHwgbnVsbCB9KTsKfSk7CgpmdW5jdGlvbiB3cml0ZVRva2VuVG9Db25maWcocmVtb3RlTmFtZSwgdHlwZSwgdG9rZW4pIHsKICBjb25zdCB0b2tlblN0ciA9IHR5cGVvZiB0b2tlbiA9PT0gJ3N0cmluZycgPyB0b2tlbiA6IEpTT04uc3RyaW5naWZ5KHRva2VuKTsKICBsZXQgY29udGVudCA9IHJlYWRDb25maWcoKTsKCiAgY29uc3Qgc2VjdGlvblJlID0gbmV3IFJlZ0V4cChgXFxbJHtyZW1vdGVOYW1lLnJlcGxhY2UoL1suKis/XiR7fSgpfFtcXVxcXS9nLCAnXFwkJicpfVxcXVteXFxbXSpgLCAnZycpOwogIGlmIChzZWN0aW9uUmUudGVzdChjb250ZW50KSkgewogICAgY29udGVudCA9IGNvbnRlbnQucmVwbGFjZShzZWN0aW9uUmUsICcnKS5yZXBsYWNlKC9cbnszLH0vZywgJ1xuXG4nKS50cmltKCk7CiAgfQoKICBsZXQgc2VjdGlvbiA9IGBcblske3JlbW90ZU5hbWV9XVxudHlwZSA9ICR7dHlwZX1gOwogIGlmICh0eXBlID09PSAnZHJpdmUnKSB7CiAgICBzZWN0aW9uICs9IGBcbnNjb3BlID0gZHJpdmVgOwogIH0gZWxzZSBpZiAodHlwZSA9PT0gJ29uZWRyaXZlJykgewogICAgc2VjdGlvbiArPSBgXG5kcml2ZV90eXBlID0gcGVyc29uYWxgOwogICAgLy8gR2V0IGRyaXZlX2lkIGZyb20gTWljcm9zb2Z0IEdyYXBoIEFQSQogICAgdHJ5IHsKICAgICAgY29uc3QgdG9rZW5PYmogPSB0eXBlb2YgdG9rZW4gPT09ICdzdHJpbmcnID8gSlNPTi5wYXJzZSh0b2tlbikgOiB0b2tlbjsKICAgICAgY29uc3QgYWNjZXNzVG9rZW4gPSB0b2tlbk9iai5hY2Nlc3NfdG9rZW47CiAgICAgIGlmIChhY2Nlc3NUb2tlbikgewogICAgICAgIGNvbnN0IHJlc3VsdCA9IGV4ZWNTeW5jKGBjdXJsIC1zIC1IICJBdXRob3JpemF0aW9uOiBCZWFyZXIgJHthY2Nlc3NUb2tlbn0iICJodHRwczovL2dyYXBoLm1pY3Jvc29mdC5jb20vdjEuMC9tZS9kcml2ZSJgLCB7CiAgICAgICAgICBlbmNvZGluZzogJ3V0Zi04JywgdGltZW91dDogMTAwMDAKICAgICAgICB9KTsKICAgICAgICBjb25zdCBkcml2ZUluZm8gPSBKU09OLnBhcnNlKHJlc3VsdCk7CiAgICAgICAgaWYgKGRyaXZlSW5mby5pZCkgewogICAgICAgICAgc2VjdGlvbiArPSBgXG5kcml2ZV9pZCA9ICR7ZHJpdmVJbmZvLmlkfWA7CiAgICAgICAgfQogICAgICB9CiAgICB9IGNhdGNoIChlKSB7CiAgICAgIGNvbnNvbGUubG9nKGBbQ29uZmlnXSBGYWlsZWQgdG8gZ2V0IGRyaXZlX2lkIGZvciAke3JlbW90ZU5hbWV9OiAke2UubWVzc2FnZX1gKTsKICAgIH0KICB9CiAgc2VjdGlvbiArPSBgXG50b2tlbiA9ICR7dG9rZW5TdHJ9YDsKCiAgY29uc3Qgc2VwID0gY29udGVudC50cmltKCkgPyAnXG4nIDogJyc7CiAgZnMud3JpdGVGaWxlU3luYyhDT05GSUdfUEFUSCwgKGNvbnRlbnQudHJpbSgpICsgc2VwICsgc2VjdGlvbiArICdcbicpLnRyaW0oKSArICdcbicpOwp9CgovLyA9PT0gRmlsZSBCcm93c2VyID09PQphcHAuZ2V0KCcvYXBpL2Jyb3dzZS86cmVtb3RlLyonLCAocmVxLCByZXMpID0+IHsKICBjb25zdCByZW1vdGUgPSByZXEucGFyYW1zLnJlbW90ZTsKICBjb25zdCBzdWJQYXRoID0gcmVxLnBhcmFtc1swXSB8fCAnJzsKICBjb25zdCB0YXJnZXQgPSBzdWJQYXRoID8gYCR7cmVtb3RlfTovJHtzdWJQYXRofWAgOiBgJHtyZW1vdGV9OmA7CiAgY29uc3QgcmVzdWx0ID0gcmNsb25lKFsnbHNmJywgYCIke3RhcmdldH0iYCwgJy0tZm9ybWF0JywgJ3RwJywgJy0tZGlycy1vbmx5J10pOwogIGlmICghcmVzdWx0Lm9rICYmICFyZXN1bHQuZGF0YSkgcmV0dXJuIHJlcy5qc29uKHsgaXRlbXM6IFtdLCBlcnJvcjogcmVzdWx0LmVycm9yIH0pOwoKICBjb25zdCBsaW5lcyA9IChyZXN1bHQuZGF0YSB8fCAnJykuc3BsaXQoJ1xuJykuZmlsdGVyKEJvb2xlYW4pOwogIGNvbnN0IGl0ZW1zID0gbGluZXMubWFwKGwgPT4gewogICAgY29uc3QgaXNEaXIgPSBsLmVuZHNXaXRoKCcvJyk7CiAgICByZXR1cm4geyBuYW1lOiBpc0RpciA/IGwuc2xpY2UoMCwgLTEpIDogbCwgaXNEaXIgfTsKICB9KS5zb3J0KChhLCBiKSA9PiBiLmlzRGlyIC0gYS5pc0RpciB8fCBhLm5hbWUubG9jYWxlQ29tcGFyZShiLm5hbWUpKTsKCiAgcmVzLmpzb24oeyBpdGVtcywgcGF0aDogc3ViUGF0aCB9KTsKfSk7CgphcHAuZ2V0KCcvYXBpL2Jyb3dzZS1maWxlcy86cmVtb3RlLyonLCAocmVxLCByZXMpID0+IHsKICBjb25zdCByZW1vdGUgPSByZXEucGFyYW1zLnJlbW90ZTsKICBjb25zdCBzdWJQYXRoID0gcmVxLnBhcmFtc1swXSB8fCAnJzsKICBjb25zdCB0YXJnZXQgPSBzdWJQYXRoID8gYCR7cmVtb3RlfTovJHtzdWJQYXRofWAgOiBgJHtyZW1vdGV9OmA7CiAgY29uc3QgcmVzdWx0ID0gcmNsb25lKFsnbHNmJywgYCIke3RhcmdldH0iYCwgJy0tZm9ybWF0JywgJ3RwJ10pOwogIGlmICghcmVzdWx0Lm9rICYmICFyZXN1bHQuZGF0YSkgcmV0dXJuIHJlcy5qc29uKHsgaXRlbXM6IFtdLCBlcnJvcjogcmVzdWx0LmVycm9yIH0pOwoKICBjb25zdCBsaW5lcyA9IChyZXN1bHQuZGF0YSB8fCAnJykuc3BsaXQoJ1xuJykuZmlsdGVyKEJvb2xlYW4pOwogIGNvbnN0IGl0ZW1zID0gbGluZXMubWFwKGwgPT4gewogICAgY29uc3QgaXNEaXIgPSBsLmVuZHNXaXRoKCcvJyk7CiAgICByZXR1cm4geyBuYW1lOiBpc0RpciA/IGwuc2xpY2UoMCwgLTEpIDogbCwgaXNEaXIgfTsKICB9KS5zb3J0KChhLCBiKSA9PiBiLmlzRGlyIC0gYS5pc0RpciB8fCBhLm5hbWUubG9jYWxlQ29tcGFyZShiLm5hbWUpKTsKCiAgcmVzLmpzb24oeyBpdGVtcywgcGF0aDogc3ViUGF0aCB9KTsKfSk7CgovLyA9PT0gU3luYyBKb2JzID09PQpjb25zdCBKT0JfUkVURU5USU9OX0RBWVMgPSAzMDsKCmZ1bmN0aW9uIGNsZWFudXBPbGRKb2JzKCkgewogIHRyeSB7CiAgICBjb25zdCBmaWxlcyA9IGZzLnJlYWRkaXJTeW5jKFNZTkNfSk9CU19ESVIpLmZpbHRlcihmID0+IGYuZW5kc1dpdGgoJy5qc29uJykpOwogICAgY29uc3QgY3V0b2ZmID0gRGF0ZS5ub3coKSAtIEpPQl9SRVRFTlRJT05fREFZUyAqIDI0ICogNjAgKiA2MCAqIDEwMDA7CiAgICBmb3IgKGNvbnN0IGYgb2YgZmlsZXMpIHsKICAgICAgdHJ5IHsKICAgICAgICBjb25zdCBqb2IgPSBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyhwYXRoLmpvaW4oU1lOQ19KT0JTX0RJUiwgZiksICd1dGYtOCcpKTsKICAgICAgICBjb25zdCBjcmVhdGVkID0gbmV3IERhdGUoam9iLmNyZWF0ZWRBdCB8fCAwKS5nZXRUaW1lKCk7CiAgICAgICAgaWYgKGNyZWF0ZWQgPCBjdXRvZmYpIGZzLnVubGlua1N5bmMocGF0aC5qb2luKFNZTkNfSk9CU19ESVIsIGYpKTsKICAgICAgfSBjYXRjaCB7fQogICAgfQogIH0gY2F0Y2gge30KfQoKYXBwLmdldCgnL2FwaS9qb2JzJywgKHJlcSwgcmVzKSA9PiB7CiAgdHJ5IHsKICAgIGNsZWFudXBPbGRKb2JzKCk7CiAgICBjb25zdCBmaWxlcyA9IGZzLnJlYWRkaXJTeW5jKFNZTkNfSk9CU19ESVIpLmZpbHRlcihmID0+IGYuZW5kc1dpdGgoJy5qc29uJykpOwogICAgY29uc3Qgam9icyA9IGZpbGVzLm1hcChmID0+IHsKICAgICAgdHJ5IHsgcmV0dXJuIEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKHBhdGguam9pbihTWU5DX0pPQlNfRElSLCBmKSwgJ3V0Zi04JykpOyB9CiAgICAgIGNhdGNoIHsgcmV0dXJuIG51bGw7IH0KICAgIH0pLmZpbHRlcihCb29sZWFuKTsKICAgIGpvYnMuc29ydCgoYSwgYikgPT4gbmV3IERhdGUoYi5jcmVhdGVkQXQgfHwgMCkgLSBuZXcgRGF0ZShhLmNyZWF0ZWRBdCB8fCAwKSk7CiAgICByZXMuanNvbih7IGpvYnMgfSk7CiAgfSBjYXRjaCAoZSkgewogICAgcmVzLmpzb24oeyBqb2JzOiBbXSB9KTsKICB9Cn0pOwoKYXBwLnBvc3QoJy9hcGkvam9icycsIChyZXEsIHJlcykgPT4gewogIGNvbnN0IHsgc291cmNlLCBkZXN0LCBtb2RlLCBleGNsdWRlLCBkcnlSdW4sIHZlcmJvc2UsIG5hbWUsIGRlbGV0ZUV4dHJhIH0gPSByZXEuYm9keTsKICBpZiAoIXNvdXJjZSB8fCAhZGVzdCkgcmV0dXJuIHJlcy5zdGF0dXMoNDAwKS5qc29uKHsgZXJyb3I6ICfjgrPjg5Tjg7zlhYPjgajjgrPjg5Tjg7zlhYjjga/lv4XpoIjjgafjgZknIH0pOwoKICBjb25zdCBqb2JJZCA9IGBqb2JfJHtEYXRlLm5vdygpfWA7CiAgY29uc3Qgam9iID0gewogICAgaWQ6IGpvYklkLAogICAgbmFtZTogbmFtZSB8fCBgJHtzb3VyY2Uuc3BsaXQoJzonKVswXX0g4oaSICR7ZGVzdC5zcGxpdCgnOicpWzBdfWAsCiAgICBzb3VyY2UsIGRlc3QsCiAgICBtb2RlOiBtb2RlIHx8ICdjb3B5JywKICAgIGV4Y2x1ZGU6IGV4Y2x1ZGUgfHwgJycsCiAgICBkcnlSdW46ICEhZHJ5UnVuLAogICAgdmVyYm9zZTogISF2ZXJib3NlLAogICAgZGVsZXRlRXh0cmE6ICEhZGVsZXRlRXh0cmEsCiAgICBzdGF0dXM6ICdydW5uaW5nJywKICAgIGxvZzogJycsCiAgICBjcmVhdGVkQXQ6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKQogIH07CiAgZnMud3JpdGVGaWxlU3luYyhwYXRoLmpvaW4oU1lOQ19KT0JTX0RJUiwgYCR7am9iSWR9Lmpzb25gKSwgSlNPTi5zdHJpbmdpZnkoam9iLCBudWxsLCAyKSk7CgogIGNvbnN0IGFyZ3MgPSBbZGVsZXRlRXh0cmEgPyAnc3luYycgOiAnY29weSddOwogIGFyZ3MucHVzaCgnLS1zdGF0cycsICcycycsICctLXN0YXRzLW9uZS1saW5lJywgJy12Jyk7CiAgaWYgKGRyeVJ1bikgYXJncy5wdXNoKCctLWRyeS1ydW4nKTsKICBpZiAoZXhjbHVkZSkgYXJncy5wdXNoKCctLWV4Y2x1ZGUnLCBleGNsdWRlKTsKICBhcmdzLnB1c2goc291cmNlLCBkZXN0KTsKCiAgY29uc3Qgam9iRmlsZSA9IHBhdGguam9pbihTWU5DX0pPQlNfRElSLCBgJHtqb2JJZH0uanNvbmApOwogIGNvbnN0IHByb2MgPSBzcGF3bigncmNsb25lJywgYXJncywgewogICAgZW52OiB7IC4uLnByb2Nlc3MuZW52LCBSQ0xPTkVfQ09ORklHOiBDT05GSUdfUEFUSCB9LAogICAgc3RkaW86IFsncGlwZScsICdwaXBlJywgJ3BpcGUnXQogIH0pOwogIGxldCBsb2dCdWYgPSAnJzsKICBwcm9jLnN0ZG91dC5vbignZGF0YScsIGQgPT4geyBsb2dCdWYgKz0gZC50b1N0cmluZygpOyB9KTsKICBwcm9jLnN0ZGVyci5vbignZGF0YScsIGQgPT4geyBsb2dCdWYgKz0gZC50b1N0cmluZygpOyB9KTsKICBjb25zdCBzYXZlTG9nID0gc2V0SW50ZXJ2YWwoKCkgPT4gewogICAgaWYgKGxvZ0J1ZikgewogICAgICBqb2IubG9nID0gbG9nQnVmOwogICAgICB0cnkgeyBmcy53cml0ZUZpbGVTeW5jKGpvYkZpbGUsIEpTT04uc3RyaW5naWZ5KGpvYiwgbnVsbCwgMikpOyB9IGNhdGNoIHt9CiAgICB9CiAgfSwgNTAwKTsKICBwcm9jLm9uKCdjbG9zZScsIChjb2RlKSA9PiB7CiAgICBjbGVhckludGVydmFsKHNhdmVMb2cpOwogICAgam9iLnN0YXR1cyA9IGNvZGUgPT09IDAgPyAnY29tcGxldGVkJyA6ICdmYWlsZWQnOwogICAgam9iLmNvbXBsZXRlZEF0ID0gbmV3IERhdGUoKS50b0lTT1N0cmluZygpOwogICAgam9iLmxvZyA9IGxvZ0J1ZiB8fCAnKG5vIG91dHB1dCknOwogICAgam9iLmV4aXRDb2RlID0gY29kZTsKICAgIHRyeSB7IGZzLndyaXRlRmlsZVN5bmMoam9iRmlsZSwgSlNPTi5zdHJpbmdpZnkoam9iLCBudWxsLCAyKSk7IH0gY2F0Y2gge30KICB9KTsKCiAgcmVzLmpzb24oeyBqb2JJZCwgc3RhdHVzOiAncnVubmluZycgfSk7Cn0pOwoKYXBwLmRlbGV0ZSgnL2FwaS9qb2JzLzppZCcsIChyZXEsIHJlcykgPT4gewogIGNvbnN0IGYgPSBwYXRoLmpvaW4oU1lOQ19KT0JTX0RJUiwgYCR7cmVxLnBhcmFtcy5pZH0uanNvbmApOwogIGlmIChmcy5leGlzdHNTeW5jKGYpKSB7IGZzLnVubGlua1N5bmMoZik7IHJlcy5qc29uKHsgb2s6IHRydWUgfSk7IH0KICBlbHNlIHJlcy5zdGF0dXMoNDA0KS5qc29uKHsgZXJyb3I6ICfjgrjjg6fjg5bjgYzopovjgaTjgYvjgorjgb7jgZvjgpMnIH0pOwp9KTsKCmFwcC5wb3N0KCcvYXBpL2pvYnMvOmlkL3N0b3AnLCAocmVxLCByZXMpID0+IHsKICBjb25zdCBmID0gcGF0aC5qb2luKFNZTkNfSk9CU19ESVIsIGAke3JlcS5wYXJhbXMuaWR9Lmpzb25gKTsKICBpZiAoIWZzLmV4aXN0c1N5bmMoZikpIHJldHVybiByZXMuc3RhdHVzKDQwNCkuanNvbih7IGVycm9yOiAn44K444On44OW44GM6KaL44Gk44GL44KK44G+44Gb44KTJyB9KTsKICBjb25zdCBqb2IgPSBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyhmLCAndXRmLTgnKSk7CiAgam9iLnN0YXR1cyA9ICdzdG9wcGVkJzsKICBqb2IuY29tcGxldGVkQXQgPSBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCk7CiAgZnMud3JpdGVGaWxlU3luYyhmLCBKU09OLnN0cmluZ2lmeShqb2IsIG51bGwsIDIpKTsKICB0cnkgeyBleGVjU3luYyhga2lsbCAkKHBncmVwIC1mICJyY2xvbmUuKiR7cmVxLnBhcmFtcy5pZH0iIHwgaGVhZCAtMSkgMj4vZGV2L251bGxgKTsgfSBjYXRjaCB7fQogIHJlcy5qc29uKHsgb2s6IHRydWUgfSk7Cn0pOwoKLy8gPT09IFNpemUgPT09CmFwcC5nZXQoJy9hcGkvc2l6ZS86cmVtb3RlLyonLCAocmVxLCByZXMpID0+IHsKICBjb25zdCB0YXJnZXQgPSByZXEucGFyYW1zWzBdID8gYCR7cmVxLnBhcmFtcy5yZW1vdGV9Oi8ke3JlcS5wYXJhbXNbMF19YCA6IGAke3JlcS5wYXJhbXMucmVtb3RlfTpgOwogIGNvbnN0IHJlc3VsdCA9IHJjbG9uZShbJ3NpemUnLCBgIiR7dGFyZ2V0fSJgLCAnLS1qc29uJ10pOwogIGlmIChyZXN1bHQub2spIHsgdHJ5IHsgcmV0dXJuIHJlcy5qc29uKEpTT04ucGFyc2UocmVzdWx0LmRhdGEpKTsgfSBjYXRjaCB7fSB9CiAgcmVzLmpzb24oeyBlcnJvcjogcmVzdWx0LmVycm9yIHx8ICfjgrXjgqTjgrrlj5blvpfjgavlpLHmlZcnIH0pOwp9KTsKCmFwcC5nZXQoJyonLCAocmVxLCByZXMpID0+IHsKICByZXMuc2VuZEZpbGUocGF0aC5qb2luKF9fZGlybmFtZSwgJ3B1YmxpYycsICdpbmRleC5odG1sJykpOwp9KTsKCmNvbnN0IHNlcnZlciA9IGFwcC5saXN0ZW4oUE9SVCwgJzAuMC4wLjAnLCAoKSA9PiB7CiAgY29uc29sZS5sb2coYFxuICDwn5qAIEVhc3lSY2xvbmUgR1VJIOi1t+WLlWApOwogIGNvbnNvbGUubG9nKGAgIPCfk6EgaHR0cDovL2xvY2FsaG9zdDoke1BPUlR9XG5gKTsKfSk7Cg=='
B64_HTML='PCFET0NUWVBFIGh0bWw+CjxodG1sIGxhbmc9ImphIj4KPGhlYWQ+CiAgPG1ldGEgY2hhcnNldD0iVVRGLTgiPgogIDxtZXRhIG5hbWU9InZpZXdwb3J0IiBjb250ZW50PSJ3aWR0aD1kZXZpY2Utd2lkdGgsIGluaXRpYWwtc2NhbGU9MS4wIj4KICA8dGl0bGU+RWFzeVJjbG9uZTwvdGl0bGU+CiAgPGxpbmsgcmVsPSJpY29uIiBocmVmPSJkYXRhOmltYWdlL3N2Zyt4bWwsPHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHZpZXdCb3g9JzAgMCAxMDAgMTAwJz48cmVjdCByeD0nMjAnIHdpZHRoPScxMDAnIGhlaWdodD0nMTAwJyBmaWxsPSclMjMyNTYzZWInLz48dGV4dCB4PSc1MCcgeT0nNjgnIGZvbnQtc2l6ZT0nNjAnIHRleHQtYW5jaG9yPSdtaWRkbGUnIGZpbGw9J3doaXRlJyBmb250LWZhbWlseT0nQXJpYWwnIGZvbnQtd2VpZ2h0PSdib2xkJz5DPC90ZXh0Pjwvc3ZnPiI+CiAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIvY3NzL3N0eWxlLmNzcyI+CjwvaGVhZD4KPGJvZHk+CiAgPGhlYWRlciBjbGFzcz0iYXBwLWhlYWRlciI+CiAgICA8ZGl2IGNsYXNzPSJoZWFkZXItbGVmdCI+CiAgICAgIDxzdmcgY2xhc3M9ImxvZ28iIHdpZHRoPSIyOCIgaGVpZ2h0PSIyOCIgdmlld0JveD0iMCAwIDI0IDI0IiBmaWxsPSJub25lIiBzdHJva2U9ImN1cnJlbnRDb2xvciIgc3Ryb2tlLXdpZHRoPSIyIj4KICAgICAgICA8cGF0aCBkPSJNMTIgMkwyIDdsMTAgNSAxMC01LTEwLTV6Ii8+PHBhdGggZD0iTTIgMTdsMTAgNSAxMC01Ii8+PHBhdGggZD0iTTIgMTJsMTAgNSAxMC01Ii8+CiAgICAgIDwvc3ZnPgogICAgICA8aDE+RWFzeVJjbG9uZTwvaDE+CiAgICA8L2Rpdj4KICAgIDxkaXYgY2xhc3M9ImhlYWRlci1yaWdodCI+CiAgICAgIDxidXR0b24gY2xhc3M9ImJ0biBidG4tZ2hvc3QiIG9uY2xpY2s9Im9wZW5BZGRNb2RhbCgnZHJpdmUnKSI+KyBHb29nbGXjg4njg6njgqTjg5Y8L2J1dHRvbj4KICAgICAgPGJ1dHRvbiBjbGFzcz0iYnRuIGJ0bi1naG9zdCIgb25jbGljaz0ib3BlbkFkZE1vZGFsKCdvbmVkcml2ZScpIj4rIE9uZURyaXZlPC9idXR0b24+CiAgICAgIDxidXR0b24gY2xhc3M9ImJ0biBidG4tZ2hvc3QiIG9uY2xpY2s9ImV4cG9ydFNldHRpbmdzKCkiPvCfk6Qg44Ko44Kv44K544Od44O844OIPC9idXR0b24+CiAgICAgIDxidXR0b24gY2xhc3M9ImJ0biBidG4tZ2hvc3QiIG9uY2xpY2s9ImltcG9ydFNldHRpbmdzKCkiPvCfk6Ug44Kk44Oz44Od44O844OIPC9idXR0b24+CiAgICAgIDxidXR0b24gY2xhc3M9ImJ0biBidG4tZ2hvc3QgbmF2LWJ0biIgZGF0YS1wYWdlPSJqb2JzIiBvbmNsaWNrPSJzaG93UGFnZSgnam9icycpIj7wn5OLIOWxpeattDwvYnV0dG9uPgogICAgPC9kaXY+CiAgPC9oZWFkZXI+CgogIDxtYWluIGNsYXNzPSJjb250ZW50Ij4KICAgIDxkaXYgaWQ9InBhZ2UtbWFpbiIgY2xhc3M9InBhZ2UgYWN0aXZlIj4KICAgICAgPGRpdiBpZD0icmVtb3RlLWNhcmRzIj48L2Rpdj4KCiAgICAgIDxkaXYgY2xhc3M9InNjaGVkdWxlLXNlY3Rpb24iIGlkPSJzY2hlZHVsZS1zZWN0aW9uIiBzdHlsZT0iZGlzcGxheTpub25lIj4KICAgICAgICA8ZGl2IGNsYXNzPSJjYXJkIj4KICAgICAgICAgIDxoMz7wn5WQIOOCueOCseOCuOODpeODvOODq+ioreWumu+8iOWFqOODmuOCouWvvuixoe+8iTwvaDM+CiAgICAgICAgICA8ZGl2IHN0eWxlPSJkaXNwbGF5OmZsZXg7Z2FwOjhweDthbGlnbi1pdGVtczpjZW50ZXI7bWFyZ2luLWJvdHRvbTo4cHgiPgogICAgICAgICAgICA8c2VsZWN0IGlkPSJzY2hlZHVsZS10aW1lLXNlbGVjdCIgc3R5bGU9IndpZHRoOjYwcHg7cGFkZGluZzo2cHggNHB4O2JvcmRlcjoxcHggc29saWQgdmFyKC0tYm9yZGVyKTtib3JkZXItcmFkaXVzOnZhcigtLXJhZGl1cy1zbSk7Zm9udC1zaXplOjAuODVyZW0iPgogICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9IiI+5pmCPC9vcHRpb24+CiAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iMCI+MDwvb3B0aW9uPjxvcHRpb24gdmFsdWU9IjEiPjE8L29wdGlvbj48b3B0aW9uIHZhbHVlPSIyIj4yPC9vcHRpb24+CiAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iMyI+Mzwvb3B0aW9uPjxvcHRpb24gdmFsdWU9IjQiPjQ8L29wdGlvbj48b3B0aW9uIHZhbHVlPSI1Ij41PC9vcHRpb24+CiAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iNiI+Njwvb3B0aW9uPjxvcHRpb24gdmFsdWU9IjciPjc8L29wdGlvbj48b3B0aW9uIHZhbHVlPSI4Ij44PC9vcHRpb24+CiAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iOSI+OTwvb3B0aW9uPjxvcHRpb24gdmFsdWU9IjEwIj4xMDwvb3B0aW9uPjxvcHRpb24gdmFsdWU9IjExIj4xMTwvb3B0aW9uPgogICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9IjEyIj4xMjwvb3B0aW9uPjxvcHRpb24gdmFsdWU9IjEzIj4xMzwvb3B0aW9uPjxvcHRpb24gdmFsdWU9IjE0Ij4xNDwvb3B0aW9uPgogICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9IjE1Ij4xNTwvb3B0aW9uPjxvcHRpb24gdmFsdWU9IjE2Ij4xNjwvb3B0aW9uPjxvcHRpb24gdmFsdWU9IjE3Ij4xNzwvb3B0aW9uPgogICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9IjE4Ij4xODwvb3B0aW9uPjxvcHRpb24gdmFsdWU9IjE5Ij4xOTwvb3B0aW9uPjxvcHRpb24gdmFsdWU9IjIwIj4yMDwvb3B0aW9uPgogICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9IjIxIj4yMTwvb3B0aW9uPjxvcHRpb24gdmFsdWU9IjIyIj4yMjwvb3B0aW9uPjxvcHRpb24gdmFsdWU9IjIzIj4yMzwvb3B0aW9uPgogICAgICAgICAgICA8L3NlbGVjdD4KICAgICAgICAgICAgPHNlbGVjdCBpZD0ic2NoZWR1bGUtbWluLXNlbGVjdCIgc3R5bGU9IndpZHRoOjcwcHg7cGFkZGluZzo2cHggMTBweDtib3JkZXI6MXB4IHNvbGlkIHZhcigtLWJvcmRlcik7Ym9yZGVyLXJhZGl1czp2YXIoLS1yYWRpdXMtc20pO2ZvbnQtc2l6ZTowLjg1cmVtIj4KICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSIwMCI+OjAwPC9vcHRpb24+PG9wdGlvbiB2YWx1ZT0iMTUiPjoxNTwvb3B0aW9uPjxvcHRpb24gdmFsdWU9IjMwIj46MzA8L29wdGlvbj48b3B0aW9uIHZhbHVlPSI0NSI+OjQ1PC9vcHRpb24+CiAgICAgICAgICAgIDwvc2VsZWN0PgogICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJidG4gYnRuLW91dGxpbmUgYnRuLXNtIiBvbmNsaWNrPSJhZGRTeW5jU2NoZWR1bGUoKSI+6L+95YqgPC9idXR0b24+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDxkaXYgaWQ9InN5bmMtc2NoZWR1bGUtbGlzdCI+PC9kaXY+CiAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJidG4gYnRuLXByaW1hcnkgYnRuLXNtIiBvbmNsaWNrPSJzYXZlU2NoZWR1bGUoKSIgc3R5bGU9Im1hcmdpbi10b3A6OHB4Ij7jgrnjgrHjgrjjg6Xjg7zjg6vkv53lrZg8L2J1dHRvbj4KICAgICAgICAgIDxidXR0b24gY2xhc3M9ImJ0biBidG4tb3V0bGluZSBidG4tc20iIG9uY2xpY2s9InNob3dDcm9uSW5mbygpIiBzdHlsZT0ibWFyZ2luLXRvcDo4cHgiPmNyb27oqK3lrprnorroqo08L2J1dHRvbj4KICAgICAgICAgIDxkaXYgaWQ9ImNyb24taW5mby1hcmVhIiBzdHlsZT0iZGlzcGxheTpub25lO21hcmdpbi10b3A6MTJweCI+CiAgICAgICAgICAgIDxwcmUgaWQ9ImNyb24taW5mby1jb250ZW50IiBzdHlsZT0iYmFja2dyb3VuZDojMWUyOTNiO2NvbG9yOiNhNWYzZmM7cGFkZGluZzoxMnB4O2JvcmRlci1yYWRpdXM6dmFyKC0tcmFkaXVzLXNtKTtmb250LXNpemU6MC44cmVtO292ZXJmbG93LXg6YXV0bzt3aGl0ZS1zcGFjZTpwcmUtd3JhcCI+PC9wcmU+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KCiAgICA8ZGl2IGlkPSJwYWdlLWpvYnMiIGNsYXNzPSJwYWdlIj4KICAgICAgPGRpdiBjbGFzcz0icGFnZS1oZWFkZXIiPgogICAgICAgIDxoMj7jgrjjg6fjg5blsaXmrbQ8L2gyPgogICAgICAgIDxidXR0b24gY2xhc3M9ImJ0biBidG4tb3V0bGluZSBidG4tc20iIG9uY2xpY2s9InNob3dQYWdlKCdtYWluJykiPuKGkCDmiLvjgos8L2J1dHRvbj4KICAgICAgPC9kaXY+CiAgICAgIDxkaXYgaWQ9ImpvYi1saXN0Ij48L2Rpdj4KICAgIDwvZGl2PgogIDwvbWFpbj4KCiAgPCEtLSBBZGQgUmVtb3RlIE1vZGFsIC0tPgogIDxkaXYgaWQ9Im1vZGFsLWFkZCIgY2xhc3M9Im1vZGFsLW92ZXJsYXkiIG9uY2xpY2s9ImNsb3NlTW9kYWxCZyhldmVudCkiPgogICAgPGRpdiBjbGFzcz0ibW9kYWwiIG9uY2xpY2s9ImV2ZW50LnN0b3BQcm9wYWdhdGlvbigpIj4KICAgICAgPGRpdiBjbGFzcz0ibW9kYWwtaGVhZGVyIj4KICAgICAgICA8aDMgaWQ9Im1vZGFsLXRpdGxlIj48L2gzPgogICAgICAgIDxidXR0b24gY2xhc3M9Im1vZGFsLWNsb3NlIiBvbmNsaWNrPSJjbG9zZU1vZGFsKCkiPsOXPC9idXR0b24+CiAgICAgIDwvZGl2PgogICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1ib2R5IiBpZD0ibW9kYWwtYm9keSI+PC9kaXY+CiAgICA8L2Rpdj4KICA8L2Rpdj4KCiAgPCEtLSBBdXRoIEZsb3cgTW9kYWwgLS0+CiAgPGRpdiBpZD0ibW9kYWwtYXV0aCIgY2xhc3M9Im1vZGFsLW92ZXJsYXkiIG9uY2xpY2s9ImNsb3NlTW9kYWxCZyhldmVudCkiPgogICAgPGRpdiBjbGFzcz0ibW9kYWwgbW9kYWwtYXV0aCIgb25jbGljaz0iZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCkiPgogICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1oZWFkZXIiPgogICAgICAgIDxoMz7wn5SXIOOCouOCq+OCpuODs+ODiOiqjeiovDwvaDM+CiAgICAgICAgPGJ1dHRvbiBjbGFzcz0ibW9kYWwtY2xvc2UiIG9uY2xpY2s9ImNsb3NlTW9kYWwoKSI+w5c8L2J1dHRvbj4KICAgICAgPC9kaXY+CiAgICAgIDxkaXYgY2xhc3M9Im1vZGFsLWJvZHkiPgogICAgICAgIDxwIGlkPSJhdXRoLXN0YXR1cyIgc3R5bGU9Im1hcmdpbjowIDAgMTJweDtmb250LXNpemU6MC45cmVtO2NvbG9yOnZhcigtLXRleHQyKTtmb250LXdlaWdodDo1MDAiPjwvcD4KICAgICAgICA8ZGl2IGlkPSJhdXRoLXVybC1hcmVhIiBzdHlsZT0iZGlzcGxheTpub25lIj4KICAgICAgICAgIDxkaXYgY2xhc3M9InNzaC10dW5uZWwtYm94Ij4KICAgICAgICAgICAgPGRpdiBjbGFzcz0ic3NoLXR1bm5lbC1sYWJlbCI+MS4gU1NI44OI44Oz44ON44Or44KS5o6l57aaOjwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJzc2gtdHVubmVsLWNtZCI+PGNvZGUgaWQ9InNzaC1jbWQiPjwvY29kZT48YnV0dG9uIGNsYXNzPSJidG4gYnRuLW91dGxpbmUgYnRuLXNtIiBvbmNsaWNrPSJjb3B5U3NoQ21kKCkiPvCfk4s8L2J1dHRvbj48L2Rpdj4KICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPGRpdiBjbGFzcz0iYXV0aC11cmwtYm94IiBzdHlsZT0ibWFyZ2luLXRvcDo4cHgiPgogICAgICAgICAgICA8ZGl2IHN0eWxlPSJmb250LXNpemU6MC44cmVtO2ZvbnQtd2VpZ2h0OjYwMDtjb2xvcjp2YXIoLS10ZXh0Mik7bWFyZ2luLWJvdHRvbTo0cHgiPjIuIOODluODqeOCpuOCtuOBp+ODreOCsOOCpOODszo8L2Rpdj4KICAgICAgICAgICAgPGRpdiBzdHlsZT0iZGlzcGxheTpmbGV4O2dhcDo4cHg7YWxpZ24taXRlbXM6Y2VudGVyIj4KICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgaWQ9ImF1dGgtdXJsLWlucHV0IiByZWFkb25seSBjbGFzcz0iYXV0aC11cmwtaW5wdXQiPgogICAgICAgICAgICAgIDxhIGlkPSJhdXRoLXVybC1saW5rIiBocmVmPSIjIiB0YXJnZXQ9Il9ibGFuayIgY2xhc3M9ImJ0biBidG4tcHJpbWFyeSBidG4tc20iPumWi+OBjzwvYT4KICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJidG4gYnRuLW91dGxpbmUgYnRuLXNtIiBvbmNsaWNrPSJjb3B5QXV0aFVybCgpIj7wn5OLPC9idXR0b24+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdiBpZD0iYXV0aC1kb25lLWFyZWEiIHN0eWxlPSJkaXNwbGF5Om5vbmU7dGV4dC1hbGlnbjpjZW50ZXI7cGFkZGluZzoyMHB4IDAiPgogICAgICAgICAgPHAgc3R5bGU9ImNvbG9yOnZhcigtLXN1Y2Nlc3MpO2ZvbnQtd2VpZ2h0OjYwMDtmb250LXNpemU6MS4xcmVtIj7inIUg6KqN6Ki85a6M5LqGPC9wPgogICAgICAgIDwvZGl2PgogICAgICA8L2Rpdj4KICAgIDwvZGl2PgogIDwvZGl2PgoKICA8IS0tIFN5bmMgUGFpciBBZGQgTW9kYWwgLS0+CiAgPGRpdiBpZD0ibW9kYWwtc3luYy1wYWlyIiBjbGFzcz0ibW9kYWwtb3ZlcmxheSIgb25jbGljaz0iY2xvc2VNb2RhbEJnKGV2ZW50KSI+CiAgICA8ZGl2IGNsYXNzPSJtb2RhbCIgc3R5bGU9Im1heC13aWR0aDo2MDBweCIgb25jbGljaz0iZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCkiPgogICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1oZWFkZXIiPgogICAgICAgIDxoMz7lkIzmnJ/jg5rjgqLjgpLov73liqA8L2gzPgogICAgICAgIDxidXR0b24gY2xhc3M9Im1vZGFsLWNsb3NlIiBvbmNsaWNrPSJjbG9zZU1vZGFsKCkiPsOXPC9idXR0b24+CiAgICAgIDwvZGl2PgogICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1ib2R5Ij4KICAgICAgICA8ZGl2IGNsYXNzPSJmb3JtLWdyb3VwIj4KICAgICAgICAgIDxsYWJlbD7jgrPjg5Tjg7zlhYPvvIjjgrXjg7zjg5Djg7zlgbTvvIk8L2xhYmVsPgogICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIGlkPSJwYWlyLXNvdXJjZSIgcGxhY2Vob2xkZXI9Ii9vcHQvbHhkLWRhdGEvZmlsZSI+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0iZm9ybS1ncm91cCI+CiAgICAgICAgICA8bGFiZWw+44Kz44OU44O85YWI77yI44Kv44Op44Km44OJ5YG077yJPC9sYWJlbD4KICAgICAgICAgIDxkaXYgc3R5bGU9ImRpc3BsYXk6ZmxleDtnYXA6MCI+CiAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJzeW5jLXByZWZpeCIgaWQ9InBhaXItcHJlZml4Ij5nZHJpdmU6PC9zcGFuPgogICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgaWQ9InBhaXItZGVzdCIgY2xhc3M9InN5bmMtaW5wdXQtZGVzdCIgcGxhY2Vob2xkZXI9Ii9iYWNrdXAiPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGxhYmVsIGNsYXNzPSJjaGVja2JveCIgc3R5bGU9Im1hcmdpbjo4cHggMCI+PGlucHV0IHR5cGU9ImNoZWNrYm94IiBpZD0icGFpci1kZWxldGUiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6MC44NXJlbSI+44Kz44OU44O85YWD44Gr44Gq44GE44OV44Kh44Kk44Or44KS44Kz44OU44O85YWI44Gn5YmK6ZmkPC9zcGFuPjwvbGFiZWw+CiAgICAgICAgPGRpdiBzdHlsZT0ibWFyZ2luLXRvcDoxNnB4O2Rpc3BsYXk6ZmxleDtnYXA6OHB4O2p1c3RpZnktY29udGVudDpmbGV4LWVuZCI+CiAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJidG4gYnRuLW91dGxpbmUiIG9uY2xpY2s9ImNsb3NlTW9kYWwoKSI+44Kt44Oj44Oz44K744OrPC9idXR0b24+CiAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJidG4gYnRuLXByaW1hcnkiIG9uY2xpY2s9InNhdmVTeW5jUGFpcigpIj7ov73liqA8L2J1dHRvbj4KICAgICAgICA8L2Rpdj4KICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KICA8L2Rpdj4KCiAgPGRpdiBpZD0idG9hc3QiIGNsYXNzPSJ0b2FzdCI+PC9kaXY+CiAgPHNjcmlwdCBzcmM9Ii9qcy9hcHAuanM/dj02Ij48L3NjcmlwdD4KPC9ib2R5Pgo8L2h0bWw+Cg=='
B64_JS='bGV0IGFsbFJlbW90ZXMgPSBbXTsKbGV0IHN5bmNQYWlycyA9IFtdOwpsZXQgc3luY1NjaGVkdWxlID0gW107CmxldCBqb2JIaXN0b3J5ID0gW107CmxldCBhdXRoVHlwZSA9ICcnOwpsZXQgYXV0aFJlbW90ZU5hbWUgPSAnJzsKbGV0IGF1dGhTZXNzaW9uSWQgPSAnJzsKbGV0IGF1dGhQb2xsVGltZXIgPSBudWxsOwpsZXQgYWRkaW5nUGFpckZvciA9ICcnOwpsZXQgZGlzbWlzc2VkRXJyb3JzID0gbmV3IFNldChKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdlYXN5cmNsb25lX2Rpc21pc3NlZCcpIHx8ICdbXScpKTsKCmFzeW5jIGZ1bmN0aW9uIGFwaSh1cmwsIG9wdHMgPSB7fSkgewogIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKHVybCwgewogICAgbWV0aG9kOiBvcHRzLm1ldGhvZCB8fCAnR0VUJywKICAgIGhlYWRlcnM6IG9wdHMuYm9keSA/IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9IDogdW5kZWZpbmVkLAogICAgYm9keTogb3B0cy5ib2R5ID8gSlNPTi5zdHJpbmdpZnkob3B0cy5ib2R5KSA6IHVuZGVmaW5lZAogIH0pOwogIHJldHVybiByZXMuanNvbigpOwp9Cgphc3luYyBmdW5jdGlvbiBsb2FkQWxsKCkgewogIGNvbnN0IGRhdGEgPSBhd2FpdCBhcGkoJy9hcGkvcmVtb3RlcycpOwogIGFsbFJlbW90ZXMgPSBkYXRhLnJlbW90ZXMgfHwgW107CiAgY29uc3Qgc2V0dGluZ3MgPSBhd2FpdCBhcGkoJy9hcGkvc3luYy1zZXR0aW5ncycpOwogIHN5bmNQYWlycyA9IHNldHRpbmdzLnNldHRpbmdzPy5wYWlycyB8fCBbXTsKICBzeW5jU2NoZWR1bGUgPSBzZXR0aW5ncy5zZXR0aW5ncz8uc2NoZWR1bGUgfHwgW107CiAgY29uc3Qgam9icyA9IGF3YWl0IGFwaSgnL2FwaS9qb2JzJyk7CiAgam9iSGlzdG9yeSA9IGpvYnMuam9icyB8fCBbXTsKICByZW5kZXJBbGwoKTsKfQoKZnVuY3Rpb24gc2hvd1RvYXN0KG1zZywgdHlwZSA9ICdpbmZvJykgewogIGNvbnN0IHQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG9hc3QnKTsKICB0LnRleHRDb250ZW50ID0gbXNnOwogIHQuY2xhc3NOYW1lID0gYHRvYXN0ICR7dHlwZX0gc2hvd2A7CiAgY2xlYXJUaW1lb3V0KHQuX3RpbWVyKTsKICB0Ll90aW1lciA9IHNldFRpbWVvdXQoKCkgPT4gdC5jbGFzc0xpc3QucmVtb3ZlKCdzaG93JyksIDQwMDApOwp9CgpmdW5jdGlvbiBzaG93UGFnZShuYW1lKSB7CiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnBhZ2UnKS5mb3JFYWNoKHAgPT4gcC5jbGFzc0xpc3QucmVtb3ZlKCdhY3RpdmUnKSk7CiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3BhZ2UtJyArIG5hbWUpLmNsYXNzTGlzdC5hZGQoJ2FjdGl2ZScpOwogIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5uYXYtYnRuJykuZm9yRWFjaChiID0+IGIuY2xhc3NMaXN0LnRvZ2dsZSgnYWN0aXZlJywgYi5kYXRhc2V0LnBhZ2UgPT09IG5hbWUpKTsKICBpZiAobmFtZSA9PT0gJ21haW4nKSBsb2FkQWxsKCk7CiAgaWYgKG5hbWUgPT09ICdqb2JzJykgbG9hZEpvYnMoKTsKfQoKZnVuY3Rpb24gY2xvc2VNb2RhbCgpIHsKICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcubW9kYWwtb3ZlcmxheScpLmZvckVhY2gobSA9PiBtLmNsYXNzTGlzdC5yZW1vdmUoJ29wZW4nKSk7Cn0KZnVuY3Rpb24gY2xvc2VNb2RhbEJnKGUpIHsgaWYgKGUudGFyZ2V0ID09PSBlLmN1cnJlbnRUYXJnZXQpIGNsb3NlTW9kYWwoKTsgfQoKZnVuY3Rpb24gZXNjKHMpIHsgcmV0dXJuIFN0cmluZyhzKS5yZXBsYWNlKC8nL2csICJcXCciKS5yZXBsYWNlKC8iL2csICcmcXVvdDsnKTsgfQoKZnVuY3Rpb24gZGlzbWlzc0Vycm9yKHNvdXJjZSwgZGVzdCkgewogIGRpc21pc3NlZEVycm9ycy5hZGQoYCR7c291cmNlfeKGkiR7ZGVzdH1gKTsKICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnZWFzeXJjbG9uZV9kaXNtaXNzZWQnLCBKU09OLnN0cmluZ2lmeShbLi4uZGlzbWlzc2VkRXJyb3JzXSkpOwogIHNob3dQYWdlKCdqb2JzJyk7Cn0KCi8vID09PSBSZW5kZXIgPT09CmZ1bmN0aW9uIHJlbmRlckFsbCgpIHsKICBjb25zdCBjb250YWluZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmVtb3RlLWNhcmRzJyk7CiAgY29uc3Qgc2NoZWRTZWN0aW9uID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NjaGVkdWxlLXNlY3Rpb24nKTsKCiAgaWYgKCFhbGxSZW1vdGVzLmxlbmd0aCkgewogICAgY29udGFpbmVyLmlubmVySFRNTCA9ICc8ZGl2IGNsYXNzPSJlbXB0eS1zdGF0ZSI+PGRpdiBjbGFzcz0iZW1wdHktaWNvbiI+4piB77iPPC9kaXY+PGgzPuOCouOCq+OCpuODs+ODiOOBjOacqueZu+mMsuOBp+OBmTwvaDM+PHA+5Y+z5LiK44Gu44Oc44K/44Oz44GL44KJ44Kv44Op44Km44OJ44Ki44Kr44Km44Oz44OI44KS6L+95Yqg44GX44Gm44GP44Gg44GV44GEPC9wPjwvZGl2Pic7CiAgICBzY2hlZFNlY3Rpb24uc3R5bGUuZGlzcGxheSA9ICdub25lJzsKICAgIHJldHVybjsKICB9CgogIGxldCBodG1sID0gJyc7CiAgZm9yIChjb25zdCByIG9mIGFsbFJlbW90ZXMpIHsKICAgIGNvbnN0IHBhaXJzID0gc3luY1BhaXJzLmZpbHRlcihwID0+IHAucmVtb3RlTmFtZSA9PT0gci5uYW1lKTsKICAgIGh0bWwgKz0gYAogICAgPGRpdiBjbGFzcz0iY2FyZCByZW1vdGUtY2FyZCI+CiAgICAgIDxkaXYgY2xhc3M9InJlbW90ZS1jYXJkLWhlYWRlciI+CiAgICAgICAgPGRpdiBjbGFzcz0icmVtb3RlLWNhcmQtbGVmdCI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJyZW1vdGUtaWNvbiAke3IudHlwZX0iPiR7ci50eXBlID09PSAnZHJpdmUnID8gJ0cnIDogJ08nfTwvZGl2PgogICAgICAgICAgPGRpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0icmVtb3RlLWNhcmQtbmFtZSI+JHtlc2Moci5uYW1lKX08L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0icmVtb3RlLWNhcmQtdHlwZSI+JHtyLnR5cGUgPT09ICdkcml2ZScgPyAnR29vZ2xlIOODieODqeOCpOODlicgOiAnT25lRHJpdmUnfTwvZGl2PgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0icmVtb3RlLWNhcmQtYWN0aW9ucyI+CiAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJidG4gYnRuLW91dGxpbmUgYnRuLXNtIiBvbmNsaWNrPSJzZXR1cFNzaCgpIj7wn5SnIOS4gOaZglNTSOioreWumjwvYnV0dG9uPgogICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iYnRuIGJ0bi1wcmltYXJ5IGJ0bi1zbSIgb25jbGljaz0ic3RhcnRBdXRoRmxvdygnJHtlc2Moci5uYW1lKX0nLCcke3IudHlwZX0nKSI+8J+UkSDoqo3oqLw8L2J1dHRvbj4KICAgICAgICAgIDxidXR0b24gY2xhc3M9ImJ0biBidG4tb3V0bGluZSBidG4tc20iIG9uY2xpY2s9InRlc3RSZW1vdGUoJyR7ZXNjKHIubmFtZSl9JykiPvCflJcg44OG44K544OIPC9idXR0b24+CiAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJidG4gYnRuLW91dGxpbmUgYnRuLXNtIiBvbmNsaWNrPSJ0ZWFyZG93blNzaCgpIj7wn5eRIOS4gOaZglNTSOWJiumZpDwvYnV0dG9uPgogICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iYnRuIGJ0bi1zdWNjZXNzIGJ0bi1zbSIgb25jbGljaz0ib3BlbkFkZFBhaXIoJyR7ZXNjKHIubmFtZSl9JywnJHtyLnR5cGV9JykiPu+8iyDlkIzmnJ/jg5rjgqLov73liqA8L2J1dHRvbj4KICAgICAgICAgIDxidXR0b24gY2xhc3M9ImJ0biBidG4tZGFuZ2VyIGJ0bi1zbSIgb25jbGljaz0iZGVsZXRlUmVtb3RlKCcke2VzYyhyLm5hbWUpfScpIj7wn5eRIOWJiumZpDwvYnV0dG9uPgogICAgICAgIDwvZGl2PgogICAgICA8L2Rpdj5gOwoKICAgIGlmIChwYWlycy5sZW5ndGgpIHsKICAgICAgaHRtbCArPSAnPGRpdiBjbGFzcz0ic3luYy1wYWlycy1hcmVhIj4nOwogICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhaXJzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgY29uc3QgcGkgPSBzeW5jUGFpcnMuaW5kZXhPZihwYWlyc1tpXSk7CiAgICAgICAgY29uc3QgcCA9IHBhaXJzW2ldOwogICAgICAgIGNvbnN0IHBhaXJKb2JzID0gam9iSGlzdG9yeS5maWx0ZXIoaiA9PiBqLnNvdXJjZSA9PT0gcC5zb3VyY2UgJiYgai5kZXN0ID09PSBwLmRlc3QpOwogICAgICAgIGNvbnN0IGVycm9yS2V5ID0gYCR7cC5zb3VyY2V94oaSJHtwLmRlc3R9YDsKICAgICAgICBjb25zdCBoYXNFcnJvciA9IHBhaXJKb2JzLnNvbWUoaiA9PiBqLnN0YXR1cyA9PT0gJ2ZhaWxlZCcpICYmICFkaXNtaXNzZWRFcnJvcnMuaGFzKGVycm9yS2V5KTsKICAgICAgICBjb25zdCBlcnJvckxpbmsgPSBoYXNFcnJvciA/IGA8c3BhbiBjbGFzcz0ic3luYy1lcnJvci1saW5rIiBvbmNsaWNrPSJkaXNtaXNzRXJyb3IoJyR7ZXNjKHAuc291cmNlKX0nLCcke2VzYyhwLmRlc3QpfScpIj7lkIzmnJ/jgqjjg6njg7zjgYLjgoo8L3NwYW4+YCA6ICcnOwogICAgICAgIGh0bWwgKz0gYAogICAgICAgIDxkaXYgY2xhc3M9InN5bmMtcGFpci1yb3ciPgogICAgICAgICAgPGRpdiBjbGFzcz0ic3luYy1wYWlyLWxlZnQiPgogICAgICAgICAgICA8c3BhbiBjbGFzcz0ic3luYy1wYWlyLXBhdGgiPiR7ZXNjKHAuc291cmNlKX08L3NwYW4+CiAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJzeW5jLWFycm93Ij7ihpI8L3NwYW4+CiAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJzeW5jLXBhaXItcGF0aCI+JHtlc2MocC5kZXN0KX08L3NwYW4+CiAgICAgICAgICAgICR7cC5kZWxldGVFeHRyYSA/ICc8c3BhbiBjbGFzcz0idGFnIHRhZy1yZWQiPuWJiumZpOOBguOCijwvc3Bhbj4nIDogJyd9CiAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDxkaXYgY2xhc3M9InN5bmMtcGFpci1yaWdodCI+CiAgICAgICAgICAgICR7ZXJyb3JMaW5rfQogICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJidG4gYnRuLXByaW1hcnkgYnRuLXNtIiBvbmNsaWNrPSJzeW5jUGFpck5vdygke3BpfSkiPvCflIQg5ZCM5pyfPC9idXR0b24+CiAgICAgICAgICAgIDxidXR0b24gY2xhc3M9ImJ0biBidG4tb3V0bGluZSBidG4tc20iIG9uY2xpY2s9ImVkaXRQYWlyKCR7cGl9KSI+4pyP77iPIOe3qOmbhjwvYnV0dG9uPgogICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJidG4gYnRuLWRhbmdlciBidG4tc20iIG9uY2xpY2s9ImRlbGV0ZVBhaXIoJHtwaX0pIj7wn5eRPC9idXR0b24+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj5gOwogICAgICB9CiAgICAgIGh0bWwgKz0gJzwvZGl2Pic7CiAgICB9CiAgICBodG1sICs9ICc8L2Rpdj4nOwogIH0KICBjb250YWluZXIuaW5uZXJIVE1MID0gaHRtbDsKCiAgaWYgKHN5bmNQYWlycy5sZW5ndGgpIHsKICAgIHNjaGVkU2VjdGlvbi5zdHlsZS5kaXNwbGF5ID0gJyc7CiAgICByZW5kZXJTeW5jU2NoZWR1bGUoKTsKICB9IGVsc2UgewogICAgc2NoZWRTZWN0aW9uLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7CiAgfQp9CgovLyA9PT0gUmVtb3RlIEFjdGlvbnMgPT09CmFzeW5jIGZ1bmN0aW9uIHRlc3RSZW1vdGUobikgewogIHNob3dUb2FzdCgn44OG44K544OI5LitLi4uJywgJ2luZm8nKTsKICBjb25zdCBkID0gYXdhaXQgYXBpKGAvYXBpL3JlbW90ZXMvJHtufS90ZXN0YCwgeyBtZXRob2Q6ICdQT1NUJyB9KTsKICBzaG93VG9hc3QoZC5vayA/IGDinIUgJHtufSDmjqXntprmiJDlip9gIDogYOKdjCDlpLHmlZc6ICR7KGQuZXJyb3IgfHwgJycpLnN1YnN0cmluZygwLCA4MCl9YCwgZC5vayA/ICdzdWNjZXNzJyA6ICdlcnJvcicpOwp9Cgphc3luYyBmdW5jdGlvbiBkZWxldGVSZW1vdGUobikgewogIGlmICghY29uZmlybShg44CMJHtufeOAjeOCkuWJiumZpOOBl+OBvuOBmeOBi++8n2ApKSByZXR1cm47CiAgY29uc3QgZCA9IGF3YWl0IGFwaShgL2FwaS9yZW1vdGVzLyR7bn1gLCB7IG1ldGhvZDogJ0RFTEVURScgfSk7CiAgaWYgKGQub2spIHsgc2hvd1RvYXN0KCfliYrpmaTjgZfjgb7jgZfjgZ8nLCAnc3VjY2VzcycpOyBsb2FkQWxsKCk7IH0KICBlbHNlIHNob3dUb2FzdChkLmVycm9yIHx8ICflpLHmlZcnLCAnZXJyb3InKTsKfQoKLy8gPT09IFNTSCA9PT0KYXN5bmMgZnVuY3Rpb24gc2V0dXBTc2goKSB7CiAgc2hvd1RvYXN0KCdTU0joqK3lrprkuK0uLi4nLCAnaW5mbycpOwogIGNvbnN0IGQgPSBhd2FpdCBhcGkoJy9hcGkvc3NoL3NldHVwJywgeyBtZXRob2Q6ICdQT1NUJyB9KTsKICBpZiAoZC5vaykgewogICAgYWxlcnQoYFNTSOS4gOaZguioreWumuWujOS6hlxuXG7jg5vjgrnjg4g6ICR7ZC5ob3N0bmFtZX1cbuODpuODvOOCtuODvDogcm9vdFxu44OR44K544Ov44O844OJOiAke2QucGFzc3dvcmR9XG5cbuaOpee2mjpcbnNzaCAtTCA1MzY4MjoxMjcuMC4wLjE6NTM2ODIgcm9vdEAke2QuaG9zdG5hbWV9YCk7CiAgICBzaG93VG9hc3QoJ1NTSOacieWKuScsICdzdWNjZXNzJyk7CiAgfSBlbHNlIHNob3dUb2FzdCgn5aSx5pWXOiAnICsgKGQuZXJyb3IgfHwgJycpLCAnZXJyb3InKTsKfQoKYXN5bmMgZnVuY3Rpb24gdGVhcmRvd25Tc2goKSB7CiAgaWYgKCFjb25maXJtKCfkuIDmmYJTU0joqK3lrprjgpLliYrpmaTjgZfjgb7jgZnjgYvvvJ8nKSkgcmV0dXJuOwogIGNvbnN0IGQgPSBhd2FpdCBhcGkoJy9hcGkvc3NoL3RlYXJkb3duJywgeyBtZXRob2Q6ICdQT1NUJyB9KTsKICBzaG93VG9hc3QoZC5vayA/ICfinIUg5YmK6Zmk44GX44G+44GX44GfJyA6ICflpLHmlZcnLCBkLm9rID8gJ3N1Y2Nlc3MnIDogJ2Vycm9yJyk7Cn0KCi8vID09PSBBZGQgUmVtb3RlID09PQpmdW5jdGlvbiBvcGVuQWRkTW9kYWwodHlwZSkgewogIGF1dGhUeXBlID0gdHlwZTsKICBjb25zdCB0aXRsZSA9IHR5cGUgPT09ICdkcml2ZScgPyAnR29vZ2xlIOODieODqeOCpOODluOCkui/veWKoCcgOiAnT25lRHJpdmUg44KS6L+95YqgJzsKICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW9kYWwtdGl0bGUnKS50ZXh0Q29udGVudCA9IHRpdGxlOwogIGNvbnN0IGRlZmF1bHROYW1lID0gdHlwZSA9PT0gJ2RyaXZlJyA/ICdnZHJpdmUnIDogJ29uZWRyaXZlJzsKICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbW9kYWwtYm9keScpLmlubmVySFRNTCA9IGAKICAgIDxkaXYgY2xhc3M9ImZvcm0tZ3JvdXAiPgogICAgICA8bGFiZWw+44Oq44Oi44O844OI5ZCNPC9sYWJlbD4KICAgICAgPGlucHV0IHR5cGU9InRleHQiIGlkPSJhZGQtbmFtZSIgdmFsdWU9IiR7ZGVmYXVsdE5hbWV9Ij4KICAgIDwvZGl2PgogICAgPGRpdiBzdHlsZT0ibWFyZ2luLXRvcDoxNnB4O2Rpc3BsYXk6ZmxleDtnYXA6OHB4Ij4KICAgICAgPGJ1dHRvbiBjbGFzcz0iYnRuIGJ0bi1wcmltYXJ5IiBvbmNsaWNrPSJhZGRSZW1vdGVPbmx5KCkiPui/veWKoOOBmeOCizwvYnV0dG9uPgogICAgICA8YnV0dG9uIGNsYXNzPSJidG4gYnRuLW91dGxpbmUiIG9uY2xpY2s9ImNsb3NlTW9kYWwoKSI+44Kt44Oj44Oz44K744OrPC9idXR0b24+CiAgICA8L2Rpdj5gOwogIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb2RhbC1hZGQnKS5jbGFzc0xpc3QuYWRkKCdvcGVuJyk7Cn0KCmFzeW5jIGZ1bmN0aW9uIGFkZFJlbW90ZU9ubHkoKSB7CiAgY29uc3QgbmFtZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhZGQtbmFtZScpLnZhbHVlLnRyaW0oKTsKICBpZiAoIW5hbWUpIHsgc2hvd1RvYXN0KCflkI3liY3jgpLlhaXlipsnLCAnZXJyb3InKTsgcmV0dXJuOyB9CiAgY29uc3QgZCA9IGF3YWl0IGFwaSgnL2FwaS9yZW1vdGVzJywgeyBtZXRob2Q6ICdQT1NUJywgYm9keTogeyBuYW1lLCB0eXBlOiBhdXRoVHlwZSwgcGFyYW1zOiB7fSB9IH0pOwogIGlmICghZC5vaykgeyBzaG93VG9hc3QoZC5lcnJvciB8fCAn5aSx5pWXJywgJ2Vycm9yJyk7IHJldHVybjsgfQogIHNob3dUb2FzdChg44CMJHtuYW1lfeOAjeOCkui/veWKoOOBl+OBvuOBl+OBn2AsICdzdWNjZXNzJyk7CiAgY2xvc2VNb2RhbCgpOwogIGxvYWRBbGwoKTsKfQoKLy8gPT09IEF1dGggPT09CmZ1bmN0aW9uIHN0YXJ0QXV0aEZsb3cobmFtZSwgdHlwZSkgewogIGF1dGhSZW1vdGVOYW1lID0gbmFtZTsKICBhdXRoVHlwZSA9IHR5cGU7CiAgaWYgKGF1dGhQb2xsVGltZXIpIHsgY2xlYXJJbnRlcnZhbChhdXRoUG9sbFRpbWVyKTsgYXV0aFBvbGxUaW1lciA9IG51bGw7IH0KICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYXV0aC1zdGF0dXMnKS50ZXh0Q29udGVudCA9ICfoqo3oqLzjgrXjg7zjg5Djg7zotbfli5XkuK0uLi4nOwogIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhdXRoLXVybC1hcmVhJykuc3R5bGUuZGlzcGxheSA9ICdub25lJzsKICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYXV0aC1kb25lLWFyZWEnKS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOwogIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb2RhbC1hdXRoJykuY2xhc3NMaXN0LmFkZCgnb3BlbicpOwoKICBmZXRjaCgnL2FwaS9hdXRoL3N0YXJ0JywgewogICAgbWV0aG9kOiAnUE9TVCcsCiAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSwKICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgdHlwZSwgcmVtb3RlTmFtZTogbmFtZSB9KQogIH0pLnRoZW4ociA9PiByLmpzb24oKSkudGhlbihkYXRhID0+IHsKICAgIGlmICghZGF0YS5vaykgeyBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYXV0aC1zdGF0dXMnKS50ZXh0Q29udGVudCA9ICfjgqjjg6njg7w6ICcgKyAoZGF0YS5lcnJvciB8fCAnJyk7IHJldHVybjsgfQogICAgYXV0aFNlc3Npb25JZCA9IGRhdGEuc2Vzc2lvbklkOwogICAgaWYgKGRhdGEuYXV0aFVybCkgc2hvd1VybChkYXRhLmF1dGhVcmwpOwogICAgYXV0aFBvbGxUaW1lciA9IHNldEludGVydmFsKHBvbGxBdXRoLCAxNTAwKTsKICAgIHBvbGxBdXRoKCk7CiAgfSkuY2F0Y2goZSA9PiB7IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhdXRoLXN0YXR1cycpLnRleHRDb250ZW50ID0gJ+OCqOODqeODvDogJyArIGUubWVzc2FnZTsgfSk7Cn0KCmZ1bmN0aW9uIHBvbGxBdXRoKCkgewogIGlmICghYXV0aFNlc3Npb25JZCkgcmV0dXJuOwogIGZldGNoKGAvYXBpL2F1dGgvcG9sbC8ke2F1dGhTZXNzaW9uSWR9YCkudGhlbihyID0+IHIuanNvbigpKS50aGVuKGRhdGEgPT4gewogICAgaWYgKGRhdGEuYXV0aFVybCkgc2hvd1VybChkYXRhLmF1dGhVcmwpOwogICAgaWYgKGRhdGEuZG9uZSkgewogICAgICBjbGVhckludGVydmFsKGF1dGhQb2xsVGltZXIpOyBhdXRoUG9sbFRpbWVyID0gbnVsbDsKICAgICAgaWYgKGRhdGEuc3VjY2VzcykgewogICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhdXRoLWRvbmUtYXJlYScpLnN0eWxlLmRpc3BsYXkgPSAnJzsKICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYXV0aC1zdGF0dXMnKS50ZXh0Q29udGVudCA9ICcnOwogICAgICAgIHNldFRpbWVvdXQoKCkgPT4geyBjbG9zZU1vZGFsKCk7IHNob3dUb2FzdChg44CMJHthdXRoUmVtb3RlTmFtZX3jgI3oqo3oqLzlrozkuoZgLCAnc3VjY2VzcycpOyBsb2FkQWxsKCk7IH0sIDIwMDApOwogICAgICB9IGVsc2UgewogICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhdXRoLXN0YXR1cycpLnRleHRDb250ZW50ID0gJ+KdjCAnICsgKGRhdGEuZXJyb3IgfHwgJ+WkseaVlycpOwogICAgICB9CiAgICB9CiAgfSkuY2F0Y2goKCkgPT4ge30pOwp9CgpmdW5jdGlvbiBzaG93VXJsKHVybCkgewogIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhdXRoLXVybC1hcmVhJykuc3R5bGUuZGlzcGxheSA9ICcnOwogIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhdXRoLXVybC1pbnB1dCcpLnZhbHVlID0gdXJsOwogIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhdXRoLXVybC1saW5rJykuaHJlZiA9IHVybDsKICBjb25zdCBtID0gdXJsLm1hdGNoKC9odHRwOlwvXC9bXGQuXSs6KFxkKykvKTsKICBjb25zdCBwb3J0ID0gbSA/IG1bMV0gOiAnNTM2ODInOwogIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhdXRoLXN0YXR1cycpLnRleHRDb250ZW50ID0gJ1NTSOODiOODs+ODjeODq+aOpee2muW+jOOAgeS4i+OBrlVSTOOCkumWi+OBhOOBpuOBj+OBoOOBleOBhCc7CiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NzaC1jbWQnKS50ZXh0Q29udGVudCA9IGBzc2ggLUwgJHtwb3J0fToxMjcuMC4wLjE6JHtwb3J0fSByb290QCR7bG9jYXRpb24uaG9zdG5hbWV9YDsKfQoKZnVuY3Rpb24gY29weUF1dGhVcmwoKSB7CiAgY29uc3QgZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhdXRoLXVybC1pbnB1dCcpOwogIGUuc2VsZWN0KCk7IGUuc2V0U2VsZWN0aW9uUmFuZ2UoMCwgOTk5OTkpOwogIHRyeSB7IGRvY3VtZW50LmV4ZWNDb21tYW5kKCdjb3B5Jyk7IHNob3dUb2FzdCgn44Kz44OU44O844GX44G+44GX44GfJywgJ3N1Y2Nlc3MnKTsgfSBjYXRjaCB7IHNob3dUb2FzdCgn5aSx5pWXJywgJ2Vycm9yJyk7IH0KfQoKZnVuY3Rpb24gY29weVNzaENtZCgpIHsKICBjb25zdCBlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NzaC1jbWQnKTsKICBjb25zdCB0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGV4dGFyZWEnKTsKICB0LnZhbHVlID0gZS50ZXh0Q29udGVudDsgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0KTsgdC5zZWxlY3QoKTsKICB0cnkgeyBkb2N1bWVudC5leGVjQ29tbWFuZCgnY29weScpOyBzaG93VG9hc3QoJ+OCs+ODlOODvOOBl+OBvuOBl+OBnycsICdzdWNjZXNzJyk7IH0gY2F0Y2ggeyBzaG93VG9hc3QoJ+WkseaVlycsICdlcnJvcicpOyB9CiAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZCh0KTsKfQoKLy8gPT09IFN5bmMgUGFpcnMgPT09CmZ1bmN0aW9uIG9wZW5BZGRQYWlyKHJlbW90ZU5hbWUsIHJlbW90ZVR5cGUpIHsKICBhZGRpbmdQYWlyRm9yID0gcmVtb3RlTmFtZTsKICBjb25zdCBwcmVmaXggPSByZW1vdGVUeXBlID09PSAnZHJpdmUnID8gYCR7cmVtb3RlTmFtZX06YCA6IGAke3JlbW90ZU5hbWV9OmA7CiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3BhaXItcHJlZml4JykudGV4dENvbnRlbnQgPSBwcmVmaXg7CiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3BhaXItc291cmNlJykudmFsdWUgPSAnJzsKICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncGFpci1kZXN0JykudmFsdWUgPSAnJzsKICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncGFpci1kZWxldGUnKS5jaGVja2VkID0gZmFsc2U7CiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21vZGFsLXN5bmMtcGFpcicpLmNsYXNzTGlzdC5hZGQoJ29wZW4nKTsKfQoKYXN5bmMgZnVuY3Rpb24gc2F2ZVN5bmNQYWlyKCkgewogIGNvbnN0IHNvdXJjZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwYWlyLXNvdXJjZScpLnZhbHVlLnRyaW0oKTsKICBjb25zdCBwYXRoT25seSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwYWlyLWRlc3QnKS52YWx1ZS50cmltKCk7CiAgY29uc3QgcHJlZml4ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3BhaXItcHJlZml4JykudGV4dENvbnRlbnQ7CiAgY29uc3QgZGVsZXRlRXh0cmEgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncGFpci1kZWxldGUnKS5jaGVja2VkOwogIGlmICghc291cmNlKSB7IHNob3dUb2FzdCgn44Kz44OU44O85YWD44KS5YWl5YqbJywgJ2Vycm9yJyk7IHJldHVybjsgfQogIGlmICghcGF0aE9ubHkpIHsgc2hvd1RvYXN0KCfjgrPjg5Tjg7zlhYjjgpLlhaXlipsnLCAnZXJyb3InKTsgcmV0dXJuOyB9CgogIGlmIChlZGl0aW5nUGFpcklkeCA+PSAwKSB7CiAgICBzeW5jUGFpcnNbZWRpdGluZ1BhaXJJZHhdID0geyBzb3VyY2UsIGRlc3Q6IHByZWZpeCArIHBhdGhPbmx5LCBkZWxldGVFeHRyYSwgcmVtb3RlTmFtZTogYWRkaW5nUGFpckZvciB9OwogICAgc2hvd1RvYXN0KCflkIzmnJ/jg5rjgqLjgpLmm7TmlrDjgZfjgb7jgZfjgZ8nLCAnc3VjY2VzcycpOwogIH0gZWxzZSB7CiAgICBzeW5jUGFpcnMucHVzaCh7IHNvdXJjZSwgZGVzdDogcHJlZml4ICsgcGF0aE9ubHksIGRlbGV0ZUV4dHJhLCByZW1vdGVOYW1lOiBhZGRpbmdQYWlyRm9yIH0pOwogICAgc2hvd1RvYXN0KCflkIzmnJ/jg5rjgqLjgpLov73liqDjgZfjgb7jgZfjgZ8nLCAnc3VjY2VzcycpOwogIH0KICBlZGl0aW5nUGFpcklkeCA9IC0xOwogIGF3YWl0IHNhdmVTZXR0aW5ncygpOwogIGNsb3NlTW9kYWwoKTsKICBsb2FkQWxsKCk7Cn0KCmFzeW5jIGZ1bmN0aW9uIGRlbGV0ZVBhaXIoaWR4KSB7CiAgaWYgKCFjb25maXJtKCfjgZPjga7lkIzmnJ/jg5rjgqLjgpLliYrpmaTjgZfjgb7jgZnjgYvvvJ8nKSkgcmV0dXJuOwogIHN5bmNQYWlycy5zcGxpY2UoaWR4LCAxKTsKICBhd2FpdCBzYXZlU2V0dGluZ3MoKTsKICBzaG93VG9hc3QoJ+WJiumZpOOBl+OBvuOBl+OBnycsICdzdWNjZXNzJyk7CiAgbG9hZEFsbCgpOwp9Cgphc3luYyBmdW5jdGlvbiBzeW5jUGFpck5vdyhpZHgpIHsKICBjb25zdCBwID0gc3luY1BhaXJzW2lkeF07CiAgaWYgKCFwKSByZXR1cm47CiAgc2hvd1RvYXN0KCflkIzmnJ/plovlp4suLi4nLCAnaW5mbycpOwogIGNvbnN0IGQgPSBhd2FpdCBhcGkoJy9hcGkvam9icycsIHsKICAgIG1ldGhvZDogJ1BPU1QnLAogICAgYm9keTogeyBzb3VyY2U6IHAuc291cmNlLCBkZXN0OiBwLmRlc3QsIG1vZGU6ICdjb3B5JywgbmFtZTogYCR7cC5zb3VyY2V9IOKGkiAke3AuZGVzdH1gLCBkZWxldGVFeHRyYTogcC5kZWxldGVFeHRyYSB9CiAgfSk7CiAgaWYgKGQuam9iSWQpIHsgc2hvd1RvYXN0KGDjgrjjg6fjg5YgJHtkLmpvYklkfSDplovlp4tgLCAnc3VjY2VzcycpOyBzaG93UGFnZSgnam9icycpOyB9CiAgZWxzZSBzaG93VG9hc3QoZC5lcnJvciB8fCAn5aSx5pWXJywgJ2Vycm9yJyk7Cn0KCmxldCBlZGl0aW5nUGFpcklkeCA9IC0xOwoKZnVuY3Rpb24gZWRpdFBhaXIoaWR4KSB7CiAgZWRpdGluZ1BhaXJJZHggPSBpZHg7CiAgY29uc3QgcCA9IHN5bmNQYWlyc1tpZHhdOwogIGNvbnN0IHJlbW90ZU5hbWUgPSBwLnJlbW90ZU5hbWUgfHwgYWxsUmVtb3Rlc1swXT8ubmFtZSB8fCAnZ2RyaXZlJzsKICBhZGRpbmdQYWlyRm9yID0gcmVtb3RlTmFtZTsKICBjb25zdCByZW1vdGVUeXBlID0gYWxsUmVtb3Rlcy5maW5kKHIgPT4gci5uYW1lID09PSByZW1vdGVOYW1lKT8udHlwZSB8fCAnZHJpdmUnOwogIGNvbnN0IHByZWZpeCA9IGAke3JlbW90ZU5hbWV9OmA7CiAgbGV0IHBhdGhPbmx5ID0gcC5kZXN0IHx8ICcnOwogIGlmIChwYXRoT25seS5zdGFydHNXaXRoKHByZWZpeCkpIHBhdGhPbmx5ID0gcGF0aE9ubHkuc3Vic3RyaW5nKHByZWZpeC5sZW5ndGgpOwoKICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncGFpci1zb3VyY2UnKS52YWx1ZSA9IHAuc291cmNlIHx8ICcnOwogIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwYWlyLWRlc3QnKS52YWx1ZSA9IHBhdGhPbmx5OwogIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwYWlyLWRlbGV0ZScpLmNoZWNrZWQgPSBwLmRlbGV0ZUV4dHJhIHx8IGZhbHNlOwogIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwYWlyLXByZWZpeCcpLnRleHRDb250ZW50ID0gcHJlZml4OwogIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtb2RhbC1zeW5jLXBhaXInKS5jbGFzc0xpc3QuYWRkKCdvcGVuJyk7Cn0KCmFzeW5jIGZ1bmN0aW9uIHNhdmVTZXR0aW5ncygpIHsKICBhd2FpdCBhcGkoJy9hcGkvc3luYy1zZXR0aW5ncycsIHsgbWV0aG9kOiAnUE9TVCcsIGJvZHk6IHsgcGFpcnM6IHN5bmNQYWlycywgc2NoZWR1bGU6IHN5bmNTY2hlZHVsZSB9IH0pOwp9CgovLyA9PT0gU2NoZWR1bGUgPT09CmZ1bmN0aW9uIHJlbmRlclN5bmNTY2hlZHVsZSgpIHsKICBjb25zdCBlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzeW5jLXNjaGVkdWxlLWxpc3QnKTsKICBpZiAoIXN5bmNTY2hlZHVsZS5sZW5ndGgpIHsKICAgIGVsLmlubmVySFRNTCA9ICc8ZGl2IHN0eWxlPSJwYWRkaW5nOjhweDtjb2xvcjp2YXIoLS10ZXh0Myk7Zm9udC1zaXplOjAuODVyZW0iPuacquioreWumjwvZGl2Pic7CiAgICByZXR1cm47CiAgfQogIGVsLmlubmVySFRNTCA9IHN5bmNTY2hlZHVsZS5tYXAoKHQsIGkpID0+IGAKICAgIDxkaXYgY2xhc3M9InN5bmMtc2NoZWR1bGUtaXRlbSI+CiAgICAgIDxzcGFuIGNsYXNzPSJzeW5jLXNjaGVkdWxlLXRpbWUiPvCflZAgJHt0fTwvc3Bhbj4KICAgICAgPGJ1dHRvbiBjbGFzcz0iYnRuIGJ0bi1kYW5nZXIgYnRuLXNtIiBvbmNsaWNrPSJzeW5jU2NoZWR1bGUuc3BsaWNlKCR7aX0sMSk7cmVuZGVyU3luY1NjaGVkdWxlKCkiPvCfl5E8L2J1dHRvbj4KICAgIDwvZGl2PgogIGApLmpvaW4oJycpOwp9CgpmdW5jdGlvbiBhZGRTeW5jU2NoZWR1bGUoKSB7CiAgY29uc3QgaG91clNlbGVjdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzY2hlZHVsZS10aW1lLXNlbGVjdCcpOwogIGNvbnN0IG1pblNlbGVjdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzY2hlZHVsZS1taW4tc2VsZWN0Jyk7CiAgY29uc3QgaG91ciA9IGhvdXJTZWxlY3QudmFsdWU7CiAgY29uc3QgbWluID0gbWluU2VsZWN0LnZhbHVlOwogIGlmICghaG91ciAmJiBob3VyICE9PSAnMCcpIHsgc2hvd1RvYXN0KCfmmYLplpPjgpLpgbjmip7jgZfjgabjgY/jgaDjgZXjgYQnLCAnZXJyb3InKTsgcmV0dXJuOyB9CiAgY29uc3QgaCA9IGhvdXIucGFkU3RhcnQoMiwgJzAnKTsKICBjb25zdCB0aW1lID0gYCR7aH06JHttaW59YDsKICBpZiAoc3luY1NjaGVkdWxlLmluY2x1ZGVzKHRpbWUpKSB7IHNob3dUb2FzdCgn6YeN6KSH44GX44Gm44GE44G+44GZJywgJ2Vycm9yJyk7IHJldHVybjsgfQogIHN5bmNTY2hlZHVsZS5wdXNoKHRpbWUpOwogIHN5bmNTY2hlZHVsZS5zb3J0KCk7CiAgcmVuZGVyU3luY1NjaGVkdWxlKCk7CiAgaG91clNlbGVjdC52YWx1ZSA9ICcnOwogIG1pblNlbGVjdC52YWx1ZSA9ICcwMCc7Cn0KCmFzeW5jIGZ1bmN0aW9uIHNhdmVTY2hlZHVsZSgpIHsKICBhd2FpdCBhcGkoJy9hcGkvc3luYy1zZXR0aW5ncycsIHsgbWV0aG9kOiAnUE9TVCcsIGJvZHk6IHsgcGFpcnM6IHN5bmNQYWlycywgc2NoZWR1bGU6IHN5bmNTY2hlZHVsZSB9IH0pOwogIHNob3dUb2FzdCgn44K544Kx44K444Ol44O844Or44KS5L+d5a2Y44GX44G+44GX44GfJywgJ3N1Y2Nlc3MnKTsKfQoKZnVuY3Rpb24gZXhwb3J0U2V0dGluZ3MoKSB7CiAgY29uc3QgZGF0YSA9IHsgcGFpcnM6IHN5bmNQYWlycywgc2NoZWR1bGU6IHN5bmNTY2hlZHVsZSwgZXhwb3J0ZWRBdDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpIH07CiAgY29uc3QgYmxvYiA9IG5ldyBCbG9iKFtKU09OLnN0cmluZ2lmeShkYXRhLCBudWxsLCAyKV0sIHsgdHlwZTogJ2FwcGxpY2F0aW9uL2pzb24nIH0pOwogIGNvbnN0IHVybCA9IFVSTC5jcmVhdGVPYmplY3RVUkwoYmxvYik7CiAgY29uc3QgYSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTsKICBhLmhyZWYgPSB1cmw7CiAgYS5kb3dubG9hZCA9IGBlYXN5cmNsb25lLXNldHRpbmdzLSR7bmV3IERhdGUoKS50b0lTT1N0cmluZygpLnNsaWNlKDAsMTApfS5qc29uYDsKICBhLmNsaWNrKCk7CiAgVVJMLnJldm9rZU9iamVjdFVSTCh1cmwpOwogIHNob3dUb2FzdCgn6Kit5a6a44KS44Ko44Kv44K544Od44O844OI44GX44G+44GX44GfJywgJ3N1Y2Nlc3MnKTsKfQoKZnVuY3Rpb24gaW1wb3J0U2V0dGluZ3MoKSB7CiAgY29uc3QgaW5wdXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbnB1dCcpOwogIGlucHV0LnR5cGUgPSAnZmlsZSc7CiAgaW5wdXQuYWNjZXB0ID0gJy5qc29uJzsKICBpbnB1dC5vbmNoYW5nZSA9IGFzeW5jIChlKSA9PiB7CiAgICBjb25zdCBmaWxlID0gZS50YXJnZXQuZmlsZXNbMF07CiAgICBpZiAoIWZpbGUpIHJldHVybjsKICAgIHRyeSB7CiAgICAgIGNvbnN0IHRleHQgPSBhd2FpdCBmaWxlLnRleHQoKTsKICAgICAgY29uc3QgZGF0YSA9IEpTT04ucGFyc2UodGV4dCk7CiAgICAgIGlmIChkYXRhLnBhaXJzICYmIGRhdGEuc2NoZWR1bGUpIHsKICAgICAgICBzeW5jUGFpcnMgPSBkYXRhLnBhaXJzOwogICAgICAgIHN5bmNTY2hlZHVsZSA9IGRhdGEuc2NoZWR1bGU7CiAgICAgICAgYXdhaXQgc2F2ZVNldHRpbmdzKCk7CiAgICAgICAgc2hvd1RvYXN0KCfoqK3lrprjgpLjgqTjg7Pjg53jg7zjg4jjgZfjgb7jgZfjgZ8nLCAnc3VjY2VzcycpOwogICAgICAgIGxvYWRBbGwoKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBzaG93VG9hc3QoJ+eEoeWKueOBquioreWumuODleOCoeOCpOODq+OBp+OBmScsICdlcnJvcicpOwogICAgICB9CiAgICB9IGNhdGNoIChlKSB7CiAgICAgIHNob3dUb2FzdCgn6Kqt44G/6L6844G/44Ko44Op44O8OiAnICsgZS5tZXNzYWdlLCAnZXJyb3InKTsKICAgIH0KICB9OwogIGlucHV0LmNsaWNrKCk7Cn0KCmFzeW5jIGZ1bmN0aW9uIHNob3dDcm9uSW5mbygpIHsKICBjb25zdCBhcmVhID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Nyb24taW5mby1hcmVhJyk7CiAgY29uc3QgY29udGVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjcm9uLWluZm8tY29udGVudCcpOwogIGlmIChhcmVhLnN0eWxlLmRpc3BsYXkgPT09ICcnKSB7IGFyZWEuc3R5bGUuZGlzcGxheSA9ICdub25lJzsgcmV0dXJuOyB9CiAgYXJlYS5zdHlsZS5kaXNwbGF5ID0gJyc7CiAgY29udGVudC50ZXh0Q29udGVudCA9ICfoqq3jgb/ovrzjgb/kuK0uLi4nOwogIGNvbnN0IGQgPSBhd2FpdCBhcGkoJy9hcGkvY3Jvbi1pbmZvJyk7CiAgY29udGVudC50ZXh0Q29udGVudCA9IGQub2sgPyBkLm91dHB1dCA6ICfjgqjjg6njg7w6ICcgKyAoZC5lcnJvciB8fCAnJyk7Cn0KCi8vID09PSBKb2JzID09PQphc3luYyBmdW5jdGlvbiBsb2FkSm9icygpIHsKICBjb25zdCBkYXRhID0gYXdhaXQgYXBpKCcvYXBpL2pvYnMnKTsKICBjb25zdCBsaXN0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2pvYi1saXN0Jyk7CiAgaWYgKCFkYXRhLmpvYnM/Lmxlbmd0aCkgewogICAgbGlzdC5pbm5lckhUTUwgPSAnPGRpdiBjbGFzcz0iZW1wdHktc3RhdGUiPjxkaXYgY2xhc3M9ImVtcHR5LWljb24iPvCfk4s8L2Rpdj48aDM+44K444On44OW44GM44GC44KK44G+44Gb44KTPC9oMz48L2Rpdj4nOwogICAgcmV0dXJuOwogIH0KICBsaXN0LmlubmVySFRNTCA9IGRhdGEuam9icy5tYXAoaiA9PiB7CiAgICBjb25zdCBzbCA9IHsgcnVubmluZzogJ+KPsyDlrp/ooYzkuK0nLCBjb21wbGV0ZWQ6ICfinIUg5a6M5LqGJywgZmFpbGVkOiAn4p2MIOWkseaVlycsIHN0b3BwZWQ6ICfij7kg5YGc5q2iJyB9W2ouc3RhdHVzXSB8fCBqLnN0YXR1czsKICAgIGNvbnN0IGxvZ0xpbmVzID0gKGoubG9nIHx8ICcnKS5zcGxpdCgnXG4nKS5maWx0ZXIoQm9vbGVhbik7CiAgICBjb25zdCBsYXN0TGluZXMgPSBsb2dMaW5lcy5zbGljZSgtMjApLmpvaW4oJ1xuJyk7CiAgICByZXR1cm4gYAogICAgPGRpdiBjbGFzcz0iam9iLWNhcmQiPgogICAgICA8ZGl2IGNsYXNzPSJqb2ItY2FyZC10b3AiPgogICAgICAgIDxzcGFuIGNsYXNzPSJqb2ItY2FyZC1uYW1lIj4ke2VzYyhqLm5hbWUgfHwgai5pZCl9PC9zcGFuPgogICAgICAgIDxzcGFuIGNsYXNzPSJqb2Itc3RhdHVzICR7ai5zdGF0dXN9Ij4ke3NsfTwvc3Bhbj4KICAgICAgPC9kaXY+CiAgICAgIDxkaXYgY2xhc3M9ImpvYi1jYXJkLXBhdGhzIj48c3Bhbj4ke2VzYyhqLnNvdXJjZSl9PC9zcGFuPjxzcGFuPuKGkjwvc3Bhbj48c3Bhbj4ke2VzYyhqLmRlc3QpfTwvc3Bhbj48L2Rpdj4KICAgICAgPGRpdiBjbGFzcz0iam9iLWNhcmQtbWV0YSI+CiAgICAgICAgPGRpdj4ke25ldyBEYXRlKGouY3JlYXRlZEF0KS50b0xvY2FsZVN0cmluZygnamEtSlAnKX0ke2ouY29tcGxldGVkQXQgPyAnIOKGkiAnICsgbmV3IERhdGUoai5jb21wbGV0ZWRBdCkudG9Mb2NhbGVTdHJpbmcoJ2phLUpQJykgOiAnJ308L2Rpdj4KICAgICAgPC9kaXY+CiAgICAgICR7bGFzdExpbmVzID8gYDxkaXYgY2xhc3M9ImpvYi1sb2ciPjxwcmU+JHtlc2MobGFzdExpbmVzKX08L3ByZT48L2Rpdj5gIDogJyd9CiAgICA8L2Rpdj5gOwogIH0pLmpvaW4oJycpOwoKICBpZiAoZGF0YS5qb2JzLnNvbWUoaiA9PiBqLnN0YXR1cyA9PT0gJ3J1bm5pbmcnKSkgc2V0VGltZW91dChsb2FkSm9icywgMjAwMCk7Cn0KCmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ0RPTUNvbnRlbnRMb2FkZWQnLCAoKSA9PiBsb2FkQWxsKCkpOwo='
B64_CSS='OnJvb3QgewogIC0tcHJpbWFyeTogIzI1NjNlYjsKICAtLXByaW1hcnktaG92ZXI6ICMxZDRlZDg7CiAgLS1wcmltYXJ5LWxpZ2h0OiAjZWZmNmZmOwogIC0tYmc6ICNmMWY1Zjk7CiAgLS1jYXJkOiAjZmZmZmZmOwogIC0tdGV4dDogIzBmMTcyYTsKICAtLXRleHQyOiAjMzM0MTU1OwogIC0tdGV4dDM6ICM2NDc0OGI7CiAgLS1ib3JkZXI6ICNlMmU4ZjA7CiAgLS1ib3JkZXIyOiAjY2JkNWUxOwogIC0tc3VjY2VzczogIzE2YTM0YTsKICAtLXN1Y2Nlc3MtYmc6ICNmMGZkZjQ7CiAgLS1kYW5nZXI6ICNkYzI2MjY7CiAgLS1kYW5nZXItYmc6ICNmZWYyZjI7CiAgLS13YXJuaW5nOiAjZDk3NzA2OwogIC0td2FybmluZy1iZzogI2ZmZmJlYjsKICAtLWRyaXZlOiAjNDI4NWY0OwogIC0tb25lZHJpdmU6ICMwMDc4ZDQ7CiAgLS1yYWRpdXM6IDEwcHg7CiAgLS1yYWRpdXMtc206IDZweDsKICAtLXNoYWRvdzogMCAxcHggM3B4IHJnYmEoMCwwLDAsMC4wOCk7CiAgLS1zaGFkb3ctbWQ6IDAgNHB4IDEycHggcmdiYSgwLDAsMCwwLjEpOwp9CgoqIHsgbWFyZ2luOiAwOyBwYWRkaW5nOiAwOyBib3gtc2l6aW5nOiBib3JkZXItYm94OyB9CmJvZHkgeyBmb250LWZhbWlseTogLWFwcGxlLXN5c3RlbSwgQmxpbmtNYWNTeXN0ZW1Gb250LCAnU2Vnb2UgVUknLCAnSGlyYWdpbm8gU2FucycsICdZdSBHb3RoaWMnLCBzYW5zLXNlcmlmOyBiYWNrZ3JvdW5kOiB2YXIoLS1iZyk7IGNvbG9yOiB2YXIoLS10ZXh0KTsgbWluLWhlaWdodDogMTAwdmg7IH0KCi8qIEhlYWRlciAqLwouYXBwLWhlYWRlciB7CiAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KDEzNWRlZywgIzFlM2E1ZiAwJSwgIzI1NjNlYiAxMDAlKTsKICBjb2xvcjogd2hpdGU7IHBhZGRpbmc6IDAgMjRweDsgaGVpZ2h0OiA1NnB4OwogIGRpc3BsYXk6IGZsZXg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsKICBwb3NpdGlvbjogc3RpY2t5OyB0b3A6IDA7IHotaW5kZXg6IDEwMDsKICBib3gtc2hhZG93OiAwIDJweCA4cHggcmdiYSgwLDAsMCwwLjE1KTsKfQouaGVhZGVyLWxlZnQgeyBkaXNwbGF5OiBmbGV4OyBhbGlnbi1pdGVtczogY2VudGVyOyBnYXA6IDEwcHg7IH0KLmhlYWRlci1sZWZ0IGgxIHsgZm9udC1zaXplOiAxLjFyZW07IGZvbnQtd2VpZ2h0OiA3MDA7IH0KLmhlYWRlci1sZWZ0IC5zdWJ0aXRsZSB7IGZvbnQtc2l6ZTogMC43NXJlbTsgb3BhY2l0eTogMC43OyB9Ci5oZWFkZXItcmlnaHQgeyBkaXNwbGF5OiBmbGV4OyBnYXA6IDRweDsgfQoubG9nbyB7IG9wYWNpdHk6IDAuOTsgfQoKLmJ0bi1naG9zdCB7CiAgYmFja2dyb3VuZDogcmdiYSgyNTUsMjU1LDI1NSwwLjEpOyBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwyNTUsMjU1LDAuMik7CiAgY29sb3I6IHdoaXRlOyBwYWRkaW5nOiA2cHggMTRweDsgYm9yZGVyLXJhZGl1czogdmFyKC0tcmFkaXVzLXNtKTsKICBjdXJzb3I6IHBvaW50ZXI7IGZvbnQtc2l6ZTogMC44MnJlbTsgZm9udC13ZWlnaHQ6IDUwMDsgdHJhbnNpdGlvbjogYWxsIDAuMTVzOwp9Ci5idG4tZ2hvc3Q6aG92ZXIgeyBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwyNTUsMjU1LDAuMik7IH0KLmJ0bi1naG9zdC5hY3RpdmUgeyBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwyNTUsMjU1LDAuMjUpOyBib3JkZXItY29sb3I6IHJnYmEoMjU1LDI1NSwyNTUsMC40KTsgfQoKLyogTGF5b3V0ICovCi5jb250ZW50IHsgbWF4LXdpZHRoOiAxMTAwcHg7IG1hcmdpbjogMCBhdXRvOyBwYWRkaW5nOiAyNHB4IDE2cHg7IH0KLnBhZ2UgeyBkaXNwbGF5OiBub25lOyB9Ci5wYWdlLmFjdGl2ZSB7IGRpc3BsYXk6IGJsb2NrOyB9CgoucGFnZS1oZWFkZXIgeyBtYXJnaW4tYm90dG9tOiAyMHB4OyB9Ci5wYWdlLWhlYWRlciBoMiB7IGZvbnQtc2l6ZTogMS40cmVtOyBmb250LXdlaWdodDogNzAwOyBtYXJnaW4tYm90dG9tOiA0cHg7IH0KLnBhZ2UtaGVhZGVyIC5kZXNjIHsgY29sb3I6IHZhcigtLXRleHQzKTsgZm9udC1zaXplOiAwLjlyZW07IH0KCi8qIENhcmRzICovCi5jYXJkIHsKICBiYWNrZ3JvdW5kOiB2YXIoLS1jYXJkKTsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsgYm9yZGVyLXJhZGl1czogdmFyKC0tcmFkaXVzKTsKICBwYWRkaW5nOiAyMHB4OyBtYXJnaW4tYm90dG9tOiAxNnB4OyBib3gtc2hhZG93OiB2YXIoLS1zaGFkb3cpOwp9Ci5jYXJkIGgzIHsgZm9udC1zaXplOiAxcmVtOyBmb250LXdlaWdodDogNjAwOyBtYXJnaW4tYm90dG9tOiAxNHB4OyB9CgovKiBBZGQgQnV0dG9ucyAqLwouYWRkLWJ1dHRvbnMgeyBkaXNwbGF5OiBmbGV4OyBnYXA6IDE2cHg7IG1hcmdpbi10b3A6IDIwcHg7IH0KLmFkZC1jYXJkIHsKICBmbGV4OiAxOyBkaXNwbGF5OiBmbGV4OyBhbGlnbi1pdGVtczogY2VudGVyOyBnYXA6IDE2cHg7CiAgcGFkZGluZzogMjBweCAyNHB4OyBib3JkZXItcmFkaXVzOiB2YXIoLS1yYWRpdXMpOyBjdXJzb3I6IHBvaW50ZXI7CiAgYm9yZGVyOiAycHggZGFzaGVkIHZhcigtLWJvcmRlcjIpOyBiYWNrZ3JvdW5kOiB2YXIoLS1jYXJkKTsKICB0cmFuc2l0aW9uOiBhbGwgMC4yczsgdGV4dC1hbGlnbjogbGVmdDsKfQouYWRkLWNhcmQ6aG92ZXIgeyBib3JkZXItY29sb3I6IHZhcigtLXByaW1hcnkpOyBiYWNrZ3JvdW5kOiB2YXIoLS1wcmltYXJ5LWxpZ2h0KTsgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC0xcHgpOyBib3gtc2hhZG93OiB2YXIoLS1zaGFkb3ctbWQpOyB9Ci5hZGQtY2FyZC1pY29uIHsgZmxleC1zaHJpbms6IDA7IH0KLmFkZC1jYXJkLWxhYmVsIHN0cm9uZyB7IGRpc3BsYXk6IGJsb2NrOyBmb250LXNpemU6IDFyZW07IGNvbG9yOiB2YXIoLS10ZXh0KTsgfQouYWRkLWNhcmQtbGFiZWwgc3BhbiB7IGZvbnQtc2l6ZTogMC44cmVtOyBjb2xvcjogdmFyKC0tdGV4dDMpOyB9CgovKiBSZW1vdGUgQ2FyZHMgKi8KLnJlbW90ZS1jYXJkcyB7IGRpc3BsYXk6IGdyaWQ7IGdhcDogMTZweDsgfQoucmVtb3RlLWNhcmQgewogIHBhZGRpbmc6IDE2cHggMjBweDsgYmFja2dyb3VuZDogdmFyKC0tY2FyZCk7IGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7CiAgYm9yZGVyLXJhZGl1czogdmFyKC0tcmFkaXVzKTsgYm94LXNoYWRvdzogdmFyKC0tc2hhZG93KTsKfQoucmVtb3RlLWNhcmQtbGVmdCB7IGRpc3BsYXk6IGZsZXg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IGdhcDogMTRweDsgfQoucmVtb3RlLWljb24gewogIHdpZHRoOiA0NHB4OyBoZWlnaHQ6IDQ0cHg7IGJvcmRlci1yYWRpdXM6IDEwcHg7CiAgZGlzcGxheTogZmxleDsgYWxpZ24taXRlbXM6IGNlbnRlcjsganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgY29sb3I6IHdoaXRlOyBmb250LXdlaWdodDogNzAwOyBmb250LXNpemU6IDEuMXJlbTsKfQoucmVtb3RlLWljb24uZHJpdmUgeyBiYWNrZ3JvdW5kOiB2YXIoLS1kcml2ZSk7IH0KLnJlbW90ZS1pY29uLm9uZWRyaXZlIHsgYmFja2dyb3VuZDogdmFyKC0tb25lZHJpdmUpOyB9Ci5yZW1vdGUtY2FyZC1uYW1lIHsgZm9udC13ZWlnaHQ6IDYwMDsgZm9udC1zaXplOiAwLjk1cmVtOyB9Ci5yZW1vdGUtY2FyZC10eXBlIHsgZm9udC1zaXplOiAwLjhyZW07IGNvbG9yOiB2YXIoLS10ZXh0Myk7IG1hcmdpbi10b3A6IDJweDsgfQoucmVtb3RlLWNhcmQtYWN0aW9ucyB7IGRpc3BsYXk6IGZsZXg7IGdhcDogNnB4OyB9CgovKiBFbXB0eSBTdGF0ZSAqLwouZW1wdHktc3RhdGUgeyB0ZXh0LWFsaWduOiBjZW50ZXI7IHBhZGRpbmc6IDQwcHggMjBweDsgY29sb3I6IHZhcigtLXRleHQzKTsgfQouZW1wdHktaWNvbiB7IGZvbnQtc2l6ZTogMi41cmVtOyBtYXJnaW4tYm90dG9tOiA4cHg7IG9wYWNpdHk6IDAuNjsgfQouZW1wdHktc3RhdGUgaDMgeyBmb250LXNpemU6IDFyZW07IGNvbG9yOiB2YXIoLS10ZXh0Mik7IG1hcmdpbi1ib3R0b206IDRweDsgfQouZW1wdHktc3RhdGUgcCB7IGZvbnQtc2l6ZTogMC44NXJlbTsgfQoKLyogQnV0dG9ucyAqLwouYnRuIHsKICBwYWRkaW5nOiA4cHggMTZweDsgYm9yZGVyLXJhZGl1czogdmFyKC0tcmFkaXVzLXNtKTsgZm9udC1zaXplOiAwLjg1cmVtOwogIGZvbnQtd2VpZ2h0OiA1MDA7IGN1cnNvcjogcG9pbnRlcjsgYm9yZGVyOiBub25lOyB0cmFuc2l0aW9uOiBhbGwgMC4xNXM7CiAgZGlzcGxheTogaW5saW5lLWZsZXg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IGdhcDogNnB4Owp9Ci5idG4tcHJpbWFyeSB7IGJhY2tncm91bmQ6IHZhcigtLXByaW1hcnkpOyBjb2xvcjogd2hpdGU7IH0KLmJ0bi1wcmltYXJ5OmhvdmVyIHsgYmFja2dyb3VuZDogdmFyKC0tcHJpbWFyeS1ob3Zlcik7IH0KLmJ0bi1kYW5nZXIgeyBiYWNrZ3JvdW5kOiB2YXIoLS1kYW5nZXIpOyBjb2xvcjogd2hpdGU7IH0KLmJ0bi1kYW5nZXI6aG92ZXIgeyBiYWNrZ3JvdW5kOiAjYjkxYzFjOyB9Ci5idG4tc3VjY2VzcyB7IGJhY2tncm91bmQ6IHZhcigtLXN1Y2Nlc3MpOyBjb2xvcjogd2hpdGU7IH0KLmJ0bi1zdWNjZXNzOmhvdmVyIHsgYmFja2dyb3VuZDogIzE1ODAzZDsgfQouYnRuLW91dGxpbmUgeyBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyMik7IGNvbG9yOiB2YXIoLS10ZXh0Mik7IH0KLmJ0bi1vdXRsaW5lOmhvdmVyIHsgYmFja2dyb3VuZDogdmFyKC0tYmcpOyB9Ci5idG4tc20geyBwYWRkaW5nOiA1cHggMTBweDsgZm9udC1zaXplOiAwLjc4cmVtOyB9Ci5idG4tbGcgeyBwYWRkaW5nOiAxMnB4IDI4cHg7IGZvbnQtc2l6ZTogMC45NXJlbTsgfQouYnRuOmRpc2FibGVkIHsgb3BhY2l0eTogMC41OyBjdXJzb3I6IG5vdC1hbGxvd2VkOyB9CgovKiBEaXJlY3Rpb24gKi8KLmRpcmVjdGlvbi1jYXJkIC5kaXJlY3Rpb24tZ3JpZCB7IGRpc3BsYXk6IGdyaWQ7IGdyaWQtdGVtcGxhdGUtY29sdW1uczogcmVwZWF0KDQsIDFmcik7IGdhcDogMTBweDsgfQouZGlyLWJ0biB7CiAgZGlzcGxheTogZmxleDsgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsgYWxpZ24taXRlbXM6IGNlbnRlcjsgZ2FwOiA2cHg7CiAgcGFkZGluZzogMTZweCAxMnB4OyBib3JkZXI6IDJweCBzb2xpZCB2YXIoLS1ib3JkZXIpOyBib3JkZXItcmFkaXVzOiB2YXIoLS1yYWRpdXMpOwogIGJhY2tncm91bmQ6IHZhcigtLWNhcmQpOyBjdXJzb3I6IHBvaW50ZXI7IHRyYW5zaXRpb246IGFsbCAwLjE1czsKfQouZGlyLWJ0bjpob3ZlciB7IGJvcmRlci1jb2xvcjogdmFyKC0tcHJpbWFyeSk7IH0KLmRpci1idG4uYWN0aXZlIHsgYm9yZGVyLWNvbG9yOiB2YXIoLS1wcmltYXJ5KTsgYmFja2dyb3VuZDogdmFyKC0tcHJpbWFyeS1saWdodCk7IH0KLmRpci1hcnJvdyB7IGZvbnQtc2l6ZTogMS44cmVtOyBjb2xvcjogdmFyKC0tcHJpbWFyeSk7IGZvbnQtd2VpZ2h0OiA3MDA7IH0KLmRpci1sYWJlbCB7IGZvbnQtc2l6ZTogMC44NXJlbTsgZm9udC13ZWlnaHQ6IDYwMDsgY29sb3I6IHZhcigtLXRleHQyKTsgbGluZS1oZWlnaHQ6IDEuMzsgfQouZGlyLWxhYmVsIHNtYWxsIHsgZm9udC13ZWlnaHQ6IDQwMDsgY29sb3I6IHZhcigtLXRleHQzKTsgfQoKLyogQnJvd3NlciBQYW5lbHMgKi8KLmJyb3dzZXItcGFuZWxzIHsgZGlzcGxheTogZ3JpZDsgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiAxZnIgYXV0byAxZnI7IGdhcDogMDsgbWFyZ2luLWJvdHRvbTogMTZweDsgfQoucGFuZWwgeyBiYWNrZ3JvdW5kOiB2YXIoLS1jYXJkKTsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsgYm9yZGVyLXJhZGl1czogdmFyKC0tcmFkaXVzKTsgb3ZlcmZsb3c6IGhpZGRlbjsgYm94LXNoYWRvdzogdmFyKC0tc2hhZG93KTsgZGlzcGxheTogZmxleDsgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsgfQoucGFuZWwtaGVhZGVyIHsgcGFkZGluZzogMTBweCAxNHB4OyBiYWNrZ3JvdW5kOiAjZjhmYWZjOyBib3JkZXItYm90dG9tOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsgZGlzcGxheTogZmxleDsgYWxpZ24taXRlbXM6IGNlbnRlcjsgZ2FwOiAxMHB4OyB9Ci5wYW5lbC10aXRsZSB7IGZvbnQtc2l6ZTogMC44MnJlbTsgZm9udC13ZWlnaHQ6IDYwMDsgY29sb3I6IHZhcigtLXRleHQyKTsgd2hpdGUtc3BhY2U6IG5vd3JhcDsgfQoucGFuZWwtaGVhZGVyIHNlbGVjdCB7IGZsZXg6IDE7IHBhZGRpbmc6IDVweCA4cHg7IGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7IGJvcmRlci1yYWRpdXM6IHZhcigtLXJhZGl1cy1zbSk7IGZvbnQtc2l6ZTogMC44MnJlbTsgYmFja2dyb3VuZDogd2hpdGU7IH0KLmJyZWFkY3J1bWIgeyBwYWRkaW5nOiA2cHggMTRweDsgYmFja2dyb3VuZDogI2Y4ZmFmYzsgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7IGZvbnQtZmFtaWx5OiBtb25vc3BhY2U7IGZvbnQtc2l6ZTogMC43OHJlbTsgY29sb3I6IHZhcigtLXRleHQzKTsgZGlzcGxheTogZmxleDsgZmxleC13cmFwOiB3cmFwOyBnYXA6IDJweDsgfQouYnJlYWRjcnVtYiBzcGFuIHsgY3Vyc29yOiBwb2ludGVyOyBwYWRkaW5nOiAxcHggNHB4OyBib3JkZXItcmFkaXVzOiAzcHg7IH0KLmJyZWFkY3J1bWIgc3Bhbjpob3ZlciB7IGJhY2tncm91bmQ6IHZhcigtLXByaW1hcnktbGlnaHQpOyBjb2xvcjogdmFyKC0tcHJpbWFyeSk7IH0KLnBhbmVsLWJvZHkgeyBtaW4taGVpZ2h0OiAyNTBweDsgbWF4LWhlaWdodDogMzUwcHg7IG92ZXJmbG93LXk6IGF1dG87IH0KLnBhbmVsLWNlbnRlciB7IGRpc3BsYXk6IGZsZXg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IGp1c3RpZnktY29udGVudDogY2VudGVyOyBwYWRkaW5nOiAwIDhweDsgfQouc3luYy1pY29uIHsgZm9udC1zaXplOiAxLjVyZW07IG9wYWNpdHk6IDAuNTsgfQoKLmJyb3dzZS1pdGVtIHsKICBwYWRkaW5nOiA3cHggMTRweDsgY3Vyc29yOiBwb2ludGVyOyBkaXNwbGF5OiBmbGV4OyBhbGlnbi1pdGVtczogY2VudGVyOyBnYXA6IDhweDsKICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI2YxZjVmOTsgZm9udC1zaXplOiAwLjg1cmVtOyB0cmFuc2l0aW9uOiBiYWNrZ3JvdW5kIDAuMXM7Cn0KLmJyb3dzZS1pdGVtOmhvdmVyIHsgYmFja2dyb3VuZDogI2Y4ZmFmYzsgfQouYnJvd3NlLWl0ZW0uc2VsZWN0ZWQgeyBiYWNrZ3JvdW5kOiB2YXIoLS1wcmltYXJ5LWxpZ2h0KTsgY29sb3I6IHZhcigtLXByaW1hcnkpOyB9Ci5icm93c2UtaXRlbSAuYmktaWNvbiB7IHdpZHRoOiAxOHB4OyB0ZXh0LWFsaWduOiBjZW50ZXI7IGZvbnQtc2l6ZTogMC45cmVtOyB9Ci5icm93c2UtaXRlbS5pcy1kaXIgeyBmb250LXdlaWdodDogNTAwOyB9Ci5icm93c2UtaXRlbS5pcy1iYWNrIHsgY29sb3I6IHZhcigtLXRleHQzKTsgfQoKLnBhbmVsLWVtcHR5IHsgcGFkZGluZzogMzBweDsgdGV4dC1hbGlnbjogY2VudGVyOyBjb2xvcjogdmFyKC0tdGV4dDMpOyBmb250LXNpemU6IDAuODVyZW07IH0KCi8qIE9wdGlvbnMgKi8KLm9wdGlvbnMtZ3JpZCB7IGRpc3BsYXk6IGdyaWQ7IGdyaWQtdGVtcGxhdGUtY29sdW1uczogMWZyIDFmcjsgZ2FwOiAxMnB4OyB9Ci5jaGVja2JveC1yb3cgeyBkaXNwbGF5OiBmbGV4OyBnYXA6IDIwcHg7IG1hcmdpbi10b3A6IDEycHg7IH0KLmNoZWNrYm94IHsgZGlzcGxheTogZmxleDsgYWxpZ24taXRlbXM6IGNlbnRlcjsgZ2FwOiA2cHg7IGZvbnQtc2l6ZTogMC44NXJlbTsgY3Vyc29yOiBwb2ludGVyOyBjb2xvcjogdmFyKC0tdGV4dDIpOyB9Ci5jaGVja2JveCBpbnB1dCB7IHdpZHRoOiAxNnB4OyBoZWlnaHQ6IDE2cHg7IGFjY2VudC1jb2xvcjogdmFyKC0tcHJpbWFyeSk7IH0KCi5mb3JtLWdyb3VwIGxhYmVsIHsgZGlzcGxheTogYmxvY2s7IGZvbnQtc2l6ZTogMC44cmVtOyBmb250LXdlaWdodDogNTAwOyBtYXJnaW4tYm90dG9tOiA0cHg7IGNvbG9yOiB2YXIoLS10ZXh0Mik7IH0KLmZvcm0tZ3JvdXAgaW5wdXQsIC5mb3JtLWdyb3VwIHNlbGVjdCwgLmZvcm0tZ3JvdXAgdGV4dGFyZWEgewogIHdpZHRoOiAxMDAlOyBwYWRkaW5nOiA4cHggMTJweDsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsKICBib3JkZXItcmFkaXVzOiB2YXIoLS1yYWRpdXMtc20pOyBmb250LXNpemU6IDAuODVyZW07IHRyYW5zaXRpb246IGJvcmRlci1jb2xvciAwLjE1czsKfQouZm9ybS1ncm91cCBpbnB1dDpmb2N1cywgLmZvcm0tZ3JvdXAgc2VsZWN0OmZvY3VzIHsgb3V0bGluZTogbm9uZTsgYm9yZGVyLWNvbG9yOiB2YXIoLS1wcmltYXJ5KTsgYm94LXNoYWRvdzogMCAwIDAgM3B4IHJnYmEoMzcsOTksMjM1LDAuMSk7IH0KCi8qIEFjdGlvbiBCYXIgKi8KLmFjdGlvbi1iYXIgewogIGRpc3BsYXk6IGZsZXg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsKICBwYWRkaW5nOiAxNnB4IDIwcHg7IGJhY2tncm91bmQ6IHZhcigtLWNhcmQpOyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOwogIGJvcmRlci1yYWRpdXM6IHZhcigtLXJhZGl1cyk7IGJveC1zaGFkb3c6IHZhcigtLXNoYWRvdyk7Cn0KLmFjdGlvbi1wcmV2aWV3IHsgZm9udC1zaXplOiAwLjgycmVtOyBjb2xvcjogdmFyKC0tdGV4dDMpOyBmb250LWZhbWlseTogbW9ub3NwYWNlOyB9CgovKiBKb2JzICovCi5qb2ItY2FyZCB7CiAgYmFja2dyb3VuZDogdmFyKC0tY2FyZCk7IGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7IGJvcmRlci1yYWRpdXM6IHZhcigtLXJhZGl1cyk7CiAgcGFkZGluZzogMTRweCAxOHB4OyBtYXJnaW4tYm90dG9tOiAxMHB4OyBib3gtc2hhZG93OiB2YXIoLS1zaGFkb3cpOwp9Ci5qb2ItY2FyZC10b3AgeyBkaXNwbGF5OiBmbGV4OyBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47IGFsaWduLWl0ZW1zOiBjZW50ZXI7IG1hcmdpbi1ib3R0b206IDZweDsgfQouam9iLWNhcmQtbmFtZSB7IGZvbnQtd2VpZ2h0OiA2MDA7IGZvbnQtc2l6ZTogMC45cmVtOyB9Ci5qb2Itc3RhdHVzIHsKICBwYWRkaW5nOiAzcHggMTBweDsgYm9yZGVyLXJhZGl1czogMTJweDsgZm9udC1zaXplOiAwLjcycmVtOyBmb250LXdlaWdodDogNjAwOyB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOwp9Ci5qb2Itc3RhdHVzLnJ1bm5pbmcgeyBiYWNrZ3JvdW5kOiAjZGJlYWZlOyBjb2xvcjogIzFlNDBhZjsgfQouam9iLXN0YXR1cy5jb21wbGV0ZWQgeyBiYWNrZ3JvdW5kOiAjZGNmY2U3OyBjb2xvcjogIzE2NjUzNDsgfQouam9iLXN0YXR1cy5mYWlsZWQgeyBiYWNrZ3JvdW5kOiAjZmVlMmUyOyBjb2xvcjogIzk5MWIxYjsgfQouam9iLXN0YXR1cy5zdG9wcGVkIHsgYmFja2dyb3VuZDogI2ZlZjNjNzsgY29sb3I6ICM5MjQwMGU7IH0KLmpvYi1jYXJkLXBhdGhzIHsgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsgZm9udC1zaXplOiAwLjhyZW07IGNvbG9yOiB2YXIoLS10ZXh0Myk7IGRpc3BsYXk6IGZsZXg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IGdhcDogOHB4OyBtYXJnaW4tYm90dG9tOiA0cHg7IH0KLmpvYi1jYXJkLW1ldGEgeyBmb250LXNpemU6IDAuNzVyZW07IGNvbG9yOiB2YXIoLS10ZXh0Myk7IGRpc3BsYXk6IGZsZXg7IGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsgfQouam9iLWNhcmQtbWV0YSAudGFnIHsgZGlzcGxheTogaW5saW5lLWJsb2NrOyBwYWRkaW5nOiAxcHggNnB4OyBib3JkZXItcmFkaXVzOiA0cHg7IGZvbnQtc2l6ZTogMC43cmVtOyBiYWNrZ3JvdW5kOiAjZjFmNWY5OyBjb2xvcjogdmFyKC0tdGV4dDMpOyB9Ci5qb2ItbG9nIHsgbWFyZ2luLXRvcDogOHB4OyBiYWNrZ3JvdW5kOiAjMWUyOTNiOyBjb2xvcjogI2E1ZjNmYzsgYm9yZGVyLXJhZGl1czogdmFyKC0tcmFkaXVzLXNtKTsgcGFkZGluZzogMTBweCAxMnB4OyBtYXgtaGVpZ2h0OiAyMDBweDsgb3ZlcmZsb3cteTogYXV0bzsgfQouam9iLWxvZyBwcmUgeyBtYXJnaW46IDA7IGZvbnQtZmFtaWx5OiAnU0YgTW9ubycsIE1lbmxvLCBDb25zb2xhcywgbW9ub3NwYWNlOyBmb250LXNpemU6IDAuNzhyZW07IHdoaXRlLXNwYWNlOiBwcmUtd3JhcDsgd29yZC1icmVhazogYnJlYWstYWxsOyBsaW5lLWhlaWdodDogMS40OyB9CgovKiBNb2RhbCAqLwoubW9kYWwtb3ZlcmxheSB7CiAgZGlzcGxheTogbm9uZTsgcG9zaXRpb246IGZpeGVkOyBpbnNldDogMDsgYmFja2dyb3VuZDogcmdiYSgwLDAsMCwwLjQ1KTsKICB6LWluZGV4OiAyMDA7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IGp1c3RpZnktY29udGVudDogY2VudGVyOwp9Ci5tb2RhbC1vdmVybGF5Lm9wZW4geyBkaXNwbGF5OiBmbGV4OyB9Ci5tb2RhbCB7CiAgYmFja2dyb3VuZDogdmFyKC0tY2FyZCk7IGJvcmRlci1yYWRpdXM6IDEycHg7IHdpZHRoOiA5MCU7IG1heC13aWR0aDogNTIwcHg7CiAgbWF4LWhlaWdodDogODV2aDsgb3ZlcmZsb3cteTogYXV0bzsgYm94LXNoYWRvdzogdmFyKC0tc2hhZG93LW1kKTsKfQoubW9kYWwtaGVhZGVyIHsKICBkaXNwbGF5OiBmbGV4OyBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47IGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgcGFkZGluZzogMTZweCAyMHB4OyBib3JkZXItYm90dG9tOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsKfQoubW9kYWwtaGVhZGVyIGgzIHsgZm9udC1zaXplOiAxLjA1cmVtOyB9Ci5tb2RhbC1jbG9zZSB7CiAgYmFja2dyb3VuZDogbm9uZTsgYm9yZGVyOiBub25lOyBmb250LXNpemU6IDEuM3JlbTsgY3Vyc29yOiBwb2ludGVyOwogIGNvbG9yOiB2YXIoLS10ZXh0Myk7IHBhZGRpbmc6IDRweDsKfQoubW9kYWwtY2xvc2U6aG92ZXIgeyBjb2xvcjogdmFyKC0tdGV4dCk7IH0KLm1vZGFsLWJvZHkgeyBwYWRkaW5nOiAyMHB4OyB9CgovKiBBdXRoIEZsb3cgKi8KLm1vZGFsLWF1dGggeyBtYXgtd2lkdGg6IDQ4MHB4OyB9Ci5hdXRoLWZsb3cgeyBtYXJnaW4tYm90dG9tOiAxNnB4OyB9Ci5zdGVwIHsgcGFkZGluZzogOHB4IDEycHg7IGZvbnQtc2l6ZTogMC44NXJlbTsgY29sb3I6IHZhcigtLXRleHQyKTsgYm9yZGVyLWxlZnQ6IDNweCBzb2xpZCB2YXIoLS1wcmltYXJ5KTsgbWFyZ2luLWJvdHRvbTogOHB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1wcmltYXJ5LWxpZ2h0KTsgYm9yZGVyLXJhZGl1czogMCB2YXIoLS1yYWRpdXMtc20pIHZhcigtLXJhZGl1cy1zbSkgMDsgfQouc3Bpbm5lciB7IHdpZHRoOiAzMnB4OyBoZWlnaHQ6IDMycHg7IGJvcmRlcjogM3B4IHNvbGlkIHZhcigtLWJvcmRlcik7IGJvcmRlci10b3AtY29sb3I6IHZhcigtLXByaW1hcnkpOyBib3JkZXItcmFkaXVzOiA1MCU7IGFuaW1hdGlvbjogc3BpbiAwLjhzIGxpbmVhciBpbmZpbml0ZTsgbWFyZ2luOiAyMHB4IGF1dG87IH0KQGtleWZyYW1lcyBzcGluIHsgdG8geyB0cmFuc2Zvcm06IHJvdGF0ZSgzNjBkZWcpOyB9IH0KCi8qIFRvYXN0ICovCi50b2FzdCB7CiAgcG9zaXRpb246IGZpeGVkOyBib3R0b206IDI0cHg7IHJpZ2h0OiAyNHB4OyBwYWRkaW5nOiAxMnB4IDIwcHg7CiAgYm9yZGVyLXJhZGl1czogdmFyKC0tcmFkaXVzKTsgY29sb3I6IHdoaXRlOyBmb250LXNpemU6IDAuODVyZW07IGZvbnQtd2VpZ2h0OiA1MDA7CiAgei1pbmRleDogMTAwMDsgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDEwMHB4KTsgb3BhY2l0eTogMDsgdHJhbnNpdGlvbjogYWxsIDAuM3M7CiAgYm94LXNoYWRvdzogdmFyKC0tc2hhZG93LW1kKTsKfQoudG9hc3Quc2hvdyB7IHRyYW5zZm9ybTogdHJhbnNsYXRlWSgwKTsgb3BhY2l0eTogMTsgfQoudG9hc3Quc3VjY2VzcyB7IGJhY2tncm91bmQ6IHZhcigtLXN1Y2Nlc3MpOyB9Ci50b2FzdC5lcnJvciB7IGJhY2tncm91bmQ6IHZhcigtLWRhbmdlcik7IH0KLnRvYXN0LmluZm8geyBiYWNrZ3JvdW5kOiB2YXIoLS1wcmltYXJ5KTsgfQoKLyogQXV0aCBVUkwgKi8KLmF1dGgtdXJsLWJveCB7CiAgZGlzcGxheTogZmxleDsgYWxpZ24taXRlbXM6IGNlbnRlcjsgZ2FwOiA4cHg7IHBhZGRpbmc6IDEycHggMTRweDsKICBiYWNrZ3JvdW5kOiB2YXIoLS1iZyk7IGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7IGJvcmRlci1yYWRpdXM6IHZhcigtLXJhZGl1cy1zbSk7Cn0KLmF1dGgtdXJsLWlucHV0IHsKICBmbGV4OiAxOyBwYWRkaW5nOiA2cHggMTBweDsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsgYm9yZGVyLXJhZGl1czogNHB4OwogIGZvbnQtZmFtaWx5OiBtb25vc3BhY2U7IGZvbnQtc2l6ZTogMC44cmVtOyBiYWNrZ3JvdW5kOiB3aGl0ZTsgY29sb3I6IHZhcigtLXRleHQpOwogIG1pbi13aWR0aDogMDsKfQouYXV0aC11cmwtbGluayB7IGNvbG9yOiB2YXIoLS1wcmltYXJ5KTsgZm9udC1zaXplOiAwLjgycmVtOyB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsgd29yZC1icmVhazogYnJlYWstYWxsOyB9Ci5hdXRoLXVybC1saW5rOmhvdmVyIHsgY29sb3I6IHZhcigtLXByaW1hcnktaG92ZXIpOyB9Cgouc3NoLXR1bm5lbC1ib3ggewogIHBhZGRpbmc6IDEycHggMTRweDsgYmFja2dyb3VuZDogI2ZmZmJlYjsgYm9yZGVyOiAxcHggc29saWQgI2ZiYmYyNDsKICBib3JkZXItcmFkaXVzOiB2YXIoLS1yYWRpdXMtc20pOyBtYXJnaW4tYm90dG9tOiA4cHg7Cn0KLnNzaC10dW5uZWwtbGFiZWwgeyBmb250LXNpemU6IDAuOHJlbTsgZm9udC13ZWlnaHQ6IDYwMDsgY29sb3I6ICM5MjQwMGU7IG1hcmdpbi1ib3R0b206IDZweDsgfQouc3NoLXR1bm5lbC1jbWQgewogIGRpc3BsYXk6IGZsZXg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IGdhcDogOHB4OyBiYWNrZ3JvdW5kOiB3aGl0ZTsKICBwYWRkaW5nOiA4cHggMTJweDsgYm9yZGVyLXJhZGl1czogNHB4OyBib3JkZXI6IDFweCBzb2xpZCAjZmJiZjI0Owp9Ci5zc2gtdHVubmVsLWNtZCBjb2RlIHsKICBmbGV4OiAxOyBmb250LWZhbWlseTogbW9ub3NwYWNlOyBmb250LXNpemU6IDAuODJyZW07IGNvbG9yOiB2YXIoLS10ZXh0KTsKICB3b3JkLWJyZWFrOiBicmVhay1hbGw7IHVzZXItc2VsZWN0OiBhbGw7Cn0KCi8qIFN5bmMgU2V0dGluZ3MgKi8KLnN5bmMtcGFpci1yb3cgewogIHBhZGRpbmc6IDEycHg7IGJhY2tncm91bmQ6IHZhcigtLWJnKTsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsKICBib3JkZXItcmFkaXVzOiB2YXIoLS1yYWRpdXMtc20pOyBtYXJnaW4tYm90dG9tOiA4cHg7Cn0KLnN5bmMtcGFpci1maWVsZHMgewogIGRpc3BsYXk6IGZsZXg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IGdhcDogOHB4OyBtYXJnaW4tYm90dG9tOiA2cHg7Cn0KLnN5bmMtaW5wdXQgewogIGZsZXg6IDE7IHBhZGRpbmc6IDZweCAxMHB4OyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOwogIGJvcmRlci1yYWRpdXM6IDRweDsgZm9udC1zaXplOiAwLjg1cmVtOyBmb250LWZhbWlseTogbW9ub3NwYWNlOwp9Ci5zeW5jLWlucHV0OmZvY3VzIHsgb3V0bGluZTogbm9uZTsgYm9yZGVyLWNvbG9yOiB2YXIoLS1wcmltYXJ5KTsgfQouc3luYy1pbnB1dC1kZXN0IHsgYm9yZGVyLXJhZGl1czogMCA0cHggNHB4IDA7IH0KLnN5bmMtcHJlZml4IHsKICBwYWRkaW5nOiA2cHggOHB4OyBiYWNrZ3JvdW5kOiAjZTJlOGYwOyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOwogIGJvcmRlci1yaWdodDogbm9uZTsgYm9yZGVyLXJhZGl1czogNHB4IDAgMCA0cHg7CiAgZm9udC1zaXplOiAwLjhyZW07IGZvbnQtd2VpZ2h0OiA2MDA7IGNvbG9yOiB2YXIoLS10ZXh0Mik7CiAgd2hpdGUtc3BhY2U6IG5vd3JhcDsgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsKfQouc3luYy1hcnJvdyB7IGZvbnQtc2l6ZTogMS4ycmVtOyBjb2xvcjogdmFyKC0tcHJpbWFyeSk7IGZvbnQtd2VpZ2h0OiA3MDA7IH0KLnN5bmMtc2NoZWR1bGUtaXRlbSB7CiAgZGlzcGxheTogZmxleDsgYWxpZ24taXRlbXM6IGNlbnRlcjsganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwogIHBhZGRpbmc6IDZweCAxMHB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1iZyk7IGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7CiAgYm9yZGVyLXJhZGl1czogNHB4OyBtYXJnaW4tYm90dG9tOiA0cHg7IGZvbnQtc2l6ZTogMC44NXJlbTsKfQouc3luYy1zY2hlZHVsZS10aW1lIHsgZm9udC13ZWlnaHQ6IDUwMDsgfQoKLyogUmVtb3RlIENhcmQgd2l0aCBTeW5jIFBhaXJzICovCi5yZW1vdGUtY2FyZC1oZWFkZXIgeyBkaXNwbGF5OiBmbGV4OyBhbGlnbi1pdGVtczogY2VudGVyOyBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47IGZsZXgtd3JhcDogd3JhcDsgZ2FwOiA4cHg7IH0KLnJlbW90ZS1jYXJkLW5hbWUgeyBmb250LXdlaWdodDogNjAwOyBmb250LXNpemU6IDAuOTVyZW07IH0KLnJlbW90ZS1jYXJkLXR5cGUgeyBmb250LXNpemU6IDAuOHJlbTsgY29sb3I6IHZhcigtLXRleHQzKTsgbWFyZ2luLXRvcDogMnB4OyB9Ci5yZW1vdGUtY2FyZC1hY3Rpb25zIHsgZGlzcGxheTogZmxleDsgZ2FwOiA2cHg7IGZsZXgtd3JhcDogd3JhcDsgfQouc3luYy1wYWlycy1hcmVhIHsgbWFyZ2luLXRvcDogMTJweDsgcGFkZGluZy10b3A6IDEycHg7IGJvcmRlci10b3A6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOyB9Ci5zeW5jLXBhaXItcm93IHsKICBkaXNwbGF5OiBmbGV4OyBhbGlnbi1pdGVtczogY2VudGVyOyBnYXA6IDhweDsgcGFkZGluZzogOHB4IDEycHg7CiAgYmFja2dyb3VuZDogdmFyKC0tYmcpOyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOwogIGJvcmRlci1yYWRpdXM6IHZhcigtLXJhZGl1cy1zbSk7IG1hcmdpbi1ib3R0b206IDZweDsKICBmb250LXNpemU6IDAuODVyZW07IGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsKfQouc3luYy1wYWlyLXBhdGggeyBmb250LWZhbWlseTogbW9ub3NwYWNlOyBmb250LXNpemU6IDAuODJyZW07IGNvbG9yOiB2YXIoLS10ZXh0Mik7IHdvcmQtYnJlYWs6IGJyZWFrLWFsbDsgfQouc3luYy1wYWlyLWxlZnQgeyBkaXNwbGF5OiBmbGV4OyBhbGlnbi1pdGVtczogY2VudGVyOyBnYXA6IDhweDsgZmxleDogMTsgbWluLXdpZHRoOiAwOyB9Ci5zeW5jLXBhaXItcmlnaHQgeyBkaXNwbGF5OiBmbGV4OyBhbGlnbi1pdGVtczogY2VudGVyOyBnYXA6IDZweDsgZmxleC1zaHJpbms6IDA7IH0KLnN5bmMtYXJyb3cgeyBjb2xvcjogdmFyKC0tcHJpbWFyeSk7IGZvbnQtd2VpZ2h0OiA3MDA7IGZsZXgtc2hyaW5rOiAwOyB9Ci5zeW5jLWVycm9yLWxpbmsgeyBmb250LXNpemU6IDAuNzVyZW07IGNvbG9yOiB2YXIoLS1kYW5nZXIpOyBjdXJzb3I6IHBvaW50ZXI7IHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOyB3aGl0ZS1zcGFjZTogbm93cmFwOyB9Ci50YWctcmVkIHsgYmFja2dyb3VuZDogI2ZlZTJlMjsgY29sb3I6ICM5OTFiMWI7IH0KLnNjaGVkdWxlLXNlY3Rpb24geyBtYXJnaW4tdG9wOiAyMHB4OyB9CgovKiBSZXNwb25zaXZlICovCkBtZWRpYSAobWF4LXdpZHRoOiA3NjhweCkgewogIC5yZW1vdGUtY2FyZC1oZWFkZXIgeyBmbGV4LWRpcmVjdGlvbjogY29sdW1uOyBhbGlnbi1pdGVtczogZmxleC1zdGFydDsgfQogIC5yZW1vdGUtY2FyZC1hY3Rpb25zIHsgd2lkdGg6IDEwMCU7IH0KICAuc3luYy1wYWlyLXJvdyB7IGZsZXgtd3JhcDogd3JhcDsgfQogIC5oZWFkZXItcmlnaHQgeyBnYXA6IDJweDsgfQogIC5idG4tZ2hvc3QgeyBwYWRkaW5nOiA2cHggMTBweDsgZm9udC1zaXplOiAwLjc4cmVtOyB9Cn0K'
printf '%s' "$B64_SERVER" | base64 -d > "$INSTALL_DIR/server.js"
printf '%s' "$B64_HTML" | base64 -d > "$INSTALL_DIR/public/index.html"
printf '%s' "$B64_JS" | base64 -d > "$INSTALL_DIR/public/js/app.js"
printf '%s' "$B64_CSS" | base64 -d > "$INSTALL_DIR/public/css/style.css"
echo " ファイルデコード完了"
cat > "$INSTALL_DIR/package.json" << 'PKGEND'
{
"name": "easyrclone",
"version": "10.0.0",
"description": "EasyRclone - Cloud Sync Web GUI",
"main": "server.js",
"scripts": { "start": "node server.js" },
"dependencies": {
"express": "^4.18.2",
"ws": "^8.16.0"
}
}
PKGEND
echo " package.json 作成完了"
echo ""
echo "[5/6] npm 依存関係インストール..."
cd "$INSTALL_DIR"
npm install --production 2>&1 | tail -3
echo ""
echo "[6/6] systemd サービス作成..."
cat > /etc/systemd/system/easyrclone.service << SVCEOF
[Unit]
Description=EasyRclone Web GUI
After=network.target
[Service]
Type=simple
WorkingDirectory=$INSTALL_DIR
ExecStart=$(which node) server.js
Restart=always
RestartSec=3
Environment=PORT=$PORT
Environment=TZ=Asia/Tokyo
[Install]
WantedBy=multi-user.target
SVCEOF
systemctl daemon-reload
systemctl enable easyrclone
systemctl restart easyrclone
echo " サービス起動完了"
echo ""
echo "========================================="
echo " インストール完了!"
echo "========================================="
echo ""
echo ""
if [ -n "$TS_IP" ]; then
echo " Web UI : http://${TS_IP}:${PORT}"
fi
if [ -n "$TS_HOSTNAME" ]; then
echo " Web UI : http://${TS_HOSTNAME%%.*}:${PORT} (MagicDNS)"
fi
echo " Web UI (local) : http://localhost:$PORT"
echo ""
echo " サービス: systemctl [start|stop|restart|status] easyrclone"
echo " 設定ファイル: $INSTALL_DIR/config/rclone.conf"
echo " ログ: journalctl -u easyrclone -f"
echo " タイムゾーン: $(date)"
echo ""
使い方
GoogleドライブやOneDriveへの接続を許可する
EasyRcloneのページにアクセスしたら、上部のバーから「Googleドライブ」か「OneDrive」ボタンをクリックします。

すると下の画面のようなカードが作られるので最初に「一時SSH設定」ボタンを押します。
まず、この設定が必要な理由ですが、Google DriveやOneDriveをrcloneで使うには、最初に1回だけOAuth認証(ブラウザでGoogle/Microsoftにログインして許可する作業)が必要です。この認証には少しクセがあって、rclone自身がPC上に一時的なWebサーバーを立てて、ブラウザからの認証結果をそこで受け取る、という仕組みになっています。
通常、rcloneをローカルPCで直接動かしている場合はこれで何も問題ないのですが、今回のEasyRcloneは別PC上のLXDコンテナの中で動いています。そうすると次の2つの壁にぶつかります。
1.コンテナ内で立った一時Webサーバー(認証受け取り用)は、コンテナの外から直接アクセスできない
2.このコンテナはrootにパスワードが設定されておらず、SSH接続もデフォルトでは許可されていない
つまり「SSHトンネルでポートを転送すれば認証URLにアクセスできる」はずなのに、そのSSH接続自体ができない、という状態です。
これを解決するための動作が「一時SSH設定」ボタンです。押すと以下を一時的に行います。
・root に固定パスワード(rclone)を設定
・SSHのパスワード認証・root ログインを一時的に有効化
・sshd を再起動して反映
このあと「認証」ボタンを押します。

SSHトンネルのためのコマンド(ssh -L ポート:127.0.0.1:ポート root@ホスト名 の形)が表示されるので、これをローカルPCのターミナルで実行すれば、コンテナ内の認証用一時サーバーにローカルPCからアクセスできるようになり、通常のブラウザ認証フローがそのまま使えるようになります。
そのまま、ブラウザでログインの「開く」ボタンを押す、もしくはURLをコピーしてブラウザに貼り付けます。するとログイン認証画面が表示されるはずです。

これを許可し、下記のように「Success!」と表示されれば完了です。

元の画面に戻り、「アカウント認証」の画面をバツで閉じて、「テスト」ボタンを押します。画面右下に「接続成功」と出ればOKです。

接続設定が問題なければ、「一時SSH削除」ボタンを押して、パスワードを無効化し、SSH設定も元(パスワード認証禁止)に戻しておきましょう。
同期ペアを追加
続いて同期ペアを追加していきます。ひとまず除外設定などはない、シンプルな形にしています。
コピー元は既存のフォルダを指定、コピー先はフォルダが無ければ作られるので、好きな場所にしておけばよいです。
チェックボックスへチェックするかどうかで、動作は下記の違いになります。rclone copy(チェックなし): コピー元の内容をコピー先に反映するが、コピー先にしか無いファイルはそのまま残す → 単純コピー・追加専用 rclone sync(チェックあり): コピー先をコピー元と完全に一致させる。コピー元に無いファイルはコピー先から削除される → ミラーリング
チェックなしならコピー元からコピー先へ、新しいファイル・更新されたファイルを追加していくだけの動作です。コピー先にだけ存在する古いファイルがあっても、それは消されずにそのまま残ります。安全側の動作で、間違って何かを消してしまう心配がありません。

同期ペアが追加されるので、ひとまず「同期」ボタンを押して追加した設定で同期してみましょう。

ジョブ履歴画面が表示され処理中のログが表示され、成功か失敗が表示されます。なお、このジョブ履歴は30日間保存する設定にしています。

またスケジュール実行していた時に同期エラーが発生した場合は、同期ペアカードに「同期エラーあり」という通知が表示されるようにしています。このリンクをクリックすればジョブ履歴ページが開き、この表示は消えるようにしています。

手軽に色々な環境で動作チェック出来ないのと、手間や時間がかかるので、しばらくはこれを試したりしながら、問題なさそうなら本格的に運用してみたいと思います。
アンインストール
一時SSHパスワード認証を「一時SSH設定」機能で有効にしたことがある場合は、先に忘れずにUIの「一時SSH削除」ボタンを押しておいてください(アンインストール後は/api/ssh/teardownが呼べなくなるため、sshd_configの変更が残ります)。
スクリプトの中身は systemd停止・無効化 → crontabの同期スケジュール削除 → /opt/easyrclone 削除、の3ステップです。rclone自体やNode.jsは他アプリと共用の可能性があるため削除していません。
#!/bin/bash
set -e
INSTALL_DIR="/opt/easyrclone"
echo "========================================="
echo " EasyRclone アンインストーラー"
echo "========================================="
echo ""
if [ "$(id -u)" -ne 0 ]; then
echo "エラー: root で実行してください"
echo " sudo bash $0"
exit 1
fi
echo "[1/3] systemd サービス停止・無効化..."
if systemctl list-unit-files | grep -q '^easyrclone.service'; then
systemctl stop easyrclone 2>/dev/null || true
systemctl disable easyrclone 2>/dev/null || true
rm -f /etc/systemd/system/easyrclone.service
systemctl daemon-reload
echo " 停止・無効化・unitファイル削除完了"
else
echo " easyrclone.service は見つかりませんでした(スキップ)"
fi
echo ""
echo "[2/3] crontab のスケジュールエントリ削除..."
if crontab -l 2>/dev/null | grep -q -e 'cron-sync.sh' -e '# easyrclone-schedule'; then
crontab -l 2>/dev/null | grep -v -e 'cron-sync.sh' -e '# easyrclone-schedule' > /tmp/easyrclone_crontab_tmp || true
crontab /tmp/easyrclone_crontab_tmp
rm -f /tmp/easyrclone_crontab_tmp
echo " crontab エントリ削除完了"
else
echo " crontab にエントリは見つかりませんでした(スキップ)"
fi
echo ""
echo "[3/3] ファイル削除..."
if [ -d "$INSTALL_DIR" ]; then
rm -rf "$INSTALL_DIR"
echo " $INSTALL_DIR を削除しました"
else
echo " $INSTALL_DIR は見つかりませんでした(スキップ)"
fi
echo ""
echo "========================================="
echo " アンインストール完了"
echo "========================================="
echo ""
echo " ※ 一時SSH設定(パスワード認証有効化)を使ったことがある場合は、"
echo " /etc/ssh/sshd_config.d/60-cloudimg-settings.conf を確認し、"
echo " 必要に応じて PasswordAuthentication / KbdInteractiveAuthentication を"
echo " 元に戻して 'systemctl restart sshd' を実行してください。"
echo ""

