} else {
            $adescription = $prow ? "update" : "register";
        }
        Conf::msg_error(whyNotText($whyNot, $adescription));
    }
    // If we get here, we failed to update.
    // Use the request unless the request failed because updates
    // aren't allowed.
    $useRequest = !$whyNot || !$prow || !($action != "final" && !$Me->can_update_paper($prow) && $Me->can_finalize_paper($prow));
}
if ($Qreq->updatecontacts && check_post($Qreq) && $prow) {
    if ($Me->can_administer($prow) || $Me->act_author_view($prow)) {
        $ps = new PaperStatus($Me);
        $opj = $ps->paper_json($prow);
        $pj = PaperStatus::clone_json($opj);
        PaperSaver::replace_contacts($pj, $Qreq);
        if ($ps->save_paper_json($pj, $opj)) {
            redirectSelf();
        } else {
            Conf::msg_error("<ul><li>" . join("</li><li>", $ps->error_html()) . "</li></ul>");
            $Error = $ps->error_fields();
        }
    } else {
        Conf::msg_error(whyNotText(array("permission" => 1), "update contacts for"));
    }
    // use request?
    $useRequest = true;
}
// delete action
if ($Qreq->delete && check_post()) {
    if ($newPaper) {
 public function apply(Contact $user, $pj, $opj, $qreq, $action)
 {
     global $Conf;
     // Title, abstract, collaborators
     foreach (array("title", "abstract", "collaborators") as $k) {
         if (isset($qreq[$k])) {
             $pj->{$k} = $qreq[$k];
         }
     }
     // Authors
     $bad_author = ["name" => "Name", "email" => "Email", "aff" => "Affiliation"];
     $authors = array();
     foreach ($qreq as $k => $v) {
         if (preg_match('/\\Aau(name|email|aff)(\\d+)\\z/', $k, $m) && ($v = simplify_whitespace($v)) !== "" && $v !== $bad_author[$m[1]]) {
             $au = $authors[$m[2]] = get($authors, $m[2]) ?: (object) array();
             $x = $m[1] == "aff" ? "affiliation" : $m[1];
             $au->{$x} = $v;
         }
     }
     if (!empty($authors)) {
         ksort($authors, SORT_NUMERIC);
         $pj->authors = array_values($authors);
     }
     // Contacts
     if ($qreq->setcontacts || $qreq->has_contacts) {
         PaperSaver::replace_contacts($pj, $qreq);
     } else {
         if (!$opj) {
             $pj->contacts = array($user);
         }
     }
     // Status
     if ($action === "submit") {
         $pj->submitted = true;
     } else {
         if ($action === "final") {
             $pj->final_submitted = true;
         } else {
             $pj->submitted = false;
         }
     }
     // Paper upload
     if ($qreq->_FILES->paperUpload) {
         if ($action === "final") {
             $pj->final = Filer::file_upload_json($qreq->_FILES->paperUpload);
         } else {
             if ($action === "update" || $action === "submit") {
                 $pj->submission = Filer::file_upload_json($qreq->_FILES->paperUpload);
             }
         }
     }
     // Blindness
     if ($action !== "final" && $Conf->subBlindOptional()) {
         $pj->nonblind = !$qreq->blind;
     }
     // Topics
     if ($qreq->has_topics) {
         $pj->topics = (object) array();
         foreach ($Conf->topic_map() as $tid => $tname) {
             if (+$qreq["top{$tid}"] > 0) {
                 $pj->topics->{$tname} = true;
             }
         }
     }
     // Options
     if (!isset($pj->options)) {
         $pj->options = (object) [];
     }
     foreach (PaperOption::option_list() as $o) {
         if ($qreq["has_opt{$o->id}"] && (!$o->final || $action === "final")) {
             $okey = $o->abbr;
             $pj->options->{$okey} = $o->parse_request(get($pj->options, $okey), $qreq, $user, $pj);
         }
     }
     if (!count(get_object_vars($pj->options))) {
         unset($pj->options);
     }
     // PC conflicts
     if ($Conf->setting("sub_pcconf") && ($action !== "final" || $user->privChair) && $qreq->has_pcconf) {
         $cmax = $user->privChair ? CONFLICT_CHAIRMARK : CONFLICT_MAXAUTHORMARK;
         $pj->pc_conflicts = (object) array();
         foreach (pcMembers() as $pcid => $pc) {
             $ctype = cvtint($qreq["pcc{$pcid}"], 0);
             $ctype = max(min($ctype, $cmax), 0);
             if ($ctype) {
                 $email = $pc->email;
                 $pj->pc_conflicts->{$email} = Conflict::$type_names[$ctype];
             }
         }
     }
 }