PROCEDURE jmp$restore_output_files (
  comment_banner, comment_banners, cb: list of string 0..31 = $optional
  control_family, control_families, cf: list of name = $optional
  control_user, control_users, cu: list of name = $optional
  data_mode, dm: list of key
      (coded, c)
      (transparent, t)
    keyend = $optional
  device, devices, d: list of any of
      key
        automatic
      keyend
      name
    anyend = $optional
  external_characteristics, ec: list of any of
      key
        normal
      keyend
      string 0..6
    anyend = $optional
  forms_code, forms_codes, fc: list of any of
      key
        normal
      keyend
      string 0..6
    anyend = $optional
  login_account, login_accounts, la: list of name = $optional
  login_family, login_families, lf: list of name = $optional
  login_project, login_projects, lp: list of name = $optional
  login_user, login_users, lu: list of name = $optional
  name, names, n: list of name = $optional
  operator_family, operator_families, of: list of name = $optional
  operator_user, operator_users, ou: list of name = $optional
  output_class, output_classes, oc: list of name = $optional
  output_deferred_by_user, odbu: boolean = $optional
  output_destination, output_destinations, ode: list of any of
      name
      string 0..31
    anyend = $optional
  output_destination_usage, odu: list of any of
      key
        dual_state, ntf, private, public, qtf
      keyend
      name
    anyend = $optional
  output_priority, output_priorities, op: list of name = $optional
  remote_host_directive, remote_host_directives, rhd: list of string 0..256 = $optional
  routing_banner, routing_banners, rb: list of string 0..31 = $optional
  site_information, si: list of string 0..256 = $optional
  station, stations, s: list of any of
      key
        automatic
      keyend
      name
    anyend = $optional
  system_job_name, system_job_names, sjn: list of name = $optional
  user_information, ui: list of string 0..256 = $optional
  vertical_print_density, vertical_print_densities, vpd: list of key
      six, eight, none
    keyend = $optional
  vfu_load_procedure, vfu_load_procedures, vlp: list of any of
      key
        none
      keyend
      name
    anyend = $optional
  maximum_selection, maxs: any of
      key
        all
      keyend
      integer 1..65535
    anyend = all
  vsn, vsns, v: list of any of
      name 1..6
      string 1..6
    anyend = $optional
  vsn_prefix, vp: any of
      name 1..5
      string 1..5
    anyend = $optional
  vsn_count, vc: integer 1..11881376 = 15
  vsn_suffix, vs: any = $optional
  increment_scheme, is: key
      (alphabetic, a)
      (decimal, d)
    keyend = decimal
  type, t: key
      mt9$800, mt9$1600, mt9$6250, mt18$38000
    keyend = mt9$1600
  backup_file, bf:file = $optional
  excluded_file_list, efl: (VAR) list 0..$max_list of name = $optional
  output, o: file = $OUTPUT
  errors, e: file = $ERRORS
  status)

  " Confirm that we are in the system_operator_utility with the system_administration and system_operation
  " capabilities active.

  WHEN command_fault DO
  exit procedure with $status(FALSE 'OF' ofe$sou_not_active 'system_administration and system_operation')
  WHENEND

  VAR
    active_capabilities: file = $unique($local)
    ignore_status: status
    lines: list 0..$max_list of string
  VAREND

  system_operator_utility.display_active_capabilities output=active_capabilities
  get_line variable=lines input=active_capabilities
  detach_file file=active_capabilities status=ignore_status
  IF $nil($select_wild_card_strings(lines '*system_administration*' basic)) OR ..
     $nil($select_wild_card_strings(lines '*system_operation*' basic)) THEN
    exit procedure with $status(FALSE 'OF' ofe$sou_not_active 'system_administration and system_operation')
  IFEND
  CANCEL command_fault
  VAR
    constructed_vsn_list: list 1..$max_list of string 6
    current_ring: integer 1..15 = $ring
    output_created: boolean = NOT $file(output assigned)
    queue_backup: file = $unique($local)
    vsn_list: list 1..$max_list of string 1..6
  VAREND

  IF $specified(vsn) THEN
    IF $specified(vsn_prefix) OR $specified(vsn_suffix) THEN
      exit procedure with $status(FALSE 'JM' jme$incompatible_vsn_params '')
    IFEND
    IF $nil(vsn) THEN
      exit procedure with $status(FALSE 'JM' jme$empty_vsn_list '')
    IFEND
    vsn_list = $string(vsn)

    ELSEIF NOT ($specified(vsn_prefix) OR $specified(vsn_suffix)) THEN
    IF NOT $specified(backup_file) THEN
      exit procedure with $status(FALSE 'JM' jme$vsn_vsnp_vsns_bf_required '')
    IFEND
    ELSE
    pup$construct_volume_list vsn_count=vsn_count vsn_prefix=vsn_prefix increment_scheme=increment_scheme ..
          volume_list=constructed_vsn_list
    vsn_list = constructed_vsn_list
  IFEND

  " Restore all the files on the specified backup tape set.
  TASK ring=3
     IF NOT $specified(backup_file) THEN
    request_magnetic_tape queue_backup recorded_vsn=vsn_list ring=false type=type
     ELSE
    queue_backup=backup_file
     IFEND
    RESTORE_PERMANENT_FILES list=output
      restore_all_files backup_file=queue_backup status=ignore_status
    QUIT
     IF NOT $specified(backup_file) THEN
     detach_file file=queue_backup
     IFEND
    IF output_created THEN
      change_file_attributes file=output ring_attributes=(current_ring current_ring current_ring)
    IFEND
  TASKEND

  $system.MANAGE_OUTPUT

    change_list_options output=output errors=errors

    "$FORMAT=OFF"
    VAR
      activated_files: list 0..$max_list of name
      desired_files: list 0..$max_list of name
      selected_files: list 0..$max_list of name
      unwanted_files: list 0..$max_list of name
    VAREND
    "$FORMAT=ON"

    " Activate all files that were restored or otherwise inactive but present in the output queue catalogs.

    activate_output_files files_activated=activated_files

    " Construct a list of system file names of the desired outputs to restore.

    select_output comment_banner=comment_banner control_family=control_family control_user=control_user ..
          data_mode=data_mode device=device external_characteristics=external_characteristics ..
          forms_code=forms_code login_account=login_account login_family=login_family ..
          login_project=login_project login_user=login_user name=name operator_family=operator_family ..
          operator_user=operator_user output_class=output_class output_deferred_by_operator=TRUE ..
          output_deferred_by_user=output_deferred_by_user output_destination=output_destination ..
          output_destination_usage=output_destination_usage output_priority=output_priority ..
          remote_host_directive=remote_host_directive routing_banner=routing_banner ..
          site_information=site_information station=station system_job_name=system_job_name ..
          user_information=user_information vertical_print_density=vertical_print_density ..
          vfu_load_procedure=vfu_load_procedure maximum_selection=maximum_selection ..
          output_selection_list=selected_files

    desired_files = $intersection(activated_files selected_files)
    unwanted_files = $difference(activated_files selected_files)

    " Get rid of the unchosen outputs, and return their system file names as the excluded_file_list argument.

    IF NOT $nil(unwanted_files) THEN
      terminate_output names=unwanted_files reason=none
    IFEND
    IF $specified(excluded_file_list) THEN
      excluded_file_list = unwanted_files
    IFEND

    " Emit output_queuing_started history statistics for the desired outputs and reenable them for initiation.

    IF NOT $nil(desired_files) THEN
      log_restored_output_files files_restored=desired_files
      display_output_attributes names=desired_files display_option=all output=output.$eoi
      change_output_attributes names=desired_files output_deferred_by_operator=false
    IFEND
  QUIT

PROCEND jmp$restore_output_files
