diff --git a/CHANGELOG.md b/CHANGELOG.md index 9baf3cf..8fd59a4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,10 @@ # Changelog +## r4 (2017/07/13) + +* Replace TCC/LE with Clink (crazy-max/neard#288) +* Add GnuWin32 CoreUtils (crazy-max/neard#287) + ## r3 (2016/04/29) * Move icons to Neard core resources diff --git a/README.md b/README.md index ab81269..b7d559c 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ [![GitHub release](https://img.shields.io/github/release/crazy-max/neard-tool-console.svg?style=flat-square)](https://github.com/crazy-max/neard-tool-console/releases/latest) ![Total downloads](https://img.shields.io/github/downloads/crazy-max/neard-tool-console/total.svg?style=flat-square) -This a module of [Neard project](https://github.com/crazy-max/neard) involving Console tool bundles. +This is a module of [Neard project](https://github.com/crazy-max/neard) involving Console tool bundles. ## Documentation and downloads diff --git a/bin/consolep1/console.xml b/bin/console2.00.148.1/console.xml similarity index 100% rename from bin/consolep1/console.xml rename to bin/console2.00.148.1/console.xml diff --git a/bin/consolep1/tccle.properties b/bin/console2.00.148.1/deps.properties similarity index 50% rename from bin/consolep1/tccle.properties rename to bin/console2.00.148.1/deps.properties index b8cc359..d49e2f7 100644 --- a/bin/consolep1/tccle.properties +++ b/bin/console2.00.148.1/deps.properties @@ -1 +1,2 @@ +ansicon = https://github.com/crazy-max/neard-modules-untouched/releases/download/console-r1/ansi166.zip tccle = https://github.com/crazy-max/neard-modules-untouched/releases/download/console-r1/tccle-14.0.0.6.zip \ No newline at end of file diff --git a/bin/consolep1/neard.conf b/bin/console2.00.148.1/neard.conf similarity index 100% rename from bin/consolep1/neard.conf rename to bin/console2.00.148.1/neard.conf diff --git a/bin/consolep1/tccle.bat b/bin/console2.00.148.1/tccle.bat similarity index 100% rename from bin/consolep1/tccle.bat rename to bin/console2.00.148.1/tccle.bat diff --git a/bin/consolep1/tccle/logs/.gitignore b/bin/console2.00.148.1/tccle/logs/.gitignore similarity index 100% rename from bin/consolep1/tccle/logs/.gitignore rename to bin/console2.00.148.1/tccle/logs/.gitignore diff --git a/bin/consolep1/tccle/tcexit.btm b/bin/console2.00.148.1/tccle/tcexit.btm similarity index 100% rename from bin/consolep1/tccle/tcexit.btm rename to bin/console2.00.148.1/tccle/tcexit.btm diff --git a/bin/consolep1/tccle/tcmd.ini b/bin/console2.00.148.1/tccle/tcmd.ini similarity index 100% rename from bin/consolep1/tccle/tcmd.ini rename to bin/console2.00.148.1/tccle/tcmd.ini diff --git a/bin/consolep1/tccle/tcmd.ini.nrd b/bin/console2.00.148.1/tccle/tcmd.ini.nrd similarity index 100% rename from bin/consolep1/tccle/tcmd.ini.nrd rename to bin/console2.00.148.1/tccle/tcmd.ini.nrd diff --git a/bin/consolep1/tccle/tcstart.btm b/bin/console2.00.148.1/tccle/tcstart.btm similarity index 100% rename from bin/consolep1/tccle/tcstart.btm rename to bin/console2.00.148.1/tccle/tcstart.btm diff --git a/bin/consolep2/console.xml b/bin/console2.00.148.2/console.xml similarity index 98% rename from bin/consolep2/console.xml rename to bin/console2.00.148.2/console.xml index d617984..d90b0f2 100644 --- a/bin/consolep2/console.xml +++ b/bin/console2.00.148.2/console.xml @@ -1,103 +1,103 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/bin/consolep2/tccle.properties b/bin/console2.00.148.2/deps.properties similarity index 50% rename from bin/consolep2/tccle.properties rename to bin/console2.00.148.2/deps.properties index f7ee633..dba0d05 100644 --- a/bin/consolep2/tccle.properties +++ b/bin/console2.00.148.2/deps.properties @@ -1 +1,2 @@ +ansicon = https://github.com/crazy-max/neard-modules-untouched/releases/download/console-r1/ansi166.zip tccle = https://github.com/crazy-max/neard-modules-untouched/releases/download/console-r1/tccle-14.0.0.9.zip \ No newline at end of file diff --git a/bin/consolep2/neard.conf b/bin/console2.00.148.2/neard.conf similarity index 100% rename from bin/consolep2/neard.conf rename to bin/console2.00.148.2/neard.conf diff --git a/bin/consolep2/tccle.bat b/bin/console2.00.148.2/tccle.bat similarity index 100% rename from bin/consolep2/tccle.bat rename to bin/console2.00.148.2/tccle.bat diff --git a/bin/consolep2/tccle/logs/.gitignore b/bin/console2.00.148.2/tccle/logs/.gitignore similarity index 100% rename from bin/consolep2/tccle/logs/.gitignore rename to bin/console2.00.148.2/tccle/logs/.gitignore diff --git a/bin/consolep2/tccle/tcexit.btm b/bin/console2.00.148.2/tccle/tcexit.btm similarity index 100% rename from bin/consolep2/tccle/tcexit.btm rename to bin/console2.00.148.2/tccle/tcexit.btm diff --git a/bin/consolep2/tccle/tcmd.ini b/bin/console2.00.148.2/tccle/tcmd.ini similarity index 100% rename from bin/consolep2/tccle/tcmd.ini rename to bin/console2.00.148.2/tccle/tcmd.ini diff --git a/bin/consolep2/tccle/tcmd.ini.nrd b/bin/console2.00.148.2/tccle/tcmd.ini.nrd similarity index 100% rename from bin/consolep2/tccle/tcmd.ini.nrd rename to bin/console2.00.148.2/tccle/tcmd.ini.nrd diff --git a/bin/consolep2/tccle/tcstart.btm b/bin/console2.00.148.2/tccle/tcstart.btm similarity index 100% rename from bin/consolep2/tccle/tcstart.btm rename to bin/console2.00.148.2/tccle/tcstart.btm diff --git a/bin/console2.00.148.3/config/settings b/bin/console2.00.148.3/config/settings new file mode 100644 index 0000000..e7eb811 --- /dev/null +++ b/bin/console2.00.148.3/config/settings @@ -0,0 +1,116 @@ +# name: Pressing Ctrl-D exits session +# type: bool +# Ctrl-D exits cmd.exe when it is pressed on an empty line. +ctrld_exits = 1 + +# name: Toggle if pressing Esc clears line +# type: bool +# Clink clears the current line when Esc is pressed (unless Readline's Vi mode +# is enabled). +esc_clears_line = 1 + +# name: Match display colour +# type: int +# Colour to use when displaying matches. A value less than 0 will be the +# opposite brightness of the default colour. +match_colour = -1 + +# name: Executable match style +# type: enum +# 0 = PATH only +# 1 = PATH and CWD +# 2 = PATH, CWD, and directories +# Changes how Clink will match executables when there is no path separator on +# the line. 0 = PATH only, 1 = PATH and CWD, 2 = PATH, CWD, and directories. In +# all cases both executables and directories are matched when there is a path +# separator present. A value of -1 will disable executable matching completely. +exec_match_style = 2 + +# name: Whitespace prefix matches files +# type: bool +# If the line begins with whitespace then Clink bypasses executable matching and +# will match all files and directories instead. +space_prefix_match_files = 1 + +# name: Colour of the prompt +# type: int +# Surrounds the prompt in ANSI escape codes to set the prompt's colour. Disabled +# when the value is less than 0. +prompt_colour = 10 + +# name: Auto-answer terminate prompt +# type: enum +# 0 = Disabled +# 1 = Answer 'Y' +# 2 = Answer 'N' +# Automatically answers cmd.exe's 'Terminate batch job (Y/N)?' prompts. 0 = +# disabled, 1 = answer 'Y', 2 = answer 'N'. +terminate_autoanswer = 0 + +# name: Lines of history saved to disk +# type: int +# When set to a positive integer this is the number of lines of history that +# will persist when Clink saves the command history to disk. Use 0 for infinite +# lines and <0 to disable history persistence. +history_file_lines = 10000 + +# name: Skip adding lines prefixed with whitespace +# type: bool +# Ignore lines that begin with whitespace when adding lines in to the history. +history_ignore_space = 0 + +# name: Controls how duplicate entries are handled +# type: enum +# 0 = Always add +# 1 = Ignore +# 2 = Erase previous +# If a line is a duplicate of an existing history entry Clink will erase the +# duplicate when this is set 2. A value of 1 will not add duplicates to the +# history and a value of 0 will always add lines. Note that history is not +# deduplicated when reading/writing to disk. +history_dupe_mode = 2 + +# name: Read/write history file each line edited +# type: bool +# When non-zero the history will be read from disk before editing a new line and +# written to disk afterwards. +history_io = 0 + +# name: Sets how command history expansion is applied +# type: enum +# 0 = Off +# 1 = On +# 2 = Not in single quotes +# 3 = Not in double quote +# 4 = Not in any quotes +# The '!' character in an entered line can be interpreted to introduce words +# from the history. This can be enabled and disable by setting this value to 1 +# or 0. Values or 2, 3 or 4 will skip any ! character quoted in single, double, +# or both quotes respectively. +history_expand_mode = 4 + +# name: Support Windows' Ctrl-Alt substitute for AltGr +# type: bool +# Windows provides Ctrl-Alt as a substitute for AltGr, historically to support +# keyboards with no AltGr key. This may collide with some of Readline's +# bindings. +use_altgr_substitute = 1 + +# name: Strips CR and LF chars on paste +# type: enum +# 0 = Paste unchanged +# 1 = Strip +# 2 = As space +# Setting this to a value >0 will make Clink strip CR and LF characters from +# text pasted into the current line. Set this to 1 to strip all newline +# characters and 2 to replace them with a space. +strip_crlf_on_paste = 2 + +# name: Enables basic ANSI escape code support +# type: bool +# When printing the prompt, Clink has basic built-in support for SGR ANSI escape +# codes to control the text colours. This is automatically disabled if a third +# party tool is detected that also provides this facility. It can also be +# disabled by setting this to 0. +ansi_code_support = 1 + diff --git a/bin/console2.00.148.3/console.xml b/bin/console2.00.148.3/console.xml new file mode 100644 index 0000000..d90b0f2 --- /dev/null +++ b/bin/console2.00.148.3/console.xml @@ -0,0 +1,103 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/bin/console2.00.148.3/deps.properties b/bin/console2.00.148.3/deps.properties new file mode 100644 index 0000000..42d9d8b --- /dev/null +++ b/bin/console2.00.148.3/deps.properties @@ -0,0 +1,4 @@ +clink = https://github.com/crazy-max/neard-modules-untouched/releases/download/console-r1/clink_0.4.8.zip +clink_completions = https://github.com/crazy-max/neard-modules-untouched/releases/download/console-r1/clink-completions-0.3.2.zip +gnuwin32_coreutils_bin = https://github.com/crazy-max/neard-modules-untouched/releases/download/console-r1/coreutils-5.3.0-bin.zip +gnuwin32_coreutils_dep = https://github.com/crazy-max/neard-modules-untouched/releases/download/console-r1/coreutils-5.3.0-dep.zip \ No newline at end of file diff --git a/bin/console2.00.148.3/launch.bat b/bin/console2.00.148.3/launch.bat new file mode 100644 index 0000000..e08a03d --- /dev/null +++ b/bin/console2.00.148.3/launch.bat @@ -0,0 +1,19 @@ +@echo off + +:: Root dir +set CONSOLE_ROOT=%~dp0 + +:: Remove trailing '\' +if "%CONSOLE_ROOT:~-1%" == "\" SET "CONSOLE_ROOT=%CONSOLE_ROOT:~0,-1%" + +:: Get architecture +if "%PROCESSOR_ARCHITECTURE%"=="x86" ( + set architecture=86 +) else ( + set architecture=64 +) + +set PATH=%CONSOLE_ROOT%\vendor\gnuwin32;%PATH% + +:: Run clink +"%CONSOLE_ROOT%\vendor\clink\clink_x%architecture%.exe" inject --quiet --profile "%CONSOLE_ROOT%\config" --scripts "%CONSOLE_ROOT%\vendor" diff --git a/bin/console2.00.148.3/neard.conf b/bin/console2.00.148.3/neard.conf new file mode 100644 index 0000000..d4ebd11 --- /dev/null +++ b/bin/console2.00.148.3/neard.conf @@ -0,0 +1,8 @@ +consoleVersion = "p1" +consoleExe = "Console.exe" +consoleConf = "console.xml" +consoleLaunchExe = "launch.bat" +consoleRows = "25" +consoleCols = "95" + +bundleRelease = "@RELEASE_VERSION@" diff --git a/bin/console2.00.148.3/vendor/clink.lua b/bin/console2.00.148.3/vendor/clink.lua new file mode 100644 index 0000000..54351da --- /dev/null +++ b/bin/console2.00.148.3/vendor/clink.lua @@ -0,0 +1,286 @@ +-- default script for clink, called by launch.bat when injecting clink + +-- At first, load the original clink.lua file +-- this is needed as we set the script path to this dir and therefore the original +-- clink.lua is not loaded. +local clink_lua_file = clink.get_env('CONSOLE_ROOT')..'\\vendor\\clink\\clink.lua' +dofile(clink_lua_file) + +-- now add our own things... + +--- + -- Setting the prompt in clink means that commands which rewrite the prompt do + -- not destroy our own prompt. It also means that started cmds (or batch files + -- which echo) don't get the ugly '{lamb}' shown. +--- +function set_prompt_filter() + -- get_cwd() is differently encoded than the clink.prompt.value, so everything other than + -- pure ASCII will get garbled. So try to parse the current directory from the original prompt + -- and only if that doesn't work, use get_cwd() directly. + -- The matching relies on the default prompt which ends in X:\PATH\PATH> + -- (no network path possible here!) + local old_prompt = clink.prompt.value + local cwd = old_prompt:match('.*(.:[^>]*)>') + if cwd == nil then cwd = clink.get_cwd() end + + local username = clink.get_env('USERNAME') + local computername = clink.get_env('COMPUTERNAME') + + -- $_$E[1;31m%USERNAME%@%COMPUTERNAME%$S$E[1;32m$P$E[0m$S$_$E[1;30m$$$S$E[0m + + -- environment systems like pythons virtualenv change the PROMPT and usually + -- set some variable. But the variables are differently named and we would never + -- get them all, so try to parse the env name out of the PROMPT. + -- envs are usually put in round or square parentheses and before the old prompt + local env = old_prompt:match('.*%(([^%)]+)%).+:') + -- also check for square brackets + if env == nil then env = old_prompt:match('.*%[([^%]]+)%].+:') end + + -- build our own prompt + -- orig: $E[1;32;40m$P$S{git}{hg}$S$_$E[1;30;40m{lamb}$S$E[0m + -- color codes: "\x1b[1;37;40m" + + local console_prompt = "\x1b[1;35;40m{username}@{computername} \x1b[1;32;40m{cwd} {git}{hg} \n\x1b[1;30;40m{dollar} \x1b[0m" + console_prompt = string.gsub(console_prompt, "{username}", username) + console_prompt = string.gsub(console_prompt, "{computername}", computername) + console_prompt = string.gsub(console_prompt, "{cwd}", cwd) + if env == nil then + dollar = "$" + else + dollar = "("..env..") $" + end + clink.prompt.value = string.gsub(console_prompt, "{dollar}", dollar) +end + +--- + -- Resolves closest directory location for specified directory. + -- Navigates subsequently up one level and tries to find specified directory + -- @param {string} path Path to directory will be checked. If not provided + -- current directory will be used + -- @param {string} dirname Directory name to search for + -- @return {string} Path to specified directory or nil if such dir not found +local function get_dir_contains(path, dirname) + + -- return parent path for specified entry (either file or directory) + local function pathname(path) + local prefix = "" + local i = path:find("[\\/:][^\\/:]*$") + if i then + prefix = path:sub(1, i-1) + end + return prefix + end + + -- Navigates up one level + local function up_one_level(path) + if path == nil then path = '.' end + if path == '.' then path = clink.get_cwd() end + return pathname(path) + end + + -- Checks if provided directory contains git directory + local function has_specified_dir(path, specified_dir) + if path == nil then path = '.' end + local found_dirs = clink.find_dirs(path..'/'..specified_dir) + if #found_dirs > 0 then return true end + return false + end + + -- Set default path to current directory + if path == nil then path = '.' end + + -- If we're already have .git directory here, then return current path + if has_specified_dir(path, dirname) then + return path..'/'..dirname + else + -- Otherwise go up one level and make a recursive call + local parent_path = up_one_level(path) + if parent_path == path then + return nil + else + return get_dir_contains(parent_path, dirname) + end + end +end + +local function get_hg_dir(path) + return get_dir_contains(path, '.hg') +end + +-- adapted from from clink-completions' git.lua +local function get_git_dir(path) + + -- return parent path for specified entry (either file or directory) + local function pathname(path) + local prefix = "" + local i = path:find("[\\/:][^\\/:]*$") + if i then + prefix = path:sub(1, i-1) + end + return prefix + end + + -- Checks if provided directory contains git directory + local function has_git_dir(dir) + return #clink.find_dirs(dir..'/.git') > 0 and dir..'/.git' + end + + local function has_git_file(dir) + local gitfile = io.open(dir..'/.git') + if not gitfile then return false end + + local git_dir = gitfile:read():match('gitdir: (.*)') + gitfile:close() + + return git_dir and dir..'/'..git_dir + end + + -- Set default path to current directory + if not path or path == '.' then path = clink.get_cwd() end + + -- Calculate parent path now otherwise we won't be + -- able to do that inside of logical operator + local parent_path = pathname(path) + + return has_git_dir(path) + or has_git_file(path) + -- Otherwise go up one level and make a recursive call + or (parent_path ~= path and get_git_dir(parent_path) or nil) +end + +--- + -- Find out current branch + -- @return {false|mercurial branch name} +--- +function get_hg_branch() + for line in io.popen("hg branch 2>nul"):lines() do + local m = line:match("(.+)$") + if m then + return m + end + end + + return false +end + +--- + -- Get the status of working dir + -- @return {bool} +--- +function get_hg_status() + for line in io.popen("hg status -0"):lines() do + return false + end + return true +end + +function hg_prompt_filter() + + -- Colors for mercurial status + local colors = { + clean = "\x1b[1;37;40m", + dirty = "\x1b[31;1m", + } + + if get_hg_dir() then + -- if we're inside of mercurial repo then try to detect current branch + local branch = get_hg_branch() + if branch then + -- Has branch => therefore it is a mercurial folder, now figure out status + if get_hg_status() then + color = colors.clean + else + color = colors.dirty + end + + clink.prompt.value = string.gsub(clink.prompt.value, "{hg}", color.."("..branch..")") + return false + end + end + + -- No mercurial present or not in mercurial file + clink.prompt.value = string.gsub(clink.prompt.value, "{hg}", "") + return false +end + +--- + -- Find out current branch + -- @return {nil|git branch name} +--- +function get_git_branch(git_dir) + local git_dir = git_dir or get_git_dir() + + -- If git directory not found then we're probably outside of repo + -- or something went wrong. The same is when head_file is nil + local head_file = git_dir and io.open(git_dir..'/HEAD') + if not head_file then return end + + local HEAD = head_file:read() + head_file:close() + + -- if HEAD matches branch expression, then we're on named branch + -- otherwise it is a detached commit + local branch_name = HEAD:match('ref: refs/heads/(.+)') + return branch_name or 'HEAD detached at '..HEAD:sub(1, 7) +end + +--- + -- Get the status of working dir + -- @return {bool} +--- +function get_git_status() + local file = io.popen("git status --no-lock-index --porcelain 2>nul") + for line in file:lines() do + file:close() + return false + end + file:close() + return true +end + +function git_prompt_filter() + + -- Colors for git status + local colors = { + clean = "\x1b[1;37;40m", + dirty = "\x1b[31;1m", + } + + local git_dir = get_git_dir() + if git_dir then + -- if we're inside of git repo then try to detect current branch + local branch = get_git_branch(git_dir) + if branch then + -- Has branch => therefore it is a git folder, now figure out status + if get_git_status() then + color = colors.clean + else + color = colors.dirty + end + + clink.prompt.value = string.gsub(clink.prompt.value, "{git}", color.."("..branch..")") + return false + end + end + + -- No git present or not in git file + clink.prompt.value = string.gsub(clink.prompt.value, "{git}", "") + return false +end + +-- insert the set_prompt at the very beginning so that it runs first +clink.prompt.register_filter(set_prompt_filter, 1) +clink.prompt.register_filter(hg_prompt_filter, 50) +clink.prompt.register_filter(git_prompt_filter, 50) + +local completions_dir = clink.get_env('CONSOLE_ROOT')..'/vendor/clink-completions/' +for _,lua_module in ipairs(clink.find_files(completions_dir..'*.lua')) do + -- Skip files that starts with _. This could be useful if some files should be ignored + if not string.match(lua_module, '^_.*') then + local filename = completions_dir..lua_module + -- use dofile instead of require because require caches loaded modules + -- so config reloading using Alt-Q won't reload updated modules. + dofile(filename) + end +end + diff --git a/bin/consolep1/ansicon.properties b/bin/consolep1/ansicon.properties deleted file mode 100644 index 8ccff60..0000000 --- a/bin/consolep1/ansicon.properties +++ /dev/null @@ -1 +0,0 @@ -ansicon = https://github.com/crazy-max/neard-modules-untouched/releases/download/console-r1/ansi166.zip \ No newline at end of file diff --git a/bin/consolep2/ansicon.properties b/bin/consolep2/ansicon.properties deleted file mode 100644 index 8ccff60..0000000 --- a/bin/consolep2/ansicon.properties +++ /dev/null @@ -1 +0,0 @@ -ansicon = https://github.com/crazy-max/neard-modules-untouched/releases/download/console-r1/ansi166.zip \ No newline at end of file diff --git a/build.properties b/build.properties index 4f9b9a3..5fadc12 100644 --- a/build.properties +++ b/build.properties @@ -1,5 +1,5 @@ bundle.name = console -bundle.release = r3 +bundle.release = r4 bundle.type = tools bundle.format = 7z diff --git a/build.xml b/build.xml index b55cfc6..ab9a9b5 100644 --- a/build.xml +++ b/build.xml @@ -30,38 +30,104 @@ - + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -72,8 +138,7 @@ diff --git a/releases.properties b/releases.properties index d155dce..f728113 100644 --- a/releases.properties +++ b/releases.properties @@ -1,3 +1,6 @@ -2.00.148 = https://github.com/crazy-max/neard-tool-console/releases/download/r1/neard-console-2.00.148-r1.zip -p1 = https://github.com/crazy-max/neard-tool-console/releases/download/r3/neard-console-p1-r3.7z -p2 = https://github.com/crazy-max/neard-tool-console/releases/download/r3/neard-console-p2-r3.7z +2.00.148 = https://github.com/crazy-max/neard-tool-console/releases/download/r1/neard-console-2.00.148-r1.zip +p1 = https://github.com/crazy-max/neard-tool-console/releases/download/r3/neard-console-p1-r3.7z +p2 = https://github.com/crazy-max/neard-tool-console/releases/download/r3/neard-console-p2-r3.7z +2.00.148.1 = https://github.com/crazy-max/neard-tool-console/releases/download/r4/neard-console-2.00.148.1-r4.7z +2.00.148.2 = https://github.com/crazy-max/neard-tool-console/releases/download/r4/neard-console-2.00.148.2-r4.7z +2.00.148.3 = https://github.com/crazy-max/neard-tool-console/releases/download/r4/neard-console-2.00.148.3-r4.7z \ No newline at end of file