#!/usr/bin/env sh


readonly 'VERSION=w3mplus 2.0.3'

: ${W3MPLUS_W3M_HOME:="${HOME}/.w3m"}
: ${W3MPLUS_W3M_BOOKMARK:="${W3MPLUS_W3M_HOME}/bookmark.html"}
: ${W3MPLUS_W3M_CONFIG:="${W3MPLUS_W3M_HOME}/config"}
: ${W3MPLUS_W3M_HISTORY:="${W3MPLUS_W3M_HOME}/history"}
: ${W3MPLUS_W3M_SITECONF:="${W3MPLUS_W3M_HOME}/siteconf"}

: ${W3MPLUS_HOME:="${HOME}/.w3mplus"}
: ${W3MPLUS_CACHE:="${W3MPLUS_HOME}/cache"}
: ${W3MPLUS_PATH:="${W3MPLUS_HOME}/bin"}
: ${W3MPLUS_LIB:="${W3MPLUS_HOME}/lib"}
: ${W3MPLUS_PASS_FILE:="${W3MPLUS_HOME}/pass"}

: ${W3MPLUS_YANK:='v=$(cat; printf "_"); v="${v%_}"; "${HOME}/.w3mplus/bin/setreg" "+" "${v}"; exec 3>&1 >>"${HOME}/w3mplusyank"; date -- "+# %Y-%m-%d %H:%M:%S %Z"; echo "${v}"; exec 1>&3 3>&-'}
: ${W3MPLUS_UNDO_TIMEOUT:='+86400'}
: ${W3MPLUS_UNDO_HISTSIZE:='2000'}
: ${W3MPLUS_UNDO_FILE:="${W3MPLUS_HOME}/tabrestore"}
: ${W3MPLUS_VISUAL_TIMEOUT:='+600'}
: ${W3MPLUS_SEARCH_CONFIGFILE:="${W3MPLUS_HOME}/search-config"}
: ${W3MPLUS_SEARCH_ENGINE:='google'}
: ${W3MPLUS_SEARCH_HISTSIZE:='2000'}
: ${W3MPLUS_SEARCH_HISTFILE:="${W3MPLUS_HOME}/search-history"}
: ${W3MPLUS_REGISTER_FILE:="${W3MPLUS_HOME}/register"}
: ${W3MPLUS_OPERATORFUNC:='cat'}
: ${W3MPLUS_FORMATPRG:='cat'}
: ${W3MPLUS_KEYWORDPRG:='man "$(cat)"'}
: ${W3MPLUS_EQUALPRG:='cat'}
: ${W3MPLUS_ZOOM_MAX:='300'}
: ${W3MPLUS_ZOOM_MIN:='30'}
: ${W3MPLUS_QUICKMARK_FILE:="${W3MPLUS_HOME}/quickmark"}
: ${W3MPLUS_LOCALMARK_FILE:="${W3MPLUS_HOME}/localmark"}
: ${W3MPLUS_URLMARK_FILE:="${W3MPLUS_HOME}/urlmark"}
: ${W3MPLUS_USERCOMMAND_FILE:="${W3MPLUS_HOME}/usercommand"}
: ${W3MPLUS_SIDEBAR_SIZE:='200'}
: ${W3MPLUS_SIDEBAR_POSITION:='left'}
: ${W3MPLUS_UNDOREDO:='UNDO'}

: ${W3MPLUS_HTTP_PROGRAM:=}
: ${W3MPLUS_HTML_PROGRAM:=}
: ${W3MPLUS_FRAMESET_PROGRAM:=}

: ${SCRIPT_NAME:="cgi-bin/${0##*/}"}
: ${QUERY_STRING:=''}
: ${REQUEST_URI:="${SCRIPT_NAME}${QUERY_STRING:+?}${QUERY_STRING-}"}

: ${W3MPLUS_DEBUGMODE:='1'}

export PATH="${W3MPLUS_PATH}:${W3MPLUS_LIB}${PATH:+:}${PATH-}"
export AWKPATH="${W3MPLUS_LIB}${AWKPATH:+:}${AWKPATH-}"



set -efu
umask '0022'
readonly "LC_ALL_ORG=${LC_ALL-}"
LC_ALL='C'
IFS=$(printf ' \t\n_')
IFS="${IFS%_}"
PATH="${PATH-}${PATH:+:}$(command -p getconf 'PATH')"
UNIX_STD='2003'         # HP-UX POSIX mode
XPG_SUS_ENV='ON'        # AIX POSIX mode
XPG_UNIX98='OFF'        # AIX UNIX 03 mode
POSIXLY_CORRECT='1'     # GNU Coreutils POSIX mode
COMMAND_MODE='unix2003' # macOS UNIX 03 mode
export 'LC_ALL' 'IFS' 'PATH' 'UNIX_STD' 'XPG_SUS_ENV' 'XPG_UNIX98' 'POSIXLY_CORRECT' 'COMMAND_MODE'




readonly 'EX_OK=0' # successful termination

readonly 'EX__BASE=64' # base value for error messages

readonly 'EX_USAGE=64'       # command line usage error
readonly 'EX_DATAERR=65'     # data format error
readonly 'EX_NOINPUT=66'     # cannot open input
readonly 'EX_NOUSER=67'      # addressee unknown
readonly 'EX_NOHOST=68'      # host name unknown
readonly 'EX_UNAVAILABLE=69' # service unavailable
readonly 'EX_SOFTWARE=70'    # internal software error
readonly 'EX_OSERR=71'       # system error (e.g., can't fork)
readonly 'EX_OSFILE=72'      # critical OS file missing
readonly 'EX_CANTCREAT=73'   # can't create (user) output file
readonly 'EX_IOERR=74'       # input/output error
readonly 'EX_TEMPFAIL=75'    # temp failure; user is invited to retry
readonly 'EX_PROTOCOL=76'    # remote error in protocol
readonly 'EX_NOPERM=77'      # permission denied
readonly 'EX_CONFIG=78'      # configuration error

readonly 'EX__MAX=78' # maximum listed value

trap 'case "${?}" in 0) end_call;; *) end_call "${EX_SOFTWARE}";; esac' 0 # EXIT
trap 'end_call 129' 1                                                     # SIGHUP
trap 'end_call 130' 2                                                     # SIGINT
trap 'end_call 131' 3                                                     # SIGQUIT
trap 'end_call 143' 15                                                    # SIGTERM

alias org_lc='LC_ALL="${LC_ALL_ORG}"'


end_call() {
	trap '' 0 # EXIT
	rm -fr -- ${tmpDir:+"${tmpDir}"}
	exit "${1:-0}"
}



datauri() {
	printf 'data:%s;base64,' "${1}"
	shift
	base64 -- ${@+"${@}"} | tr -d '\n'
}



shell_argument() {
	set "${1}" "${2-}" ''

	until [ "${2#*\'}" '=' "${2}" ]; do
		set -- "${1}" "${2#*\'}" "${3}${2%%\'*}'\"'\"'"
	done

	eval "${1}=\"'\${3}\${2}'\""
}





abspath() {
	case "${2}" in
	'/'*) set -- "${1}" "${2}/" '' ;;
	*) set -- "${1}" "${3:-$PWD}/$2/" '' ;;
	esac

	while [ -n "${2}" ]; do
		case "${2%%/*}" in
		'' | '.') set -- "${1}" "${2#*/}" "${3}" ;;
		'..') set -- "${1}" "${2#*/}" "${3%/*}" ;;
		*) set -- "${1}" "${2#*/}" "${3}/${2%%/*}" ;;
		esac
	done

	eval "${1}=\"/\${3#/}\""
}


path_to_fileurl() {
	abspath "${1}" "${2}"

	eval "${1}=\"file://\$(printf '%s' \"\${${1}}\" | urlencode | sed -e 's/%2F/\//g')\""
}

parser_definition() {
	setup REST plus:true abbr:true error:option_error no:0 help:usage \
		-- 'Usage:' "  QUERY_STRING='action={action}' ${2##*/}" \
		'' 'Options:'

	disp :usage -h --help -- 'このヘルプを表示して終了する'
	disp VERSION -v --version -- 'バージョン情報を表示して終了する'

	msg -- '' 'Exit Status:' \
		'    0 - successful termination' \
		'   64 - command line usage error' \
		'   65 - data format error' \
		'   66 - cannot open input' \
		'   67 - addressee unknown' \
		'   68 - host name unknown' \
		'   69 - service unavailable' \
		'   70 - internal software error' \
		"   71 - system error (e.g., can't fork)" \
		'   72 - critical OS file missing' \
		"   73 - can't create (user) output file" \
		'   74 - input/output error' \
		'   75 - temp failure; user is invited to retry' \
		'   76 - remote error in protocol' \
		'   77 - permission denied' \
		'   78 - configuration error' \
		'  129 - received SIGHUP' \
		'  130 - received SIGINT' \
		'  131 - received SIGQUIT' \
		'  143 - received SIGTERM'

	msg -- '' 'Environment Variables:' \
		'  W3MPLUS_W3M_HOME          - w3m の設定ファイルのディレクトリ' \
		'  W3MPLUS_W3M_BOOKMARK      - w3m のブックマークファイル' \
		'  W3MPLUS_W3M_CONFIG        - w3m の設定ファイル' \
		'  W3MPLUS_W3M_HISTORY       - w3m の閲覧履歴ファイル' \
		'  W3MPLUS_W3M_SITECONF      - w3m の Web サイト毎の設定ファイル' \
		'  W3MPLUS_HOME              - w3mplus の設定ファイルのディレクトリ' \
		'  W3MPLUS_CACHE             - w3mplus のキャッシュを保存するディレクトリ' \
		'  W3MPLUS_PATH              - w3mplus の実行ファイルのディレクトリ' \
		'  W3MPLUS_LIB               - w3mplus のライブラリファイルのディレクトリ' \
		'  W3MPLUS_PASS_FILE         - w3mplus のパスファイル' \
		'  W3MPLUS_YANK              - コピーする際に起動するプログラム' \
		'  W3MPLUS_UNDO_TIMEOUT      - 復元するタブのタイムアウト秒数' \
		'  W3MPLUS_UNDO_HISTSIZE     - 復元するタブの最大保存数' \
		'  W3MPLUS_UNDO_FILE         - 復元するタブを記録するファイル' \
		'  W3MPLUS_VISUAL_TIMEOUT    - ビジュアルモードでタイムアウトする秒数' \
		'  W3MPLUS_SEARCH_CONFIGFILE - 検索エンジンの設定ファイル' \
		'  W3MPLUS_SEARCH_ENGINE     - 使用する検索エンジン名' \
		'  W3MPLUS_SEARCH_HISTSIZE   - 検索履歴の最大保存数' \
		'  W3MPLUS_SEARCH_HISTFILE   - 検索履歴を記録するファイル' \
		'  W3MPLUS_REGISTER_FILE     - レジスタを記録するファイル' \
		'  W3MPLUS_OPERATORFUNC      - operatorfunc 用プログラム' \
		'  W3MPLUS_FORMATPRG         - formatprg 用プログラム' \
		'  W3MPLUS_KEYWORDPRG        - keywordprg 用プログラム' \
		'  W3MPLUS_EQUALPRG          - equalprg 用プログラム' \
		'  W3MPLUS_ZOOM_MAX          - 画像表示の最大倍率' \
		'  W3MPLUS_ZOOM_MIN          - 画像表示の最小倍率' \
		'  W3MPLUS_QUICKMARK_FILE    - クイックマークを記録するファイル' \
		'  W3MPLUS_LOCALMARK_FILE    - ローカルマークを記録するファイル' \
		'  W3MPLUS_URLMARK_FILE      - URL マークを記録するファイル' \
		'  W3MPLUS_USERCOMMAND_FILE  - ユーザーコマンドを記録するファイル' \
		'  W3MPLUS_SIDEBAR_SIZE      - サイドバーのサイズ' \
		'  W3MPLUS_SIDEBAR_POSITION  - サイドバーの位置'
}

REST=''
parse() {
	OPTIND=$(($# + 1))
	while OPTARG= && [ $# -gt 0 ]; do
		set -- "${1%%\=*}" "${1#*\=}" "$@"
		while [ ${#1} -gt 2 ]; do
			case $1 in *[!a-zA-Z0-9_-]*) break ;; esac
			case '--help' in
			"$1")
				OPTARG=
				break
				;;
			$1*) OPTARG="$OPTARG --help" ;;
			esac
			case '--version' in
			"$1")
				OPTARG=
				break
				;;
			$1*) OPTARG="$OPTARG --version" ;;
			esac
			break
		done
		case ${OPTARG# } in
		*\ *)
			eval "set -- $OPTARG $1 $OPTARG"
			OPTIND=$((($# + 1) / 2)) OPTARG=$1
			shift
			while [ $# -gt "$OPTIND" ]; do
				OPTARG="$OPTARG, $1"
				shift
			done
			set "Ambiguous option: $1 (could be $OPTARG)" ambiguous "$@"
			option_error "$@" >&2 || exit $?
			echo "$1" >&2
			exit 1
			;;
		?*)
			[ "$2" = "$3" ] || OPTARG="$OPTARG=$2"
			shift 3
			eval 'set -- "${OPTARG# }"' ${1+'"$@"'}
			OPTARG=
			;;
		*) shift 2 ;;
		esac
		case $1 in
		--?*=*)
			OPTARG=$1
			shift
			eval 'set -- "${OPTARG%%\=*}" "${OPTARG#*\=}"' ${1+'"$@"'}
			;;
		--no-* | --without-*) unset OPTARG ;;
		-[hv]?*)
			OPTARG=$1
			shift
			eval 'set -- "${OPTARG%"${OPTARG#??}"}" -"${OPTARG#??}"' ${1+'"$@"'}
			OPTARG=
			;;
		+*) unset OPTARG ;;
		esac
		case $1 in
		'-h' | '--help')
			usage
			exit 0
			;;
		'-v' | '--version')
			echo "${VERSION}"
			exit 0
			;;
		--)
			shift
			while [ $# -gt 0 ]; do
				REST="${REST} \"\${$((OPTIND - $#))}\""
				shift
			done
			break
			;;
		[-+]?*)
			set "unknown" "$1"
			break
			;;
		*)
			REST="${REST} \"\${$((OPTIND - $#))}\""
			;;
		esac
		shift
	done
	[ $# -eq 0 ] && {
		OPTIND=1
		unset OPTARG
		return 0
	}
	case $1 in
	unknown) set "Unrecognized option: $2" "$@" ;;
	noarg) set "Does not allow an argument: $2" "$@" ;;
	required) set "Requires an argument: $2" "$@" ;;
	pattern:*) set "Does not match the pattern (${1#*:}): $2" "$@" ;;
	notcmd) set "Not a command: $2" "$@" ;;
	*) set "Validation error ($1): $2" "$@" ;;
	esac
	option_error "$@" >&2 || exit $?
	echo "$1" >&2
	exit 1
}
usage() {
	cat <<'GETOPTIONSHERE'
Usage:
  QUERY_STRING='action={action}' w3mplus

Options:
  -h,     --help              このヘルプを表示して終了する
  -v,     --version           バージョン情報を表示して終了する

Exit Status:
    0 - successful termination
   64 - command line usage error
   65 - data format error
   66 - cannot open input
   67 - addressee unknown
   68 - host name unknown
   69 - service unavailable
   70 - internal software error
   71 - system error (e.g., can't fork)
   72 - critical OS file missing
   73 - can't create (user) output file
   74 - input/output error
   75 - temp failure; user is invited to retry
   76 - remote error in protocol
   77 - permission denied
   78 - configuration error
  129 - received SIGHUP
  130 - received SIGINT
  131 - received SIGQUIT
  143 - received SIGTERM

Environment Variables:
  W3MPLUS_W3M_HOME          - w3m の設定ファイルのディレクトリ
  W3MPLUS_W3M_BOOKMARK      - w3m のブックマークファイル
  W3MPLUS_W3M_CONFIG        - w3m の設定ファイル
  W3MPLUS_W3M_HISTORY       - w3m の閲覧履歴ファイル
  W3MPLUS_W3M_SITECONF      - w3m の Web サイト毎の設定ファイル
  W3MPLUS_HOME              - w3mplus の設定ファイルのディレクトリ
  W3MPLUS_CACHE             - w3mplus のキャッシュを保存するディレクトリ
  W3MPLUS_PATH              - w3mplus の実行ファイルのディレクトリ
  W3MPLUS_LIB               - w3mplus のライブラリファイルのディレクトリ
  W3MPLUS_PASS_FILE         - w3mplus のパスファイル
  W3MPLUS_YANK              - コピーする際に起動するプログラム
  W3MPLUS_UNDO_TIMEOUT      - 復元するタブのタイムアウト秒数
  W3MPLUS_UNDO_HISTSIZE     - 復元するタブの最大保存数
  W3MPLUS_UNDO_FILE         - 復元するタブを記録するファイル
  W3MPLUS_VISUAL_TIMEOUT    - ビジュアルモードでタイムアウトする秒数
  W3MPLUS_SEARCH_CONFIGFILE - 検索エンジンの設定ファイル
  W3MPLUS_SEARCH_ENGINE     - 使用する検索エンジン名
  W3MPLUS_SEARCH_HISTSIZE   - 検索履歴の最大保存数
  W3MPLUS_SEARCH_HISTFILE   - 検索履歴を記録するファイル
  W3MPLUS_REGISTER_FILE     - レジスタを記録するファイル
  W3MPLUS_OPERATORFUNC      - operatorfunc 用プログラム
  W3MPLUS_FORMATPRG         - formatprg 用プログラム
  W3MPLUS_KEYWORDPRG        - keywordprg 用プログラム
  W3MPLUS_EQUALPRG          - equalprg 用プログラム
  W3MPLUS_ZOOM_MAX          - 画像表示の最大倍率
  W3MPLUS_ZOOM_MIN          - 画像表示の最小倍率
  W3MPLUS_QUICKMARK_FILE    - クイックマークを記録するファイル
  W3MPLUS_LOCALMARK_FILE    - ローカルマークを記録するファイル
  W3MPLUS_URLMARK_FILE      - URL マークを記録するファイル
  W3MPLUS_USERCOMMAND_FILE  - ユーザーコマンドを記録するファイル
  W3MPLUS_SIDEBAR_SIZE      - サイドバーのサイズ
  W3MPLUS_SIDEBAR_POSITION  - サイドバーの位置
GETOPTIONSHERE
}

parse ${@+"${@}"}
eval "set -- ${REST}"

add_printtmp() {
	if [ ! -f "${query_printtmp-}" ]; then
		printtmp=$(TMPDIR="${W3MPLUS_CACHE}" mktemp -u)
		path_to_fileurl 'filepath' "${SCRIPT_NAME}"

		org_lc httpresponse \
			-H 'W3m-control: BACK' \
			-H "W3m-control: PRINT ${printtmp}" \
			-H "W3m-control: GOTO ${filepath}?${QUERY_STRING}&printtmp=$(printf '%s' "${printtmp}" | urlencode)"

		exit
	fi
}

error_meesage() {
	org_lc httpresponse --status-line 'HTTP/1.1 500 Internal Server Error' -H 'Content-Type: text/plain; charset=UTF-8' -- - <<-__EOF__
		An unexpected error occurred during request processing.


		$(cat -- ${@+"${@}"})


		$(env)
	__EOF__
}

expand() {
	case "${2}" in
	'-'*) eval "${1}=\"\${2#*-}\"" ;;
	'' | *[!0-9A-Za-z_]*) eval "${1}=" ;;
	*) eval "${1}=\${${2}-}" ;;
	esac

	eval ": \${${1}:=\"\${3-}\"}"
}

tmpDir=$(mktemp -d)

case "${W3MPLUS_DEBUGMODE}" in
'1')
	: >>"${tmpDir}/stdout"
	: >>"${tmpDir}/stderr"

	exec 3>&1 4>&2 1>"${tmpDir}/stdout" 2>"${tmpDir}/stderr"

	trap '
			case "${?}" in
				0)
					exec 1>&3 2>&4 3>&- 4>&-
					cat -- "${tmpDir}/stdout"
					end_call 0
					;;
				*)
					exec 1>&3 2>&4 3>&- 4>&-
					error_meesage "${tmpDir}/stderr"
					end_call "${EX_SOFTWARE}"
					;;
			esac
		' 0 # EXIT
	;;
'2')
	exec 2>&1
	printf 'Content-Type: text/plain; charset=UTF-8\r\n\r\n'
	set -x
	;;
esac

eval "$(org_lc parsequery --prefix 'query_' "${QUERY_STRING-}")"

export "W3MPLUS_PASS_VALUE=${query_pass-}"

if [ -f "${W3MPLUS_PASS_FILE}" ] && [ "${W3MPLUS_PASS_VALUE}" '!=' "$(cat -- "${W3MPLUS_PASS_FILE}")" ]; then
	org_lc httpresponse \
		--status-line 'HTTP/1.1 400 Bad Request' \
		-H 'Content-Type: text/plain; charset=UTF-8' \
		-- - <<-'__EOF__'
			The value of 'pass' is invalid.
		__EOF__

	exit
fi

case "${query_action-}" in
'about-uri') org_lc w3mabouturi -- ${query_about+"${query_about}"} ||
	case "${?}" in [!1] | 1?*)
		exit "${?}"
		;;
	esac ;;
'close-tab')
	expand 'uri' "${query_uri-W3M_URL}"
	expand 'line' "${query_line-W3M_CURRENT_LINE}" '1'
	expand 'colmun' "${query_colmun-W3M_CURRENT_COLMUN}" '1'

	case "${uri}" in ?*)
		org_lc setregister --config "${W3MPLUS_REGISTER_FILE}" -- '-' "${uri}"

		org_lc pushuri --config "${W3MPLUS_UNDO_FILE}" --l1 "${line}" --c1 "${colmun}" -- "${uri}"
		;;
	esac

	org_lc httpresponse \
		-H 'W3m-control: BACK' \
		-H 'W3m-control: CLOSE_TAB'
	;;
'context-menu')
	org_lc httpresponse \
		-H 'W3m-control: BACK' \
		-H "W3m-control: MENU $(contextmenu)"
	;;
'cookie-config')
	expand 'uri' "${query_uri-W3M_URL}"
	host=$(org_lc uricheck --field 'host' -- "${uri}" || :)

	case "${host}" in
	?*)
		org_lc w3mcookieconfig \
			${query_accept+'--accept' "${query_accept}=${host}"} \
			${query_reject+'--reject' "${query_reject}=${host}"} \
			${query_subdomain+'--subdomain'} \
			--in-place -- "${W3MPLUS_W3M_CONFIG}"

		accept=$(grep -e '^cookie_accept_domains[[:blank:]]' -- "${W3MPLUS_W3M_CONFIG}" | cut -d ' ' -f 2)
		reject=$(grep -e '^cookie_reject_domains[[:blank:]]' -- "${W3MPLUS_W3M_CONFIG}" | cut -d ' ' -f 2)

		org_lc httpresponse \
			${query_accept+-H "W3m-control: SET_OPTION cookie_accept_domains=${accept}"} \
			${query_rejrct+-H "W3m-control: SET_OPTION cookie_reject_domains=${rejrct}"} \
			-H 'W3m-control: BACK' \
			-H "W3m-control: EXEC_SHELL grep -Ee '^cookie_(accept|reject)_domains[[:blank:]]' '${W3MPLUS_W3M_CONFIG}'"
		;;
	*) org_lc httpresponse -H 'W3m-control: BACK' ;;
	esac
	;;
'equalprg')
	expand 'uri' "${query_uri-W3M_URL}"

	case "${uri}" in
	'') org_lc httpresponse -H 'W3m-control: BACK' ;;
	*)
		equalprg=$(printf '%s' "${W3MPLUS_EQUALPRG}" | base64 | tr -d '\n')
		shell_argument 'argUri' "${uri}"

		org_lc httpresponse \
			-H 'W3m-control: BACK' \
			-H "W3m-control: EXEC_SHELL w3m -o 'auto_uncompress=1' -dump_source ${argUri} | sh -c 'eval \"\$(echo \"${equalprg}\" | base64 -d)\"'"
		;;
	esac
	;;
'execute-env-var')
	case "${query_subaction}" in
	'goto' | 'increment-uri' | 'parent-uripath' | 'redirect')
		commandArg='${query_tab+--tab "${query_tab}"} ${query_before+--b1 "${query_before}"} ${query_after+--a1 "${query_after}"}'
		;;
	'keywordprg')
		query_subaction='exec-shell'
		commandArg='"${W3MPLUS_KEYWORDPRG}"'
		;;
	'yank') commandArg='"${W3MPLUS_YANK}"' ;;
	esac

	case "${query_subaction}" in
	'increment-uri')
		case "${query_number:+1}" in '1')
			shell_argument 'query_number' "${query_number}"
			;;
		esac

		query_subaction='goto'
		commandArg="${commandArg}$(
			cat <<-'__EOF__'
				 -- incrementuri ${query_number+--number "${query_number}"}
			__EOF__
		)"
		;;
	'parent-uripath')
		case "${query_number:+1}" in '1')
			shell_argument 'query_number' "${query_number}"
			;;
		esac

		query_subaction='goto'
		commandArg="${commandArg}$(
			cat <<-'__EOF__'
				 -- parenturipath ${query_number+--number "${query_number}"}
			__EOF__
		)"
		;;
	'redirect')
		case "${query_redirect:+1}" in
		'1') shell_argument 'query_redirect' "${query_redirect}" ;;
		*)
			path_to_fileurl 'filepath' "${SCRIPT_NAME}"
			shell_argument 'query_redirect' "${filepath}?pass=$(printf '%s' "${W3MPLUS_PASS_VALUE}" | urlencode)&action=search&tab=del-prebuf&query="
			;;
		esac

		query_subaction='goto'
		commandArg="${commandArg}$(
			cat <<-'__EOF__'
				 -- printf "'%s%s'" "${query_redirect}" '"$(urlencode)"'
			__EOF__
		)"
		;;
	esac

	eval org_lc w3maction \
		'"${query_subaction}"' \
		'"${query_variable-W3M_URL}"' \
		"${commandArg-}"
	;;
'execute-user-command')
	expand 'input' "${query_string-W3M_URL}"

	org_lc executeusercommand --config "${W3MPLUS_USERCOMMAND_FILE}" -- "${query_key-manual}" "${input}" || case "${?}" in
	'1') org_lc httpresponse -H 'W3m-control: BACK' ;;
	*) exit "${?}" ;;
	esac
	;;
'find-string' | 'find-word')
	expand 'word' "${query_word-W3M_CURRENT_WORD}"

	case "${query_action}" in 'find-word')
		exact='--exact'
		;;
	esac

	case "${word}" in
	?*) org_lc w3mfindinpage \
		${exact-} \
		${query_number+--number "${query_number}"} \
		-- "${word}" ;;
	*) org_lc httpresponse -H 'W3m-control: BACK' ;;
	esac
	;;
'get-local-mark' | 'get-local-mark-line-begin')
	expand 'uri' "${query_uri-W3M_URL}"

	case "${query_action}" in 'get-local-mark-line-begin')
		export 'W3MPLUS_LOCALMARK_LINEBEGIN=1'
		;;
	esac

	org_lc executeusercommand \
		--config "${W3MPLUS_LOCALMARK_FILE}" \
		-- "${query_key}|${uri%%#*}" "${uri%%#*}" ||
		case "${?}" in
		'1') org_lc httpresponse -H 'W3m-control: BACK' ;;
		*) exit "${?}" ;;
		esac
	;;
'get-quick-mark')
	org_lc getquickmark \
		--config "${W3MPLUS_QUICKMARK_FILE}" \
		-- "${query_key}" |
		cut -f '2' |
		org_lc w3mredirect ${query_tab+--tab "${query_tab}"}
	;;
'get-register')
	register=$(getregister --config "${W3MPLUS_REGISTER_FILE}" -- "${query_key-0}" && printf '_') || case "${?}" in
	'1')
		org_lc httpresponse -H 'W3m-control: BACK'
		exit
		;;
	*) exit "${?}" ;;
	esac

	QUERY_STRING="${QUERY_STRING}&action=execute-env-var&variable=W3MPLUS_REGISTER_TMP" W3MPLUS_REGISTER_TMP="${register%_}" "${0}" ${@+"${@}"}
	;;
'get-url-mark' | 'get-url-mark-line-begin')
	awkScript=$(
		cat <<-'__EOF__'
			BEGIN {
				FS = "\t"
			}

			{
				uri = $2
				line = $3

				printf("%s\t%s\t\t\t%s\n", uri, line, (moveURL == "" ? "" : "GOTO " moveURL $3))
			}
		__EOF__
	)

	case "${query_action}" in
	'get-url-mark-line-begin')
		path_to_fileurl 'filepath' "${SCRIPT_NAME}"

		moveURL="${filepath}?action=line-begin-non-blake&line=-"
		;;
	*) moveURL='' ;;
	esac

	org_lc getquickmark \
		--config "${W3MPLUS_URLMARK_FILE}" \
		-- "${query_key}" |
		awk -v "moveURL=${moveURL}" -- "${awkScript}" |
		org_lc w3mredirect ${query_tab+--tab "${query_tab}"}
	;;
'goto-line')
	add_printtmp

	expand 'line' "${query_line-W3M_CURRENT_LINE}" '1'
	jump=$(
		org_lc gotoline \
			--line "${line}" \
			${query_number+--number "${query_number}"} \
			-- "${query_printtmp}"
	)

	rm -f -- "${query_printtmp}"

	org_lc httpresponse \
		-H 'W3m-control: BACK' \
		-H "W3m-control: GOTO_LINE ${jump}"
	;;
'goto-paragraph')
	add_printtmp

	expand 'line' "${query_line-W3M_CURRENT_LINE}" '1'
	jump=$(
		org_lc gotoparagraph \
			--line "${line}" \
			${query_number+--number "${query_number}"} \
			-- "${query_printtmp}"
	) || case "${?}" in [!1]* | 1?*)
		exit "${?}"
		;;
	esac

	rm -f -- "${query_printtmp}"

	org_lc httpresponse \
		-H 'W3m-control: BACK' \
		${jump:+-H "W3m-control: GOTO_LINE ${jump}"}
	;;
'homepage') org_lc w3mredirect ${query_tab+--tab "${query_tab}"} -- "${WWW_HOME-about:home}" ;;
'line-begin-non-blake' | 'line-end-non-blake')
	add_printtmp
	expand 'line' "${query_line-W3M_CURRENT_LINE}" '1'

	if [ '1' -le "${line}" ] && [ "${line}" -le "$(grep -c -e '^' -- "${query_printtmp}")" ]; then
		case "${query_action}" in
		'line-begin-non-blake')
			move1='LINE_BEGIN'
			move2="MOVE_RIGHT1 $(sed -n -e "${line}"'{s/^\([[:blank:]]*\).*$/\1/; p; q}' -- "${query_printtmp}" | tr -d '\n' | wc -m)"
			;;
		'line-end-non-blake')
			move1='LINE_END' \
				move2="MOVE_LEFT1 $(sed -n -e "${line}"'{s/.*[^[:blank:]]\{1,\}\([[:blank:]]*\)$/\1/; p; q}' -- "${query_printtmp}" | tr -d '\n' | wc -m)"
			;;
		esac

		rm -f -- "${query_printtmp}"

		org_lc httpresponse \
			-H 'W3m-control: BACK' \
			-H "W3m-control: GOTO_LINE ${line}" \
			-H "W3m-control: ${move1}" \
			-H "W3m-control: ${move2}"
	else
		org_lc httpresponse -H 'W3m-control: BACK'
	fi
	;;
'line-incriment')
	expand 'line' "${query_line-W3M_CURRENT_LINE}" '1'
	expand 'colmun' "${query_colmun-W3M_CURRENT_COLMUN}" '1'

	case "${query_lineincriment-}" in ?*)
		line=$((line + query_lineincriment))
		;;
	esac

	case "${query_colmunincriment-}" in ?*)
		colmun=$((colmun + query_colmunincriment))
		;;
	esac

	QUERY_STRING="${QUERY_STRING}&action=${query__action}&line=-${line}&colmun=-${colmun}" "${0}"
	;;
'link-goto' | 'link-tabgoto')
	case "${query_action}" in
	'link-goto') command='GOTO' ;;
	'link-tabgoto') command='TAB_GOTO' ;;
	esac

	org_lc httpresponse \
		-H 'W3m-control: BACK' \
		${W3M_CURRENT_LINK:+-H 'W3m-control: SET_OPTION default_url=2' -H "W3m-control: ${command}"}
	;;
'scroll-zt' | 'scroll-zb')
	expand 'line' "${query_line-W3M_CURRENT_LINE}" '1'

	case "${query_action}" in
	'scroll-zt') move='NEXT_HALF_PAGE' ;;
	'scroll-zb') move='PREV_HALF_PAGE' ;;
	esac

	org_lc httpresponse \
		-H 'W3m-control: BACK' \
		-H 'W3m-control: CENTER_V' \
		-H "W3m-control: ${move}" \
		-H "W3m-control: GOTO_LINE ${line}"
	;;
'search' | 'dict-word')
	case "${query_action}${query_query:+_}" in 'dict-word_')
		query_query="${query_query#?}"
		;;
	esac

	if [ -n "${query_designator-}" ] && [ "${query_query}" '=' '!' ]; then
		pass=$(printf '%s' "${W3MPLUS_PASS_VALUE}" | urlencode)
		path_to_fileurl 'filepath' "${SCRIPT_NAME}"

		org_lc w3mredirect -- "${filepath}?pass=${pass}&action=show-search-history"
	else
		url=$(
			org_lc searchuri \
				${query_designator+--designator "${query_designator}"} \
				--engine "${query_engine-${W3MPLUS_SEARCH_ENGINE}}" \
				--config "${W3MPLUS_SEARCH_CONFIGFILE}" \
				--history "${W3MPLUS_SEARCH_HISTFILE}" \
				-- ${query_query-}
		)

		org_lc setregister \
			--config "${W3MPLUS_REGISTER_FILE}" \
			-- '/' "${query_query-}"

		org_lc w3mredirect \
			${query_tab+--tab "${query_tab}"} \
			${query_before+--b1 "${query_before}"} \
			${query_after+--a1 "${query_after}"} \
			-- "${url}"
	fi
	;;
'select-line')
	expand 'line' "${query_line-W3M_CURRENT_LINE}" '1'

	case "${query_subaction}" in
	'formatprg') commandArg="${W3MPLUS_FORMATPRG}" ;;
	'operatorfunc') commandArg="${W3MPLUS_OPERATORFUNC}" ;;
	'yank') commandArg="${W3MPLUS_YANK}" ;;
	esac

	org_lc w3mselectline \
		--line "${line}" \
		${query_number+'--number' "${query_number}"} \
		"${query_subaction}" \
		${commandArg+"${commandArg}"}
	;;
'set-local-mark')
	expand 'uri' "${query_uri-W3M_URL}"
	expand 'line' "${query_line-W3M_CURRENT_LINE}" '1'

	case "${uri}" in
	?*)
		shell_argument 'argURI' "${uri%%#*}"
		path_to_fileurl 'filepath' "${SCRIPT_NAME}"

		org_lc setusercommand \
			--config "${W3MPLUS_LOCALMARK_FILE}" \
			-- "${query_key}|${uri%%#*}" |
			awk -- '{ lf = 1; print($0); } END { if(lf) { print(""); } }'

		org_lc setusercommand \
			--config "${W3MPLUS_LOCALMARK_FILE}" \
			-- "${query_key}|${uri%%#*}" \
			"[ \"\${W3M_URL%%#*}\" '=' ${argURI} ] && httpresponse -H 'W3m-control: BACK' -H 'W3m-control: GOTO_LINE ${line}' \${W3MPLUS_LOCALMARK_LINEBEGIN:+-H 'W3m-control: GOTO ${filepath}?action=line-begin-non-blake&line=-${line}'}"
		;;
	*) printf 'This page cannot be registered.\n' ;;
	esac 2>&1 | datauri 'text/plain;charset=UTF-8' | org_lc w3mredirect
	;;
'set-quick-mark')
	expand 'uri' "${query_uri-W3M_URL}"
	expand 'line' "${query_line-W3M_CURRENT_LINE}" '1'
	expand 'colmun' "${query_colmun-W3M_CURRENT_COLMUN}" '1'

	case "${uri}" in
	?*)
		org_lc setquickmark \
			--config "${W3MPLUS_QUICKMARK_FILE}" \
			-- "${query_key}" |
			awk -- '{ lf = 1; print($0); } END { if(lf) { print(""); } }'

		org_lc setquickmark \
			--config "${W3MPLUS_QUICKMARK_FILE}" \
			--l1 "${line}" --c1 "${colmun}" \
			-- "${query_key}" "${uri}"
		;;
	*) printf 'This page cannot be registered.\n' ;;
	esac 2>&1 | datauri 'text/plain;charset=UTF-8' | org_lc w3mredirect
	;;
'set-register')
	expand 'value' "${query_value-W3M_URL}"

	case "${value}" in ?*)
		org_lc setregister --config "${W3MPLUS_REGISTER_FILE}" -- "${query_key-+}" "${value}"
		;;
	esac

	org_lc httpresponse -H 'W3m-control: BACK'
	;;
'set-url-mark')
	expand 'uri' "${query_uri-W3M_URL}"
	expand 'line' "${query_line-W3M_CURRENT_LINE}" '1'
	expand 'colmun' "${query_colmun-W3M_CURRENT_COLMUN}" '1'

	case "${uri}" in
	?*)
		org_lc setquickmark \
			--config "${W3MPLUS_URLMARK_FILE}" \
			-- "${query_key}" |
			awk -- '{ lf = 1; print($0); } END { if(lf) { print(""); } }'

		org_lc setquickmark \
			--config "${W3MPLUS_URLMARK_FILE}" \
			--l1 "${line}" --c1 "${colmun}" \
			-- "${query_key}" "${uri}"
		;;
	*) printf 'This page cannot be registered.\n' ;;
	esac 2>&1 | datauri 'text/plain;charset=UTF-8' | org_lc w3mredirect
	;;
'show-local-mark')
	: >>"${W3MPLUS_LOCALMARK_FILE}"

	path_to_fileurl 'mark' "${W3MPLUS_LOCALMARK_FILE}"

	org_lc w3mredirect -- "${mark}"
	;;
'show-quick-mark')
	: >>"${W3MPLUS_QUICKMARK_FILE}"
	path_to_fileurl 'uri' "${W3MPLUS_QUICKMARK_FILE}"

	org_lc w3mredirect -- "${uri}"
	;;
'show-register')
	: >>"${W3MPLUS_REGISTER_FILE}"
	path_to_fileurl 'uri' "${W3MPLUS_REGISTER_FILE}"

	org_lc w3mredirect -- "${uri}"
	;;
'show-search-history')
	awkScript=$(
		cat <<-'__EOF__'



			function html_escape(string) {
				gsub(/&/, "\\&amp;", string)
				gsub(/</, "\\&lt;", string)
				gsub(/</, "\\&gt;", string)
				gsub(/'/, "\\&#39;", string)
				gsub(/"/, "\\&quot;", string)

				return string
			}





			function remove_control_character(string, except,  cc,char) {
				cc = "\000\001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037\177\200\201\202\203\204\205\206\207\210\211\212\213\214"

				gsub(except, "", cc)

				for(char = ""; cc != ""; cc = substr(cc, 2)) {
					gsub(substr(cc, 1, 1), "", string)
				}

				return string
			}


			function safe_string(string) {
				return remove_control_character(string, "\011\012\015")
			}



			function url_decode(string, httpDecode,  p2c,result) {
				split("", p2c)

				p2c["00"] = "\000"; p2c["01"] = "\001";
				p2c["02"] = "\002"; p2c["03"] = "\003";
				p2c["04"] = "\004"; p2c["05"] = "\005";
				p2c["06"] = "\006"; p2c["07"] = "\007";
				p2c["08"] = "\010"; p2c["09"] = "\011";
				p2c["0A"] = p2c["0a"] = "\012"; p2c["0B"] = p2c["0b"] = "\013";
				p2c["0C"] = p2c["0c"] = "\014"; p2c["0D"] = p2c["0d"] = "\015";
				p2c["0E"] = p2c["0e"] = "\016"; p2c["0F"] = p2c["0f"] = "\017";
				p2c["10"] = "\020"; p2c["11"] = "\021";
				p2c["12"] = "\022"; p2c["13"] = "\023";
				p2c["14"] = "\024"; p2c["15"] = "\025";
				p2c["16"] = "\026"; p2c["17"] = "\027";
				p2c["18"] = "\030"; p2c["19"] = "\031";
				p2c["1A"] = p2c["1a"] = "\032"; p2c["1B"] = p2c["1b"] = "\033";
				p2c["1C"] = p2c["1c"] = "\034"; p2c["1D"] = p2c["1d"] = "\035";
				p2c["1E"] = p2c["1e"] = "\036"; p2c["1F"] = p2c["1f"] = "\037";
				p2c["20"] = "\040"; p2c["21"] = "\041";
				p2c["22"] = "\042"; p2c["23"] = "\043";
				p2c["24"] = "\044"; p2c["25"] = "\045";
				p2c["26"] = "\046"; p2c["27"] = "\047";
				p2c["28"] = "\050"; p2c["29"] = "\051";
				p2c["2A"] = p2c["2a"] = "\052"; p2c["2B"] = p2c["2b"] = "\053";
				p2c["2C"] = p2c["2c"] = "\054"; p2c["2D"] = p2c["2d"] = "\055";
				p2c["2E"] = p2c["2e"] = "\056"; p2c["2F"] = p2c["2f"] = "\057";
				p2c["30"] = "\060"; p2c["31"] = "\061";
				p2c["32"] = "\062"; p2c["33"] = "\063";
				p2c["34"] = "\064"; p2c["35"] = "\065";
				p2c["36"] = "\066"; p2c["37"] = "\067";
				p2c["38"] = "\070"; p2c["39"] = "\071";
				p2c["3A"] = p2c["3a"] = "\072"; p2c["3B"] = p2c["3b"] = "\073";
				p2c["3C"] = p2c["3c"] = "\074"; p2c["3D"] = p2c["3d"] = "\075";
				p2c["3E"] = p2c["3e"] = "\076"; p2c["3F"] = p2c["3f"] = "\077";
				p2c["40"] = "\100"; p2c["41"] = "\101";
				p2c["42"] = "\102"; p2c["43"] = "\103";
				p2c["44"] = "\104"; p2c["45"] = "\105";
				p2c["46"] = "\106"; p2c["47"] = "\107";
				p2c["48"] = "\110"; p2c["49"] = "\111";
				p2c["4A"] = p2c["4a"] = "\112"; p2c["4B"] = p2c["4b"] = "\113";
				p2c["4C"] = p2c["4c"] = "\114"; p2c["4D"] = p2c["4d"] = "\115";
				p2c["4E"] = p2c["4e"] = "\116"; p2c["4F"] = p2c["4f"] = "\117";
				p2c["50"] = "\120"; p2c["51"] = "\121";
				p2c["52"] = "\122"; p2c["53"] = "\123";
				p2c["54"] = "\124"; p2c["55"] = "\125";
				p2c["56"] = "\126"; p2c["57"] = "\127";
				p2c["58"] = "\130"; p2c["59"] = "\131";
				p2c["5A"] = p2c["5a"] = "\132"; p2c["5B"] = p2c["5b"] = "\133";
				p2c["5C"] = p2c["5c"] = "\134"; p2c["5D"] = p2c["5d"] = "\135";
				p2c["5E"] = p2c["5e"] = "\136"; p2c["5F"] = p2c["5f"] = "\137";
				p2c["60"] = "\140"; p2c["61"] = "\141";
				p2c["62"] = "\142"; p2c["63"] = "\143";
				p2c["64"] = "\144"; p2c["65"] = "\145";
				p2c["66"] = "\146"; p2c["67"] = "\147";
				p2c["68"] = "\150"; p2c["69"] = "\151";
				p2c["6A"] = p2c["6a"] = "\152"; p2c["6B"] = p2c["6b"] = "\153";
				p2c["6C"] = p2c["6c"] = "\154"; p2c["6D"] = p2c["6d"] = "\155";
				p2c["6E"] = p2c["6e"] = "\156"; p2c["6F"] = p2c["6f"] = "\157";
				p2c["70"] = "\160"; p2c["71"] = "\161";
				p2c["72"] = "\162"; p2c["73"] = "\163";
				p2c["74"] = "\164"; p2c["75"] = "\165";
				p2c["76"] = "\166"; p2c["77"] = "\167";
				p2c["78"] = "\170"; p2c["79"] = "\171";
				p2c["7A"] = p2c["7a"] = "\172"; p2c["7B"] = p2c["7b"] = "\173";
				p2c["7C"] = p2c["7c"] = "\174"; p2c["7D"] = p2c["7d"] = "\175";
				p2c["7E"] = p2c["7e"] = "\176"; p2c["7F"] = p2c["7f"] = "\177";
				p2c["80"] = "\200"; p2c["81"] = "\201";
				p2c["82"] = "\202"; p2c["83"] = "\203";
				p2c["84"] = "\204"; p2c["85"] = "\205";
				p2c["86"] = "\206"; p2c["87"] = "\207";
				p2c["88"] = "\210"; p2c["89"] = "\211";
				p2c["8A"] = p2c["8a"] = "\212"; p2c["8B"] = p2c["8b"] = "\213";
				p2c["8C"] = p2c["8c"] = "\214"; p2c["8D"] = p2c["8d"] = "\215";
				p2c["8E"] = p2c["8e"] = "\216"; p2c["8F"] = p2c["8f"] = "\217";
				p2c["90"] = "\220"; p2c["91"] = "\221";
				p2c["92"] = "\222"; p2c["93"] = "\223";
				p2c["94"] = "\224"; p2c["95"] = "\225";
				p2c["96"] = "\226"; p2c["97"] = "\227";
				p2c["98"] = "\230"; p2c["99"] = "\231";
				p2c["9A"] = p2c["9a"] = "\232"; p2c["9B"] = p2c["9b"] = "\233";
				p2c["9C"] = p2c["9c"] = "\234"; p2c["9D"] = p2c["9d"] = "\235";
				p2c["9E"] = p2c["9e"] = "\236"; p2c["9F"] = p2c["9f"] = "\237";
				p2c["A0"] = p2c["a0"] = "\240"; p2c["A1"] = p2c["a1"] = "\241";
				p2c["A2"] = p2c["a2"] = "\242"; p2c["A3"] = p2c["a3"] = "\243";
				p2c["A4"] = p2c["a4"] = "\244"; p2c["A5"] = p2c["a5"] = "\245";
				p2c["A6"] = p2c["a6"] = "\246"; p2c["A7"] = p2c["a7"] = "\247";
				p2c["A8"] = p2c["a8"] = "\250"; p2c["A9"] = p2c["a9"] = "\251";
				p2c["AA"] = p2c["aA"] = p2c["Aa"] = p2c["aa"] = "\252";
				p2c["AB"] = p2c["aB"] = p2c["Ab"] = p2c["ab"] = "\253";
				p2c["AC"] = p2c["aC"] = p2c["Ac"] = p2c["ac"] = "\254";
				p2c["AD"] = p2c["aD"] = p2c["Ad"] = p2c["ad"] = "\255";
				p2c["AE"] = p2c["aE"] = p2c["Ae"] = p2c["ae"] = "\256";
				p2c["AF"] = p2c["aF"] = p2c["Af"] = p2c["af"] = "\257";
				p2c["B0"] = p2c["b0"] = "\260"; p2c["B1"] = p2c["b1"] = "\261";
				p2c["B2"] = p2c["b2"] = "\262"; p2c["B3"] = p2c["b3"] = "\263";
				p2c["B4"] = p2c["b4"] = "\264"; p2c["B5"] = p2c["b5"] = "\265";
				p2c["B6"] = p2c["b6"] = "\266"; p2c["B7"] = p2c["b7"] = "\267";
				p2c["B8"] = p2c["b8"] = "\270"; p2c["B9"] = p2c["b9"] = "\271";
				p2c["BA"] = p2c["bA"] = p2c["Ba"] = p2c["ba"] = "\272";
				p2c["BB"] = p2c["bB"] = p2c["Bb"] = p2c["bb"] = "\273";
				p2c["BC"] = p2c["bC"] = p2c["Bc"] = p2c["bc"] = "\274";
				p2c["BD"] = p2c["bD"] = p2c["Bd"] = p2c["bd"] = "\275";
				p2c["BE"] = p2c["bE"] = p2c["Be"] = p2c["be"] = "\276";
				p2c["BF"] = p2c["bF"] = p2c["Bf"] = p2c["bf"] = "\277";
				p2c["C0"] = p2c["c0"] = "\300"; p2c["C1"] = p2c["c1"] = "\301";
				p2c["C2"] = p2c["c2"] = "\302"; p2c["C3"] = p2c["c3"] = "\303";
				p2c["C4"] = p2c["c4"] = "\304"; p2c["C5"] = p2c["c5"] = "\305";
				p2c["C6"] = p2c["c6"] = "\306"; p2c["C7"] = p2c["c7"] = "\307";
				p2c["C8"] = p2c["c8"] = "\310"; p2c["C9"] = p2c["c9"] = "\311";
				p2c["CA"] = p2c["cA"] = p2c["Ca"] = p2c["ca"] = "\312";
				p2c["CB"] = p2c["cB"] = p2c["Cb"] = p2c["cb"] = "\313";
				p2c["CC"] = p2c["cC"] = p2c["Cc"] = p2c["cc"] = "\314";
				p2c["CD"] = p2c["cD"] = p2c["Cd"] = p2c["cd"] = "\315";
				p2c["CE"] = p2c["cE"] = p2c["Ce"] = p2c["ce"] = "\316";
				p2c["CF"] = p2c["cF"] = p2c["Cf"] = p2c["cf"] = "\317";
				p2c["D0"] = p2c["d0"] = "\320"; p2c["D1"] = p2c["d1"] = "\321";
				p2c["D2"] = p2c["d2"] = "\322"; p2c["D3"] = p2c["d3"] = "\323";
				p2c["D4"] = p2c["d4"] = "\324"; p2c["D5"] = p2c["d5"] = "\325";
				p2c["D6"] = p2c["d6"] = "\326"; p2c["D7"] = p2c["d7"] = "\327";
				p2c["D8"] = p2c["d8"] = "\330"; p2c["D9"] = p2c["d9"] = "\331";
				p2c["DA"] = p2c["dA"] = p2c["Da"] = p2c["da"] = "\332";
				p2c["DB"] = p2c["dB"] = p2c["Db"] = p2c["db"] = "\333";
				p2c["DC"] = p2c["dC"] = p2c["Dc"] = p2c["dc"] = "\334";
				p2c["DD"] = p2c["dD"] = p2c["Dd"] = p2c["dd"] = "\335";
				p2c["DE"] = p2c["dE"] = p2c["De"] = p2c["de"] = "\336";
				p2c["DF"] = p2c["dF"] = p2c["Df"] = p2c["df"] = "\337";
				p2c["E0"] = p2c["e0"] = "\340"; p2c["E1"] = p2c["e1"] = "\341";
				p2c["E2"] = p2c["e2"] = "\342"; p2c["E3"] = p2c["e3"] = "\343";
				p2c["E4"] = p2c["e4"] = "\344"; p2c["E5"] = p2c["e5"] = "\345";
				p2c["E6"] = p2c["e6"] = "\346"; p2c["E7"] = p2c["e7"] = "\347";
				p2c["E8"] = p2c["e8"] = "\350"; p2c["E9"] = p2c["e9"] = "\351";
				p2c["EA"] = p2c["eA"] = p2c["Ea"] = p2c["ea"] = "\352";
				p2c["EB"] = p2c["eB"] = p2c["Eb"] = p2c["eb"] = "\353";
				p2c["EC"] = p2c["eC"] = p2c["Ec"] = p2c["ec"] = "\354";
				p2c["ED"] = p2c["eD"] = p2c["Ed"] = p2c["ed"] = "\355";
				p2c["EE"] = p2c["eE"] = p2c["Ee"] = p2c["ee"] = "\356";
				p2c["EF"] = p2c["eF"] = p2c["Ef"] = p2c["ef"] = "\357";
				p2c["F0"] = p2c["f0"] = "\360"; p2c["F1"] = p2c["f1"] = "\361";
				p2c["F2"] = p2c["f2"] = "\362"; p2c["F3"] = p2c["f3"] = "\363";
				p2c["F4"] = p2c["f4"] = "\364"; p2c["F5"] = p2c["f5"] = "\365";
				p2c["F6"] = p2c["f6"] = "\366"; p2c["F7"] = p2c["f7"] = "\367";
				p2c["F8"] = p2c["f8"] = "\370"; p2c["F9"] = p2c["f9"] = "\371";
				p2c["FA"] = p2c["fA"] = p2c["Fa"] = p2c["fa"] = "\372";
				p2c["FB"] = p2c["fB"] = p2c["Fb"] = p2c["fb"] = "\373";
				p2c["FC"] = p2c["fC"] = p2c["Fc"] = p2c["fc"] = "\374";
				p2c["FD"] = p2c["fD"] = p2c["Fd"] = p2c["fd"] = "\375";
				p2c["FE"] = p2c["fE"] = p2c["Fe"] = p2c["fe"] = "\376";
				p2c["FF"] = p2c["fF"] = p2c["Ff"] = p2c["ff"] = "\377";

				if(httpDecode) {
					gsub(/\+/, " ", string)
				}

				for(result = ""; match(string, /%[0-9A-Fa-f]{2}/); string = substr(string, RSTART + RLENGTH)) {
					result = result substr(string, 1, RSTART - 1) p2c[substr(string, RSTART + 1, 2)]
				}

				return result string
			}

						BEGIN {
							FS = "\t"
							printf("<pre><samp>")
						}

						{
							printf("<span id=\"search-%d\">%6d %s <a href=\"%s\">%s</a></span>\n", $1, $1, $4, html_escape(safe_string(url "&query=" $2 "&engine=" $3)), html_escape(safe_string(url_decode($2))))
						}

						END {
							printf("</samp></pre>")
						}
		__EOF__
	)
	pass=$(printf '%s' "${W3MPLUS_PASS_VALUE}" | urlencode)
	path_to_fileurl 'filepath' "${SCRIPT_NAME}"

	awk \
		-v "url=${filepath}?pass=${pass}&action=search" \
		-- "${awkScript}" "${W3MPLUS_SEARCH_HISTFILE}" |
		org_lc printhtml --title 'Search History' -- - |
		org_lc httpresponse -H 'Content-Type: text/html; charset=UTF-8' -
	;;
'show-tab-history')
	: >>"${W3MPLUS_UNDO_FILE}"
	path_to_fileurl 'uri' "${W3MPLUS_UNDO_FILE}"

	org_lc w3mredirect -- "${uri}"
	;;
'show-url-mark')
	: >>"${W3MPLUS_URLMARK_FILE}"

	path_to_fileurl 'mark' "${W3MPLUS_URLMARK_FILE}"

	org_lc w3mredirect -- "${mark}"
	;;
'show-user-command')
	: >>"${W3MPLUS_USERCOMMAND_FILE}"
	path_to_fileurl 'uri' "${W3MPLUS_USERCOMMAND_FILE}"

	org_lc w3mredirect -- "${uri}"
	;;
'sidebar-bookmark')
	expand 'uri' "${query_uri-W3M_URL}"
	: >>"${W3MPLUS_W3M_BOOKMARK}"

	sed \
		-e 's/<a href=/<a target="main" href=/g' \
		-- "${W3MPLUS_W3M_BOOKMARK}" >"${tmpDir}/bookmark"

	output="${W3MPLUS_CACHE}/menu-$(cksum "${tmpDir}/bookmark" | cut -d ' ' -f '1-2' | tr ' ' '-').html"
	path_to_fileurl 'menu' "${output}"

	cat -- "${tmpDir}/bookmark" >"${output}"

	case "${W3MPLUS_SIDEBAR_POSITION}" in
	'right')
		org_lc htmlframe \
			--attribute "cols=*,${W3MPLUS_SIDEBAR_SIZE}" \
			--n1 'main' --n2 'menu' \
			--t1 'Main page' --t2 'Menu page' \
			--title 'Bookmark' \
			-- "${uri:-data:text/plain,}" "${menu}"
		;;
	'left')
		org_lc htmlframe \
			--attribute "cols=${W3MPLUS_SIDEBAR_SIZE},*" \
			--n1 'menu' --n2 'main' \
			--t1 'Menu page' --t2 'Main page' \
			--title 'Bookmark' \
			-- "${menu}" "${uri:-data:text/plain,}"
		;;
	esac | datauri 'text/html' | org_lc w3mredirect
	;;
'sidebar-history')
	expand 'uri' "${query_uri-W3M_URL}"
	: >>"${W3MPLUS_W3M_HISTORY}"

	grep -v -e '^data:' -e '^file:///cgi-bin/' -- "${W3MPLUS_W3M_HISTORY}" |
		org_lc framelinkmenu \
			${uri:+'--main' "${uri}"} \
			--position "${W3MPLUS_SIDEBAR_POSITION}" \
			--title 'History' |
		datauri 'text/html' |
		org_lc w3mredirect
	;;
'toggle-https-everywhere')
	if sed -n -e '/^# HTTPS Everywhere$/,/^$/p' -- "${W3MPLUS_W3M_SITECONF}" | grep -Fqx '# url m@^http://@'; then
		sed -e '/^# HTTPS Everywhere$/,/^$/{s/^# url/url/; s/^# substitute_url/substitute_url/}' -- "${W3MPLUS_W3M_SITECONF}" >"${tmpDir}/siteconf"
		cat -- "${tmpDir}/siteconf" >"${W3MPLUS_W3M_SITECONF}"

		org_lc httpresponse \
			-H 'W3m-control: BACK' \
			-H 'W3m-control: REINIT'
	elif sed -n -e '/^# HTTPS Everywhere$/,/^$/p' -- "${W3MPLUS_W3M_SITECONF}" | grep -Fqx 'url m@^http://@'; then
		sed -e '/^# HTTPS Everywhere$/,/^$/{s/^url/# url/; s/^substitute_url/# substitute_url/}' -- "${W3MPLUS_W3M_SITECONF}" >"${tmpDir}/siteconf"
		cat -- "${tmpDir}/siteconf" >"${W3MPLUS_W3M_SITECONF}"

		org_lc httpresponse \
			-H 'W3m-control: BACK' \
			-H 'W3m-control: REINIT'
	else
		org_lc httpresponse -H 'W3m-control: BACK'
	fi
	;;
'undo-redo')
	case "${W3MPLUS_UNDOREDO}" in
	'REDO')
		w3mcomm='REDO'
		setenv='UNDO'
		;;
	'UNDO')
		w3mcomm='UNDO'
		setenv='REDO'
		;;
	esac

	org_lc httpresponse \
		-H 'W3m-control: BACK' \
		-H "W3m-control: ${w3mcomm}" \
		-H "W3m-control: SETENV W3MPLUS_UNDOREDO=${setenv}"
	;;
'undo-tab')
	case "${query_count-}" in '@'*)
		query_number="@$(date -u -- '+%Y%m%d%H%M%S' | TZ='UTC+0' utconv)"
		;;
	esac

	org_lc popuri \
		--config "${W3MPLUS_UNDO_FILE}" \
		${query_number+--number "${query_number}"} \
		${query_count+--count "${query_count}"} \
		--timeout "${W3MPLUS_UNDO_TIMEOUT}" |
		cut -f '1-2' |
		org_lc w3mredirect --tab 'open-newtab'
	;;
'visual-mode')
	expand 'id' "${query_id-W3M_URL}"
	expand 'line' "${query_line-W3M_CURRENT_LINE}" '1'

	case "${query_subaction}" in
	'formatprg') commandArg="${W3MPLUS_FORMATPRG}" ;;
	'operatorfunc') commandArg="${W3MPLUS_OPERATORFUNC}" ;;
	'yank') commandArg="${W3MPLUS_YANK}" ;;
	esac

	org_lc w3mvisualmode \
		--line "${line}" \
		--timeout "${W3MPLUS_VISUAL_TIMEOUT}" \
		-- "${id}" "${query_subaction}" \
		${commandArg+"${commandArg}"}
	;;
'zoom')
	org_lc changeconfig \
		--max "${W3MPLUS_ZOOM_MAX}" \
		--min "${W3MPLUS_ZOOM_MIN}" \
		--param "image_scale=${query_zoom-100}" \
		--in-place \
		-- "${W3MPLUS_W3M_CONFIG}"
	zoom=$(grep -e '^image_scale ' -- "${W3MPLUS_W3M_CONFIG}" | cut -d ' ' -f 2)

	org_lc httpresponse \
		-H 'W3m-control: BACK' \
		-H "W3m-control: SET_OPTION image_scale=${zoom}" \
		-H 'W3m-control: RESHAPE'
	;;
*)
	path_to_fileurl 'filepath' "${SCRIPT_NAME}"

	org_lc printhtml --title 'Bad Request' -- - <<-__EOF__ |
		<dl>
			<dt>about-uri</dt>
			<dd>${filepath}?pass={PASS_VALUE}&amp;action=about-uri&amp;about={ABOUT_URI}</dd>

			<dt>close-tab</dt>
			<dd>${filepath}?pass={PASS_VALUE}&amp;action=close-tab&amp;uri={VARIABLE_NAME | '-' VALUE}&amp;line={VARIABLE_NAME | '-' VALUE}&amp;colmun={VARIABLE_NAME | '-' VALUE}</dd>

			<dt>context-menu</dt>
			<dd>${filepath}?pass={PASS_VALUE}&amp;action=context-menu</dd>

			<dt>cookie-config</dt>
			<dd>${filepath}?pass={PASS_VALUE}&amp;action=cookie-copnfig&amp;uri={VARIABLE_NAME | '-' VALUE}&amp;accept={'add' | 'delete' | 'toggle'}&amp;reject={'add' | 'delete' | 'toggle'}</dd>

			<dt>dict-word</dt>
			<dd>${filepath}?pass={PASS_VALUE}&amp;action=dict-word&amp;designator={'disable' | 'event' | 'all'}&amp;engine={COMMA_LIST}&amp;query={'?' TEXT}&amp;tab={TAB_PARAM}&amp;before={W3M_COMMAND}&amp;after={W3M_COMMAND}</dd>

			<dt>equalprg</dt>
			<dd>${filepath}?pass={PASS_VALUE}&amp;action=equalprg&amp;uri={VARIABLE_NAME | '-' VALUE}</dd>

			<dt>execute-env-var</dt>
			<dd>${filepath}?pass={PASS_VALUE}&amp;action=execute-env-var&amp;subaction={ACTION}&amp;variable={VARIABLE_NAME}</dd>

			<dt>execute-user-command</dt>
			<dd>${filepath}?pass={PASS_VALUE}&amp;action=execute-user-command&amp;key={PATTERN}&amp;input={VARIABLE_NAME | '-' VALUE}</dd>

			<dt>find-string</dt>
			<dd>${filepath}?pass={PASS_VALUE}&amp;action=find-string&amp;word={VARIABLE_NAME | '-' VALUE}&amp;number={SIGNED_INTEGER}</dd>

			<dt>find-word</dt>
			<dd>${filepath}?pass={PASS_VALUE}&amp;action=find-word&amp;word={VARIABLE_NAME | '-' VALUE}&amp;number={SIGNED_INTEGER}</dd>

			<dt>get-local-mark</dt>
			<dd>${filepath}?pass={PASS_VALUE}&amp;action=get-local-mark&amp;uri={VARIABLE_NAME | '-' VALUE}&amp;key={PATTERN}</dd>

			<dt>get-quick-mark</dt>
			<dd>${filepath}?pass={PASS_VALUE}&amp;action=get-quick-mark&amp;key={PATTERN}&amp;tab={TAB_PARAM}</dd>

			<dt>get-register</dt>
			<dd>${filepath}?pass={PASS_VALUE}&amp;action=get-register&amp;key={PATTERN}&amp;subaction={ACTION}</dd>

			<dt>get-url-mark</dt>
			<dd>${filepath}?pass={PASS_VALUE}&amp;action=get-url-mark&amp;key={PATTERN}&amp;tab={TAB_PARAM}</dd>

			<dt>goto-line</dt>
			<dd>${filepath}?pass={PASS_VALUE}&amp;action=goto-line&amp;line={VARIABLE_NAME | '-' VALUE}&amp;number={[+*/-]? NUMBER '%'?}</dd>

			<dt>goto-paragraph</dt>
			<dd>${filepath}?pass={PASS_VALUE}&amp;action=goto-paragraph&amp;line={VARIABLE_NAME | '-' VALUE}&amp;number={SIGNED_INTEGER}</dd>

			<dt>homepage</dt>
			<dd>${filepath}?pass={PASS_VALUE}&amp;action=homepage</dd>

			<dt>line-begin-non-blake</dt>
			<dd>${filepath}?pass={PASS_VALUE}&amp;action=line-begin-non-blake&amp;line={VARIABLE_NAME | '-' VALUE}</dd>

			<dt>line-end-non-blake</dt>
			<dd>${filepath}?pass={PASS_VALUE}&amp;action=line-end-non-blake&amp;line={VARIABLE_NAME | '-' VALUE}</dd>

			<dt>line-incriment</dt>
			<dd>${filepath}?pass={PASS_VALUE}&amp;action=line-incriment&amp;line={VARIABLE_NAME | '-' VALUE}&amp;colmun={VARIABLE_NAME | '-' VALUE}&amp;_action={ACTION}&amp;lineincriment={INTEGER}&amp;colmunincriment={INTEGER}</dd>

			<dt>link-goto</dt>
			<dd>${filepath}?pass={PASS_VALUE}&amp;action=link-goto</dd>

			<dt>link-tabgoto</dt>
			<dd>${filepath}?pass={PASS_VALUE}&amp;action=link-tabgoto</dd>

			<dt>scroll-zb</dt>
			<dd>${filepath}?pass={PASS_VALUE}&amp;action=scroll-zb&amp;line={VARIABLE_NAME | '-' VALUE}</dd>

			<dt>scroll-zt</dt>
			<dd>${filepath}?pass={PASS_VALUE}&amp;action=scroll-zt&amp;line={VARIABLE_NAME | '-' VALUE}</dd>

			<dt>search</dt>
			<dd>${filepath}?pass={PASS_VALUE}&amp;action=search&amp;designator={'disable' | 'event' | 'all'}&amp;engine={COMMA_LIST}&amp;query={TEXT}&amp;tab={TAB_PARAM}&amp;before={W3M_COMMAND}&amp;after={W3M_COMMAND}</dd>

			<dt>select-line</dt>
			<dd>${filepath}?pass={PASS_VALUE}&amp;action=select-line&amp;line={VARIABLE_NAME | '-' VALUE}&amp;subaction={ACTION}&amp;number={'0' | '$' | SIGNED_INTEGER}</dd>

			<dt>set-local-mark</dt>
			<dd>${filepath}?pass={PASS_VALUE}&amp;action=set-local-mark&amp;uri={VARIABLE_NAME | '-' VALUE}&amp;line={VARIABLE_NAME | '-' VALUE}&amp;key={KEY}</dd>

			<dt>set-register</dt>
			<dd>${filepath}?pass={PASS_VALUE}&amp;action=set-register&amp;value={VARIABLE_NAME | '-' VALUE}&amp;key={KEY}</dd>

			<dt>set-quick-mark</dt>
			<dd>${filepath}?pass={PASS_VALUE}&amp;action=setQuickMark&amp;uri={VARIABLE_NAME | '-' VALUE}&amp;line={VARIABLE_NAME | '-' VALUE}&amp;colmun={VARIABLE_NAME | '-' VALUE}&amp;key={KEY}</dd>

			<dt>set-url-mark</dt>
			<dd>${filepath}?pass={PASS_VALUE}&amp;action=set-url-mark&amp;uri={VARIABLE_NAME | '-' VALUE}&amp;line={VARIABLE_NAME | '-' VALUE}&amp;colmun={VARIABLE_NAME | '-' VALUE}&amp;key={KEY}</dd>

			<dt>show-local-mark</dt>
			<dd>${filepath}?pass={PASS_VALUE}&amp;action=show-local-mark</dd>

			<dt>show-quick-mark</dt>
			<dd>${filepath}?pass={PASS_VALUE}&amp;action=show-quick-mark</dd>

			<dt>show-register</dt>
			<dd>${filepath}?pass={PASS_VALUE}&amp;action=show-register</dd>

			<dt>show-search-history</dt>
			<dd>${filepath}?pass={PASS_VALUE}&amp;action=show-search-history</dd>

			<dt>show-tab-history</dt>
			<dd>${filepath}?pass={PASS_VALUE}&amp;action=show-tab-history</dd>

			<dt>show-url-mark</dt>
			<dd>${filepath}?pass={PASS_VALUE}&amp;action=show-url-mark</dd>

			<dt>show-user-command</dt>
			<dd>${filepath}?pass={PASS_VALUE}&amp;action=show-user-command</dd>

			<dt>sidebar-bookmark</dt>
			<dd>${filepath}?pass={PASS_VALUE}&amp;action=sidebar-bookmark&amp;uri={VARIABLE_NAME | '-' VALUE}</dd>

			<dt>sidebar-history</dt>
			<dd>${filepath}?pass={PASS_VALUE}&amp;action=sidebar-history&amp;uri={VARIABLE_NAME | '-' VALUE}</dd>

			<dt>toggle-https-everywhere</dt>
			<dd>${filepath}?pass={PASS_VALUE}&amp;action=toggle-https-everywhere</dd>

			<dt>undo-redo</dt>
			<dd>${filepath}?pass={PASS_VALUE}&amp;action=undo-redo</dd>

			<dt>undo-tab</dt>
			<dd>${filepath}?pass={PASS_VALUE}&amp;action=undo-tab&amp;number={SIGNED_INTEGER}&amp;count={@INTEGER | SIGNED_INTEGER}</dd>

			<dt>visual-mode</dt>
			<dd>${filepath}?pass={PASS_VALUE}&amp;action=visual-mode&amp;id={TEXT}&amp;line={VARIABLE_NAME | '-' VALUE}&amp;subaction={subaction}</dd>

			<dt>zoom</dt>
			<dd>${filepath}?pass={PASS_VALUE}&amp;action=zoom&amp;zoom={([+*/-] '=')? UNSIGNED_INTEGER}</dd>
		</dl>
	__EOF__
		org_lc httpresponse \
			--status-line 'HTTP/1.1 400 Bad Request' \
			-H 'Content-Type: text/html; charset=UTF-8' \
			-- -

	;;

esac
