% -*- mode: LaTeX; coding: koi8-r -*-
% $Id: rm_master.tex,v 1.6 2004/04/29 04:12:21 cher Exp $
% Copyright (C) 2004 Alexander Chernov <cher@unicorn.cmc.msu.ru>

\chapter{Веб-интерфейс пользователя}

В настоящей главе описывается интерфейс пользователя системы
\S{ejudge}, предоставляемый посредством веб-браузера. На стороне
сервера веб-интерфейс реализован с помощью CGI-программ
\S{master}, \S{judge}, \S{team}, \S{register} и \S{users}.

\section{Интерфейс администратора турнира \S{master}}

Веб-интерфейс для администратора турнира предоставляется с
помощью CGI-программы \S{master}.

\subsection{Конфигурационные файлы}

При запуске программа \S{master} считывает настройки из
конфигурационного файла \hyperlink{F:master.cfg}. Каталог, в
котором должен находится данный конфигурационный файл
устанавливается при компиляции системы \S{ejudge}. Настройки по
умолчанию таковы, что конфигурационный файл должен находиться в
каталоге \V{../cgi-data} относительно каталога, в котором
находится CGI-программа \S{master}, который определяется по
переменной окружения \V{SCRIPT\_FILENAME}. Эта переменная
окружения устанавливается веб-сервером \S{apache} при запуске
CGI-программ.

При запуске CGI-программы \S{master} обязательно должен быть
указан идентификатор турнира. Поддерживаются следующие способы
указания идентификатора турнира:
\begin{itemize}
\item
Непосредственно в имени CGI-программы.
\item
С помощью CGI-переменной \V{contest\_id} указанием её значения в
URL или в переменных формы.
\item
В конфигурационном файле программы.
\end{itemize}

Идентификатор турнира определяется при запуске CGI-программы
\S{master} по следующим правилам.
\begin{enumerate}
\item Если имя CGI-программы имеет вид \V{master-$N$}, где $N$
--- положительное целое число, тогда идентификатор турнира
полагается равным $N$. Возможное указание идентификатора турнира
в URL или переменных HTML-формы игнорируется. Далее программа
\S{master} пытается считать конфигурационный файл из каталога
конфигурационных файлов. При этом по очереди проверяются
следующие возможности:
\begin{enumerate}
\item
Если в каталоге конфигурационных файлов существует файл
\V{serve.cfg}, он будет использоваться в качестве
конфигурационного.
\item
Если предыдущее условие не выполнено, но в каталоге
конфигурационных файлов существует файл с именем \V{master-$N$},
где $N$ --- идентификатор турнира, записанный без ведущих нулей,
то такой файл будет использоваться в качестве
конфигурационного.
\item
Если предыдущие условия не выполнены, но в каталоге
конфигурационных файлов существует файл с именем
\V{master-$N'$}, где $N'$ --- идентификатор турнира, дополненный
до 6 десятичных знаков ведущими незначащими нулями, такой файл
будет использоваться в качестве конфигурационного.
\item
Если предыдущие условия не выполнены, но в каталоге
конфигурационных файлов существует файл с именем
\V{master-$N''$}, где $N''$ --- идентификатор турнира,
записанный в точности так, как в имени CGI-программы, такой файл
будет использоваться в качестве конфигурационного.
\end{enumerate}

Например, если в запросе указано имя CGI-программы
\V{master-05}, то идентификатор турнира полагается равным \V{5},
и в качестве конфигурационного файла выбирается первый файл из
списка \V{master.cfg}, \V{master-5.cfg}, \V{master-000005.cfg},
\V{master-05.cfg}, который существует в каталоге
конфигурационных файлов CGI-программы \S{master}.

Если в конфигурационном файле программы \S{master}
устанавливается идентификатор турнира с помощью
(недокументированной) конфигурационной переменной
\V{contest\_id}, её значение должно совпадать со значением,
заданным в имени программы.

Чтобы использовать задание идентификатора турнира
непосредственно в имени CGI-программы, в каталоге CGI-программ
должен существовать исполняемый файл \V{master-$N$}, который
может быть копией программы \S{master}, либо жёсткой или
символической ссылкой на неё. Если в каталоге CGI-программ
веб-сервера исполняемый файл с именем \V{master-$N$}
отсутствует, веб-сервер сгенерирует диагностическую страницу
несуществующего ресурса.

Обратите внимание, что в конфигурационных файлах сервера
\S{apache} можно указывать правила переписывания URL (URL
Rewriting Rules), с помощью которых можно выполнять сколь угодно
сложные трансформации URL. В этом случае обратитесь, пожалуйста,
к документации на веб-сервер \S{apache}.

\item
Если имя CGI-программы равно в точности \V{master}, тогда
идентификатор турнира берётся из CGI-переменных, переданных в
URL или в переменных HTML-формы. Например, идентификатор турнира
может быть задан непосредственно в URL следующим образом:
\V{http://host/cgi-bin/master?contest\_id=5}. Пусть идентификатор
турнира равен $N$. Тогда для поиска конфигурационного файла
программы \S{master} проверяются следующие возможности.
\begin{enumerate}
\item
Если в каталоге конфигурационных файлов существует файл с именем
\V{master-$N$}, где $N$ --- идентификатор турнира, записанный
без ведущих нулей, то такой файл будет использоваться в качестве
конфигурационного.
\item
Если предыдущее условие не выполнено, но в каталоге
конфигурационных файлов существует файл с именем
\V{master-$N'$}, где $N'$ --- идентификатор турнира, дополненный
до 6 десятичных знаков ведущими незначащими нулями, такой файл
будет использоваться в качестве конфигурационного.
\item
Если предыдущие условия не выполнены, но в каталоге
конфигурационных файлов существует файл \V{serve.cfg}, он будет
использоваться в качестве конфигурационного.
\end{enumerate}

Например, если URL запроса имеет вид
\V{http://host/cgi-bin/master?contest\_id=5}, то идентификатор
турнира полагается равным \V{5}, и в качестве конфигурационного
файла выбирается первый файл из списка \V{master-5.cfg},
\V{master-000005.cfg}, \V{master.cfg}, который существует в
каталоге конфигурационных файлов CGI-программы \S{master}.

Если в конфигурационном файле программы \S{master}
устанавливается идентификатор турнира с помощью
(недокументированной) конфигурационной переменной
\V{contest\_id}, её значение должно совпадать со значением,
заданным в имени программы.

\item
Если имя CGI-программы \S{master} имеет любую другую форму,
отличную от описанных выше, то в каталоге конфигурационных
файлов должен существовать конфигурационный файл \V{$M$.cfg} в
котором должна быть определена конфигурационная переменная
\V{contest\_id}. Здесь $M$ --- это имя, под которым запускается
CGI-программа \S{master}. Возможное указание идентификатора
турнира в URL или переменных HTML-формы игнорируется.

Например, если URL запроса имеет вид
\V{http://host/cgi-bin/master-mycontest}, то в каталоге
конфигурационных файлов должен существовать файл
\V{master-mycontest.cfg}, который будет использован в качестве
конфигурационного файла CGI-программы \S{master}.
\end{enumerate}

Обратите внимание, что выбор конфигурационного файла происходит
до его чтения и анализа его содержимого. Таким образом, если в
процессе поиска конфигурационного файла был найден некоторый
конфигурационный файл, который, однако, оказался некорректным,
то программа \S{master} сгенерирует диагностическую страницу
неверного конфигурационного файла, даже если в списке возможных
конфигурационных файлов далее находился корректный
конфигурационный файл.

Заметим, что такие правила определения идентификатора турнира
используются всеми CGI-программами, а не только программой
\S{master}.

\subsection{Вход в систему}

Для входа в систему в строке URL браузера введите URL
\V{http://$\I{HOST}$/cgi-bin/master}, где \I{HOST} --- IP-адрес
или имя компьютера, на котором установлена система \S{ejudge}.
Если система \S{ejudge} настроена правильно, будет выдано
приглашение ко вводу регистрационного имени, пароля и
идентификатора турнира. Экран браузера со страницей приглашения
показан на рис. \ref{master:screenshot:2}. В поле <<Login>>
необходимо ввести регистрационное имя, в поле <<Password>> ---
пароль (он не отображается на экране) и в поле <<Contest ID>>
--- идентификатор турнира. Когда все поля заполнены необходимо
нажать на кнопку <<Submit>>.

\begin{figure}[pth]
\begin{center}
\includegraphics[width=0.95\textwidth]{snapshots/master_02.eps}
\end{center}
\caption{Страница входа в систему (турнир неизвестен)}
\label{master:screenshot:2}
\end{figure}

\begin{figure}[pth]
\begin{center}
\includegraphics[width=0.95\textwidth]{snapshots/master_03.eps}
\end{center}
\caption{Страница входа в систему (турнир задан)}
\label{master:screenshot:3}
\end{figure}

Введённые данные проверяются на корректность, и в случае их
правильности происходить переход к главному экрану программы
\S{master}. Если введённые данные некорректны, будет отображена
диагностическая страница ошибки. Более точно причину ошибки
можно определить в диагностике, печатаемой программами
\S{userlist-server}, \S{serve}, либо в диагностике веб-сервера.
Возможные причины ошибки входа в систему перечислены ниже:

\begin{itemize}
\item
Введено некорректное регистрационное имя пользователя
(такой пользователь не существует в базе пользователей).
\item
Введён неправильный пароль.
\item
Указан недопустимый идентификатор турнира. Идентификатор турнира
является положительным целым числом. Возможно, что такого
турнира в системе не существует.
\item
Пользователь с указанным регистрационным именем не имеет
полномочий использовать CGI-программу \S{master}. Полномочия
устанавливаются в элементе
\hyperlink{F:contest.xml,T:cap}{\V{cap}} конфигурационного файла
турнира \hyperlink{F:contest.xml}{\V{contest.xml}}. За
возможность использования программы \S{master} отвечает бит
полномочий \V{MASTER\_LOGIN}.
\item
Пользователь с указанным регистрационным именем не
зарегистрирован как участник указанного турнира. Несмотря на то,
что этот пользователь использует привилегированную программу
\S{master}, он всё равно должен быть зарегистрирован на турнир
как и рядовой участник.
\item
Программа \S{master} для данного турнира не может быть
использована с IP-адреса клиента.
\item
Не существует или неверен конфигурационный файл программы
\S{serve}.
\item
Ошибка в конфигурационном файле турнира.
\item
Не запущена программа управления турниром \S{serve}.
\end{itemize}

Возможно задание идентификатора турнира непосредственно в URL. В
этом случае URL имеет вид
\V{http://$\I{HOST}$/cgi-bin/master?contest\_id=$N$}, где
\I{HOST} --- IP-адрес или имя компьютера, на котором установлена
система \S{ejudge}, а $N$ --- идентификатор турнира. В этом
случае приглашение ко вводу регистрационного имени и пароля
имеет вид, показанный на рис. \ref{master:screenshot:3}.
Обратите внимание, что отсутствует поле ввода идентификатора
турнира, кроме того в заголовке страницы печатается название
турнира.  В поле <<Login>> необходимо ввести регистрационное
имя, в поле <<Password>> ---  пароль (он не отображается на
экране). Когда все поля заполнены необходимо нажать на кнопку
<<Submit>>.

Если с IP-адреса клиента запрещено использование программы
\S{master} для указанного турнира $N$, то диагностическая
страница будет выдана до приглашения ко вводу регистрационного
имени. Другие возможные причины ошибки входа в систему
перечислены выше.

\subsection{Управление турниром до его начала}

\begin{figure}[htp]
\begin{center}
\includegraphics[width=0.95\textwidth]{snapshots/master_04.eps}
\end{center}
\caption{Элементы управления турниром (турнир не начался)}
\label{master:screenshot:4}
\end{figure}

На рис. \ref{master:screenshot:4} показаны элементы управления
турниром, доступные до начала турнира. Они выделены красным
подчёркиванием.

\begin{enumerate}
\item
Состояние турнира ``The contest is not started'' --- турнир не
начат.
\item
\hypertarget{P:master,E:server_time}{}
Астрономическое время программы-сервера турнира \S{serve}.
Время считывается из файла состояния сервера, который
обновляется каждую секунду. Таким образом можно определить, что
программа \S{serve} обслуживает данный турнир.
\begin{itemize}
\item
Если турнир обслуживается программой \S{serve}, работающей
самостоятельно, и время сервера слишком отличается от времени
клиента (см. ниже), CGI-программа \S{master} диагностирует
ошибку ``Server is down'' и генерирует соответствующую
диагностическую страницу.
\item
Если программа \S{serve} работает под управлением программы
супер-сервера \S{super-serve}, которая запускает
программу-сервер некоторого турнира по требованию, то есть когда
поступает запрос к этому турниру, время клиента и время сервера
могут при первом обращении сильно отличатся. В этом случае время
сервера показывает, когда последний раз обновлялся файл
состояния турнира. Ошибка ``Server is down'' в этом случае не
диагностируется.

Обратите внимание, что для работы CGI-программ с турниром под
управлением \S{super-serve} в конфигурационном файле турнира
\hyperlink{F:contest.xml}{\V{contest.xml}} в элементе
\hyperlink{F:contest.xml,T:client_flags}{\V{client\_flags}}
необходимо установить флаг клиентов \V{IGNORE\_TIME\_SKEW},
например, следующим образом.
{\small
\begin{verbatim}
  <client_flags>IGNORE_TIME_SKEW</client_flags>
\end{verbatim}
}
\end{itemize}
\item
\hypertarget{P:master,E:client_time}{}
Астрономическое время в CGI-программе \S{master}, которая в
данный момент обрабатывает запрос на генерацию html-страницы,
поступивший от веб-браузера. К сожалению, ``Client time'' ---
неудачное название, так как это время не имеет никакого
отношения к времени на компьютере пользователя, на котором
запущен веб-браузер, демонстрирующий данную страницу.

\item
Состояние турнира --- турнир не начат.

\item
Кнопка начала турнира. С помощью этой кнопки можно в любой
момент времени начать турнир.

Чтобы пользователь мог стартовать турнир, в конфигурационном
файле турнира \hyperlink{F:contest.xml}{\V{contest.xml}} в
элементе \hyperlink{F:contest.xml,T:cap}{\V{cap}} для него
должен быть установлен бит \V{CONTROL\_CONTEST}.

\item
Здесь отображается планируемое время начала турнира. Оно может
быть не установлено (отображается ``Not set'' как на рисунке),
либо может быть установлено на любое время в пределах текущих
суток. В момент, когда астрономическое время становится не
меньше, чем время, указанное в данной клетке таблицы, турнир
начинается автоматически.

\item
С помощью данного элемента управления можно установить время
автоматического начала турнира. Для этого нужно ввести время в
поле ввода и затем нажать на кнопку ``Reschedule''. Время начала
турнира вводится в формате \V{$\I{H}$[:$\I{M}$]}, где \I{H}
--- часы, а \I{M} --- минуты. Часы вводятся в 24-часовом
формате, то есть представляют собой целое число от 0 до
23. Минуты --- это целое число от 0 до 59. Минутная часть вместе
с двоеточием может быть опущена. Если устанавливается время
суток, меньшее текущего, турнир стартует автоматически немедленно.

Чтобы пользователь мог устанавливать время автоматического
начала турнира, в конфигурационном файле турнира
\hyperlink{F:contest.xml}{\V{contest.xml}} в элементе
\hyperlink{F:contest.xml,T:cap}{\V{cap}} для него должен быть
установлен бит \V{CONTROL\_CONTEST}.
\item
В данной ячейке таблицы отображается установленная
продолжительность турнира. Продолжительность турнира
отображается либо как ``Unlimited'', если продолжительность
турнира не ограничена, либо в формате \V{\I{HH}:\I{MM}:\I{SS}},
где \I{HH} --- количество полных часов, \I{MM} --- количество
полных минут в неполном последнем часе, \I{SS} --- количество
секунд в последней минуте.

\item
Данный элемент управления позволяет изменить установленную
продолжительность турнира. В поле ввода необходимо ввести новую
продолжительность турнира, затем нажать кнопку ``Change
duration''. Продолжительность турнира задаётся в виде
\V{$\I{H}$[:$\I{M}$]}, где \I{H} --- количество часов, а \I{M}
--- количество минут. Количество минут должно находиться в
интервале от 0 до 59. Минутная составляющая вместе с двоеточием
может быть опущена. Максимальная продолжительность турнира,
которую можно установить с помощью данного элемента управления,
равна 1000000 минутам, что соответствует примерно 694 суткам.
Продолжительность турнира неограниченной продолжительности не
может быть изменена. Продолжительность турнира ограниченной
продолжительности не может быть сделана неограниченной.

Начальная продолжительность турнира устанавливается в
конфигурационном файле сервера турнира
\hyperlink{F:serve.cfg}{\V{serve.cfg}} с помощью глобальной
конфигурационной переменной
\hyperlink{F:serve.cfg,T:contest_time}{\V{contest\_time}}.

Чтобы пользователь мог изменять продолжительность турнира, в
конфигурационном файле турнира
\hyperlink{F:contest.xml}{\V{contest.xml}} в элементе
\hyperlink{F:contest.xml,T:cap}{\V{cap}} для него должен быть
установлен бит \V{CONTROL\_CONTEST}.
\end{enumerate}

Остальные элементы управления могут использоваться, когда турнир
уже стартовал, и рассматриваются далее.

\subsection{Управление турниром в течение турнира}
\label{sectionMasterContestControl}

\begin{figure}[htp]
\begin{center}
\includegraphics[width=0.95\textwidth]{snapshots/master_05.eps}
\end{center}
\caption{Элементы управления турниром}
\label{master:screenshot:5}
\end{figure}

На рис. \ref{master:screenshot:5} показаны элементы управления
турниром, доступные в ходе турнира. Все выделенные на рисунке
элементы управления описываются ниже.

\begin{enumerate}
\item
Астрономическое время программы-сервера управления турниром
\S{serve}. Полное описание элемента ``Server time'' приведено
\hyperlink{P:master,E:server_time}{выше}.
\item
Астрономическое время в CGI-программе \S{master}, которая в
данный момент обрабатывает запрос на генерацию html-страницы,
поступивший от веб-браузера. См. также полное описание 
\hyperlink{P:master,E:client_time}{выше}.
\item
Астрономическое время начала турнира.
\item
С помощью кнопки ``Stop'' можно завершить турнир в любой момент
до истечения времени турнира.

Чтобы пользователь мог останавливать турнир, в конфигурационном
файле турнира \hyperlink{F:contest.xml}{\V{contest.xml}} в
элементе \hyperlink{F:contest.xml,T:cap}{\V{cap}} для него
должен быть установлен бит \V{CONTROL\_CONTEST}.

\item
Установленная продолжительность турнира отображается либо как
``Unlimited'', если продолжительность турнира не ограничена,
либо в формате \V{\I{HH}:\I{MM}:\I{SS}}, где \I{HH} ---
количество полных часов, \I{MM} --- количество полных минут в
неполном последнем часе, \I{SS} --- количество секунд в неполной
последней минуте. Когда текущая продолжительность турнира
превышает установленную продолжительность турнира, турнир
завершается автоматически. 
\item
Данный элемент управления позволяет изменить установленную
продолжительность турнира. В поле ввода необходимо ввести новую
продолжительность турнира, затем нажать кнопку ``Change
duration''. Продолжительность турнира задаётся в виде
\V{$\I{H}$[:$\I{M}$]}, где \I{H} --- количество часов, а \I{M}
--- количество минут. Количество минут должно находиться в
интервале от 0 до 59. Минутная составляющая вместе с двоеточием
может быть опущена. Максимальная продолжительность турнира,
которую можно установить с помощью данного элемента управления,
равна 1000000 минутам, что соответствует примерно 694 суткам.
Продолжительность турнира неограниченной продолжительности не
может быть изменена. Продолжительность турнира ограниченной
продолжительности не может быть сделана неограниченной.

Продолжительность турнира конечной продолжительности может быть
как увеличена, так и уменьшена. При этом на уменьшение
продолжительности накладывается такое ограничение, что новая
продолжительность турнира не должна быть такой, что турнир
должен был бы закончится в некоторый момент в прошлом. Другими
словами, уменьшение продолжительности турнира не должно
приводить к его немедленному завершению.

Начальная продолжительность турнира устанавливается в
конфигурационном файле сервера турнира
\hyperlink{F:serve.cfg}{\V{serve.cfg}} с помощью глобальной
конфигурационной переменной
\hyperlink{F:serve.cfg,T:contest_time}{\V{contest\_time}}.

Чтобы пользователь мог изменять продолжительность турнира, в
конфигурационном файле турнира
\hyperlink{F:contest.xml}{\V{contest.xml}} в элементе
\hyperlink{F:contest.xml,T:cap}{\V{cap}} для него должен быть
установлен бит \V{CONTROL\_CONTEST}.

\item
Здесь отображается ожидаемое время завершения турнира, которое
вычисляется по времени начала турнира (3) и текущей
продолжительности турнира (5). В этот момент времени турнир
будет завершён автоматически, если только до этого момента он не
будет завершён явно с помощью кнопки ``Stop'' (4). Изменения в
текущей продолжительности турнира с помощью кнопки ``Change
duration'' (7) немедленно отражаются в ожидаемом времени
завершения турнира.

Для турниров неограниченной продолжительности данная информация
не отображается.

\item
Здесь отображается ожидаемое время <<заморозки>> таблицы текущих
результатов турнира. От момента заморозки и до окончания турнира
таблица текущих результатов автоматически не обновляется при
поступлении новых решений. Время в минутах от момента заморозки
до конца турнира задаётся с помощью глобальной конфигурационной
переменной
\hyperlink{F:serve.cfg,T:stand_freeze_time}{\V{stand\_freeze\_time}}
(переменная имеет альтернативное имя
\hyperlink{F:serve.cfg,T:board_fog_time}{\V{board\_fog\_time}})
в конфигурационном файле сервера турнира
\hyperlink{F:serve.cfg}{\V{serve.cfg}}. Если значение этой
переменной установлено в 0, заморозка таблицы результатов
отключается. В этом случае, а также в случае турниров
неограниченной продолжительности данная информация не
отображается.

Изменения в текущей продолжительности турнира с помощью кнопки
``Change duration'' (7) немедленно отражаются в ожидаемом
времени заморозки таблицы результатов. В любой момент времени
таблица текущих результатов турнира может быть обновлена вручную
с помощью кнопки ``Update public standings'' (17).

Автоматическое обновление результатов турнира может быть
полностью отключено установкой глобальной конфигурационной
переменной
\hyperlink{F:serve.cfg,T:autoupdate_standings}{\V{autoupdate\_standings}}
в значение 0 в файле конфигурации турнира
\hyperlink{F:serve.cfg}{\V{serve.cfg}}.

\item
Здесь отображается время турнира, прошедшее от его начала.

\item
Здесь отображается время, оставшееся до конца турнира.

\item
\hypertarget{P:master,quick_nav}{}
Ссылки быстрой навигации по страницам управления турниром.
\begin{itemize}
\item
Нажатие на ссылку ``Refresh'' приведёт к обновлению информации
на главной странице управления турниром.
\item
Нажатие на ссылку ``Standings'' вызовет переход на страницу
отображения текущих результатов турнира. Текущие результаты
турнира, отображаемые на этой странице, никогда не
замораживаются. Обычные участники турнира, а также наблюдатели
не имеют доступа к данной <<привилегированной>> таблице
результатов.

Чтобы пользователь программы \S{master} имел возможность
смотреть привилегированные текущие результаты турнира,
в конфигурационном файле турнира
\hyperlink{F:contest.xml}{\V{contest.xml}} в элементе
\hyperlink{F:contest.xml,T:cap}{\V{cap}} для него должен быть
установлен бит \V{VIEW\_STANDINGS}.

\item
Нажатие на ссылку ``View teams'' вызовет переход на страницу
отображения информации об участниках турнира. Данная страница
подробно рассматривается ниже.

Чтобы пользователь имел полномочия просматривать список
участников турнира, в конфигурационном файле турнира
\hyperlink{F:contest.xml}{\V{contest.xml}} в элементе
\hyperlink{F:contest.xml,T:cap}{\V{cap}} для него должен быть
установлен бит \V{LIST\_CONTEST\_USERS}.

\item
Нажатие на ссылку ``Log out'' приведёт к завершению сеанса
работы администратора турнира. При этом идентификатор сессии
(SID), отображаемый в URL станет недействительным. Для входа на
страницы управления турниром необходимо вновь ввести
регистрационное имя и пароль на странице входа в программу. 
\end{itemize}

\item
Нажатие на ссылку ``Dump runs database'' вызовет печать базы
посылок в формате CSV (comma-separated values). В формате CSV
каждая запись размещается на отдельной текстовой строке, а поля
записи разделяются символом `\V{;}'. Данные в формате CSV могут
быть импортированы, например, в реляционные базы данных или в
программы электронных таблиц для дальнейшей обработки.

База посылок в формате CSV отображается непосредственно в окне
браузера (для неё устанавливается тип содержимого (Content-type)
``text/plain''). База посылок может быть сохранена в текстовом
файле средствами браузера. Поля файла базы посылок в формате CVS
описываются в соответствующем разделе.

Данная операция требует специальных привилегий. Для того, чтобы
пользователь мог получить базу посылок в формате CSV, для
пользователя в файле конфигурации турнира
\hyperlink{F:contest.xml}{\V{contest.xml}} в элементе
\hyperlink{F:contest.xml,T:cap}{\V{cap}} должен быть установлен
бит \V{DUMP\_RUNS}.

\item
Нажатие на ссылку ``Dump users database'' вызовет печать базы
участников турнира в формате CSV. База участников турнира в
формате CSV отображается непосредственно в окне браузера (для
неё устанавливается тип содержимого (Content-type)
``text/plain''). База участников турнира может быть сохранена в
текстовом  файле средствами браузера. Поля файла базы участников
турнира в формате CVS описываются в соответствующем разделе.

Данная операция требует специальных привилегий. Для того, чтобы
пользователь мог получить базу участников турнира в формате CSV,
для пользователя в файле конфигурации турнира
\hyperlink{F:contest.xml}{\V{contest.xml}} в элементе
\hyperlink{F:contest.xml,T:cap}{\V{cap}} должен быть установлен
бит \V{DUMP\_USERS}.

\item
Нажатие на ссылку ``Dump standings database'' вызовет печать
таблицы текущих результатов турнира в формате CSV. Таблица
текущих результатов турнира в формате CSV отображается
непосредственно в окне браузера (для неё устанавливается тип
содержимого (Content-type) ``text/plain''). Таблица текущих
результатов турнира может быть сохранена в текстовом файле
средствами браузера. Поля таблицы текущих результатов турнира в
формате CVS описываются в соответствующем разделе.

Данная операция требует специальных привилегий. Для того, чтобы
пользователь мог получить базу участников турнира в формате CSV,
для пользователя в файле конфигурации турнира
\hyperlink{F:contest.xml}{\V{contest.xml}} в элементе
\hyperlink{F:contest.xml,T:cap}{\V{cap}} должен быть установлен
бит \V{DUMP\_STANDINGS}.

\item
Нажатие на ссылку ``Export XML runs (external format)'' вызовет
генерацию XML-файла с базой посылок. XML-файл отображается
непосредственно в окне браузера (для него устанавливается тип
содержимого (Content-type) ``text/plain'') и затем может быть
сохранён в файле средствами браузера.

Экспортируемый XML-формат базы посылок отличается от внутреннего
(см. ниже) тем, что в экспортируемый формат добавляется
информация о зарегистрированных участниках турнира,
сконфигурированных языках программирования и задачах турнира. По
такому XML-файлу можно однозначно воспроизвести ход турнира и
его результаты. С другой стороны, в экспортируемом формате
отсутствует внутренняя информация о посылке, такая как IP-адрес,
размер, хэш-код и пр. Экспортируемый формат предназначен для
отчёта о ходе турнира.

Данная операция требует специальных привилегий. Для того, чтобы
пользователь мог получить базу посылок в формате CSV, для
пользователя в файле конфигурации турнира
\hyperlink{F:contest.xml}{\V{contest.xml}} в элементе
\hyperlink{F:contest.xml,T:cap}{\V{cap}} должен быть установлен
бит \V{DUMP\_RUNS}.

\item
Нажатие на ссылку ``Write XML runs (internal format)'' вызовет
генерацию XML-файла с базой посылок во внутреннем формате.
XML-файл отображается непосредственно в окне браузера (для него
устанавливается тип содержимого (Content-type) ``text/plain'') и
затем может быть сохранён в файле средствами браузера.

Внутренний формат отличается от внешнего (см. выше) тем, что во
внутреннем формате для каждой посылки содержится полная
информация о посылке, включающая IP-адрес, контрольную сумму,
размер, внутренние флаги и т. д. Внутренний формат не содержит
информации о зарегистрированных участниках, языках
программирования и задачах. Внутренний формат предназначен для
синхронизации базы посылок (и как следствие таблицы текущих
результатов) в случаях, когда один и тот же турнир проводится в
нескольких точках проведения с отдельным сервером турнира в
каждой точке проведения. В этом случае предполагается, что база
зарегистрированных участников турнира, список языков
программирования и задач во всех точках проведения одинаковы.

База посылок во внутреннем формате может быть проимпортирована с
помощью элемента управления ``Import and merge XML runs log''
(см. ниже).

Данная операция требует специальных привилегий. Для того, чтобы
пользователь мог получить базу посылок в формате CSV, для
пользователя в файле конфигурации турнира
\hyperlink{F:contest.xml}{\V{contest.xml}} в элементе
\hyperlink{F:contest.xml,T:cap}{\V{cap}} должен быть установлен
бит \V{DUMP\_RUNS}.

\item
Кнопка ``Update public standings'' предназначена для ручного
обновления текущих результатов турнира, доступных для участников
турнира и прочих зрителей из сети Интернет. С помощью неё можно
обновлять результаты даже тогда, когда автоматическое обновление
отключено в период заморозки результатов. Поскольку операция
обновления результатов необратима, после нажатия на данную
кнопку будет выдана страница подтверждения операции. Для
выполнения обновления результатов на странице подтверждения
необходимо нажать на кнопку ``Yes, update standings''.

Чтобы пользователь мог вручную обновлять текущее положение команд, в
конфигурационном файле турнира
\hyperlink{F:contest.xml}{\V{contest.xml}} в элементе
\hyperlink{F:contest.xml,T:cap}{\V{cap}} для него должен быть
установлен бит \V{CONTROL\_CONTEST}.

\item
Кнопка ``Reset the contest'' полностью сбрасывает турнир.
Полностью очищается база посылок и база сообщений, удаляются все
файлы в архиве сообщений и архиве посылок, продолжительность
турнира сбрасывается на значение, установленное в глобальной
конфигурационной переменной
\hyperlink{F:serve.cfg,T:contest_time}{\V{contest\_time}}
конфигурационного файла турнира
\hyperlink{F:serve.cfg}{\V{serve.cfg}}.

Поскольку операция сброса турнира необратима, после нажатия на
данную кнопку будет выдана страница подтверждения операции. Для
выполнения обновления результатов на странице подтверждения
необходимо нажать на кнопку ``Yes, reset the contest''.

Для выполнения этой операции пользователем, в конфигурационном
файле турнира \hyperlink{F:contest.xml}{\V{contest.xml}} в
элементе \hyperlink{F:contest.xml,T:cap}{\V{cap}} для него
должен быть установлен бит \V{CONTROL\_CONTEST}.

\item
Кнопка ``Suspend clients'' приостанавливает обработку сервером
турнира \S{serve} запросов от CGI-программы \S{team}, запросы от
привилегированных программ \S{master} и \S{judge} продолжают
обрабатываться. В режиме приостановленной обработки участникам
турнира будет генерироваться html-страница, показывающая только
состояние турнира. Участники турнира не могут в это время
просматривать список своих посылок, список сообщений судьям и от
судей, сами сообщения. Участники не могут посылать решения на
проверку и посылать сообщения судьям.

В режиме приостановленной обработки запросов участников в
разделе состояния турнира (25) выводится дополнительная строка
``Team requests are suspended'', доступная и участника турнира.
В режиме приостановленной обработки кнопка ``Suspend clients''
заменяется на кнопку ``Resume clients'', нажав на которую можно
выключить режим приостановленной обработки запросов участников.

Для выполнения этой операции пользователем, в конфигурационном
файле турнира \hyperlink{F:contest.xml}{\V{contest.xml}} в
элементе \hyperlink{F:contest.xml,T:cap}{\V{cap}} для него
должен быть установлен бит \V{CONTROL\_CONTEST}.

\item
Кнопка ``Suspend testing'' приостанавливает автоматическую
проверку поступающих решений. В режиме приостановленной проверки
решений участники турнира могут выполнять все обычные действия,
включая и посылку решений на проверку, но посланное на проверку
решение не будет автоматически отправлено на компиляцию и
последующее тестирование. Вместо этого оно получит статус
``Available for testing'', в котором будет находится до тех пор,
пока не будет пересужено каким-либо способом. Данная возможность
полезна, когда требуется уменьшить нагрузку на сервер турнира
(особенно, если сервер турнира одновременно выполняет компиляцию
и тестирование решений) в последние минуты турнира, когда поток
решений особенно интенсивен.

Посылку со статусом ``Available for testing'' можно пересудить
одним из следующих способов:
\begin{itemize}
\item
Выбрав опцию ``Rejudge'' в строке состояния данной посылки на
главной странице программы \S{master}.
\item
Выбрав опцию ``Rejudge'' в режиме просмотра посылки (``View
source''), доступном из главной страницы программы \S{master}.
\item
Нажав на кнопку ``Rejudge all'' (см. ниже). При этом будут
пересужены все решения, находящиеся в базе посылок.
\item
Выбрав соответствующую задачу и нажав на кнопку ``Rejudge!'' в
разделе ``Rejudge problem'' (см. ниже). В этом случае будут
пересужены все решения указанной задачи.
\item
Нажав на кнопку ``Judge suspended runs'' (см. ниже). В этом
случае будут пересужены все решения в базе посылок, которые
имеют статус ``Available for testing''.
\end{itemize}

В режиме приостановленного тестирования решений участников в
разделе состояния турнира (25) выводится дополнительная строка
``Testing of team's submits is suspended'', доступная и
участника турнира. В этом режиме кнопка ``Suspend testing''
заменяется на кнопку ``Resume testing'', нажав на которую можно
выключить режим приостановленного тестирования решений
участников.

Для выполнения этой операции пользователем, в конфигурационном
файле турнира \hyperlink{F:contest.xml}{\V{contest.xml}} в
элементе \hyperlink{F:contest.xml,T:cap}{\V{cap}} для него
должен быть установлен бит \V{CONTROL\_CONTEST}.

\item
Кнопка ``Regenerate user passwords'' генерирует случайные пароли
участников турнира для всех непривилегированных участников.
Пароли привилегированных участников остаются без изменений.

В системе \S{ejudge} каждый пользователь может иметь два
независимых пароля: регистрационный пароль и пароль участника
турнира. Регистрационный пароль генерируется автоматически при
регистрации пользователя в системе \S{ejudge} и отправляется
электронной почтой на адрес, указанный при регистрации.
Пользователь может изменить этот пароль с помощью CGI-программы
\S{register}. Регистрационный пароль используется для входа в
программу \S{register}, а также привилегированные программы
\S{master} и \S{judge}, если пользователь имеет соответствующие
привилегии. Регистрационный пароль используется для входа в
программу \S{team}, если не установлен пароль участника.

Пароль участника турнира устанавливается администратором
турнира. Пароль участника турнира действует для входа в
программу \S{team}. В текущей версии системы \S{ejudge} пароль
участника турнира един для всех турниров. Если задан и пароль
участника, и регистрационный пароль, для входа в программу
\S{team} необходимо использовать пароль участника.

По нажатию на кнопку ``Regenerate user passwords'' генерируются
случайные пароли. Поскольку операция генерации пароля
необратима, после нажатия на данную кнопку будет выдана страница
подтверждения операции. Для выполнения обновления результатов на
странице подтверждения необходимо нажать на кнопку ``Yes,
generate passwords!''. После генерации паролей страница со всеми
сгенерированными паролями отображается веб-браузером. При этом
сбрасываются все идентификаторы сессий, созданные для участников
турнира. Таким образом, всем участникам турнира придётся заново
ввести своё регистрационное имя и пароль.

Для выполнения этой операции пользователем, в конфигурационном
файле турнира \hyperlink{F:contest.xml}{\V{contest.xml}} в
элементе \hyperlink{F:contest.xml,T:cap}{\V{cap}} для него
должен быть установлен бит \V{GENERATE\_TEAM\_PASSWORDS}.

\item
Кнопка ``Regenerate register user passwords'' генерирует
случайные регистрационные пароли для всех непривилегированных
участников турнира. Пароли привилегированных участников остаются
без изменений. Поскольку операция генерации паролей необратима,
после нажатия на данную кнопку будет выдана страница
подтверждения операции. Для выполнения обновления результатов на
странице подтверждения необходимо нажать на кнопку ``Yes,
generate passwords!''. После генерации паролей страница со всеми
сгенерированными паролями отображается веб-браузером. При этом
сбрасываются все идентификаторы сессий, созданные для участников
турнира. Таким образом, всем участникам турнира придётся заново
ввести своё регистрационное имя и пароль.

Для выполнения этой операции пользователем, в конфигурационном
файле турнира \hyperlink{F:contest.xml}{\V{contest.xml}} в
элементе \hyperlink{F:contest.xml,T:cap}{\V{cap}} для него
должен быть установлен бит \V{GENERATE\_TEAM\_PASSWORDS}.

\item
Кнопка ``Clear team passwords!'' сбрасывает пароли участников
турнира для всех непривилегированных участников турнира.
Поскольку операция сброса паролей необратима, после нажатия на
данную кнопку будет выдана страница подтверждения операции. Для
выполнения обновления результатов на странице подтверждения
необходимо нажать на кнопку ``Yes, clear passwords!''. После
этого пароль участника турнира считается не установленным, и для
входа в программу \S{team} может использоваться регистрационный
пароль.

Для выполнения этой операции пользователем, в конфигурационном
файле турнира \hyperlink{F:contest.xml}{\V{contest.xml}} в
элементе \hyperlink{F:contest.xml,T:cap}{\V{cap}} для него
должен быть установлен бит \V{GENERATE\_TEAM\_PASSWORDS}.

\item
Кнопка ``Reload server'' действует только тогда, когда сервер
турнира \S{serve} работает под управлением программы
\S{super-serve}. Тогда нажатие на эту кнопку приводит к
немедленному завершению работы программ \S{serve} и \S{run},
обслуживающих данных турнир. Они будут немедленно перезапущены,
и в результате сервер турнира будет перезагружен и
конфигурационные файлы считаны заново.

В режиме самостоятельной работы программы \S{serve} на нажатие
этой кнопки будет выдано сообщение об ошибке.

Для выполнения этой операции пользователем, в конфигурационном
файле турнира \hyperlink{F:contest.xml}{\V{contest.xml}} в
элементе \hyperlink{F:contest.xml,T:cap}{\V{cap}} для него
должен быть установлен бит \V{CONTROL\_CONTEST}.

\item
Здесь выводится текущее состояние сервера. Если в текущий момент
времени отображение текущих результатов турнира заморожено,
выводится сообщение ``Standings are frozen''. Кроме того
дополнительно выводятся сообщения о приостановке обслуживания
клиентов и о приостановке проверки решений.

\item
Кнопка ``Suspend printing'' позволяет приостановить обслуживание
запросов на печать, поступающих от непривилегированных
участников соревнования. Запросы на печать привилегированных
пользователей обслуживаются как обычно. Кнопка отображается,
только если глобальная конфигурационная переменная
\hyperlink{F:serve.cfg,T:enable_printing}{\V{enable\_printing}}
конфигурационного файла \hyperlink{F:serve.cfg}{\V{serve.cfg}}
установлена в значение \I{true}.

После нажатия на данную кнопку сервер турнира переходит в режим
приостановки обслуживания запросов на печать. В этом режиме все
запросы на печать, поступающие от непривилегированных клиентов,
немедленно отвергаются. Кроме этого, в CGI-программе \S{team}
перестаёт отображаться ссылка ``Print'', позволяющая участникам
печатать исходный текст посылок. Кнопка ``Suspend printing''
заменяется на кнопку ``Resume printing'' нажатие на которую
выключает режим приостановки обслуживания запросов на печать. 
\end{enumerate}

\subsection{Специальные элементы управления турниром}

\begin{figure}[htp]
\begin{center}
\includegraphics[width=0.95\textwidth]{snapshots/master_01.eps}
\end{center}
\caption{Элементы управления турниром в режиме \I{OLYMPIAD}}
\label{master:screenshot:1}
\end{figure}

На рис. \ref{master:screenshot:1} выделены элементы управления
турниром, доступные в турнире, проходящем по системе
\I{OLYMPIAD}. Дополнительно, данный турнир имеет неограниченную
продолжительность.

\begin{enumerate}
\item
Данная строка отображает режим проверки решений участников.
Турнир системы \I{OLYMPIAD} может находится в двух режимах:
режиме приёма решений от участников и в режиме проверки
решений. В режиме приёма решений от участников поступившее
или пересуживаемое решение запускается на приёмочных тестах.
Это --- первые несколько тестов из полного набора тестов для
данной задачи. Результаты запуска решения на приёмочных тестах
становятся немедленно доступными участнику. Цель проверки на
приёмочных тестах: убедиться, что программа соблюдает форматы
входных и выходных данных. В режиме проверки решений ведётся
полная проверка решений участников.

Сообщение ``Participant's solutions are being accepted''
означает, что сервер турнира находится в режиме приёма решений,
а сообщение ``Participant's solutions are being judged''
означает, что сервер турнира находится в режиме проверки
решений.

\item
Кнопка ``Set judging mode'' позволяет переключить сервер турнира
из режима приёма решений в режим проверки решений. В режиме
проверки решений данная кнопка трансформируется в кнопку ``Set
accepting mode'', которая переключает сервер турнира в режим
приёма решений.

\item
Так отображается продолжительность турнира в случае, когда она
не ограничена. Для турниров неограниченной продолжительности
кнопка изменения продолжительности ``Change duration'' не
работает.
\end{enumerate}

\subsection{Управление турниром после его окончания}

\begin{figure}[htp]
\begin{center}
\includegraphics[width=0.95\textwidth]{snapshots/master_06.eps}
\end{center}
\caption{Элементы управления турниром после его окончания}
\label{master:screenshot:6}
\end{figure}

На рис. \ref{master:screenshot:6} выделены элементы управления
турнира, доступные после окончания турнира. Эти элементы
управления описываются ниже.

\begin{enumerate}
\item
Текущее состояние турнира --- турнир завершён.

\item
Время начала турнира.

\item
Нажатие на кнопку ``Continue'' вызывает продолжение турнира.
Турнир может быть продолжен, если в конфигурационном файле
турнира \hyperlink{F:serve.cfg}{\V{serve.cfg}} глобальная
конфигурационная переменная
\hyperlink{F:serve.cfg,T:enable_continue}{\V{enable\_continue}}
установлена в \I{true}. Кроме того, установленная
продолжительность турнира должна быть такова, что продолжение
турнира не приведёт к немедленному его завершению из-за
истечения времени.

Если турнир заканчивается из-за истечения времени, его можно
продолжить в два шага: во-первых, увеличить продолжительность
турнира, чтобы текущий момент времени был бы до момента
завершения турнира, и, во-вторых, продолжить турнир с помощью
нажатия на кнопку ``Continue''.

Для выполнения этой операции пользователем, в конфигурационном
файле турнира \hyperlink{F:contest.xml}{\V{contest.xml}} в
элементе \hyperlink{F:contest.xml,T:cap}{\V{cap}} для него
должен быть установлен бит \V{CONTROL\_CONTEST}.

\item
Текущая продолжительность турнира.

\item
С помощью этого элемента управления можно изменить
продолжительность турнира. Изменение продолжительности турнира
после его окончания возможно только, если в конфигурационном
файле турнира \hyperlink{F:serve.cfg}{\V{serve.cfg}} глобальная
конфигурационная переменная
\hyperlink{F:serve.cfg,T:enable_continue}{\V{enable\_continue}}
установлена в \I{true}.

Для выполнения этой операции пользователем, в конфигурационном
файле турнира \hyperlink{F:contest.xml}{\V{contest.xml}} в
элементе \hyperlink{F:contest.xml,T:cap}{\V{cap}} для него
должен быть установлен бит \V{CONTROL\_CONTEST}.

\item
Фактическое время окончания турнира.
\end{enumerate}

\subsection{Элементы отображения журнала посылок}

\begin{figure}[htp]
\begin{center}
\includegraphics[width=0.95\textwidth]{snapshots/master_07.eps}
\end{center}
\caption{Элементы просмотра и редактирования журнала посылок}
\label{master:screenshot:7}
\end{figure}

На рис. \ref{master:screenshot:7} приведена часть главной
страницы, генерируемой CGI-программой \S{master}, на которой
находятся элементы просмотра и управления журналом посылок. Эти
элементы управления доступны как в течение турнира, так и после
его завершения. Все элементы подробно описаны ниже.

\begin{enumerate}
\item
Здесь показывается текущая статистика по посылкам текущего
турнира. ``Total submissions'' --- это общее количество посылок
в базе посылок. ``Filtered'' --- количество посылок после
фильтрации с помощью
\hyperlink{master:filter_expr}{выражения фильтра посылок}.
``Shown'' --- количество отображённых посылок. Если в выражении
фильтра посылок не указано количество отображаемых посылок,
отображается 20 последних посылок.

\item
В этом поле ввода задаётся
\hyperlink{master:filter_expr}{выражение фильтра посылок}. Чтобы
выражение фильтра посылок было применено, необходимо нажать
кнопку ``View'' (5). Чтобы сбросить выражение фильтра, необходимо
нажать на кнопку ``Reset filter'' (6). Если выражение фильтра не
определено, фильтр посылок отключён.

\item
Это поле ввода позволяет задать посылку, которая будет
отображаться первой в списке посылок.

\item
Это поле ввода позволяет задать посылку, которая будет
отображаться последней в списке посылок. Данное поле ввода
совместно с полем ввода (3) позволяет задать диапазон
отображаемых посылок. Пусть значение поля ``First run'' равно
$A$, а значение поля ``Last run'' равно $B$. Выбор диапазона
просмотра производится после фильтрации посылок в соответствии с
установленным фильтром посылок. Пусть после применения фильтра
посылок осталось $N$ посылок, удовлетворяющих этому фильтру.
Посылки нумеруются от 0 и до $N-1$. 

Если значение $A$ или $B$ отрицательно, то соответствующее
значение преобразуется в порядковый номер посылки среди
отобранных посылок по формуле $N + A$. Таким образом, номер
посылки $-1$ обозначает последнюю посылку среди отобранных.

Пусть $A'$, $B'$ --- номера посылок после описанного выше
преобразования. Тогда если $A' > B'$, то посылки выводятся в
обратном порядке от посылки с большим номером к посылке с
меньшим номером, то есть от более <<молодой>> к более
<<старой>>. Более старая посылка будет размещаться внизу
страницы. Если $A' \leqslant B'$, то посылки выводятся в
прямом порядке от посылки с меньшим номером к посылке с большим
номером, то есть от более <<старой>> к более <<молодой>>. Более
новая посылка будет размещаться внизу страницы.

\item
К помощью кнопки ``View'' включается фильтр посылок (2) и выбор
диапазона отображаемых посылок (3) и (4).

\item
С помощью кнопки ``Reset filter'' текущие установки фильтра
посылок и диапазона отображаемых посылок сбрасываются в значения
по умолчанию. По умолчанию фильтр посылок отключён, то есть
отображаются все посылки. Отображается не более 20 последних
посылок в обратном порядке (от более <<молодой>> к более
<<старой>>).

Следующие элементы отображения используются для показа
информации о посылках.

\item
В столбце ``Run ID'' отображается порядковый номер посылки в
базе посылок. Первая посылка имеет номер 0.

\item
В столбце ``Time'' отображается время от начала турнира до
момента получения этой посылки. Для турниров неограниченной
продолжительности предпочтительнее показывать не время,
прошедшее от начала турнира, а астрономическое время. Для этого
необходимо установить в значение \I{true} значение глобальной
конфигурационной переменной
\hyperlink{F:serve.cfg,T:show_astr_time}{\V{show\_astr\_time}}
конфигурационного файла турнира
\hyperlink{F:serve.cfg}{\V{serve.cfg}}.

\item
В столбце ``Size'' показывается размер программы в данной
посылки в байтах.

\item
В столбце ``IP'' показывается IP-адрес компьютера, с которого
была послана посылка.

\item
В столбце ``Team ID'' отображается идентификатор участника
турнира. Идентификатор участника турнира --- это целое число,
большее 0.

\item
В столбце ``Team name'' отображается имя участника турнира. Имя
участника вводится самим участником турнира при его регистрации
на турнир с помощью CGI-программы \S{register}. Если участник
турнира не установил имя участника, используется регистрационное
имя (login) участника.

\item
В столбце ``Problem'' отображается короткое имя задачи, решаемой
данной посылкой. Короткое имя задачи берётся из значения
конфигурационной переменной
\hyperlink{F:serve.cfg,S:problem,T:short_name}{\V{short\_name}}
раздела описания задачи конфигурационного файла
\hyperlink{F:serve.cfg}{\V{serve.cfg}}. Если по тем или иным
причинам идентификатору задачи, хранящемуся в базе данных, не
соответствует никакой задачи, печатается числовой идентификатор
задачи.

\item
В столбце ``Language'' отображается короткое имя языка
программирования, использованного в данной посылке. Короткое имя
языка программирования берётся из значения конфигурационной переменной
\hyperlink{F:serve.cfg,S:language,T:short_name}{\V{short\_name}}
раздела описания языка программирования конфигурационного файла
\hyperlink{F:serve.cfg}{\V{serve.cfg}}. Если по тем или иным
причинам идентификатору языка программирования, хранящемуся в
базе данных, не соответствует никакого языка, печатается
числовой идентификатор языка программирования.

\item
В столбце ``Result'' отображается статус данной посылки.
Возможное множество значений статуса посылки зависит от типов
турнира. Все возможные значения статуса перечислены в таблице
\ref{tableRunStatuses}.

\item
В столбце ``Failed test'' показывается минимальный номер теста,
на котором тестируемая программа дала неверный результат. В
случае решения, прошедшего все тесты, либо решения, получившего
статус ``Compilation error'', ``Ignored'', ``Accepted for
testing'', в данном столбце выводится \V{N/A}. Такое правило
действует только для турниров в режиме \I{ACM}.

Для турниров в режиме \I{KIROV} и \I{OLYMPIAD} этот столбец
называется ``Passed tests'' и показывает количество тестов, на
которых программа дала правильный ответ. В случаях, когда это
неприменимо (см. выше), выводится \V{N/A}. В указанных режимах
турнира в таблице посылок добавляется новый столбец ``Score'', в
котором отображается количество баллов, полученное за данную
попытку. Количество баллов отображается в формате
$S_1(A) = S_2$, где $S_1$ --- количество баллов заработанное на
тестах, $A$ --- номер попытки, $S_2$ --- количество баллов с
учётом штрафа за попытку.

\item
В столбце ``New result'' выводится список возможных статусов
посылки, которые можно установить с помощью кнопки ``change''
(18). Список возможных статусов зависит от режима турнира.

\item
С помощью кнопки ``change'' можно установить статус посылки,
выбранный с помощью меню ``New result'' (17).

\item
Ссылка ``View source'' позволяет переключиться в режим просмотра
исходного текста посылки и полной служебной информации об этой
посылки. Также в режиме просмотра исходного текста посылки
возможно редактирование служебной информации.

\item
Ссылка ``View report'' позволяет переключиться в режим просмотра
протокола тестирования посылки. 

\item
Ссылки быстрой навигации подробно описаны
\hyperlink{P:master,quick_nav}{выше}.

\end{enumerate}

\subsection{Элементы управления журналом посылок}

\begin{figure}[htp]
\begin{center}
\includegraphics[width=0.95\textwidth]{snapshots/master_08.eps}
\end{center}
\caption{Элементы управления журналом посылок}
\label{master:screenshot:8}
\end{figure}

На рис. \ref{master:screenshot:8} показаны элементы управления
журналом посылок, доступные администратору турнира. Все элементы
управления описываются далее.

\begin{enumerate}
\item
Ссылки быстрой навигации подробно описаны
\hyperlink{P:master,quick_nav}{выше}.

\item
Команда ``Rejudge all'' вызывает перетестирование всех посылок,
которые могут быть перетестированы. Посылка может быть
перетестирована при выполнении следующих условий:
\begin{itemize}
\item
поле \V{is\_readonly} посылки установлено в значение \I{false};
\item
поле \V{is\_imported} посылки установлено в значение \I{false};
\item
посылка выполнена по задаче, для которой конфигурационная
переменная
\hyperlink{F:serve.cfg,S:problem,T:disable_testing}{\V{disable\_testing}}
секции описания задачи конфигурационного файла турнира
\hyperlink{F:serve.cfg}{\V{serve.cfg}} установлена в значение
\I{false} (значение по умолчанию).
\end{itemize}

После нажатия на кнопку ``Rejudge all'' будет выдана страница
подтверждения операции. Для действительного выполнения операции
на странице подтверждения необходимо нажать кнопку ``Yes,
rejudge all''.

Команда пересуживания всех посылок доступна только
привилегированным пользователям, у которых в данном турнире
установлен бит полномочий \V{EDIT\_RUN}.

\item
Команда ``Judge suspended runs'' отправляет на тестирование все
посылки, которые могут быть перетестированы (см. выше) и которые
в базе посылок имеют статус \V{ACCEPTED}. Команда может
применяться для тестирования всех посылок, которые были
накоплены в период приостановленного тестирования, включённый
командой ``Suspend testing'' администратора турнира.

После нажатия на кнопку ``Judge suspended runs'' будет
сгенерирована страница подтверждения операции. Для
действительного выполнения операции на странице подтверждения
необходимо нажать кнопку ``Yes, judge''.

Данная команда доступна только привилегированным пользователям,
у которых в данном турнире установлен бит полномочий
\V{EDIT\_RUN}.

\item
Команда ``Squeeze runs'' выполняет <<чистку>> базы посылок. Из
неё удаляются все записи со статусом \V{EMPTY}. При этом у
оставшихся посылок может измениться их номер, что требует
изменения пути, по которому сохраняются исходный код программы и
протоколы тестирования в соответствующих архивных каталогах.
Если в базе посылок нет записей со статусом \V{EMPTY}, состояние
базы посылок не изменяется.

После нажатия на кнопку ``Squeeze runs'' запрашивается
подтверждение выполнения данной операции. Чтобы операция была
выполнена на странице подтверждения необходимо нажать на кнопку
``Yes, squeeze runs''.

Данная команда доступна только привилегированным пользователям,
у которых в данном турнире установлен бит полномочий
\V{CONTROL\_CONTEST}.

\item
Команда ``Rejudge problem'' позволяет пересудить посылки по
выбранной задаче. Пересуживаются только пересуживаемые посылки
(см. выше) по пересуживаемым задачам. Необходимо в меню выбрать
требуемую задачу, затем нажать на кнопку ``Rejudge''. Обратите
внимание, что подтверждение операции не запрашивается.

Данная команда доступна только привилегированным пользователям,
у которых в данном турнире установлен бит полномочий
\V{EDIT\_RUN}.

\item
Команда ``Import and Merge XML runlog'' позволяет
проимпортировать в идущий турнир базу посылок во внутреннем
XML-формате. Для включения возможности импортирования базы
посылок глобальная конфигурационная переменная
\hyperlink{F:serve.cfg,T:enable_l10n}{\V{enable\_runlog\_merge}}
конфигурационного файла турнира
\hyperlink{F:serve.cfg}{\V{serve.cfg}} должна быть установлена в
значение \I{true}.

Данная команда доступна только привилегированным пользователям,
у которых в данном турнире установлен бит полномочий
\V{IMPORT\_XML\_RUNS}.

База посылок во внутреннем XML-формате генерируется с помощью
команды ``Write XML runs (internal format)'' администратора
турнира. База посылок во внутреннем формате не содержит
информации об участниках, языках программирования и задачах, а
только их идентификаторы в записях о посылках, поэтому задачи,
языки программирования и участники должны быть согласованы во
всех точках проведения турнира, обменивающихся информацией о
посылках. Если при импорте будет обнаружено рассогласование,
импорт не будет выполнен.

При импорте база посылок будет автоматически упорядочена в
порядке возрастания астрономического времени приёма посылки и
(для одинакового времени) в порядке возрастания идентификатора
участника турнира. При импорте учитывается значение поля
\V{is\_imported} и флага \V{authoritative} импортируемой записи.
Если в импортируемой базе посылок и локальной базе посылок
обнаруживается запись, у которой совпадают время приёма посылки
\V{timestamp}, идентификатор участника \V{team}, идентификатор
языка программирования \V{language} и идентификатор задачи
\V{problem}, конфликт разрешается следующим образом:
\begin{itemize}
\item
Если флаг \V{is\_imported} не установлен, и флаг
\V{authoritative} импортируемой посылки также не установлен,
локальная посылка имеет приоритет (сохраняет в результирующем
журнале посылок), импортируемая посылка игнорируется.
\item
Если флаг \V{is\_imported} установлен, и флаг \V{authoritative}
не установлен, локальная посылка имеет приоритет, а в случае
несовпадения какого-либо из оставшихся полей локальной и
импортируемой посылок выдаётся диагностическое сообщение.
\item
Если флаг \V{is\_imported} не установлен, и флаг
\V{authoritative} импортируемой посылки установлен, локальная
посылка имеет приоритет. Такая ситуация возможна, когда
импортируется собственный журнал посылок данного сервера
турнира. При несовпадении какого либо из оставшихся полей
локальной и импортируемой посылки выдаётся диагностическое
сообщение.
\item
Если флаг \V{is\_imported} установлен, и флаг \V{authoritative}
импортируемой посылки также установлен, импортируемая посылка
имеет приоритет.
\end{itemize}

\item
Элементы управления 7---10 предназначены для посылки программ на
проверку в привилегированном режиме. Чтобы иметь возможность
посылать программы на проверку в привилегированном режиме у
пользователя должен быть установлен бит \V{SUBMIT\_RUN}
полномочий в файле конфигурации турнира
\hyperlink{F:contest.xml}{\V{contest.xml}}.

У привилегированных посылок автоматически устанавливается флаг
\V{is\_hidden}, то есть они не участвуют в подсчёте результата и
не отображаются в таблице результатов. С другой стороны,
привилегированные посылки могут выполняться до начала турнира и
после его завершения. Изменить флаг \V{is\_hidden} посылки можно
при редактировании данных посылки с помощью интерфейса
администратора CGI-программы \S{master} (см. ниже). 

С помощью элемента ``Problem'' необходимо выбрать задачу для
сдачи. Если задача вариантная (то есть значение конфигурационной
переменной
\hyperlink{F:serve.cfg,S:problem,T:variant_num}{\V{variant\_num}}
конфигурационного файла \hyperlink{F:serve.cfg}{\V{serve.cfg}}
больше нуля), привилегированный пользователь может выбрать любой
вариант задачи. Крайний срок сдачи задачи (см. конфигурационную
переменную задачи
\hyperlink{F:serve.cfg,S:problem,T:deadline}{\V{deadline}})
игнорируется, то есть для сдачи доступны даже задачи, крайний
срок сдачи которых истёк.

Элементы меню выбора имеют вид ``$S$ --- $L$'', где $S$ --- это
короткое имя задачи, определяемое конфигурационной переменной
\hyperlink{F:serve.cfg,S:problem,T:short_name}{\V{short\_name}}
раздела описания задачи, а $L$ --- это длинное имя, определяемое
конфигурационной переменной
\hyperlink{F:serve.cfg,S:problem,T:long_name}{\V{long\_name}}.
Для вариантных задач элементы меню выбора имеют вид
``$S$-$V$ --- $L$'', где $V$ --- номер варианта (целое число от
1 до значения конфигурационной переменной
\hyperlink{F:serve.cfg,S:problem,T:variant_num}{\V{variant\_num}}.

\item
С помощью элемента ввода ``Language'' необходимо выбрать язык
программирования. Привилегированному пользователю доступны все
языки программирования, включая языки, у которых установлена
конфигурационная переменная
\hyperlink{F:serve.cfg,S:language,T:disabled}{\V{disabled}}
секции описания языка программирования конфигурационного файла
задачи \hyperlink{F:serve.cfg}{\V{serve.cfg}}.

Элементы меню выбора имеют вид ``$S$ --- $L$'', где $S$ --- это
короткое языка программирования, определяемое конфигурационной
переменной 
\hyperlink{F:serve.cfg,S:language,T:short_name}{\V{short\_name}}
раздела описания языка программирования, а $L$ --- это длинное
имя, определяемое конфигурационной переменной
\hyperlink{F:serve.cfg,S:language,T:long_name}{\V{long\_name}}.

\item
С помощью элемента ``File'' необходимо выбрать файл с исходным
текстом программы. Для этого нужно нажать на кнопку ``Browse'',
и с помощью стандартного диалога выбора файла выбрать файл с
исходным текстом программы.

\item
При нажатии на кнопку ``Send'' программа будет передана серверу
турнира, который занесёт её в базу посылок и начнёт её
обработку.

\item
Кнопка ``Rejudge displayed runs'' отправляет на перетестирование
все посылки, которые отображаются в данном окне в соответствии с
выражением фильтра. Все остальные команды пересуживания посылок
являются, по сути, частными случаями данной команды.
\end{enumerate}

\subsection{Элементы просмотра журнала сообщений}

\begin{figure}[htp]
\begin{center}
\includegraphics[width=0.95\textwidth]{snapshots/master_09.eps}
\end{center}
\caption{Элементы просмотра журнала сообщений}
\label{master:screenshot:9}
\end{figure}

На рис. \ref{master:screenshot:9} представлены элементы
интерфейса пользователя для просмотра сообщений, поступающих от
участников и ответов судей участникам. Все интерфейсные элементы
подробно описаны далее.

Если глобальная конфигурационная переменная
\hyperlink{F:serve.cfg,T:disable_team_clars}{\V{disable\_team\_clars}}
установлена в \I{true}, участники турнира не будут иметь
возможность направлять сообщения судьям. Если глобальная
конфигурационная переменная
\hyperlink{F:serve.cfg,T:disable_clars}{\V{disable\_clars}}
установлена в \I{true}, то и участники турнира не будут иметь
возможность адресовать сообщения судьям, и, наоборот, судьи и
администратор турнира не будет иметь возможность писать
сообщения участникам. В последнем случае элементы просмотра
журнала сообщений и ввода текста нового сообщения не
отображаются на страницах администратора турнира и судей
турнира.

\begin{enumerate}
\item
Ссылки быстрой навигации подробно описаны
\hyperlink{P:master,quick_nav}{выше}.

\item
В этой строке показывается общее количество сообщений в базе
сообщений (как от участников судьям так и наоборот) и количество
отображённых сообщений. По умолчанию отображается 15 последних
сообщений, но изменить количество отображаемых сообщений можно с
помощью элементов интерфейса 3, 4 и 5.

\item
В данном поле ввода указывается номер первого сообщения для
просмотра.

\item
В данном поле указывается номер последнего сообщения для
просмотра.

\item
При нажатии на кнопку ``View'' отображаются сообщения в
соответствии со значениями, введёнными в элементах 3 и 4. Пусть
в настоящий момент в базе сообщений находятся $N$ сообщений.
Сообщения нумеруются от 0 (самое раннее сообщение) до $N-1$.
Пусть в поле ``First clar'' (3) введено значение $F$, а в поле
``Last clar'' (4) введено значение $L$. Сообщения будут
отображены в соответствии со следующими правилами.

\begin{itemize}
\item
Если значение $F < 0$, то это число задаёт номер сообщения,
считая от последнего, то есть $F' = N + F$, а в противном случае
$F' = F$.
\item
Если теперь $F' < 0$, то $F'' = 0$, а если $F' \geqslant N$, то
$F'' = N - 1$, а в противном случае $F'' = F'$ (проверяется
выход за границы допустимых изменений номера сообщения).
\item
Аналогичные вычисления проводятся для $L$. Если $L < $, то
$L' = N + L$, а иначе $L' = L$.
\item
Если $L' < 0$, то $L'' = 0$, а если $L' \geqslant N$, то
$L'' = N - 1$, а иначе $L'' = L'$.
\item
Если $F'' \leqslant L''$, то будет отображён список сообщений от
сообщения с номером $F''$ до сообщения с номером $L''$ в порядке
их поступления, то есть в порядке увеличения календарного
времени их получения сервером турнира. Если $F'' > L''$, то
отображается список сообщений от сообщения с номером $L''$ до
сообщения с номером $F''$ в обратном порядке, то есть от
сообщений, поступивших позже, к сообщениями, поступившим
раньше.
\end{itemize}

Таким образом, чтобы отобразить весь список сообщений, начиная с
последнего и до самого первого, в поле ``First clar'' достаточно
ввести значение $-1$, а в поле ``Last clar'' --- значение $0$.

\item
Элементы интерфейса 6---14 соответствуют столбцам таблицы
сообщений. В столбце ``Clar ID'' отображается порядковый номер
сообщения, который изменяется, как сказано выше, от 0 до $N-1$,
где $N$ --- общее число сообщений в базе.

\item
В столбце ``Flags'' отображаются флаг состояния сообщения.
Флаг состояния может иметь следующие значения:
\begin{itemize}
\item \K{N}.
<<Новое>> сообщение, то есть сообщение, которое ещё не было
просмотрено судьёй турнира. Судьёй в данном контексте считается
пользователь, использующий для просмотра сообщений CGI-программу
\S{judge}. Флаг сбрасывается, когда текст сообщения открывается
с помощью нажатия на ссылку ``View'' (14) в CGI-программе
\S{judge}. Просмотры сообщения в CGI-программе \S{master} не
не сбрасывают этот флаг.
\item \K{A}.
<<Отвеченное>> сообщение, то есть сообщение, которое было
просмотрено судьёй или администратором турнира с помощью нажатия
на ссылку ``View'' (14), и на которое был написан и отослан
автору сообщения или всем участникам турнира ответ. Флаг \V{A}
устанавливается при использовании как CGI-программы \S{judge},
так и CGI-программы \S{master}.
\end{itemize}

Если в столбце статуса не отображается ни один из описанных выше
статусов сообщения, значит данное сообщение не является ни
новым, ни отвеченным, то есть оно уже было просмотрено, но ответ
на него ещё не был разослан.

\item
В столбце ``Time'' отображается время, прошедшее от начала
турнира до момента получения сервером турнира \S{serve} этого
сообщения. Если в файле конфигурации турнира
\hyperlink{F:serve.cfg}{\V{serve.cfg}} установлена глобальная
конфигурационная переменная
\hyperlink{F:serve.cfg,T:show_astr_time}{\V{show\_astr\_time}},
в столбце ``Time'' отображается астрономическое время получения
сообщения. 

\item
В столбце ``IP'' отображается IP-адрес отправителя сообщения, то
есть IP-адрес компьютера, на котором работает браузер, в котором
отображаются страницы, генерируемые CGI-программой \S{master},
\S{judge} или \S{team}.

\item
В столбце ``Size'' отображается размер текста сообщения в
байтах.

\item
В столбце ``From'' указывается отправитель сообщения.
Отправитель может быть участником турнира, использующим
интерфейс турнира, поддерживаемый CGI-программой \S{team}, и в
этом случае здесь отображается имя участника турнира. Если
отправителем является привилегированный пользователь,
использующий CGI-программы \S{judge} или \S{master}, в столбце
``From'' отображается строка \V{Judges} вне зависимости от
конкретного привилегированного пользователя, отославшего данное
сообщение.

\item
В столбце ``To'' указывается адресат сообщения. Если сообщение
послано судьёй или администратором турнира и адресовано
участнику турнира, то в данном поле отображается имя участника
турнира. Если сообщение послано судьёй или администратором
турнира и адресовано всем участникам турнира, в данном поле
отображается строка \V{All}. Если сообщение послано участником
турнира судьям, то в данном поле отображается строка
\V{Judges}. Обычный участник турнира не может послать сообщение
всем участникам турнира или какому-либо конкретному участнику.

\item
В столбце ``Subject'' указывается тема сообщения. В таблице
сообщений длина строки темы сообщения ограничена 16 символами.
Полностью тему сообщения можно посмотреть при просмотре всего
сообщения с помощью ссылки ``View'' (14).

\item
С помощью ссылки ``View'' можно просмотреть полную тему и текст
сообщения и написать на него ответ.
\end{enumerate}

\subsection{Элементы интерфейса посылки сообщений}

\begin{figure}[htp]
\begin{center}
\includegraphics[width=0.95\textwidth]{snapshots/master_10.eps}
\end{center}
\caption{Элементы интерфейса посылки сообщений}
\label{master:screenshot:10}
\end{figure}

На рис. \ref{master:screenshot:10} показаны элементы интерфейса
CGI-программы \S{master}, предназначенные для составления и
рассылки сообщений конкретным участникам турнира или всем
участникам турнира. Все элементы интерфейса описаны далее.

Если глобальная конфигурационная переменная
\hyperlink{F:serve.cfg,T:disable_team_clars}{\V{disable\_team\_clars}}
установлена в \I{true}, участники турнира не будут иметь
возможность направлять сообщения судьям. Если глобальная
конфигурационная переменная
\hyperlink{F:serve.cfg,T:disable_clars}{\V{disable\_clars}}
установлена в \I{true}, то и участники турнира не будут иметь
возможность адресовать сообщения судьям, и, наоборот, судьи и
администратор турнира не будет иметь возможность писать
сообщения участникам. В последнем случае элементы просмотра
журнала сообщений и ввода текста нового сообщения не
отображаются на страницах администратора турнира и судей
турнира.

\begin{enumerate}
\item
В поле ``To userid'' вводится числовой идентификатор
пользователя, которому адресовано сообщение. Если сообщение
адресовано всем участникам турнира, в данном поле должно быть
введено число $0$.

\item
В поле ``To user login'' вводится регистрационное имя (login)
пользователя, которому адресовано сообщение. Если сообщение
адресовано всем участникам турнира, в данном поле должно быть
введена строка \V{all}.

Поля ввода ``To userid'' и ``To user login'' являются
взаимоисключающими. Если указан числовой идентификатор участника
турнира, то указание регистрационного имени не обязательно, и
наоборот. Если указаны и то, и другое, то используется значение
идентификатора пользователя. Если ни одно из полей не заполнено,
сообщение не может быть отослано.

\item
В поле ``Subject'' вводится тема сообщения. Размер строки темы
сообщения ограничен 80 символами. Более длинные темы будут
обрезаны на 80 символах. Кроме того, в таблице сообщений
отображаются только первые 16 символов темы.

\item
В данном поле вводится текст сообщения. Максимальный размер
текста сообщения, посылаемого привилегированным пользователем с
помощью CGI-программ \S{master} или \S{judge} ограничен
максимальным размером пакета в протоколе взаимодействия программ
\S{master} или \S{judge} и \S{serve} (в настоящее время --- 128
Кб) и максимальным размером данных, принимаемых CGI-программами
от браузера (в настоящее время --- ? Кб).

\item
Сообщение отсылается при нажатии на кнопку ``Send''.

\item
Ссылки быстрой навигации подробно описаны
\hyperlink{P:master,quick_nav}{выше}.

\end{enumerate}

\subsection{Выражение фильтра посылок}
\label{master:filter_expr}

Выражение фильтра посылок позволяет задать условия, которым
должны удовлетворять параметры посылок, чтобы быть показанными в
списке посылок, генерируемом CGI-программами \S{master} и
\S{judge}. Выражение фильтра должно иметь тип \V{bool}, а в
противном случае генерируется ошибка.

При генерации страницы привилегированного пользователя в
CGI-программе \S{judge} или \S{master} выражение фильтра
используется следующим образом. Выражение фильтра применяется ко
всем записям в базе посылок, и если на некоторой записи
результат вычисления выражения равен \V{true}, то данная запись
помечается как удовлетворяющая фильтру. Если при вычислении
выражения фильтра хотя бы для одной посылки возникла ошибка,
отображается информация об ошибке, а не результаты фильтрации.
Если при вычислении выражения фильтра для всех записей
завершилось успешно, из записей, удовлетворяющих выражению
фильтра, отображаются записи в соответствии с заданным номером
первой и номером последней записей.

Выражение фильтра посылок имеет Си-подобный синтаксис.
Пробельные символы, разделяющие элементы выражения,
игнорируются. В именах типов и полей регистр символов является
значимым.

\subsubsection{Типы данных}

Выражение фильтра посылок строго типизировано. Выражение может
состоять из операций над значениями следующих типов:

\begin{itemize}
\item \B{Булевский.}
Булевский тип имеет имя \V{bool}. Литералы булевского типа
обозначаются \V{false} и \V{true} соответственно.
\item \B{Целый.}
Целый тип имеет имя \V{int}. В текущей реализации целый тип
является 32-битным знаковым типом. Литералы целого типа могут
записываться в восьмеричной, десятичной и шестнадцатеричной
системах счисления как в языке Си. Знак <<минус>> перед числом
не является частью числа, а рассматривается как унарная операция
изменения знака.
\item \B{Строковой.}
Строковой тип имеет имя \V{string}. Литералы строкового типа
записываются либо в кавычках (\verb|"|), либо в апострофах
(\verb|'|). Литералы первого вида не могут содержать внутри себя
символ кавычки, а литералы второго вида --- символ апострофа.
\item \B{Календарный.}
Календарный тип имеет имя \V{date\_t} и предназначен для записи
астрономического времени. Литералов календарного типа не
существует. Астрономическое время при расчётах представляется в
формате \S{POSIX}, то есть как количество секунд, прошедших с 1
января 1970 года.
\item \B{Длительностный.}
Длительностный тип имеет имя \V{dur\_t} и предназначен для
записи длительностей. При расчётах длительностный тип
рассматривается как целый тип, и все длительности представляются
в секундах. Литералов длительностного типа не существует.
\item \B{Размерный.}
Размерный тип имеет имя \V{size\_t} и предназначен для
представления размеров объектов. Литералов размерного типа не
существует. При расчётах размерный тип рассматривается как
беззнаковый целый тип.
\item \B{Статусный.}
Статусный тип имеет имя \V{result\_t} и предназначен для
представления статуса посылки. Статусный тип --- это
перечислимый тип, состоящий из литералов \V{OK}, \V{CE}, \V{RT},
\V{TL}, \V{PE}, \V{WA}, \V{CF}, \V{PT}, \V{AC}, \V{IG}, \V{RU},
\V{CD}, \V{CG}, \V{AV}, \V{EM} (см. таблицу
\ref{tableRunStatuses}).
\item \B{Контрольный.}
Контрольный тип имеет имя \V{hash\_t} и предназначен для
представления значений контрольной суммы SHA1. Литералов
контрольного типа не существует.
\item \B{Адресный.}
Адресный тип имеет имя \V{ip\_t} и предназначен для
представления IP-адресов. Литералов адресного типа не
существует.
\end{itemize}

\subsubsection{Преобразования типов}

Выражение фильтра посылок строго типизировано, но для
преобразований значений одного типа в значения другого типа
могут использоваться операции преобразования типа. Операция
преобразования типа записывается в стиле Си++, то есть следующим
образом:
\begin{verbatim}
type-cast-op = type-name "(" expr ")"
\end{verbatim}
Здесь \V{type-name} --- имя типа, одно из перечисленных выше
\V{bool}, \V{int}, \V{string}, \V{date\_t}, \V{dur\_t},
\V{size\_t}, \V{result\_t}, \V{hash\_t}, \V{ip\_t}. Не все
возможные преобразования типов допустимы. Возможные комбинации
исходного типа и целевого типа показаны в таблице
\ref{tableValidTypeCasts}. В строках таблицы записан исходный
тип, а в столбцах таблицы --- целевой тип.

\begin{table}
\begin{center}
\begin{tabular}{|p{2cm}|p{1cm}|p{1cm}|p{1cm}|p{1cm}|p{1cm}|p{1cm}|p{1cm}|p{1cm}|p{1cm}|}
\hline
 & \scriptsize\V{bool}
 & \scriptsize\V{int}
 & \scriptsize\V{string}
 & \scriptsize\V{date\_t}
 & \scriptsize\V{dur\_t}
 & \scriptsize\V{size\_t}
 & \scriptsize\V{result\_t}
 & \scriptsize\V{hash\_t}
 & \scriptsize\V{ip\_t} \\
\hline
\scriptsize\V{bool}      & + & + & + &   &   &   &   &   &   \\
\scriptsize\V{int}       & + & + & + & + & + & + & + &   & + \\
\scriptsize\V{string}    & + & + & + & + & + & + & + & + & + \\
\scriptsize\V{date\_t}   & + & + & + & + &   &   &   &   &   \\
\scriptsize\V{dur\_t}    & + & + & + &   & + &   &   &   &   \\
\scriptsize\V{size\_t}   & + & + & + &   &   & + &   &   &   \\
\scriptsize\V{result\_t} & + & + & + &   &   &   & + &   &   \\
\scriptsize\V{hash\_t}   & + & + & + &   &   &   &   & + &   \\
\scriptsize\V{ip\_t}     & + & + & + &   &   &   &   &   & + \\
\hline
\end{tabular}
\end{center}
\caption{Допустимые комбинации типов в операции преобразования типов}
\label{tableValidTypeCasts}
\end{table}

Рассмотрим подробнее каждое нетривиальное преобразование типов.

\begin{itemize}
\item \K{int} к \K{bool}.
Даёт результат \V{false}, если приводимое целое значение равно
нулю, и \V{true} иначе.
\item \K{string} к \K{bool}.
Даёт результат \V{false}, если значение строки равно \V{false}
(без учёта регистра), и результат \V{true}, если значение строки
равно \V{true} (без учёта регистра). Если значение строки не
может быть распознано как булевский литерал, генерируется ошибка
вычисления выражения.
\item \K{date\_t} к \K{bool}.
Даёт результат \V{false}, если значение астрономического времени
во внутреннем формате равно нулю, и \V{true} иначе. На практике
астрономическое время может быть равно нулю (то есть 0:00:00 1 января
1970 года по Гринвичу), когда значение соответствующей
переменной или поля не установлено.
\item \K{dur\_t} к \K{bool}.
Даёт результат \V{false}, если значение длительности равно 0
секундам, и \V{true} иначе.
\item \K{size\_t} к \K{bool}.
Даёт результат \V{false}, если значение размера равно 0 байтам,
и \V{true} иначе.
\item \K{result\_t} к \K{bool}.
Даёт результат \V{true}, если значение статуса равно \V{OK}, и
\V{false} иначе. Обратите внимание на отличие семантики этой
операции от других операций преобразования в булевский тип.
\item \K{hash\_t} к \K{bool}.
Даёт результат \V{false}, если значение хэш-кода равно нулю, то
есть все 20 байт хэш-кода равны нулю, и \V{true} иначе. Нулевой
хэш-код означает, что значение соответствующего поля или
переменной не установлено.
\item \K{ip\_t} к \K{bool}.
Даёт результат \V{false}, если значение IP-адреса равно нулю, то
есть все 4 байта IP-адреса нулевые, и \V{true} иначе. Нулевой
IP-адрес означает, то значение соответствующего поля или
переменной не установлено.

\item \K{bool} к \K{int}.
Булевское значение \V{false} преобразуется в целое значение $0$,
а булевское значение \V{true} --- в целое значение $1$.
\item \K{string} к \K{int}.
Строка рассматривается как запись числа в восьмеричной,
десятичной или шестнадцатеричной нотации (в синтаксисе Си),
возможно со знаком. Если число записано корректно и при переводе
в 32-битный знаковый тип не возникает переполнения, результатом
операции является соответствующее число. В противном случае
генерируется ошибка.
\item \K{date\_t} к \K{int}.
Поскольку в настоящее время внутреннее представление типа
\V{date\_t} --- это 32-битное знаковое число, то значением
такого преобразования типов будет внутреннее представление
астрономического времени.
\item \K{dur\_t} к \K{int}.
Поскольку в настоящее время внутреннее представление типа
\V{dur\_t} --- это 32-битное знаковое число, то значением
такого преобразования типов будет внутреннее представление
промежутка времени, то есть число секунд в нём.
\item \K{size\_t} к \K{int}.
В настоящее время тип \V{size\_t} --- это 32-битный беззнаковый
целый тип. Если значение размера при переводе из беззнакового
представления в знаковое не вызывает переполнение (то есть
значение размера не превосходит $2^{31}-1$, выполняется
преобразование из беззнакового типа в знаковый без изменения
представления числа. В противном случае генерируется ошибка.
\item \K{result\_t} к \K{int}.
Результатом такого преобразования является числовое значение,
соответствующее коду статуса (см. таблицу
\ref{tableRunStatuses}).
\item \K{hash\_t} к \K{int}.
Результатом такого преобразования является целое значение,
составленное из первых 4 байтов хэш-кода. Предполагается, что
байты в числе записываются в порядке от младшего к старшему
(litte-endian).
\item \K{ip\_t} к \K{int}.
Поскольку IP-адрес (IPv4) состоит из 4 байт, эти 4 байта
рассматриваются как целое число со знаком, записанное в порядке
байт от старшего к младшему.

\item \K{bool} к \K{string}.
Значение \V{false} преобразовывается в строку \V{false}, а
значение \V{true} --- в строку \V{true}.
\item \K{int} к \K{string}.
Целое значение преобразуется в строку, содержащую запись
десятичного целого числа со знаком.
\item \K{date\_t} к \K{string}.
Астрономическое время преобразуется в строку вида
\begin{verbatim}
YYYY/MM/DD hh:mm:ss
\end{verbatim}
Здесь \V{YYYY} --- год, \V{MM} --- месяц (от 01 до 12),
\V{DD} --- день месяца (от 01 до 31), \V{hh} --- час (от 00 до
23), \V{mm} --- минута (от 00 до 59), \V{ss} --- секунда (от 00
до 59).
\item \K{dur\_t} к \K{string}.
Продолжительность преобразуется в строку вида
\begin{verbatim}
#h:mm:ss
\end{verbatim}
Здесь \V{\#} --- знак продолжительности (для положительной
продолжительности знак не выводится, а для отрицательной
печатается знак \V{-}), \V{h} --- число полных часов, \V{mm} ---
число минут в последнем неполном часе (от 00 до 59), \V{ss} ---
число секунд в последней неполной минуте (от 00 до 59).
\item \K{size\_t} к \K{string}.
Значение размера преобразуется в строку, содержащую запись
десятичного целого числа без знака.
\item \K{result\_t} к \K{string}.
Значение статуса преобразовывается в строку в соответствии с
таблицей \ref{tableRunStatuses} (столбец <<Выражение
фильтра>>). Например, значение статуса \V{RUN\_TIME\_ERR}
преобразуется в строке \V{RT}.
\item \K{hash\_t} к \K{string}.
Значение хэш-кода распечатывается в виде 40 шестнадцатеричных
цифр (по два символа на байт от первого байта хэш-кода к
последнему). В качестве шестнадцатеричных цифр используются
десятичные цифры и строчные латинские буквы от \V{a} до \V{f}.
\item \K{ip\_t} к \K{string}.
IP-адрес переводится в строку, содержащую запись адреса в
стандартной точечной нотации (то есть 4 десятичных числа от 0 до
255, разделённые точками).

\item \K{int} к \K{date\_t}.
Поскольку тип \V{date\_t} представляется как 32-битное целое
знаковое число, при данном преобразование целое значение
рассматривается как внутреннее представление астрономического
времени.
\item \K{string} к \K{date\_t}.
Для преобразования строки к типу астрономического времени строка
должна иметь значение, удовлетворяющее следующему формату
\begin{verbatim}
Y / M / D [ h [ : m [ : s ] ] ]
\end{verbatim}
Здесь запись \V{[ X ]}, означает, что элемент \V{X} может
отсутствовать, символы \V{/} и \V{:} представляют сами себя, а
\V{Y}, \V{M}, \V{D}, \V{h}, \V{m}, \V{s} --- это целые
десятичные числа. Они могут отделяться от \V{/} и \V{:}
произвольным количеством пробельных символов. \V{Y} --- это год,
который должен находиться в интервале от 1900 до 2100, \V{M} ---
порядковый номер месяца (от 1 до 12), \V{D} --- порядковый номер
дня в месяце (от 1 до 31), \V{h} --- час суток (от 0 до 23),
\V{m} --- минута (от 0 до 59), \V{s} --- секунда (от 0 до 59).
Если часы, минуты или секунды опущены, они полагаются равными
0. Кроме того, дата должна находится в диапазоне представимых
в \S{POSIX} дат (то есть примерно от 1906 до 2038 года). Если
все условия выполняются, строковая запись астрономического
времени конвертируется во внутреннее представление, а в
противном случае генерируется ошибка.

\item \K{int} к \K{dur\_t}.
Поскольку тип \V{dur\_t} представляется как 32-битное целое
знаковое число, при данном преобразование целое значение
рассматривается как внутреннее представление промежутка
времени.
\item \K{string} к \K{dur\_t}.
Для преобразования строки к длительностному значению строка
должна иметь значение, удовлетворяющее следующему формату.
\begin{verbatim}
[ # ] h [ : m [ : s ] ]
\end{verbatim}
Здесь запись \V{[ X ]}, означает, что элемент \V{X} может
отсутствовать. \V{\#} --- это знак \V{+} или \V{-}. \V{h}, \V{m}
и \V{s} --- положительные целые числа. \V{h} --- количество
часов, \V{m} --- количество минут (от 0 до 59), \V{s} ---
количество секунд (от 0 до 59). Если минуты или секунды опущены,
их число полагается равным 0. После перевода в секунды
длительность должна находится в диапазоне целых чисел,
представимых 32-битными знаковыми числами. Если все условия
выполняются, то строковая запись длительностного значения
конвертируется во внутреннее представление, а в противном случае
генерируется ошибка.

\item \K{int} к \K{size\_t}.
Поскольку \V{int} --- это 32-битный знаковый тип, а \V{size\_t}
--- 32-битный беззнаковый тип, неотрицательные значения типа
\V{int} преобразовываются в значения типа \V{size\_t}
тривиально. При попытке преобразования отрицательных чисел
генерируется ошибка.
\item \K{string} к \K{size\_t}.
Строка должна содержать запись беззнакового целого числа в
восьмеричной, десятичной или шестнадцатеричной системе (как в
языке Си). Число должно быть представимо 32-битным беззнаковым
числом. Если эти условия выполняются, происходит преобразование
строки в значение типа \V{size\_t}, а в противном случае
генерируется ошибка.

\item \K{int} к \K{result\_t}.
Целое значение должно быть равным одному из значений статусов,
перечисленных в таблице \ref{tableRunStatuses}. В этом случае
выполняется преобразование типа, а иначе генерируется ошибка.
\item \K{string} к \K{result\_t}.
Строка должна быть равна одной из строк, перечисленных в таблице
\ref{tableRunStatuses} в столбце <<Выражение фильтра>>. В этом
случае выполняется преобразование, в иначе генерируется ошибка.

\item \K{string} к \K{hash\_t}.
Строка должна содержать 40 шестнадцатеричных цифр (буквы от
\V{a} до \V{f} могут быть как заглавными, так и строчными).
Пробельные символы в начале и конце строки игнорируются. 40
шестнадцатеричных цифр конвертируются в 20-байтное значение
хэш-кода. Предполагается, что порядок байт в слове --- от
младшего к старшему (little-endian).

\item \K{int} к \K{ip\_t}.
Поскольку значения типа \K{ip\_t} представляются 32-битными
числами, преобразование из типа \V{int} не изменяет
представления данных, то есть целое число рассматривается как
запись IP-адреса во внутреннем представлении.
\item \K{string} к \K{ip\_t}.
Для преобразования строки к типу \V{ip\_t} строка должна иметь
значение, удовлетворяющее следующему шаблону.
\begin{verbatim}
A.B.C.D
\end{verbatim}
Здесь \V{.} --- это символ <<точка>>, а \V{A}, \V{B}, \V{C} и
\V{D} --- целые беззнаковые числа от 0 до 255. Если эти условия
выполняются строка конвертируется в соответствующее значение
типа \V{ip\_t}, а в противном случае генерируется ошибка.
\end{itemize}

\subsubsection{Примитивы доступа к базе посылок}

Текущей посылкой назовём обрабатываемую при вычислении выражения
фильтра посылку. На основании результата вычисления выражения
фильтра определяется, может ли быть отображена текущая посылка.

Примитивы доступа к базе посылок позволяют получать значения
полей как текущей посылки, так и любой другой посылки с заданным
номером. Примитивы имеют следующий общий вид:
\begin{verbatim}
f [ ( expr ) ]
\end{verbatim}
Здесь в квадратных скобках \V{[} и \V{]} записана необязательная
часть. Круглые скобки \V{(} и \V{)} обозначают сами себя. \V{f}
--- это имя примитива, а \V{expr} --- это выражение целого
типа. Если выражение в скобках не задано, то берётся значение
поля, соответствующего имени примитива \V{f}, текущей посылки.
Если выражение в скобках не является выражением целого типа,
генерируется ошибка. В противном случае выражение вычисляется, и
пусть при вычислении выражения ошибок не возникло, а $n$ ---
результат вычисления выражения.

Если $n < 0$, то $n$ задаёт номер посылки начиная от последней,
то есть $n' = N + n$, где $N$ --- общее количество посылок в
базе посылок в данный момент. В противном случае предполагаем,
что $n$ задаёт номер посылки начиная от нулевой, то есть $n' = n$.
Если теперь $n' < 0$ или $n' \geqslant N$, то генерируется
ошибка вычисления выражения фильтра. Если же $n'$ удовлетворяет
ограничениям, берётся значение поля, соответствующего имени
примитива \V{f}, в посылке с номером $n'$.

Примитивы доступа к базе посылок перечислены в таблице
\ref{tableRunlogPrimitives}.

\begin{table}
\begin{center}
\begin{tabular}{|>{\small\ttfamily}p{2.1cm}|>{\small\ttfamily}p{2cm}|>{\small}p{10.5cm}|}
\hline
  \normalsize\rmfamily\B{Имя примитива}
& \normalsize\rmfamily\B{Тип значения}
& \normalsize\B{Описание}\\
\hline
time & time\_t
& Астрономическое время получения посылки сервером (значение
  поля \V{timestamp}) \\

dur & dur\_t
& Длительность времени от начала турнира до получения посылки
  сервером\\

size & size\_t
& Размер исходного текста программы в байтах (значение поля
  \V{size}).\\

hash & hash\_t
& Хэш-код текста программы (значение поля \V{sha1}).\\

ip & ip\_t
& IP-адрес клиента, на котором работает веб-браузер, и с
  которого была получена данная посылка (значение поля
  \V{ip}).\\

uid & int
& Идентификатор пользователя, от имени которого была выполнена
  данная посылка (значение поля \V{team}). Идентификатор
  пользователя всегда больше нуля. \\
login & string
& Регистрационное имя (login) пользователя, от имени которого
  была выполнена данная посылка.\\
lang & string
& Короткое имя языка программирования, который был использован в
  данной посылке. Идентификатор языка программирования находится
  в поле \V{language} записи базы посылок, а короткое имя
  языка программирования берётся из значения конфигурационной
  переменной
  \hyperlink{F:serve.cfg,S:language,T:short_name}{\V{short\_name}}
  секции описания языка программирования файла конфигурации турнира
  \hyperlink{F:serve.cfg}{\V{serve.cfg}}.\\
prob & string
& Короткое имя задачи, решаемой в данной посылке. Идентификатор
  задачи находится в поле \V{problem} записи базы посылок, а
  короткое имя задачи берётся из значения конфигурационной переменной
  \hyperlink{F:serve.cfg,S:problem,T:short_name}{\V{short\_name}}
  секции описания задачи файла конфигурации турнира
  \hyperlink{F:serve.cfg}{\V{serve.cfg}}.\\
result & result\_t
& Статус посылки (значение поля \V{status}). \\
status & result\_t
& То же самое. \\
score & int
& Балл за данную посылку без учёта штрафных баллов за посылки
  (значение поля \V{score}). \\
test & int
& Минимальный номер теста, на котором программа дала неверный
  результат, или количество успешно пройденных тестов в
  зависимости от типа турнира. \\
imported & bool
& Флаг импортированной посылки (значение поля
  \V{is\_imported}). \\
hidden & bool
& Флаг скрытой посылки (значение поля \V{is\_hidden}). \\
readonly & bool
& Флаг неизменяемой посылки (значение поля \V{is\_readonly}). \\
variant & int
& Действительный вариант. Если для вариантной задачи номер
  варианта, хранящийся в базе посылок (значение поля
  \V{variant}), равен 0, используется номер варианта,
  установленный в файле карты вариантов, устанавливаемом
  глобальной конфигурационной переменной 
  \hyperlink{F:serve.cfg,T:variant_map_file}{\V{variant\_map\_file}}
  конфигурационного файла описания турнира
  \hyperlink{F:serve.cfg}{\V{serve.cfg}}. \\
rawvariant & int
& Хранимый вариант задачи в посылке (значение поля
  \V{variant}). \\
\hline
\end{tabular}
\end{center}
\caption{Примитивы доступа к базе посылок}
\label{tableRunlogPrimitives}
\end{table}

\subsubsection{Другие примитивы}

В выражении фильтра можно использовать примитивы для получения
текущего времени, текущей продолжительности турнира и некоторые
другие. Все такие примитивы рассмотрены в данном разделе.
Примитивы имеют следующий общий вид:
\begin{verbatim}
p
\end{verbatim}
где \V{p} --- это имя примитива. Примитивы перечислены в таблице
\ref{tableRunlogOtherPrimitives}.

\begin{table}[htp]
\begin{center}
\begin{tabular}{|>{\small\ttfamily}p{2.1cm}|>{\small\ttfamily}p{2cm}|>{\normalsize}p{10.5cm}|}
\hline
  \normalsize\rmfamily\B{Имя примитива}
& \normalsize\rmfamily\B{Тип значения}
& \normalsize\B{Описание}\\
\hline
id & int
& Номер текущей посылки. \\
now & time\_t
& Текущее астрономическое время. \\
start & time\_t
& Астрономическое время начала турнира. \\
finish & time\_t
& Астрономическое время завершения турнира. \\
total & int
& Общее количество записей в базе посылок. \\
\hline
\end{tabular}
\end{center}
\caption{Прочие примитивы}
\label{tableRunlogOtherPrimitives}
\end{table}

\subsubsection{Приоритеты операций}

В данном разделе перечислены все операции, допустимые в
выражении фильтра. Операции перечисляются в порядке убывания
приоритета от наиболее приоритетных к наименее приоритетным.

\begin{itemize}
\item
Все литеральные значения (булевские, целые, строковые,
статусные), все примитивы, операции преобразования типа,
операция записи выражения в скобках \V{(}\I{expr}\V{)}.
\item
Префиксные операции \V{\~}, \V{!}, \V{-}, \V{+}. Префиксные
операции читаются справа налево.
\item
Мультипликативные операции \V{*}, \V{/}, \V{\%}.
Мультипликативные операции левоассоциативны, то есть читаются
слева направо.
\item
Аддитивные операции \V{+}, \V{-}. Они читаются также слева
направо.
\item
Операции сдвига \verb|<<| и \verb|>>|. Читаются слева направо.
\item
Операции отношений \V{==}, \V{!=}, \V{<}, \V{>}, \V{<=},
\V{>=}. Читаются слева направо.
\item
Операция побитового <<и>> \verb|&|. Читается слева направо.
\item
Операция побитового исключающего <<или>> \verb|^|. Читается
слева направо.
\item
Операция побитового <<или>> \verb"|". Читается слева направо.
\item
Операция логического <<и>> \verb|&&| или \verb|and| (эти формы
записи синонимичны). Читается слева направо.
\item
Операция логического <<или>> \verb"||" или \verb|or| (эти формы
записи синонимичны). Читается слева направо.
\end{itemize}

Далее рассмотрим все перечисленные операции.

\subsubsection{Операция побитового отрицания \V{\~}}

Операция применима только к значению типа \V{int}. Результат
операции --- значение типа \V{int}, получаемое побитовым
отрицанием первого значения.

\subsubsection{Операция логического отрицания \V{!}}

Операция применима только к значению типа \V{bool}. Результат
операции --- значение типа \V{bool}, получаемое логическим
отрицанием исходного значения.

\subsubsection{Операция смены знака \V{-}}

Унарная операция смены знака применима только к значению типа
\V{int}. Результат операции --- значение типа \V{int} с
противоположным знаком. Если результат операции не представим
в типе \V{int} (то есть 32-битным знаковым числом),
диагностируется ошибка переполнения.

\subsubsection{<<Пустая>> операция \V{+}}

Данная операция применима только к значению типа \V{int} и даёт
результат типа \V{int}. Результирующее значение равно
исходному.

\subsubsection{Операция умножения \V{*}}

Для операции умножения возможны следующие комбинации типов
операндов.

\begin{itemize}
\item
Оба аргумента имеют тип \V{int}. Результат имеет тип \V{int}.
Если результат не представим в типе \V{int} диагностируется
переполнение.
\item
Один аргумент имеет тип \V{int}, а другой --- \V{dur\_t}. В этом
случае результат имеет тип \V{dur\_t}. Если произведение
аргументов не представимо в типе \V{dur\_t}, диагностируется
переполнение.
\item
Один аргумент имеет тип \V{int}, а другой --- \V{size\_t}.
Значение аргумента целого типа в данном случае должно быть
больше нуля. Произведение имеет тип \V{size\_t}. Если значение
произведения не представимо в типе \V{size\_t}, диагностируется
переполнение.
\end{itemize}

\subsubsection{Операция целочисленного деления \V{/}}

Для операции целочисленного деления возможны следующие
комбинации типов операндов. Если делитель равен нулю,
диагностируется ошибка деления на ноль. Если результат операции
не представим в типе результата, диагностируется ошибка
переполнения. Например, при делении минимального значения типа
\V{int}, равного $-2^{31}$ на \V{-1} получается значение
$2^{31}$, не представимое в типе \V{int}.

\begin{itemize}
\item
Оба аргумента имеют тип \V{int}. Тогда результат имеет тип
\V{int}.
\item
Оба аргумента имеют тип \V{dur\_t}. Тогда результат имеет тип
\V{int}.
\item
Оба аргумента имеют тип \V{size\_t}. Тогда результат имеет тип
\V{int}.
\item
Делимое имеет тип \V{dur\_t}, а делитель --- тип \V{int}. Тогда
результат имеет тип \V{dur\_t}.
\item
Делимое имеет тип \V{size\_t}, а делитель --- тип \V{int}.
Результат в этом случае имеет тип \V{size\_t}. Делитель должен
быть положителен.
\end{itemize}

\subsubsection{Операция взятия остатка от деления \V{\%}}

Операция взятия остатка поддерживает несколько комбинаций типов
аргументов. Если делитель равен нулю, диагностируется ошибка
деления на ноль. Если тип делителя --- какой-либо знаковый тип
(например, \V{int} или \V{dur\_t}), и делитель отрицателен,
диагностируется ошибка неверного аргумента. Если результат
операции не представим в типе результата, диагностируется ошибка
переполнения. Допустимые комбинации типов операндов перечислены
ниже.
 
\begin{itemize}
\item
Оба аргумента имеют тип \V{int}. Тогда результат имеет тип
\V{int}.
\item
Оба аргумента имеют тип \V{dur\_t}. Тогда результат имеет тип
\V{int}.
\item
Оба аргумента имеют тип \V{size\_t}. Тогда результат имеет тип
\V{int}.
\item
Делимое имеет тип \V{dur\_t}, а делитель --- тип \V{int}. Тогда
результат имеет тип \V{dur\_t}.
\item
Делимое имеет тип \V{size\_t}, а делитель --- тип \V{int}.
Результат в этом случае имеет тип \V{size\_t}.
\end{itemize}

\subsubsection{Операция сложения \V{+}}

Операция сложения применима ко многим комбинациям типов
операндов. В любом случае, если результат операции не представим
в типе результата, генерируется ошибка переполнения. Допустимые
комбинации типов операндов перечислены ниже.

\begin{itemize}
\item
Оба аргумента имеют тип \V{int}. Результат также имеет тип
\V{int}.
\item
Оба аргумента имеют тип \V{string}. Результат имеет тип
\V{string} и равен конкатенации двух строк.
\item
Оба аргумента имеют тип \V{dur\_t}. Результат также имеет тип
\V{dur\_t}.
\item
Оба аргумента имеют тип \V{size\_t}. Результат также имеет тип
\V{size\_t}.
\item
Один аргумент имеет тип \V{int}, а другой --- \V{time\_t}.
Результат имеет тип \V{time\_t}.
\item
Один аргумент имеет тип \V{int}, а другой --- \V{dur\_t}.
Результат имеет тип \V{dur\_t}.
\item
Один аргумент имеет тип \V{time\_t}, а другой --- \V{dur\_t}.
Результат имеет тип \V{time\_t}.
\end{itemize}

\subsubsection{Операция вычитания \V{-}}

Операция вычитания применима ко многим комбинациям типов
операндов. В любом случае, если результат операции не представим
в типе результата, генерируется ошибка переполнения. Допустимые
комбинации типов операндов перечислены ниже.

\begin{itemize}
\item
Оба аргумента операции имеют тип \V{int}. Результат также имеет
тип \V{int}.
\item
Первый аргумент операции имеет тип \V{int}, а второй ---
\V{dur\_t}. Результат операции имеет тип \V{dur\_t}.
\item
Первый аргумент операции имеет тип \V{time\_t}, а второй ---
\V{int}. Результат операции имеет тип \V{time\_t}.
\item
Оба аргумента операции имеют тип \V{time\_t}. В этом случае
результат имеет тип \V{dur\_t}.
\item
Первый аргумент операции имеет тип \V{time\_t}, а второй ---
\V{dur\_t}. Результат имеет тип \V{time\_t}.
\item
Первый аргумент имеет тип \V{dur\_t}, а второй --- \V{int}.
Результат имеет тип \V{dur\_t}.
\item
Оба аргумента операции имеют тип \V{dur\_t}. В этом случае
результат имеет тип \V{dur\_t}.
\item
Первый аргумент операции имеет тип \V{size\_t}, а второй ---
\V{int}. Тогда результат имеет тип \V{size\_t}.
\item
Оба аргумента операции имеют тип \V{size\_t}. В этом случае
результат имеет тип \V{int}.
\end{itemize}

\subsubsection{Операции сдвига \V{<{}<{}} и \V{>{}>{}}}

Операции побитового сдвига влево \V{<{}<{}} и побитового сдвига
вправо \V{>{}>{}} применимы только к операндам типа \V{int}.
Результат операции имеет тип \V{int}. Второй аргумент операции
(количество бит сдвига) должен находиться в отрезке от 0 до 32
включительно. Если это условие не выполняется, генерируется
ошибка недопустимого аргумента операции. Сдвиг вправо
выполняется как побитовый сдвиг, то есть на место старших
разрядов числа помещаются нулевые биты. Переполнения при сдвиге
влево не диагностируется.

\subsubsection{Операции отношения \V{==} и \V{!=}}

Операции проверки на равенство или неравенство применимы ко всем
типам данных. Оба аргумента должны иметь один и тот же тип.
Неявных преобразований типа не производится. Результат операции
имеет тип \V{bool}.

\subsubsection{Операции отношения \V{<}, \V{>}, \V{<=}, \V{>=}}

Данные операции применимы ко всем типам данных, кроме
\V{result\_t}, \V{hash\_t} и \V{ip\_t}. Оба аргумента операции
должны иметь один и тот же тип данных. Результат операции имеет
тип \V{bool}.

\subsubsection{Побитовые операции \V{\^}, \V{\&}, \V{|}}

Побитовые операции применимы только к аргументам типа \V{int} и
в результате дают значение типа \V{int}.

\subsubsection{Логические операции \V{\&\&} и \V{||}}

Логические операции применимы только к аргументам типа \V{bool}
и дают в результате значение типа \V{bool}. Как и в языке Си
значение второго аргумента операции не вычисляется, если
значение всего выражение известно.

\subsection{Интерфейс управления участниками турнира}

\begin{figure}[htp]
\begin{center}
\includegraphics[width=0.95\textwidth]{snapshots/master_11.eps}
\end{center}
\caption{Интерфейс управления участниками турнира}
\label{master:screenshot:11}
\end{figure}

На рис. \ref{master:screenshot:11} приведён вид элементов
управления участниками турнира, доступный с помощью
CGI-программы администратора турнира \S{master}. Для просмотра и
управления участниками турнира в главной странице управления
турниром, а также на страницах просмотра текста программы
решения, протокола тестирования, текущих результатов
тестирования и сообщений участников нажать на ссылку
``View teams''.

Чтобы пользователь имел полномочия просматривать список
участников турнира, в конфигурационном файле турнира
\hyperlink{F:contest.xml}{\V{contest.xml}} в элементе
\hyperlink{F:contest.xml,T:cap}{\V{cap}} для него должен быть
установлен бит \V{LIST\_CONTEST\_USERS}.

Элементы управления участниками турнира рассмотрены ниже.

\begin{enumerate}
\item
Ссылки быстрой навигации, доступные на данной странице, немного
отличаются от ссылок быстрой навигации на главной странице.
\begin{itemize}
\item
Ссылка ``Main page'' вызывает переход на главную страницу
управления турниром.
\item
Ссылка ``Stangings'' вызывает переход к таблице текущих
результатов турнира.
\item
Ссылка ``Refresh'' вызывает обновление данной страницы.
\item
Нажатие на ссылку ``Log out'' приводит к завершению сеанса
работы пользователя с программой \S{master}.
\end{itemize}
\item
В данной строке отображается общее количество команд,
зарегистрировавшихся на турнир.

\item
Элементы управления 3---13 --- это столбцы в таблице
пользователей турнира.

В столбце ``User ID'' отображаются идентификаторы участников
турнира. Идентификатор участника --- это целое число, большее
0. Для каждого участника идентификатор в таблице представлен как
гиперссылка. При нажатии на эту гиперссылку происходит возврат
на главную страницу CGI-программы \S{master}, и при этом
устанавливается выражение фильтра вида \V{"{}uid == $I$"{}}, где
$I$ --- это идентификатор текущего участника. Такое выражение
фильтра отбирает только посылки данного участника.

\item
В столбце ``User Login'' отображается регистрационное имя
пользователя.

\item
В столбце ``User Name'' отображается имя пользователя. Имя
пользователя устанавливается самим пользователем при регистрации
на турнир.

\item
В столбце ``Flags'' отображаются флаги, установленные для
данного участника. Для участника могут быть установлены три
флага в любой комбинации.
\begin{itemize}
\item Флаг \B{banned}.
Если для пользователя установлен этот флаг, участие пользователя
в данном турнире запрещено администратором. Пользователь не
сможет войти на страницу сдачи решений, его результаты не
отображаются в таблице текущих результатов турнира.
\item Флаг \B{invisible}.
Если для пользователя установлен данный флаг, результаты
пользователя не отображаются в таблице текущих результатов.
Участник, у которого установлен этот флаг, может использовать
CGI-программы \S{master}, \S{judge} или \S{team}, может посылать
решения и т. д. Рекомендуется устанавливать флаг ``invisible''
для привилегированных пользователей турнира (администратора,
судей и т. д.).
\item Флаг \B{locked}.
Пользователь, у которого установлен данный флаг, не может
использовать программы \S{master}, \S{judge} или \S{team}, то
есть не может сдавать решения. Однако, результаты пользователя
отображаются в таблице текущих результатов турнира. Данный флаг
удобно устанавливать у пользователей, составляющих невиртуальную
часть таблицы результатов виртуального турнира.
\end{itemize}

\item
В столбце ``Number of runs'' отображается общее количество
посылок, выполненных данным пользователем в данном турнире на
текущий момент. Если это число равно 0, значит пользователь ещё
не посылал решения на проверку. Обратите внимание, что для
непривилегированных посылок действует ограничение на
максимальное количество посылок, которое устанавливается
глобальной конфигурационной переменной
\hyperlink{F:serve.cfg,T:max_run_num}{\V{max\_run\_num}}
конфигурационного файла описания турнира
\hyperlink{F:serve.cfg}{\V{serve.cfg}}.

\item
В столбце ``Size of runs'' отображается суммарный размер всех
программ, переданных данным пользователем на проверку в данном
турнире на текущий момент. Обратите внимание, что для
непривилегированных посылок действует ограничение на
максимальный суммарный размер посылок, которое устанавливается
глобальной конфигурационной переменной
\hyperlink{F:serve.cfg,T:max_run_total}{\V{max\_run\_total}}
конфигурационного файла описания турнира
\hyperlink{F:serve.cfg}{\V{serve.cfg}}.

\item
В столбце ``Number of clars'' отображается общее количество
сообщений, посланных данным пользователем в данном турнире на
текущий момент. Для непривилегированных пользователей действует
ограничение на максимальное количество сообщений жюри, которое
устанавливается глобальной конфигурационной переменной
\hyperlink{F:serve.cfg,T:max_clar_num}{\V{max\_clar\_num}}
конфигурационного файла описания турнира
\hyperlink{F:serve.cfg}{\V{serve.cfg}}.

\item
В столбце ``Size of clars'' отображается суммарный размер всех
сообщений, посланных данным пользователем на текущий момент
времени. Для непривилегированных пользователей действует
ограничение на максимальный суммарный размер сообщений жюри,
которое устанавливается глобальной конфигурационной переменной
\hyperlink{F:serve.cfg,T:max_clar_total}{\V{max\_clar\_total}}
конфигурационного файла описания турнира
\hyperlink{F:serve.cfg}{\V{serve.cfg}}.

\item
С помощью кнопки ``Ban''/``Unban'' можно установить или сбросить
флаг ``banned'' для данного пользователя. Если у пользователя
флаг ``banned'' не установлен, данная кнопка отображается в виде
``Ban'', и при нажатии на эту кнопку устанавливается флаг
``banned''. Если у пользователя флаг ``banned'' уже установлен,
данная кнопка отображается в виде ``Unban'', и при нажатии на
эту кнопку флаг ``banned'' сбрасывается.

\item
С помощью кнопки ``Make invisible''/``Make visible'' можно
установить или сбросить флаг ``invisible'' для данного
пользователя. Если у пользователя флаг ``invisible'' не
установлен, данная кнопка отображается в виде
``Make invisible'', и при нажатии на эту кнопку устанавливается
флаг ``invisible''. Если у пользователя флаг ``invisible'' уже
установлен, данная кнопка отображается в виде ``Make visible'',
и при нажатии на эту кнопку флаг ``invisible'' сбрасывается.

\item
С помощью кнопки ``Lock''/``Unlock'' можно установить или
сбросить флаг ``locked'' для данного пользователя. Если у
пользователя флаг ``locked'' не установлен, данная кнопка
отображается в виде ``Lock'', и при нажатии на эту кнопку
устанавливается флаг ``locked''. Если у пользователя флаг
``locked'' уже установлен, данная кнопка отображается в виде
``Unlock'', и при нажатии на эту кнопку флаг ``locked''
сбрасывается. 

\end{enumerate}

\subsection{Интерфейс редактирования посылок}

\begin{figure}[htp]
\begin{center}
\includegraphics[width=0.95\textwidth]{snapshots/master_12.eps}
\end{center}
\caption{Интерфейс редактирования посылок}
\label{master:screenshot:12}
\end{figure}

На рис. \ref{master:screenshot:12} показан вид (верхняя часть)
экрана редактирования информации о посылке. К редактированию
посылки можно перейти, нажав на ссылку ``View'' некоторой
посылки на главном экране программы \S{master}. Далее
рассматриваются элементы интерфейса страницы редактирования
посылок.

\begin{enumerate}
\item
Ссылки быстрой навигации позволяют переключиться на другой экран
программы \S{master}. Доступны следующие ссылки быстрой
навигации:
\begin{itemize}
\item ``Main page''
вызывает переход на главную страницу программы \S{master}.
\item ``Standings''
вызывает переход на страницу просмотра текущих результатов
турнира.
\item ``View teams''
вызывает переход на страницу просмотра информации об участниках
турнира.
\item ``Refresh''
вызывает обновление данной страницы.
\item ``View report''
вызывает переход к странице просмотра протокола тестирования для
текущей посылки.
\item ``View team report''
вызывает переход к странице просмотра протокола тестирования для
текущей посылки, предназначенного для участника турнира. Данная
ссылка отображается, только если глобальная конфигурационная
переменная
\hyperlink{F:serve.cfg,T:team_enable_rep_view}{\V{team\_enable\_rep\_view}}
конфигурационного файла \hyperlink{F:serve.cfg}{\V{serve.cfg}}
установлена в \I{true}.
\item ``Log out''
приводит к выходу пользователя из программы \S{master} и
завершению сессии работы.
\end{itemize}

\item
В поле ``Run ID'' отображается идентификатор посылки. Первая
(самая ранняя) посылка имеет идентификатор 0. Текущая версия
системы \S{ejudge} имеет ограничение на максимальное количество
посылок, равное 100000. См. также описание поля
\hyperlink{F:run.log,T:submission}{\V{submission}} журнала
посылок \hyperlink{F:run.log}{\V{run.log}}.

\item
Поле ``Submission time'' показывает астрономическое время, когда
была выполнена данная посылка, точнее, когда она была получена
сервером турнира \S{serve}. Время отображается в формате
\V{YYYY/MM/DD hh:mm:ss}, где \V{YYYY} --- год, \V{MM} --- номер
месяца в году (от 1 до 12), \V{DD} --- день месяца (от 1 до 31),
\V{hh} --- часы (от 0 до 23), \V{mm} --- минуты, и \V{ss} ---
секунды. См. также описание поля
\hyperlink{F:run.log,T:timestamp}{\V{timestamp}} журнала
посылок \hyperlink{F:run.log}{\V{run.log}}.

\item
Поле ``Contest time'' показывает время от начала турнира до
момента получения сервером турнира данной посылки. Время
отображается в формате \V{h:mm:ss}, где \V{h} --- количество
часов, \V{mm} --- минут, и \V{ss} --- секунд.

\item
Поле ``Originator IP'' показывает IP-адрес клиента, с которого
была выполнена посылка. IP-адрес показывается в стандартной
точечной нотации. IP-адрес генерируется как ссылка, нажав на
которую происходит возврат на основной экран программы
\S{master} с одновременной установкой фильтра посылок таким
образом, чтобы отображались только посылки, выполненные с
данного IP-адреса. См. также описание поля
\hyperlink{F:run.log,T:ip}{\V{ip}} журнала посылок
\hyperlink{F:run.log}{\V{run.log}}.

\item
Поле ``Size'' показывает размер исходного текста посылки в
байтах. Размер показывается как ссылка, при нажатии на которую
происходит возврат на главный экран программы \S{master} с
одновременной установкой фильтра посылок таким образом, чтобы
отображались только посылки, у которых размер исходного текста
совпадает с размером исходного текста данной посылки. См. также
описание поля \hyperlink{F:run.log,T:size}{\V{size}} журнала
посылок \hyperlink{F:run.log}{\V{run.log}}.

\item
Поле ``Hash value'' показывает контрольную сумму исходного
текста программы данной посылки. Контрольная сумма вычисляется
по алгоритму SHA1 и представляется как 20-байтное число в
шестнадцатеричном виде. Контрольная сумма показывается как
гиперссылка, при нажатии на которую происходит возврат на
главный экран программы \S{master} с одновременной установкой
фильтра посылок таким образом, чтобы отображались только
посылки, у которых контрольная сумма исходного текста совпадает
с контрольной суммой исходного текста данной посылки. См. также
описание поля \hyperlink{F:run.log,T:sha1}{\V{sha1}} журнала
посылок \hyperlink{F:run.log}{\V{run.log}}.

\item
В поле ``User ID'' отображается числовой идентификатор участника
турнира, выполнившего данную посылку. Числовые идентификаторы
участников находятся в диапазоне от 1 до 100000. Идентификатор
участника генерируется как гиперссылка, при нажатии на которую
происходит возврат на главный экран программы \S{master} с
одновременной установкой фильтра посылок таким образом, чтобы
отображались только посылки данного пользователя. См. также
описание поля \hyperlink{F:run.log,T:team}{\V{team}} журнала
посылок \hyperlink{F:run.log}{\V{run.log}}.

\item
С помощью данного элемента ввода можно изменить идентификатор
пользователя, приписываемый данной посылке. Для этого нужно
ввести новый числовой идентификатор и нажать на кнопку
``Change''. Пользователь с данным идентификатором должен
существовать и быть зарегистрированным на данный турнир (то есть
иметь статус регистрации ``OK''). Пользователь может иметь
статус ``Locked'', ``Banned'' или ``Invisible'' в данном
турнире.

\item
В поле ``User login'' отображается регистрационное имя участника
турнира. Регистрационное имя используется участником при входе в
программы системы \S{ejudge}. Как и идентификатор пользователя,
регистрационное имя уникально для всех зарегистрированных
пользователей.
% Регистрационное имя участника генерируется как
%гиперссылка, при нажатии на которую происходит возврат на
%главный экран программы \S{master} с одновременной установкой
%фильтра посылок таким образом, чтобы отображались только посылки
%данного пользователя. 
См. также описание поля
\hyperlink{F:run.log,T:team}{\V{team}} журнала посылок
\hyperlink{F:run.log}{\V{run.log}}.

\item
С помощью данного элемента ввода можно задать регистрационное
имя пользователя, которому будет приписана данная
посылка. Изменение регистрационного имени пользователя приведёт
к изменению идентификатора пользователя (и наоборот). Для этого
нужно ввести новое регистрационное имя пользователя и нажать на
кнопку ``Change''. Пользователь с данным идентификатором должен
существовать и быть зарегистрированным на данный турнир (то есть
иметь статус регистрации ``OK''). Пользователь может иметь
статус ``Locked'', ``Banned'' или ``Invisible'' в данном
турнире.

\item
В поле ``User name'' отображается имя пользователя. Имя
пользователя выбирается пользователем при регистрации на турнир
с помощью программы \S{register}, а также может быть установлено
администратором турнира с помощью программы \S{edit-userlist}.
Несколько пользователей могут установить себе одно и то же имя
пользователя, однако каждый пользователь может иметь только одно
имя. См. также описание поля
\hyperlink{F:run.log,T:team}{\V{team}} журнала посылок
\hyperlink{F:run.log}{\V{run.log}}.

\item
В поле ``Problem'' отображается короткое имя задачи
(см. конфигурационную переменную
\hyperlink{F:serve.cfg,S:problem,T:short_name}{\V{short\_name}}
секции описания задачи конфигурационного файла турнира
\hyperlink{F:serve.cfg}{\V{serve.cfg}}), по которой была
выполнена данная посылка. Короткое имя задачи генерируется как
гиперссылка, при нажатии на которую происходит возврат на
главный экран программы \S{master} с одновременной установкой
фильтра посылок таким образом, чтобы отображались только посылки
по данной задаче. См. также
описание поля \hyperlink{F:run.log,T:problem}{\V{problem}} журнала
посылок \hyperlink{F:run.log}{\V{run.log}}.

\item
С помощью данного диалогового элемента можно изменить задачу
данной посылки. Для этого в выпадающем меню нужно выбрать новую
задачу и нажать на кнопку ``Change''. В выпадающем меню выбора
задачи отображается как короткое имя, так и полное имя задачи.

\item
В поле ``Language'' отображается короткое имя языка
программирования (см. конфигурационную переменную
\hyperlink{F:serve.cfg,S:language,T:short_name}{\V{short\_name}}
секции описания языка программирования конфигурационного файла
турнира \hyperlink{F:serve.cfg}{\V{serve.cfg}}), который был
использован в данной посылке. Короткое имя языка
программирования генерируется как гиперссылка, при нажатии на
которую происходит возврат на главный экран программы \S{master}
с одновременной установкой фильтра посылок таким образом, чтобы
отображались только посылки с таким же языком программирования.
См. также описание поля
\hyperlink{F:run.log,T:language}{\V{language}} журнала посылок
\hyperlink{F:run.log}{\V{run.log}}.

\item
С помощью данного диалогового элемента можно изменить язык
программирования данной посылки. Для этого в выпадающем меню
нужно выбрать новый язык программирования и нажать на кнопку
``Change''. В выпадающем меню выбора языка программирования
отображается как короткое имя, так и полное имя языка
программирования.

\item
В поле ``Imported?'' отображается текущее значение флага
импортированной посылки. Флаг может принимать два значения:
``No'' (\I{false}) и ``Yes'' (\I{true}). См. также описание поля
\hyperlink{F:run.log,T:is_imported}{\V{is\_imported}} журнала
посылок \hyperlink{F:run.log}{\V{run.log}}.

\item
С помощью данного диалогового элемента можно изменить значение
флага импортированной посылки. Для этого в выпадающем меню нужно
выбрать новое значение и нажать на кнопку ``Change''.

\item
В поле ``Hidden?'' отображается текущее значение флага скрытой
посылки. Флаг может принимать два значения: ``No'' (\I{false}) и
``Yes'' (\I{true}). См. также описание поля
\hyperlink{F:run.log,T:is_hidden}{\V{is\_hidden}} журнала
посылок \hyperlink{F:run.log}{\V{run.log}}.

\item
С помощью данного диалогового элемента можно изменить значение
флага скрытой посылки. Для этого в выпадающем меню нужно
выбрать новое значение и нажать на кнопку ``Change''.

\item
В поле ``Read-only?'' отображается текущее значение флага
неизменяемой посылки. Флаг может принимать два значения: ``No''
(\I{false}) и ``Yes'' (\I{true}). См. также описание поля
\hyperlink{F:run.log,T:is_readonly}{\V{is\_readonly}} журнала
посылок \hyperlink{F:run.log}{\V{run.log}}.

\item
С помощью данного диалогового элемента можно изменить значение
флага неизменяемой посылки. Для этого в выпадающем меню нужно
выбрать новое значение и нажать на кнопку ``Change''.

\item
В поле ``Locale ID'' отображается идентификатор языкового
окружения, установленный участником турнира в момент отправки им
данной посылки. В настоящее время система \S{ejudge}
поддерживает два языковых окружения: английское (идентификатор
0) и русское (идентификатор 1). См. также описание поля
\hyperlink{F:run.log,T:locale_id}{\V{locale\_id}} журнала
посылок \hyperlink{F:run.log}{\V{run.log}}.

\item
В поле ``Status'' отображается статус данной посылки. Все
возможные статусы посылок приведены в таблице
\ref{tableRunStatuses}. См. также описание поля
\hyperlink{F:run.log,T:status}{\V{status}} журнала
посылок \hyperlink{F:run.log}{\V{run.log}}.

\item
С помощью данного диалогового элемента можно модифицировать
статус текущей посылки. Для этого в выпадающем меню нужно
выбрать новое значение статуса и нажать на кнопку ``Change''.

\item
В поле ``Tests passed'' отображается количество тестов, успешно
пройденных решением (в режимах турнира \I{KIROV} и
\I{OLYMPIAD}). Если статус текущей посылки таков, что запуск на
тестирование программы не выполнялся, в данном поле отображается
\V{N/A}.

В режиме турнира \I{ACM} данное поле называется ``Failed test''
и показывает минимальный номер теста, на котором программа дала
неверный результат. Если решение прошло все тесты или статус
текущей посылки таков, что запуск на тестирование программы не
выполнялся, в данном поле отображается \V{N/A}.

См. также описание поля
\hyperlink{F:run.log,T:tests}{\V{tests}} журнала посылок
\hyperlink{F:run.log}{\V{run.log}}.

\item
С помощью данного диалогового элемента можно изменить количество
пройденных тестов или номер первого теста для данной посылки.
Для этого нужно ввести новое значение и нажать на кнопку
``Change''. Чтобы установить данное поле в значение
<<не определено>> (N/A), в поле ввода нужно ввести число -1.

\item
При нажатии на кнопку ``Clear this entry'' текущая запись будет
очищена, включая все поля таблицы посылок и файлы с исходным
текстом и протоколами тестирования. При нажатии на данную кнопку
запрашивается подтверждение операции очистки.

\item
В поле ``Score gained'' отображается количество баллов,
полученное за данную посылку. Данное поле доступно только в
режимах турнира \I{KIROV} или \I{OLYMPIAD}. Количество баллов
отображается без учёта возможных штрафов за повторные попытки.
Если статус текущей посылки таков, что запуск на тестирование
программы не выполнялся, в данном поле отображается \V{N/A}.
См. также описание поля \hyperlink{F:run.log,T:score}{\V{score}}
журнала посылок \hyperlink{F:run.log}{\V{run.log}}.

\item
С помощью данного диалогового элемента можно изменить количество
баллов за решение. Данный диалоговый элемент доступен только в
режимах турнира \I{KIROV} или \I{OLYMPIAD}. Для изменения значения
поля нужно ввести новое значение и нажать на кнопку ``Change''.
Чтобы установить данное поле в значение <<не определено>> (N/A),
в поле ввода нужно ввести число -1.

\item
В поле ``Pages'' отображается количество страниц, использованных
при распечатке пользователем текста программы данной посылки.
Если пользователь не печатал текст, значение данного поля равно
0. Печать исходного текста посылки на принтере
непривилегированным пользователем (из-под программы \S{team})
возможна только, если глобальная конфигурационная переменная
\hyperlink{F:serve.cfg,T:enable_printing}{\V{enable\_printing}}
файла конфигурации турнира
\hyperlink{F:serve.cfg}{\V{serve.cfg}} установлена в значение
\I{true}. См. также описание поля
\hyperlink{F:run.log,T:pages}{\V{pages}} журнала посылок
\hyperlink{F:run.log}{\V{run.log}}.

\item
С помощью данного диалогового элемента можно изменить количество
страниц распечатки для данной посылки. Для этого в поле ввода
нужно задать новое значение и нажать на кнопку ``Change''.

\item
С помощью кнопки ``Print'' можно отправить исходный текст
текущей посылки на принтер. Эта операция является
привилегированной операцией, для которой требуется бит
привилегий \V{PRINT\_RUN}. В данном случае не действуют квоты
печати, можно несколько раз напечатать одну и ту же программу. В
результате привилегированной печати не изменяется поле
\V{pages}, но есть непривилегированный пользователь, который
выполнил данную посылку, всё равно сохраняет возможность её
печати на принтер.

Для печати посылок на принтер требуется задать корректные
значения для конфигурационных переменных
\hyperlink{F:serve.cfg,T:a2ps_path}{\V{a2ps\_path}},
\hyperlink{F:serve.cfg,T:a2ps_args}{\V{a2ps\_args}},
\hyperlink{F:serve.cfg,T:lpr_path}{\V{lpr\_path}},
\hyperlink{F:serve.cfg,T:lpr_args}{\V{lpr\_args}}.

\item
В поле ``Variant'' отображается вариант задачи. Данное поле
отображается только для вариантных задач, то есть для задач, у
которых конфигурационная переменная
\hyperlink{F:serve.cfg,S:problem,T:variant_num}{\V{variant\_num}}
файла конфигурации турнира
\hyperlink{F:serve.cfg}{\V{serve.cfg}} установлена в значение,
большее 0. Значение варианта изменяется от 1 и до значения,
устанавливаемого этой конфигурационной переменной. Если в базе
посылок номер варианта для данной посылки явно не установлен, то
номер варианта определяется по таблице вариантов
(см. конфигурационную переменную
\hyperlink{F:serve.cfg,T:variant_map_file}{\V{variant\_map\_file}}
файла конфигурации турнира
\hyperlink{F:serve.cfg}{\V{serve.cfg}}). В этом случае номер
варианта отображается с пометкой ``Implicit''.

См. также описание поля
\hyperlink{F:run.log,T:variant}{\V{variant}} журнала посылок
\hyperlink{F:run.log}{\V{run.log}}.

\item
С помощью поля редактирования номера варианта можно изменить
номер варианта данной посылки. Для этого в поле ввода нужно
задать новый номер варианта и нажать на кнопку ``Change''. Чтобы
сбросить явное задание номера варианта в базе посылок (то есть
чтобы использовался файл задания вариантов для пользователей), в
поле ввода нужно ввести номер варианта 0.

\item
Ссылка ``Download run'' позволяет загрузить исходный текст
посылки. Несмотря на то, что страница просмотра исходного текста
уже содержит сам исходный текст, возможность загрузки исходного
текста необходима по следующим причинам:
\begin{itemize}
\item
Исходный текст можно сразу сохранить в файл, а не копировать его
через буфер обмена, избегая таким образом искажения данных,
возможных при копировании через буфер обмена.
\item
Для посылок по задачам, для которых конфигурационная переменная
\hyperlink{F:serve.cfg,S:problem,T:binary}{\V{binary}}
конфигурационного файла описания турнира
\hyperlink{F:serve.cfg}{\V{serve.cfg}} установлена в \I{true},
исходный текст посылки не отображается, так как может содержать
управляющие коды, и во многих случаях (например, в случае
посылки архива исходных текстов) его отображение вообще
бессмысленно. В этом случае ссылка ``Download run'' ---
единственный способ ознакомиться с исходным текстом посылки.
\end{itemize}

\item
Данный элемент управления позволяет сравнить исходные тексты
двух посылок. Текущая посылка сравнивается с посылкой, номер
которой указывается в поле ввода. Для сравнения нужно ввести
номер другой посылки и нажать на кнопку ``Compare''.
Сравнение ведётся с помощью программы \S{diff} командой
\V{diff -u}, при этом указанная посылка будет первым аргументом
программы (то есть <<старым>> файлом), а текущая посылка ---
вторым аргументом программы (то есть <<новым>> файлом). Путь к
команде \S{diff} можно задать с помощью глобальной
конфигурационной переменной
\hyperlink{F:serve.cfg,T:diff_path}{\V{diff\_path}}.

При отображении страницы просмотра исходного текста в поле ввода
номера сравниваемой посылки записывается номер ближайшей (в
сторону уменьшения) посылки, для которой значения идентификатора
команды, идентификатора языка программирования и идентификатора
задачи совпадают со значениями соответствующих полей текущей
посылки. Другими словами, по умолчанию в поле ввода номера
посылки вписывается предыдущая посылка того же участника по той
же задаче.
\end{enumerate}

\subsection{Просмотр исходного кода посылок}

\begin{figure}[htp]
\begin{center}
\includegraphics[width=0.95\textwidth]{snapshots/master_13.eps}
\end{center}
\caption{Интерфейс просмотра исходного кода посылок}
\label{master:screenshot:13}
\end{figure}

На рис. \ref{master:screenshot:13} представлены элементы
управления, доступные на странице редактирования посылки.

\begin{itemize}
\item
Ссылки быстрой навигации позволяют переключиться на другой экран
программы \S{master}. Доступны следующие ссылки быстрой
навигации:
\begin{itemize}
\item ``Main page''
вызывает переход на главную страницу программы \S{master}.
\item ``Standings''
вызывает переход на страницу просмотра текущих результатов
турнира.
\item ``View teams''
вызывает переход на страницу просмотра информации об участниках
турнира.
\item ``Refresh''
вызывает обновление данной страницы.
\item ``View report''
вызывает переход к странице просмотра протокола тестирования для
текущей посылки.
\item ``View team report''
вызывает переход к странице просмотра протокола тестирования для
текущей посылки, предназначенного для участника турнира. Данная
ссылка отображается, только если глобальная конфигурационная
переменная
\hyperlink{F:serve.cfg,T:team_enable_rep_view}{\V{team\_enable\_rep\_view}}
конфигурационного файла \hyperlink{F:serve.cfg}{\V{serve.cfg}}
установлена в \I{true}.
\item ``Log out''
приводит к выходу пользователя из программы \S{master} и
завершению сессии работы.
\end{itemize}

\item
Здесь отображается текст посылки. Отображение текста возможно,
только если конфигурационная переменная
\hyperlink{F:serve.cfg,S:problem,T:binary}{\V{binary}} файла
конфигурации турнира \hyperlink{F:serve.cfg}{\V{serve.cfg}} не
установлена, то есть для языков программирования, исходные файлы
которых представляют собой текстовые файлы.
\end{itemize}

\subsection{Просмотр протокола тестирования}

\begin{figure}[htp]
\begin{center}
\includegraphics[width=0.95\textwidth]{snapshots/master_14.eps}
\end{center}
\caption{Интерфейс просмотра протокола тестирования}
\label{master:screenshot:14}
\end{figure}

На рис. \ref{master:screenshot:14} представлен вид окна браузера
при отображении страницы протокола тестирования посылки. На
копии экрана представлен вид судейского протокола тестирования,
к просмотру которого можно перейти либо нажав на ссылку
``View report'' в таблице посылок на главной странице
CGI-программ \S{serve} и \S{judge}, либо нажав на ссылку
``View report'' на странице редактирования посылки.

Если установлена конфигурационная переменная
\hyperlink{F:serve.cfg,T:team_enable_rep_view}{\V{team\_enable\_rep\_view}},
то привилегированным пользователям становится доступным и
пользовательский протокол тестирования. К нему можно перейти,
нажав на ссылку ``View team report'' на странице редактирования
посылки.

Элементы отображения протокола тестирования перечислены ниже.
Рассматривается протокол тестирования для турнира, проводимого
по системе \I{KIROV}.

\begin{enumerate}
\item
Ссылки быстрой навигации позволяют переключиться на другой экран
программы \S{master}. Доступны следующие ссылки быстрой
навигации:
\begin{itemize}
\item ``Main page''
вызывает переход на главную страницу программы \S{master}.
\item ``Standings''
вызывает переход на страницу просмотра текущих результатов
турнира.
\item ``View teams''
вызывает переход на страницу просмотра информации об участниках
турнира.
\item ``View source''
вызывает переход на страницу редактирования посылки.
\item ``Refresh''
вызывает обновление текущей страницы.
\item ``View team report''
вызывает переход к странице просмотра протокола тестирования для
текущей посылки, предназначенного для участника турнира. Данная
ссылка отображается, только если глобальная конфигурационная
переменная
\hyperlink{F:serve.cfg,T:team_enable_rep_view}{\V{team\_enable\_rep\_view}}
конфигурационного файла \hyperlink{F:serve.cfg}{\V{serve.cfg}}
установлена в \I{true}.
\item ``Log out''
приводит к выходу пользователя из программы \S{master} и
завершению сессии работы.
\end{itemize}

\item
Здесь отображается общий вердикт тестирования. Для турниров по
системе \I{ACM} вердикт может быть ``OK'', ``Run-time error'',
``Presentation error'', ``Wrong answer'', ``Check failed''. Для
турниров по системе \I{KIROV} вердикт может быть одним из
следующих: ``OK'', ``Partial solution'', ``Check failed''. Для
турниров по системе \I{OLYMPIAD} вердикт может быть одним из
следующих: ``OK'', ``Partial solution'', ``Check failed'',
``Accepted for testing''.

\item
Здесь отображается статистика по количеству пройденных тестов.
Выводится сколько тестов по данной задаче находится в каталоге
тестов (``total test runs''), сколько тестов было пройдено, и
сколько тестов осталось не пройдено.

\item
В данном разделе выводится подробные результаты тестирования по
каждому тесту в наборе. Для каждого теста выводится:
\begin{itemize}
\item
Порядковый номер теста.
\item
Код завершения программы на этом тесте. Ненулевые коды возврата
интерпретируются как ошибка выполнения программы (``Run-time
error'').
\item
Время работы программы на данном тесте в секундах.
\item
Балл, полученный за данный тест и полный балл за тест
(печатается в скобках). Поскольку система \S{ejudge} не
поддерживает выставление частичного балла за тест, решение может
получить либо 0 баллов за тест, либо полный балл.

Данный столбец не выводится в турнирах в режиме \I{ACM},
поскольку для таких турниров понятие балла за тест
не определено.
\item
Результат работы на каждом тесте. Результат работы может быть
``OK'', ``Run-time error'', ``Time-limit exceeded'',
``Presentation error'', ``Wrong answer'' и ``Check failed''.
\end{itemize}

\item
В поле ``Score gained'' отображается, сколько баллов было
получено решением на тестировании и максимальное количество
баллов. Количество баллов за тестирование определяется как сумма
баллов, полученных за тесты. Количество баллов за тестирование,
отображаемое на этой странице, выводятся без учёта штрафов за
повторные попытки
(см.
\hyperlink{F:serve.cfg,S:problem,T:run\_penalty}{run\_penalty})
и без учёта штрафов за календарное время сдачи.

\item
Подробный протокол тестирования для каждого теста. В протоколе
тестирования для теста отображаются:
\begin{itemize}
\item
Аргументы командной строки (Command line arguments), если
конфигурационная переменная
\hyperlink{F:serve.cfg,S:problem,T:use_info}{\V{use\_info}}
секции описания соответствующей задачи в конфигурационном файле
\hyperlink{F:serve.cfg}{\V{serve.cfg}} установлена в \I{true}, и
если конфигурационная переменная
\hyperlink{F:test.inf,T:params}{\V{params}} в файле описания
теста \hyperlink{F:test.inf}{\V{test.inf}} непуста.
\item
Входной тестовый файл (Input). Если размер входного тестового
файла превышает значение конфигурационной переменной
\hyperlink{F:serve.cfg,T:max_file_length}{\V{max\_file\_length}},
вместо содержимого файла печатается сообщение
``file is too long''. Если длина одной строки текста в этом
файле превышает значение конфигурационной переменной
\hyperlink{F:serve.cfg,T:max_line_length}{\V{max\_line\_length}},
вместо данной строки в протоколе печатается строка
``Line is too long''.

\item
Результат работы программы (Output). Если согласно описанию
задачи результат работы должен быть напечатан на стандартный
поток вывода (то есть если установлена конфигурационная
переменная \hyperlink{F:serve.cfg,S:problem,T:use_stdout}{\V{use\_stdout}}
секции описания соответствующей задачи в конфигурационном файле
\hyperlink{F:serve.cfg}{\V{serve.cfg}}.

 На отображаемый файл также накладываются ограничения,
определяемые глобальными конфигурационными переменными 
\hyperlink{F:serve.cfg,T:max_file_length}{\V{max\_file\_length}} и
\hyperlink{F:serve.cfg,T:max_line_length}{\V{max\_line\_length}}
файла конфигурации турнира \hyperlink{F:serve.cfg}{\V{serve.cfg}}.

\item
Выдача тестируемой программы на стандартный поток ошибок
(Stderr). На отображаемый файл также накладываются ограничения,
определяемые глобальными конфигурационными переменными 
\hyperlink{F:serve.cfg,T:max_file_length}{\V{max\_file\_length}} и
\hyperlink{F:serve.cfg,T:max_line_length}{\V{max\_line\_length}}
файла конфигурации турнира \hyperlink{F:serve.cfg}{\V{serve.cfg}}.

\item
Выдача проверяющей программы на данном тесте (Checker output).
Для проверяющей программы и выдача в стандартный поток ошибок, и
выдача в стандартный поток вывода сливаются в один поток вывода,
отображаемый в данной секции.
\end{itemize}
\end{enumerate}

\subsection{Интерфейс просмотра сообщений}

\begin{figure}[htp]
\begin{center}
\includegraphics[width=0.95\textwidth]{snapshots/master_15.eps}
\end{center}
\caption{Интерфейс просмотра сообщений}
\label{master:screenshot:15}
\end{figure}

На рис. \ref{master:screenshot:15} показан вид окна браузера при
просмотре сообщения. Окно просмотра сообщения активизируется при
нажатии на ссылку ``View'' в таблице сообщений.

\begin{enumerate}
\item
Ссылки быстрой навигации позволяют переходить к окнам
отображения другой информации программы \S{master}.
\begin{itemize}
\item
Ссылка ``Main page'' вызывает возврат на главную страницу
программы \S{master}.
\item
Ссылка ``Standings'' вызывает переход к привилегированной версии
текущего положения участников турнира.
\item
Ссылка ``View teams'' вызывает переход к странице списка
участников турнира.
\item
Ссылка ``Log out'' вызывает переход к заключительной странице
программы \S{master} и завершение работы с программой.
\end{itemize}

\item
В поле ``Clar ID'' отображается порядковый номер сообщения.
Сообщения нумеруются от 0.

\item
В поле ``Flags'' отображаются флаги, установленные для данного
сообщения.
\begin{itemize}
\item
Флаг \V{N} означает, что сообщение поступило от участника
турнира судьям, и ещё не было просмотрено с помощью программы
\S{judge}. Просмотры сообщения программой \S{master} не
сбрасывают флага \V{N}.
\item
Флаг \V{R} означает, что сообщение поступило от участника
турнира судьям, и было просмотрено с помощью программы
\S{judge}.
\item
Флаг \V{A} означает, что сообщение поступило от участника
турнира судьям, и на него был дан ответ либо с помощью программы
\S{master}, либо с помощью программы \S{judge}. Когда для
сообщения устанавливается флаг \V{A}, одновременно
устанавливается флаг \V{R}, и сбрасывается флаг \V{N}.
\end{itemize}

\item
В поле ``Time'' отображается астрономическое время получения
сообщения сервером турнира. Время отображается в стандартном
формате системы \S{ejudge}.

\item
В поле ``Duration'' отображается время, прошедшее от момента
начала турнира до получения сообщения сервером турнира.
Продолжительность отображается в стандартном формате системы
\S{ejudge}.

\item
В поле ``IP address'' отображается IP-адрес браузера, с которого
было послано сообщение.

\item
В поле ``Size'' отображается размер сообщения. В размер
сообщения входит и размер темы сообщения.

\item
В поле ``Sender'' отображается отправитель сообщения. Если
сообщение было отправлено с помощью привилегированной программы
\S{master} или \S{judge}, в поле отправителя печатается
``judges''. В противном случае печатается имя пользователя
(name) или его регистрационное имя (login), если имя
пользователя не установлено, а затем в скобках печатается его
идентификатор пользователя. На нашем примере \V{A User} --- это
имя пользователя, а \V{1620} --- его идентификатор.

\item
В поле ``To'' отображается получатель сообщения. Если сообщение
было отправлено непривилегированным пользователем с помощью
CGI-программы \S{team}, в данном поле выводится ``judges'', так
как непривилегированный пользователь может отправлять сообщения
только судьям. Если сообщение было отправлено привилегированным
пользователем (т. е. с помощью программ \S{master} или
\S{serve}) всем участникам турнира, в данном поле отображается
``All''. Если сообщение было отправлено привилегированным
пользователем некоторому конкретному пользователю, то печатается
имя пользователя (name) или его регистрационное имя (login),
если имя пользователя не установлено, а затем в скобках
печатается его идентификатор пользователя.

\item
В поле ``Subject'' отображается тема сообщения. Тема сообщения
ограничивается 14 символами. Если тема сообщения длиннее 14
символов, то в конце ставится \V{...}, а полностью тему
сообщения можно прочитать в окне отображения текста сообщения.

\item
Здесь отображается полный текст сообщения. Первая строка текста
--- всегда строка Subject, в которой отображается полная тема
сообщения. Строка Subject отделяется от тела сообщения одной
пустой строкой.
\end{enumerate}

\subsection{Интерфейс ответа на сообщение}

\begin{figure}[htp]
\begin{center}
\includegraphics[width=0.95\textwidth]{snapshots/master_16.eps}
\end{center}
\caption{Интерфейс ответа на сообщение}
\label{master:screenshot:16}
\end{figure}

На рис. \ref{master:screenshot:16} представлен вид окна браузера
на нижнюю часть окна просмотра сообщения. В нижней части окна
располагаются управляющие элементы для составления и посылки
ответа на сообщения участников турнира.

При отправке ответа на любое сообщение в текст ответа всегда
вставляется текст исходного сообщения, выделяемый с помощью
знака \verb|> | в начале строки (как при переписке по
электронной почте). После цитирования текста исходного сообщения
следует непосредственно текст ответа на него.

\begin{enumerate}
\item
Ссылки быстрой навигации позволяют переходить к окнам
отображения другой информации программы \S{master}.
\begin{itemize}
\item
Ссылка ``Main page'' вызывает возврат на главную страницу
программы \S{master}.
\item
Ссылка ``Standings'' вызывает переход к привилегированной версии
текущего положения участников турнира.
\item
Ссылка ``View teams'' вызывает переход к странице списка
участников турнира.
\item
Ссылка ``Log out'' вызывает переход к заключительной странице
программы \S{master} и завершение работы с программой.
\end{itemize}

\item
Кнопки быстрого ответа 2, 3, 4, 5 предназначены для выбора
одного из фиксированных вариантов ответа и посылки ответа только
участнику, от которого исходило данное сообщение. При
использовании данных кнопок игнорируется текст, введённый в поле
ввода текста ответа 6.

Кнопка ``Answer: Read the problem'' генерирует текст ответа
``Read the problem''. Данный ответ должен использоваться, когда,
по мнению жюри, ответ на поставленный вопрос содержится в тексте
условия.

\item
Кнопка ``Answer: No comments'' генерирует текст ответа ``No
comments''. Данный ответ должен использоваться, когда, по мнению
жюри, вопрос поставлен некорректно, или жюри не считает
правильным отвечать на вопрос.

\item
Кнопка ``Answer: YES'' генерирует текст ответа ``YES''.

\item
Кнопка ``Answer: NO'' генерирует текст ответа ``NO''.

\item
В данном поле вводится текст ответа на сообщение.

\item
Кнопка ``Send to sender'' отправляет ответ, введённый в поле 6,
только участнику турнира, задавшему данный вопрос.

\item
Кнопка ``Send to all'' отправляет ответ, введённый в поле 6,
всем участникам турнира.
\end{enumerate}

% Local variables:
%  compile-command: "make"
% End:
