Skip to main content
All modules

TemplateConferencescssecurity

ACM CCS 2026

ACM CCS 2026 paper in acmart sigconf format with anonymous review mode on and the camera-ready options ready to flip.

2026 · LPPL 1.3c

Loading PDF preview…

What’s inside

  • Starter files
  • main.tex1.9 KB
    \documentclass[sigconf,screen,anonymous,review]{acmart}
    % Drop anonymous,review for the camera-ready version.
    
    \acmConference[CCS '26]{ACM SIGSAC Conference on Computer and Communications Security}{2026}{Location}
    \acmYear{2026}
    \copyrightyear{2026}
    \settopmatter{printacmref=false}
    
    \usepackage{booktabs}
    
    \begin{document}
    
    \title{Your Paper Title Here}
    
    \author{Anonymous Author(s)}
    \affiliation{%
      \institution{Anonymous Institution}
      \city{City}
      \country{Country}}
    \email{anonymous@example.com}
    
    \begin{abstract}
    One paragraph summarizing the threat model, the attack or defense, and the headline result.
    \end{abstract}
    
    \keywords{security, applied cryptography, systems security}
    
    \maketitle
    
    \section{Introduction}
    Motivate the security problem and state the contribution. Prior defenses cover parts of the threat model~\cite{doe2024defense}, and recent measurements show the attack surface is growing~\cite{smith2025measurement}.
    
    \section{Threat Model}
    State the adversary's capabilities and assumptions precisely.
    
    \section{Design}
    Describe the system. A security bound can be stated as a display equation:
    \begin{equation}
    \Pr[\mathsf{Adv} \text{ wins}] \le \frac{q^2}{2^{n}} + \varepsilon.
    \label{eq:bound}
    \end{equation}
    
    \section{Evaluation}
    Summarize the experimental setup and results, as in Table~\ref{tab:results}.
    
    \begin{table}[htbp]
    \caption{Overhead of the defense on macro-benchmarks.}
    \label{tab:results}
    \begin{tabular}{lcc}
    \toprule
    Workload & Baseline (ms) & With defense (ms) \\
    \midrule
    web-server & 14.0 & 15.1 \\
    database & 22.5 & \textbf{23.0} \\
    \bottomrule
    \end{tabular}
    \end{table}
    
    \section{Conclusion}
    Recap the contribution, discuss ethics and disclosure, and note future work.
    
    This is a starter file. Ask the agent in the chat to draft sections, formalize the threat model, or typeset your existing notes into this format.
    
    \bibliographystyle{ACM-Reference-Format}
    \bibliography{references}
    
    \end{document}
    
  • Libraries and docs
  • ACM-Reference-Format.bst91 KBVendored from mirrors.ctan.org on 2026-05-26.
    %%% -*-BibTeX-*-
    %%% ====================================================================
    %%%  @BibTeX-style-file{
    %%%     author          = "Nelson H. F. Beebe, Boris Veytsman and Gerald Murray",
    %%%     version         = "2.1",
    %%%     acmart-version  = "1.90",
    %%%     date            = "Mar 26 2023",
    %%%     filename        = "ACM-Reference-Format.bst",
    %%%     email           = "borisv@lk.net, boris@varphi.com",
    %%%     codetable       = "ISO/ASCII",
    %%%     keywords        = "ACM Transactions bibliography style; BibTeX",
    %%%     license         = "public domain",
    %%%     supported       = "yes",
    %%%     abstract        = "",
    %%%  }
    %%% ====================================================================
    
    %%% Revision history:  see source in git
    
    ENTRY
      { address
        advisor
        archiveprefix
        author
        booktitle
        chapter
        city
        date
        edition
        editor
        eprint
        eprinttype
        eprintclass
        howpublished
        institution
        journal
        key
        location
        month
        note
        number
        organization
        pages
        primaryclass
        publisher
        school
        series
        title
        type
        volume
        year
            % New keys recognized
            issue         % UTAH: used in, e.g., ACM SIGSAM Bulletin and ACM Communications in Computer Algebra
            articleno
            eid
            day           % UTAH: needed for newspapers, weeklies, bi-weeklies
            doi           % UTAH
            url           % UTAH
            bookpages     % UTAH
            numpages
            lastaccessed  % UTAH: used only for @Misc{...}
            coden         % UTAH
            isbn          % UTAH
            isbn-13       % UTAH
            issn          % UTAH
            lccn          % UTAH
    	distinctURL   % whether to print url if doi is present
    	archived      % Where the url is archived
    	venue         % for presentations
      }
      {}
      { label.year extra.label sort.year sort.label basic.label.year}
    
    INTEGERS { output.state before.all mid.sentence after.sentence after.block }
    
    INTEGERS { show-isbn-10-and-13 }  % initialized below in begin.bib
    
    INTEGERS { nameptr namesleft numnames }
    
    INTEGERS { multiresult }
    
    INTEGERS { len }
    
    INTEGERS { last.extra.num }
    
    STRINGS { s t t.org u }
    
    STRINGS { last.label next.extra }
    
    STRINGS { p1 p2 p3 page.count }
    
    
    FUNCTION { not }
    {
        { #0 }
        { #1 }
      if$
    }
    
    FUNCTION { and }
    {
        'skip$
        { pop$ #0 }
      if$
    }
    
    FUNCTION { or }
    {
       { pop$ #1 }
        'skip$
      if$
    }
    
    
    FUNCTION { dump.stack.1 }
    {
        duplicate$ "STACK[top] = [" swap$ * "]" * warning$
    }
    
    FUNCTION { dump.stack.2 }
    {
        duplicate$ "STACK[top  ] = [" swap$ * "]" * warning$
        swap$
        duplicate$ "STACK[top-1] = [" swap$ * "]" * warning$
        swap$
    }
    
    FUNCTION { empty.or.unknown }
    {
      %% Examine the top stack entry, and push 1 if it is empty, or
      %% consists only of whitespace, or is a string beginning with two
      %% queries (??), and otherwise, push 0.
      %%
      %% This function provides a replacement for empty$, with the
      %% convenient feature that unknown values marked by two leading
      %% queries are treated the same as missing values, and thus, do not
      %% appear in the output .bbl file, and yet, their presence in .bib
      %% file(s) serves to mark values which are temporarily missing, but
      %% are expected to be filled in eventually once more data is
      %% obtained.  The TeX User Group and BibNet bibliography archives
      %% make extensive use of this practice.
      %%
      %% An empty string cannot serve the same purpose, because just as in
      %% statistics data processing, an unknown value is not the same as an
      %% empty value.
      %%
      %% At entry: stack = ... top:[string]
      %% At exit:  stack = ... top:[0 or 1]
    
      duplicate$ empty$
        { pop$ #1 }
        { #1 #2 substring$ "??" = }
      if$
    }
    
    FUNCTION { empty.or.zero }
    {
      %% Examine the top entry and push 1 if it is empty, or is zero
      duplicate$ empty$
        { pop$ #1 }
        { "0" = }
      if$
    }
    
    
    FUNCTION { writeln }
    {
      %% In BibTeX style files, the sequences
      %%
      %%     ... "one" "two" output
      %%     ... "one" "two" output.xxx
      %%
      %% ship "one" to the output file, possibly following by punctuation,
      %% leaving the stack with
      %%
      %%     ... "two"
      %%
      %% There is thus a one-string lag in output processing that must be
      %% carefully handled to avoid duplicating a string in the output
      %% file.  Unless otherwise noted, all output.xxx functions leave
      %% just one new string on the stack, and that model should be born
      %% in mind when reading or writing function code.
      %%
      %% BibTeX's asynchronous buffering of output from strings from the
      %% stack is confusing because newline$ bypasses the buffer.  It
      %% would have been so much easier for newline to be a character
      %% rather than a state of the output-in-progress.
      %%
      %% The documentation in btxhak.dvi is WRONG:  it says
      %%
      %%    newline$ Writes onto the bbl file what's accumulated in the
      %%             output buffer. It writes a blank line if and only
      %%             if the output buffer is empty. Since write$ does
      %%             reasonable line breaking, you should use this
      %%             function only when you want a blank line or an
      %%             explicit line break.
      %%
      %%    write$   Pops the top (string) literal and writes it on the
      %%             output buffer (which will result in stuff being
      %%             written onto the bbl file when the buffer fills
      %%             up).
      %%
      %% Examination of the BibTeX source code shows that write$ does
      %% indeed behave as claimed, but newline$ sends a newline character
      %% directly to the output file, leaving the stack unchanged.  The
      %% first line "Writes onto ... buffer." is therefore wrong.
      %%
      %% The original BibTeX style files almost always use "write$ newline$"
      %% in that order, so it makes sense to hide that pair in a private
      %% function like this one, named after a statement in Pascal,
      %% the programming language embedded in the BibTeX Web program.
    
      write$                % output top-of-stack string
      newline$              % immediate write of newline (not via stack)
    }
    
    FUNCTION { init.state.consts }
    {
      #0 'before.all :=
      #1 'mid.sentence :=
      #2 'after.sentence :=
      #3 'after.block :=
    }
    
    FUNCTION { output.nonnull }
    { % Stack in: ... R S T  Stack out: ... R T   File out: S<comma><space>
      's :=
      output.state mid.sentence =
        {
          ", " * write$
        }
        {
          output.state after.block =
            {
              add.period$ writeln
              "\newblock " write$
            }
            {
              output.state before.all =
                {
                  write$
                }
                {
                  add.period$ " " * write$
                }
              if$
            }
          if$
          mid.sentence 'output.state :=
        }
      if$
      s
    }
    
    FUNCTION { output.nonnull.dot.space }
    { % Stack in: ... R S T  Stack out: ... R T   File out: S<dot><space>
      's :=
      output.state mid.sentence =           % { "<DEBUG output.nonnull.dot.space>. " * write$ }
        {
          ". " * write$
        }
        {
          output.state after.block =
            {
              add.period$ writeln "\newblock " write$
            }
            {
              output.state before.all =
                {
                  write$
                }
                {
                  add.period$ " " * write$
                }
              if$
            }
          if$
          mid.sentence 'output.state :=
        }
      if$
      s
    }
    
    FUNCTION { output.nonnull.remove }
    { % Stack in: ... R S T  Stack out: ... R T   File out: S<space>
      's :=
      output.state mid.sentence =
        {
          " " * write$
        }
        {
          output.state after.block =
            {
              add.period$ writeln "\newblock " write$
            }
            {
              output.state before.all =
                {
                  write$
                }
                {
                  add.period$ " " * write$
                }
              if$
            }
          if$
          mid.sentence 'output.state :=
        }
      if$
      s
    }
    
    FUNCTION { output.nonnull.removenospace }
    { % Stack in: ... R S T  Stack out: ... R T   File out: S
      's :=
      output.state mid.sentence =
        {
          "" * write$
        }
        {
          output.state after.block =
            {
              add.period$ writeln "\newblock " write$
            }
            {
              output.state before.all =
                {
                  write$
                }
                {
                  add.period$ " " * write$
                }
              if$
            }
          if$
          mid.sentence 'output.state :=
        }
      if$
      s
    }
    
    FUNCTION { output }
    { % discard top token if empty, else like output.nonnull
      duplicate$ empty.or.unknown
        'pop$
        'output.nonnull
      if$
    }
    
    FUNCTION { output.dot.space }
    { % discard top token if empty, else like output.nonnull.dot.space
      duplicate$ empty.or.unknown
        'pop$
        'output.nonnull.dot.space
      if$
    }
    
    FUNCTION { output.removenospace }
    { % discard top token if empty, else like output.nonnull.removenospace
      duplicate$ empty.or.unknown
        'pop$
        'output.nonnull.removenospace
      if$
    }
    
    FUNCTION { output.check }
    { % like output, but warn if key name on top-of-stack is not set
      't :=
      duplicate$ empty.or.unknown
        { pop$ "empty " t * " in " * cite$ * warning$ }
        'output.nonnull
      if$
    }
    
    FUNCTION { bibinfo.output.check }
    { % like output.check, adding bibinfo field
      't :=
      duplicate$ empty.or.unknown
        { pop$ "empty " t * " in " * cite$ * warning$ }
        { "\bibinfo{" t "}{" * * swap$ * "}" *
          output.nonnull }
      if$
    }
    
    FUNCTION { output.check.dot.space }
    { % like output.dot.space, but warn if key name on top-of-stack is not set
      't :=
      duplicate$ empty.or.unknown
        { pop$ "empty " t * " in " * cite$ * warning$ }
        'output.nonnull.dot.space
      if$
    }
    
    FUNCTION { fin.block }
    { % functionally, but not logically, identical to fin.entry
       add.period$
       writeln
    }
    
    FUNCTION { fin.entry }
    {
       add.period$
       writeln
    }
    
    FUNCTION { new.sentence }
    { % update sentence state, with neither output nor stack change
      output.state after.block =
        'skip$
        {
          output.state before.all =
            'skip$
            { after.sentence 'output.state := }
          if$
        }
      if$
    }
    
    FUNCTION { fin.sentence }
    {
       add.period$
       write$
       new.sentence
       ""
    }
    
    FUNCTION { new.block }
    {
      output.state before.all =
        'skip$
        { after.block 'output.state := }
      if$
    }
    
    FUNCTION { output.coden }       % UTAH
    { % output non-empty CODEN as one-line sentence (stack untouched)
      coden empty.or.unknown
        { }
        { "\showCODEN{" coden * "}" * writeln }
      if$
    }
    
    %
    % Sometimes articleno starts with the word 'Article' or 'Paper.
    % (this is a bug of acmdl, sigh)
    % We strip them.  We assume eid or articleno is already on stack
    %
    
    FUNCTION { strip.articleno.or.eid }
    {
      't :=
      t #1 #7 substring$ "Article" = 
        {t #8 t text.length$ substring$ 't :=}
        { }
      if$
      t #1 #7 substring$ "article" = 
        {t #8 t text.length$ substring$ 't :=}
        { }
      if$
      t #1 #5 substring$ "Paper" = 
        {t #6 t text.length$ substring$ 't :=}
        { }
      if$
      t #1 #5 substring$ "paper" = 
        {t #6 t text.length$ substring$ 't :=}
        { }
      if$
      % Strip any left trailing space or ~
      t #1 #1 substring$ " " =
        {t #2 t text.length$ substring$ 't :=}
        { }
      if$ 
      t #1 #1 substring$ "~" =
        {t #2 t text.length$ substring$ 't :=}
        { }
      if$
      t 
    }
    
    
    FUNCTION { format.articleno }
    {
      articleno empty.or.unknown not eid empty.or.unknown not and
         { "Both articleno and eid are defined for " cite$ * warning$ }
         'skip$
      if$
      articleno empty.or.unknown eid empty.or.unknown and
         { "" }
         {
            numpages empty.or.unknown
              { "articleno or eid field, but no numpages field, in "
                cite$ * warning$ }
              { }
            if$
            eid empty.or.unknown
              { "Article \bibinfo{articleno}{" articleno strip.articleno.or.eid * "}" * }
              { "Article \bibinfo{articleno}{" eid strip.articleno.or.eid * "}" * }
            if$
         }
      if$
    }
    
    FUNCTION { format.year }
    { % push year string or "[n.\,d.]" onto output stack
      %% Because year is a mandatory field, we always force SOMETHING
      %% to be output.  If we do not know year but know date, we push  date
      %% as the last resort
      "\bibinfo{year}{"
      year empty.or.unknown
        { date empty.or.unknown
            { "[n.\,d.]" }
    	{ date #1 #4 substring$ }
          if$
        }
        { year }
      if$
      *  "}" *
    }
    
    FUNCTION { format.day.month }
    { % push "day month " or "month " or "" onto output stack
      day empty.or.unknown
        {
          month empty.or.unknown
            { "" }
            { "\bibinfo{date}{" month * "} " *}
          if$
        }
        {
          month empty.or.unknown
            { "" }
            { "\bibinfo{date}{" day * " " * month * "} " *}
          if$
        }
      if$
    }
    
    FUNCTION { format.day.month.year }     % UTAH
    { % if month is empty, push "" else push "(MON.)" or "(DD MON.)"
      % Needed for frequent periodicals: 2008. ... New York Times C-1, C-2, C-17 (23 Oct.)
      % acm-*.bst addition: prefix parenthesized date string with
      % ", Article nnn "
      articleno empty.or.unknown eid empty.or.unknown and
        { "" }
        { output.state after.block =
           {", " format.articleno * }
           { format.articleno  }
          if$
        }
      if$
      " (" * format.day.month * format.year * ")" *
    }
    
    FUNCTION { output.day.month.year }     % UTAH
    { % if month is empty value, do nothing; else output stack top and
      % leave with new top string "(MON.)" or "(DD MON.)"
      % Needed for frequent periodicals: 2008. ... New York Times C-1, C-2, C-17 (23 Oct.)
      format.day.month.year
      output.nonnull.remove
    }
    
    FUNCTION { strip.doi } % UTAH
    { % Strip any Web address prefix to recover the bare DOI, leaving the
      % result on the output stack, as recommended by CrossRef DOI
      % documentation.
      % For example, reduce "http://doi.acm.org/10.1145/1534530.1534545" to
      % "10.1145/1534530.1534545".  A suitable URL is later typeset and
      % displayed as the LAST item in the reference list entry.  Publisher Web
      % sites wrap this with a suitable link to a real URL to resolve the DOI,
      % and the master https://doi.org/ address is preferred, since publisher-
      % specific URLs can disappear in response to economic events.  All
      % journals are encouraged by the DOI authorities to use that typeset
      % format and link procedures for uniformity across all publications that
      % include DOIs in reference lists.
      % The numeric prefix is guaranteed to start with "10.", so we use
      % that as a test.
      % 2017-02-04 Added stripping of https:// (Boris)
      doi #1 #3 substring$ "10." =
        { doi }
        {
          doi 't :=  % get modifiable copy of DOI
    
          % Change https:// to http:// to strip both prefixes (BV)
    
          t #1 #8 substring$ "https://" =
            { "http://"  t #9 t text.length$ #8 - substring$ * 't := }
            { }
          if$
    
          t #1 #7 substring$ "http://" =
            {
                t #8 t text.length$ #7 - substring$ 't :=
    
                "INTERNAL STYLE-FILE ERROR" 's :=
    
                % search for next "/" and assign its suffix to s
    
                { t text.length$ }
                {
                  t #1 #1 substring$ "/" =
                    {
                      % save rest of string as true DOI (should be 10.xxxx/yyyy)
                      t #2 t text.length$ #1 - substring$ 's :=
                      "" 't :=    % empty string t terminates the loop
                    }
                    {
                      % discard first character and continue loop: t <= substring(t,2,last)
                      t #2 t text.length$ #1 - substring$ 't :=
                    }
                  if$
                }
                while$
    
                % check for valid DOI (should be 10.xxxx/yyyy)
                s #1 #3 substring$ "10." =
                  { }
                  { "unrecognized DOI substring " s * " in DOI value [" * doi * "]" * warning$ }
                if$
    
                s   % push the stripped DOI on the output stack
    
            }
            {
              "unrecognized DOI value [" doi * "]" * warning$
              doi   % push the unrecognized original DOI on the output stack
            }
          if$
        }
      if$
    }
    
    %
    % Change by BV: added standard prefix to URL
    %
    FUNCTION { output.doi } % UTAH
    { % output non-empty DOI as one-line sentence (stack untouched)
      doi empty.or.unknown
        { }
        { 
          "\href{https://doi.org/" strip.doi * "}{doi:\nolinkurl{" *
          strip.doi  * "}}" * writeln
        }
      if$
    }
    
    FUNCTION { output.isbn }                % UTAH
    { % output non-empty ISBN-10 and/or ISBN-13 as one-line sentences (stack untouched)
      show-isbn-10-and-13
        {
          %% show both 10- and 13-digit ISBNs
          isbn empty.or.unknown
            { }
            {
              "\showISBNx{" isbn * "}" * writeln
            }
          if$
          isbn-13 empty.or.unknown
            { }
            {
              "\showISBNxiii{" isbn-13 * "}" * writeln
            }
          if$
        }
        {
          %% show 10-digit ISBNs only if 13-digit ISBNs not available
          isbn-13 empty.or.unknown
            {
              isbn empty.or.unknown
                { }
                {
                  "\showISBNx{" isbn * "}" * writeln
                }
              if$
            }
            {
              "\showISBNxiii{" isbn-13 * "}" * writeln
            }
          if$
        }
      if$
    }
    
    FUNCTION { output.issn } % UTAH
    { % output non-empty ISSN as one-line sentence (stack untouched)
      issn empty.or.unknown
        { }
        { "\showISSN{" issn * "}" * writeln }
      if$
    }
    
    FUNCTION { output.issue }
    { % output non-empty issue number as a one-line sentence (stack untouched)
      issue empty.or.unknown
        { }
        { "Issue " issue * "." * writeln }
      if$
    }
    
    FUNCTION { output.lccn } % UTAH
    { % return with stack untouched
      lccn empty.or.unknown
        { }
        { "\showLCCN{" lccn * "}" * writeln }
      if$
    }
    
    FUNCTION { output.note } % UTAH
    { % return with stack empty
      note empty.or.unknown
        { }
        { "\shownote{" note * "}" add.period$ * writeln }
      if$
    }
    
    FUNCTION { output.note.check } % UTAH
    { % return with stack empty
      note empty.or.unknown
        { "empty note in " cite$ * warning$ }
        { "\shownote{" note * "}" add.period$ * writeln }
      if$
    }
    
    FUNCTION { output.eprint } %
    { % return with stack empty
      eprint empty.or.unknown
        { }
        { "\showeprint"
             archiveprefix empty.or.unknown
               { eprinttype empty.or.unknown
                   { }
                   { "[" eprinttype "]" * * * }
                 if$
               }
               { "[" archiveprefix "l" change.case$ "]" * * * }
             if$
    	 "{" eprint "}" * * *
             primaryclass empty.or.unknown
               { eprintclass empty.or.unknown
                 { }
                 { "~[" eprintclass "]" * * * }
                 if$
               }
               { "~[" primaryclass "]" * * * }
             if$
             writeln
        }
      if$
    }
    
    
    %
    % Changes by BV 2011/04/15.  Do not output
    % url if doi is defined
    %
    %
    % Changes by BV 2021/11/26.  Output url even if doi is defined
    % if distinctURL is not zero.
    %
    FUNCTION { output.url } % UTAH
    { % return with stack untouched
      % output URL and associated lastaccessed fields
      doi empty.or.unknown distinctURL empty.or.zero not or
      {
        url empty.or.unknown
          { }
          {  new.sentence
              %% Use \urldef, outside \showURL, so that %nn, #, etc in URLs work
              %% correctly.  Put the actual URL on its own line to reduce the
              %% likelihood of BibTeX's nasty line wrapping after column 79.
              %% \url{} can undo this, but if that doesn't work for some reason
              %% the .bbl file would have to be repaired manually.
              "\urldef\tempurl%" writeln
              "\url{" url * "}" * writeln
    
              "\showURL{%" writeln
              lastaccessed empty.or.unknown
                { "" }
                { "Retrieved " lastaccessed * " from " * }
              if$
              "\tempurl" *
    	  archived empty.or.unknown
    	    { }
    	    {"\urldef\tempurla%" writeln
    	      "\url{" archived * "}%" * writeln
    	      ", archived at [\tempurla]" *
    	    }
    	  if$
    	  "}" * writeln
          }
          if$
      }
      { }
      if$
    }
    
    FUNCTION { output.year.check }
    { % warn if year empty, output top string and leave " YEAR<label>" on stack in mid-sentence
      year empty.or.unknown
         { "empty year in " cite$ * warning$
           date empty.or.unknown
           {
              "using n.d. in " cite$ * warning$
              write$
              " \bibinfo{year}{[n.\,d.]}"
              "\natexlab{" extra.label * "}" * *
              mid.sentence 'output.state :=
           }
           {
              "using date in " cite$ * warning$
              write$
              " \bibinfo{year}{" date #1 #4 substring$ * "}" *
              "\natexlab{" extra.label * "}" * *
              mid.sentence 'output.state :=
            }
    	if$
         }
         { write$
           " \bibinfo{year}{" year * "}"  *
           "\natexlab{" extra.label * "}" * *
           mid.sentence 'output.state :=
         }
      if$
    }
    
    
    FUNCTION { le }
    {
      %% test whether first number is less than or equal to second number
      %% stack in:  n1 n2
      %% stack out: if n1 <= n2 then 1 else 0
    
      %% "DEBUG: le " cite$ * warning$
      > { #0 } { #1 } if$
    }
    
    FUNCTION { ge }
    {
      %% test whether first number is greater than or equal to second number
      %% stack in:  n1 n2
      %% stack out: if n1 >= n2 then 1 else 0
    
      %% "DEBUG: ge " cite$ * warning$
      < { #0 } { #1 } if$
    }
    
    FUNCTION { is.leading.digit }
    {
      %% test whether first character of string is a digit
      %% stack in:  string
      %% stack out: if first-char-is-digit then 1 else 0
    
      #1 #1 substring$                      % replace string by string[1:1]
      duplicate$                            % string[1:1] string[1:1]
      chr.to.int$
      "0" chr.to.int$ swap$ le              % "0" <= string[1:1] --> 0-or-1
      swap$                                 % 0-or-1 string[1:1]
      chr.to.int$
      "9" chr.to.int$ le                    % string[1:1} <= "9" --> 0-or-1
      and
    }
    
    FUNCTION { skip.digits }
    {
      %% skip over leading digits in string
      %% stack in:  string
      %% stack out: rest-of-string leading-digits
    
      %% "DEBUG: enter skip.digits " cite$ * warning$
    
      %% dump.stack.1
    
      duplicate$
      't :=
      't.org :=
      "" 'u :=
    
      { t text.length$ }
      {
        %% "=================DEBUG: skip.digits   t = [" t * "]" * warning$
        t is.leading.digit
          { t #2 t text.length$ #1 - substring$ }
          {
            t 'u :=
            ""
          }
        if$
        't :=
      }
      while$
    
      u                                                             % rest of string
      t.org #1 t.org text.length$ u text.length$ - substring$       % leading digits
    
      %% "DEBUG: t.org = [" t.org * "]" * warning$
      %% "DEBUG: u     = [" u * "]" * warning$
    
      %% dump.stack.2
    
      %% "DEBUG: leave skip.digits " cite$ * warning$
    }
    
    FUNCTION { skip.nondigits }
    {
      %% skip over leading nondigits in string
      %% stack in:  string
      %% stack out: rest-of-string
    
      %% "DEBUG: enter skip.nondigits " cite$ * warning$
    
      't :=
      "" 'u :=
    
      { t text.length$ }
      {
        %% "=================DEBUG: skip.nondigits   t = [" t * "]" * warning$
        t is.leading.digit
          {
            t 'u :=
            ""
          }
          { t #2 t text.length$ #1 - substring$ }
        if$
        't :=
      }
      while$
    
      u                     % rest of string
    
      %% dump.stack.1
      %% "DEBUG: leave skip.nondigits " cite$ * warning$
    }
    
    FUNCTION { parse.next.number }
    {
      %% stack in:  string
      %% stack out: rest-of-string next-numeric-part-of-string
      %% Example:
      %% stack in:  "123:1--123:59"
      %% stack out: ":1--123:59" "123"
    
      's :=
      s skip.nondigits 's :=
      s skip.digits
    }
    
    FUNCTION { reduce.pages.to.page.count }
    {
      %% Stack in:  arbitrary-and-unused
      %% Stack out: unchanged
      %%
      %% For the new-style pagination with article number and numpages or
      %% pages, we expect to have BibTeX entries containing something like
      %%     articleno = "17",
      %%     pages     = "1--23",
      %% with output "Article 17, 23 pages",
      %% or
      %%     articleno = "17",
      %%     numpages  = "23",
      %% with output "Article 17, 23 pages",
      %% or
      %%     articleno = "17",
      %%     pages     = "17:1--17:23",
      %% with output "Article 17, 23 pages",
      %%
      %% If articleno is missing or empty, then we should output "1--23",
      %% "23" (with a warning of a missing articleno), or "17:1--17:23",
      %% respectively.
    
      %% "DEBUG: enter reduce.pages.to.page.count " cite$ * warning$
    
      %% "DEBUG: pages = [" pages * "]" * warning$
    
      pages
      parse.next.number 'p1 :=
      parse.next.number 'p2 :=
      parse.next.number 'p3 :=
      parse.next.number 'page.count :=
    
      duplicate$
      empty.or.unknown
        {  }
        {
          duplicate$ "unexpected trailing garbage [" swap$ *
          "] after n:p1--n:p2 in pages = [" *
          pages *
          "] in " *
          cite$ *
          warning$
        }
      if$
    
      pop$
    
      %% "DEBUG: reduce.pages.to.page.count: "
      %% " p1 = " p1 * *
      %% " p2 = " p2 * *
      %% " p3 = " p3 * *
      %% " p4 = " page.count * *
      %% " in " cite$ * * warning$
    
      p1 p3 =   p2 "1" =   and   numpages empty.or.unknown   and
        { "INFO: reduced pages = [" pages * "] to numpages = [" * page.count * "]" * warning$ }
        {
          numpages empty.or.unknown
            { pages }
            { numpages }
          if$
          'page.count :=
        }
      if$
    
      p1 "1" =   p3 empty.or.unknown   and   numpages empty.or.unknown   and
        {
          p2 'page.count :=
          "INFO: reduced pages = [" pages * "] to numpages = [" * page.count * "]" * warning$
        }
        {
          numpages empty.or.unknown
            { pages }
            { numpages }
          if$
          'page.count :=
        }
      if$
    
      %% "DEBUG: leave reduce.pages.to.page.count " cite$ * warning$
    }
    
    FUNCTION { new.block.checkb }
    { % issue a new.block only if at least one of top two stack strings is not empty
      empty.or.unknown
      swap$ empty.or.unknown
      and
        'skip$
        'new.block
      if$
    }
    
    FUNCTION { field.or.null }
    { % convert empty value to null string, else return value
      duplicate$ empty.or.unknown
        { pop$ "" }
        'skip$
      if$
    }
    
    
    
    FUNCTION { emphasize }
    { % emphasize a non-empty top string on the stack
      duplicate$ empty.or.unknown
        { pop$ "" }
        { "\emph{" swap$ * "}" * }
      if$
    }
    
    FUNCTION { comma }
    { % convert empty string to null string, or brace string and add trailing comma
      duplicate$ empty.or.unknown
        { pop$ "" }
        { "{" swap$ * "}," * }
      if$
    }
    
    FUNCTION { format.names }
    {
      % Format bibliographical entries with the first author last name first,
      % and subsequent authors with initials followed by last name.
      % All names are formatted in this routine.
    
      's :=
      #1 'nameptr :=               % nameptr = 1;
      s num.names$ 'numnames :=    % numnames = num.name$(s);
      numnames 'namesleft :=
        { namesleft #0 > }
        { nameptr #1 =
            %NO: BAD ORDER: {"{" s nameptr "{ff~}{ll}{, jj}{, vv}" format.name$ * "}" * 't := }
            %NO: BAD ORDER: {"{" s nameptr "{ff~}{ll}{, jj}{, vv}" format.name$ * "}" * 't := }
            {"\bibinfo{person}{" s nameptr "{ff }{vv }{ll}{, jj}" format.name$ * "}" * 't := }
            {"\bibinfo{person}{" s nameptr "{ff }{vv }{ll}{, jj}" format.name$ * "}" * 't := }
          if$
          nameptr #1 >
            {
              namesleft #1 >
                { ", " * t * }
                {
                  numnames #2 >
                    { "," * }
                    'skip$
                  if$
                  t "\bibinfo{person}{others}" =
                    { " {et~al\mbox{.}}" * } % jrh: avoid spacing problems
                    { " {and} " * t * } % from Chicago Manual of Style
                  if$
                }
              if$
            }
            't
          if$
          nameptr #1 + 'nameptr :=          % nameptr += 1;
          namesleft #1 - 'namesleft :=      % namesleft =- 1;
        }
      while$
    }
    
    FUNCTION { my.full.label }
    {
      's :=
      #1 'nameptr :=               % nameptr = 1;
      s num.names$ 'numnames :=    % numnames = num.name$(s);
      numnames 'namesleft :=
        { namesleft #0 > }
    
        { s nameptr "{vv~}{ll}" format.name$ 't :=  % get the next name
          nameptr #1 >
            {
              namesleft #1 >
                { ", " * t * }
                {
                  numnames #2 >
                    { "," * }
                    'skip$
                  if$
                  t "others" =
                    { " et~al\mbox{.}" * } % jrh: avoid spacing problems
                    { " and " * t * } % from Chicago Manual of Style
                  if$
                }
              if$
            }
            't
          if$
          nameptr #1 + 'nameptr :=          % nameptr += 1;
          namesleft #1 - 'namesleft :=      % namesleft =- 1;
        }
      while$
    
    }
    
    FUNCTION { format.names.fml }
    {
      % Format names in "familiar" format, with first initial followed by
      % last name. Like format.names, ALL names are formatted.
      % jtb: The names are NOT put in small caps
    
      's :=
      #1 'nameptr :=               % nameptr = 1;
      s num.names$ 'numnames :=    % numnames = num.name$(s);
      numnames 'namesleft :=
        { namesleft #0 > }
    
        {
          "\bibinfo{person}{" s nameptr "{ff~}{vv~}{ll}{, jj}" format.name$ * "}" * 't :=
    
          nameptr #1 >
            {
              namesleft #1 >
                { ", " * t * }
                {
                  numnames #2 >
                    { "," * }
                    'skip$
                  if$
                  t "\bibinfo{person}{others}" =
                    { " {et~al\mbox{.}}" * }
                    { " {and} " * t * }
                  if$
                }
              if$
            }
            't
          if$
          nameptr #1 + 'nameptr :=          % nameptr += 1;
          namesleft #1 - 'namesleft :=      % namesleft =- 1;
        }
      while$
    }
    
    FUNCTION { format.authors }
    {
      author empty.or.unknown
        { "" }
        {
          "\bibfield{author}{"
          author format.names add.period$ * "}" *} % jtb: add period if none before
      if$
    }
    
    FUNCTION { format.key }
    {
      empty.or.unknown
        { key field.or.null }
        { "" }
      if$
    }
    
    FUNCTION { format.no.key }
    {
      empty.or.unknown
        { "" }
        { "" }
      if$
    }
    
    FUNCTION { format.editors.fml }
    {
      % Format editor names for use in the "in" types: inbook, incollection,
      % inproceedings: first initial, then last names. When editors are the
      % LABEL for an entry, then format.editor is used which lists editors
      % by last name first.
    
      editor empty.or.unknown
        { "" }
        {
          "\bibfield{editor}{"
          editor format.names.fml
          *  "}" *
          editor num.names$ #1 >
            { " (Eds.)" * }
            { " (Ed.)" * }
          if$
        }
      if$
    }
    
    FUNCTION { format.editors }
    { % format editor names for use in labels, last names first.
      editor empty.or.unknown
        { "" }
        {
          "\bibfield{editor}{"
          editor format.names
          *  "}" *
          editor num.names$ #1 >
            { " (Eds.)." * }
            { " (Ed.)." * }
          if$
        }
      if$
    }
    
    FUNCTION { format.articletitle }
    {
      title empty.or.unknown
        { "" }
        % Use this to preserve lettercase in titles:
        { "\showarticletitle{" title * "}" * }
        % Use this for downcase title style:
        % { \showarticletitle{" title "t" change.case$ * "}" * }
      if$
    }
    
    FUNCTION { format.title }
    {
      title empty.or.unknown
        { "" }
        % Use this to preserve lettercase in titles:
        { "\bibinfo{title}{" title * "}" * }
        % Use this for downcase title style:
        % { title "t" change.case$ }
      if$
    }
    
    FUNCTION { n.dashify }
    {
      't :=
      ""
        { t empty.or.unknown not }
        {
          t #1 #1 substring$ "-" =
            {
              t #1 #2 substring$ "--" = not
                { "--" *
                  t #2 global.max$ substring$ 't :=
                }
                {
                  { t #1 #1 substring$ "-" = }
                  {
                    "-" *
                    t #2 global.max$ substring$ 't :=
                  }
                  while$
                }
              if$
            }
            {
              t #1 #1 substring$ *
              t #2 global.max$ substring$ 't :=
            }
          if$
        }
      while$
    }
    
    FUNCTION { format.a.title.with.edition }
    {
      "\bibinfo{booktitle}{"
      swap$ emphasize *
      edition empty.or.unknown
        'skip$
        { " (\bibinfo{edition}{" * edition "l" change.case$ *
          "} ed.)" * } % jtb: no parens for ed.
      if$
      "}" *
    }
    
    FUNCTION { format.btitle }
    { title format.a.title.with.edition }
    
    FUNCTION { format.emphasize.booktitle }
    { booktitle format.a.title.with.edition }
    
    
    
    FUNCTION { format.city }
    {
      % jtb: if the preceding string (the title of the conference) is non-empty,
      % jtb: append the location, otherwise leave empty (so as to trigger the
      % jtb: error message in output.check
    
      duplicate$ empty.or.unknown
        { }
        {
          city empty.or.unknown location empty.or.unknown and
            {
              date empty.or.unknown
                { }
                { " (" * date * ")" * }
              if$
            }
            {
              location empty.or.unknown
                {
                  date empty.or.unknown
                    { " (" * city * ")" * }
                    { " (" * city * ", " * date * ")" * }
                  if$
                }
                {
                  date empty.or.unknown
                    { " (" * location * ")" * }
                    { " (" * location * ", " * date * ")" * }
                  if$
                }
              if$
            }
          if$
        }
      if$
    }
    
    FUNCTION { tie.or.space.connect }
    {
      duplicate$ text.length$ #3 <
        { "~" }
        { " " }
      if$
      swap$ * *
    }
    
    FUNCTION { either.or.check }
    {
      empty.or.unknown
        'pop$
        { "can't use both " swap$ * " fields in " * cite$ * warning$ }
      if$
    }
    
    FUNCTION { format.bvolume }
    {
      % jtb: If there is a series, this is added and the volume trails after it.
      % jtb: Otherwise, "Vol" is Capitalized.
    
      volume empty.or.unknown
        { "" }
        {
          series empty.or.unknown
            { "Vol.~\bibinfo{volume}{" volume "}" * *}
            { "\bibinfo{series}{" series "}, " * *
              "Vol.~\bibinfo{volume}{" volume "}" * * *}
          if$
          "volume and number" number either.or.check
        }
      if$
    }
    
    FUNCTION { format.bvolume.noseries }
    {
      volume empty.or.unknown
        { "" }
        { "Vol.~\bibinfo{volume}{" volume "}" * *
          "volume and number" number either.or.check
        }
      if$
    }
    
    FUNCTION { format.series }
    {
      series empty.or.unknown
        {""}
        {" \emph{(\bibinfo{series}{" * series "}" *
         volume empty.or.unknown
           {
             number empty.or.unknown
                {")}" *}
                {", \bibinfo{number}{" number "})}" * * *}
              if$
           }
           {", Vol.~\bibinfo{volume}{" volume "})}" * * *
            "volume and number" number either.or.check
           }
         if$
        }
      if$
    }
    
    FUNCTION { format.number.series }
    {
      volume empty.or.unknown
        {
          number empty.or.unknown
            {
              volume empty.or.unknown
              { "" }
              {
                series empty.or.unknown
                  { "" }
                  { " (\bibinfo{series}{" series * "})" * }
                if$
              }
              if$
            }                                       %    { series field.or.null }
            {
              output.state mid.sentence =
                { "Number" }                        % gnp - changed to mixed case always
                { "Number" }
              if$
              number tie.or.space.connect series empty.or.unknown
                { "there's a number but no series in " cite$ * warning$ }
                { " in \bibinfo{series}{" * series * "}" * }
              if$
            }
          if$
        }
        {
          ""
        }
      if$
    }
    
    FUNCTION { multi.page.check }
    {
      't :=
      #0 'multiresult :=
        { multiresult not
          t empty.or.unknown not
          and
        }
        { t #1 #1 substring$
          duplicate$ "-" =
          swap$ duplicate$ "," =
          swap$ "+" =
          or or
        { #1 'multiresult := }
        { t #2 global.max$ substring$ 't := }
          if$
        }
      while$
      multiresult
    }
    
    FUNCTION { format.pages }
    {
      pages empty.or.unknown
        { "" }
        { "\bibinfo{pages}{"
          pages multi.page.check
            { pages n.dashify } % gnp - removed () % jtb: removed pp.
            { pages }
          if$
          * "}" *
        }
      if$
    }
    
    FUNCTION { format.pages.check.without.articleno }
    { %% format pages field only if articleno is absent
      %% Stack out: pages-specification
      numpages missing$ pages missing$ and
        { "page numbers missing in both pages and numpages fields in " cite$ * warning$ }
        { }
      if$
    
      articleno empty.or.unknown eid empty.or.unknown and
        {
          pages missing$
            {
    	   numpages empty.or.unknown
    	     {""}
                 { "\bibinfo{numpages}{" numpages * "}~pages" * }
    	  if$
    	}
            { format.pages }
          if$
        }
        { "" }
      if$
    }
    
    FUNCTION { format.pages.check }
    {
      pages empty.or.unknown
        { "page numbers missing in " cite$ * warning$ "" }
        { pages n.dashify }
      if$
    }
    
    FUNCTION { format.bookpages }
    {
      bookpages empty.or.unknown
        { "" }
        { bookpages "book pages" tie.or.space.connect }
      if$
    }
    
    FUNCTION { format.named.pages }
    {
      pages empty.or.unknown
        { "" }
        { format.pages "pages" tie.or.space.connect }
      if$
    }
    
    %
    % Changed by Boris Veytsman, 2011-03-13
    % Now the word "pages" is printed even if
    % there field pages is not empty.
    %
    
    FUNCTION { format.page.count }
    {
      page.count empty.or.unknown
        { "" }
        { "\bibinfo{numpages}{" page.count * "}~pages" * }
      if$
    }
    
    FUNCTION { format.articleno.numpages }
    {
      %% There are seven possible outputs, depending on which fields are set.
      %%
      %% These four are handled here:
      %%
      %%     articleno, numpages, pages     -> "Article articleno-value, numpages-value pages"
      %%     articleno, numpages            -> "Article articleno-value, numpages-value pages"
      %%     articleno, pages               -> "Article articleno-value, reduced-pages-value pages"
      %%     articleno                      -> "Article articleno-value" and warn about missing numpages
      %%
      %% The remaining three have already been handled by
      %% format.pages.check.without.articleno:
      %%
      %%     numpages, pages                -> "pages-value"
      %%     numpages                       -> "numpages-value"
      %%     pages                          -> "pages-value"
      %%
      %% We no longer issue warninig when missing articleno, but having numpages
    
      articleno empty.or.unknown eid empty.or.unknown and
        {
    %%      numpages empty.or.unknown
    %%        { }
    %%        { "numpages field, but no articleno or eid field, in "
    %%          cite$ * warning$ }
    %%      if$
          ""
        }
        {
          numpages empty.or.unknown
            {
              pages empty.or.unknown
                {
                  "articleno or eid, but no pages or numpages field in "
                     cite$ * warning$
                  "" 'page.count :=
                }
                { reduce.pages.to.page.count }
              if$
            }
            { numpages 'page.count := }
          if$
    
          %% The Article number is now handled in format.day.month.year because
          %% ACM prefers the style "Digital Libraries 12, 3, Article 5 (July 2008)"
          %% over "Digital Libraries 12, 3 (July 2008), Article 5"
          %% format.articleno output
          format.page.count
        }
      if$
    }
    
    FUNCTION {calc.format.page.count}
    {
      numpages empty.or.unknown
       {
         pages empty.or.unknown
            {
            "" 'page.count :=
            }
            { reduce.pages.to.page.count }
         if$
       }
       { numpages 'page.count := }
      if$
      format.page.count
    }
    
    
    FUNCTION { journal.canon.abbrev }
    {
      % Returns a canonical abbreviation for 'journal', or else 'journal'
      % unchanged.
      journal "ACM Computing Surveys"                                                                       = { "Comput. Surveys"                                 } {
      journal "{ACM} Computing Surveys"                                                                     = { "Comput. Surveys"                                 } {
      journal "ACM Transactions on Mathematical Software"                                                   = { "ACM Trans. Math. Software"                       } {
      journal "{ACM} Transactions on Mathematical Software"                                                 = { "ACM Trans. Math. Software"                       } {
      journal "ACM SIGNUM Newsletter"                                                                       = { "ACM SIGNUM Newslett."                            } {
      journal "ACM {SIGNUM} Newsletter"                                                                     = { "ACM SIGNUM Newslett."                            } {
      journal "{ACM} SIGNUM Newsletter"                                                                     = { "ACM SIGNUM Newslett."                            } {
      journal "{ACM} {SIGNUM} Newsletter"                                                                   = { "ACM SIGNUM Newslett."                            } {
      journal "American Journal of Sociology"                                                               = { "Amer. J.
  • acmart.cls120 KBVendored from mirrors.ctan.org on 2026-05-26.
    %%
    %% This is file `acmart.cls',
    %% generated with the docstrip utility.
    %%
    %% The original source files were:
    %%
    %% acmart.dtx  (with options: `class')
    %% 
    %% IMPORTANT NOTICE:
    %% 
    %% For the copyright see the source file.
    %% 
    %% Any modified versions of this file must be renamed
    %% with new filenames distinct from acmart.cls.
    %% 
    %% For distribution of the original source see the terms
    %% for copying and modification in the file acmart.dtx.
    %% 
    %% This generated file may be distributed as long as the
    %% original source files, as listed above, are part of the
    %% same distribution. (The sources need not necessarily be
    %% in the same archive or directory.)
    %% \CharacterTable
    %%  {Upper-case    \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
    %%   Lower-case    \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z
    %%   Digits        \0\1\2\3\4\5\6\7\8\9
    %%   Exclamation   \!     Double quote  \"     Hash (number) \#
    %%   Dollar        \$     Percent       \%     Ampersand     \&
    %%   Acute accent  \'     Left paren    \(     Right paren   \)
    %%   Asterisk      \*     Plus          \+     Comma         \,
    %%   Minus         \-     Point         \.     Solidus       \/
    %%   Colon         \:     Semicolon     \;     Less than     \<
    %%   Equals        \=     Greater than  \>     Question mark \?
    %%   Commercial at \@     Left bracket  \[     Backslash     \\
    %%   Right bracket \]     Circumflex    \^     Underscore    \_
    %%   Grave accent  \`     Left brace    \{     Vertical bar  \|
    %%   Right brace   \}     Tilde         \~}
    
    
    \NeedsTeXFormat{LaTeX2e}
    \ProvidesClass{acmart}
    [2025/08/27 v2.16 Typesetting articles for the Association for Computing Machinery]
    \def\@classname{acmart}
    \InputIfFileExists{acmart-preload-hook.tex}{%
      \ClassWarning{\@classname}{%
        I am loading acmart-preload-hook.tex. You are fully responsible
        for any problems from now on.}}{}
    \RequirePackage{xkeyval}
    \RequirePackage{xstring}
    \RequirePackage{iftex}
    \define@choicekey*+{\@classname.cls}{format}[\ACM@format\ACM@format@nr]{%
      manuscript, acmsmall, acmlarge, acmtog, sigconf, siggraph,
      sigplan, sigchi, sigchi-a, acmengage, acmcp}[manuscript]{}{%
      \ClassError{\@classname}{The option format must be manuscript,
        acmsmall, acmlarge, acmtog, sigconf, siggraph,
        sigplan, sigchi or sigchi-a}}
    \def\@DeclareACMFormat#1{\DeclareOptionX{#1}{\setkeys{\@classname.cls}{format=#1}}}
    \@DeclareACMFormat{manuscript}
    \@DeclareACMFormat{acmsmall}
    \@DeclareACMFormat{acmlarge}
    \@DeclareACMFormat{acmtog}
    \@DeclareACMFormat{sigconf}
    \@DeclareACMFormat{siggraph}
    \@DeclareACMFormat{sigplan}
    \@DeclareACMFormat{sigchi}
    \@DeclareACMFormat{sigchi-a}
    \@DeclareACMFormat{acmengage}
    \@DeclareACMFormat{acmcp}
    \ExecuteOptionsX{format}
    \define@boolkey+{\@classname.cls}[@ACM@]{screen}[true]{%
      \if@ACM@screen
        \PackageInfo{\@classname}{Using screen mode}%
      \else
        \PackageInfo{\@classname}{Not using screen mode}%
      \fi}{\PackageError{\@classname}{The option screen can be either true or
        false}}
    \ExecuteOptionsX{screen=false}
    \define@boolkey+{\@classname.cls}[@ACM@]{urlbreakonhyphens}[true]{%
      \if@ACM@urlbreakonhyphens
        \PackageInfo{\@classname}{Using breaking urls on hyphens}%
      \else
        \PackageInfo{\@classname}{Not breaking urls on hyphens}%
      \fi}{\PackageError{\@classname}{The option urlbreakonhyphens can be either true or
        false}}
    \ExecuteOptionsX{urlbreakonhyphens=true}
    \define@boolkey+{\@classname.cls}[@ACM@]{acmthm}[true]{%
      \if@ACM@acmthm
        \PackageInfo{\@classname}{Requiring acmthm}%
      \else
        \PackageInfo{\@classname}{Suppressing acmthm}%
      \fi}{\PackageError{\@classname}{The option acmthm can be either true or
        false}}
    \ExecuteOptionsX{acmthm=true}
    \define@boolkey+{\@classname.cls}[@ACM@]{review}[true]{%
      \if@ACM@review
        \PackageInfo{\@classname}{Using review mode}%
        \AtBeginDocument{\@ACM@printfoliostrue}%
      \else
        \PackageInfo{\@classname}{Not using review mode}%
      \fi}{\PackageError{\@classname}{The option review can be either true or
        false}}
    \ExecuteOptionsX{review=false}
    \define@boolkey+{\@classname.cls}[@ACM@]{authorversion}[true]{%
      \if@ACM@authorversion
        \PackageInfo{\@classname}{Using authorversion mode}%
      \else
        \PackageInfo{\@classname}{Not using authorversion mode}%
      \fi}{\PackageError{\@classname}{The option authorversion can be either true or
        false}}
    \ExecuteOptionsX{authorversion=false}
    \define@boolkey+{\@classname.cls}[@ACM@]{nonacm}[true]{%
      \if@ACM@nonacm
        \PackageInfo{\@classname}{Using nonacm mode}%
        \AtBeginDocument{\@ACM@printacmreffalse}%
        % in 'nonacm' mode we disable the "ACM Reference Format"
        % printing by default, but this can be re-enabled by the
        % user using \settopmatter{printacmref=true}
      \else
        \PackageInfo{\@classname}{Not using nonacm mode}%
      \fi}{\PackageError{\@classname}{The option nonacm can be either true or
        false}}
    \ExecuteOptionsX{nonacm=false}
    \define@boolkey+{\@classname.cls}[@ACM@]{balance}[true]{}{%
      \PackageError{\@classname}{The option balance can be either true or
        false}}
    \ExecuteOptionsX{balance}
    \define@boolkey+{\@classname.cls}[@ACM@]{pbalance}[true]{}{%
      \PackageError{\@classname}{The option pbalance can be either true or
        false}}
    \ExecuteOptionsX{pbalance=false}
    \define@boolkey+{\@classname.cls}[@ACM@]{natbib}[true]{%
      \if@ACM@natbib
        \PackageInfo{\@classname}{Explicitly selecting natbib mode}%
      \else
        \PackageInfo{\@classname}{Explicitly deselecting natbib mode}%
      \fi}{\PackageError{\@classname}{The option natbib can be either true or
        false}}
    \ExecuteOptionsX{natbib=true}
    \define@boolkey+{\@classname.cls}[@ACM@]{anonymous}[true]{%
      \if@ACM@anonymous
        \PackageInfo{\@classname}{Using anonymous mode}%
      \else
        \PackageInfo{\@classname}{Not using anonymous mode}%
      \fi}{\PackageError{\@classname}{The option anonymous can be either true or
        false}}
    \ExecuteOptionsX{anonymous=false}
    \define@boolkey+{\@classname.cls}[@ACM@]{timestamp}[true]{%
      \if@ACM@timestamp
        \PackageInfo{\@classname}{Using timestamp mode}%
      \else
        \PackageInfo{\@classname}{Not using timestamp mode}%
      \fi}{\PackageError{\@classname}{The option timestamp can be either true or
        false}}
    \ExecuteOptionsX{timestamp=false}
    \define@boolkey+{\@classname.cls}[@ACM@]{authordraft}[true]{%
      \if@ACM@authordraft
        \PackageInfo{\@classname}{Using authordraft mode}%
        \@ACM@timestamptrue
        \@ACM@reviewtrue
      \else
        \PackageInfo{\@classname}{Not using authordraft mode}%
      \fi}{\PackageError{\@classname}{The option authordraft can be either true or
        false}}
    \ExecuteOptionsX{authordraft=false}
    \def\ACM@fontsize{}
    \DeclareOptionX{8pt}{\edef\ACM@fontsize{\CurrentOption}}
    \DeclareOptionX{9pt}{\edef\ACM@fontsize{\CurrentOption}}
    \DeclareOptionX{10pt}{\edef\ACM@fontsize{\CurrentOption}}
    \DeclareOptionX{11pt}{\edef\ACM@fontsize{\CurrentOption}}
    \DeclareOptionX{12pt}{\edef\ACM@fontsize{\CurrentOption}}
    \def\ACM@languages{}
    \DeclareOptionX{language}{%
      \ifx\ACM@languages\@empty
      \gdef\ACM@languages{english}\fi
      \g@addto@macro\ACM@languages{, #1}}
    \DeclareOptionX{draft}{\PassOptionsToClass{\CurrentOption}{amsart}}
    \DeclareOptionX{*}{\PassOptionsToClass{\CurrentOption}{amsart}}
    \ProcessOptionsX
    \ClassInfo{\@classname}{Using format \ACM@format, number \ACM@format@nr}
    \newif\if@ACM@manuscript
    \newif\if@ACM@journal
    \newif\if@ACM@journal@bibstrip
    \newif\if@ACM@journal@bibstrip@or@tog
    \newif\if@ACM@sigchiamode
    \newif\if@ACM@engage
    \@ACM@engagefalse
    \newif\if@ACM@acmcp
    \@ACM@acmcpfalse
    \ifnum\ACM@format@nr=5\relax % siggraph
    \ClassWarning{\@classname}{%
      The format siggraph is now obsolete.\MessageBreak
      I am switching to sigconf.}
      \setkeys{\@classname.cls}{format=sigconf}
    \fi
    \ifnum\ACM@format@nr=7\relax % sigchi
    \ClassWarning{\@classname}{%
      The format sigchi is now obsolete.\MessageBreak
      I am switching to sigconf.}
      \setkeys{\@classname.cls}{format=sigconf}
    \fi
    \ifnum\ACM@format@nr=8\relax % sigchi
    \ClassWarning{\@classname}{%
      ACM SIGCHI has retired the SIGCHI-A template\MessageBreak
      effective immediately. ACM is keeping this template\MessageBreak
      option available to authors who are working on legacy\MessageBreak
      documents only. ACM will not, under any circumstances,\MessageBreak
      accept documents in this format for publication and\MessageBreak
      will not offer technical support to the authors who use\MessageBreak
      this template.\MessageBreak
      ACM SIGCHI is directing Conference leaders and\MessageBreak
      authors to publish their articles using the SIGCONF\MessageBreak
      template call.}
    \fi
    \ifnum\ACM@format@nr=0\relax
      \@ACM@manuscripttrue
    \else
      \@ACM@manuscriptfalse
    \fi
    \@ACM@sigchiamodefalse
    \ifcase\ACM@format@nr
    \relax % manuscript
      \@ACM@journaltrue
    \or % acmsmall
      \@ACM@journaltrue
    \or % acmlarge
      \@ACM@journaltrue
    \or % acmtog
      \@ACM@journaltrue
      \@ACM@journal@bibstrip@or@togtrue
    \or % sigconf
      \@ACM@journalfalse
    \or % siggraph
      \@ACM@journalfalse
     \or % sigplan
      \@ACM@journalfalse
     \or % sigchi
      \@ACM@journalfalse
    \or % sigchi-a
      \@ACM@journalfalse
      \@ACM@sigchiamodetrue
    \or % acmengage
      \@ACM@journalfalse
      \@ACM@engagetrue
    \or % acmcp
      \@ACM@journaltrue
      \@ACM@acmcptrue
      \AtBeginDocument{\@ACM@printacmreffalse}%
    \fi
    \if@ACM@journal
      \@ACM@journal@bibstriptrue
      \@ACM@journal@bibstrip@or@togtrue
    \else
     \@ACM@journal@bibstripfalse
    \fi
    \ifx\ACM@fontsize\@empty
      \ifcase\ACM@format@nr
      \relax % manuscript
        \def\ACM@fontsize{9pt}%
      \or % acmsmall
        \def\ACM@fontsize{10pt}%
      \or % acmlarge
        \def\ACM@fontsize{10pt}%
      \or % acmtog
        \def\ACM@fontsize{9pt}%
      \or % sigconf
        \def\ACM@fontsize{9pt}%
      \or % siggraph
        \def\ACM@fontsize{9pt}%
       \or % sigplan
        \def\ACM@fontsize{10pt}%
       \or % sigchi
        \def\ACM@fontsize{9pt}%
      \or % sigchi-a
        \def\ACM@fontsize{10pt}%
      \or % acmengage
        \def\ACM@fontsize{10pt}%
      \or % acmcp
        \def\ACM@fontsize{9pt}%
      \fi
    \fi
    \ClassInfo{\@classname}{Using fontsize \ACM@fontsize}
    \LoadClass[\ACM@fontsize, reqno]{amsart}
    \RequirePackage{microtype}
    \RequirePackage{etoolbox}
    \RequirePackage{booktabs}
    \RequirePackage{refcount}
    \RequirePackage{totpages}
    \RequirePackage{environ}
    \if@ACM@manuscript
    \RequirePackage{setspace}
    \onehalfspacing
    \fi
    \if@ACM@acmcp
    \RequirePackage{framed}
    \RequirePackage{zref-savepos, zref-user}
    \fi
    \newdimen\@ACM@acmcp@delta
    \@ACM@acmcp@delta=0pt\relax
    \if@ACM@natbib
      \RequirePackage{natbib}
      \renewcommand{\bibsection}{%
         \section*{\refname}%
         \phantomsection\addcontentsline{toc}{section}{\refname}%
      }
      \renewcommand{\bibfont}{\bibliofont}
      \renewcommand\setcitestyle[1]{
      \@for\@tempa:=#1\do
      {\def\@tempb{round}\ifx\@tempa\@tempb
         \renewcommand\NAT@open{(}\renewcommand\NAT@close{)}\fi
       \def\@tempb{square}\ifx\@tempa\@tempb
         \renewcommand\NAT@open{[}\renewcommand\NAT@close{]}\fi
       \def\@tempb{angle}\ifx\@tempa\@tempb
         \renewcommand\NAT@open{$<$}\renewcommand\NAT@close{$>$}\fi
       \def\@tempb{curly}\ifx\@tempa\@tempb
         \renewcommand\NAT@open{\{}\renewcommand\NAT@close{\}}\fi
       \def\@tempb{semicolon}\ifx\@tempa\@tempb
         \renewcommand\NAT@sep{;}\fi
       \def\@tempb{colon}\ifx\@tempa\@tempb
         \renewcommand\NAT@sep{;}\fi
       \def\@tempb{comma}\ifx\@tempa\@tempb
         \renewcommand\NAT@sep{,}\fi
       \def\@tempb{authoryear}\ifx\@tempa\@tempb
         \NAT@numbersfalse\fi
       \def\@tempb{numbers}\ifx\@tempa\@tempb
         \NAT@numberstrue\NAT@superfalse\fi
       \def\@tempb{super}\ifx\@tempa\@tempb
         \NAT@numberstrue\NAT@supertrue\fi
       \def\@tempb{nobibstyle}\ifx\@tempa\@tempb
         \let\bibstyle=\@gobble\fi
       \def\@tempb{bibstyle}\ifx\@tempa\@tempb
         \let\bibstyle=\@citestyle\fi
       \def\@tempb{sort}\ifx\@tempa\@tempb
         \def\NAT@sort{\@ne}\fi
       \def\@tempb{nosort}\ifx\@tempa\@tempb
         \def\NAT@sort{\z@}\fi
       \def\@tempb{compress}\ifx\@tempa\@tempb
         \def\NAT@cmprs{\@ne}\fi
       \def\@tempb{nocompress}\ifx\@tempa\@tempb
         \def\NAT@cmprs{\z@}\fi
       \def\@tempb{sort&compress}\ifx\@tempa\@tempb
         \def\NAT@sort{\@ne}\def\NAT@cmprs{\@ne}\fi
       \def\@tempb{mcite}\ifx\@tempa\@tempb
         \let\NAT@merge\@ne\fi
       \def\@tempb{merge}\ifx\@tempa\@tempb
         \@ifnum{\NAT@merge<\tw@}{\let\NAT@merge\tw@}{}\fi
       \def\@tempb{elide}\ifx\@tempa\@tempb
         \@ifnum{\NAT@merge<\thr@@}{\let\NAT@merge\thr@@}{}\fi
       \def\@tempb{longnamesfirst}\ifx\@tempa\@tempb
         \NAT@longnamestrue\fi
       \def\@tempb{nonamebreak}\ifx\@tempa\@tempb
         \def\NAT@nmfmt#1{\mbox{\NAT@up#1}}\fi
       \expandafter\NAT@find@eq\@tempa=\relax\@nil
       \if\@tempc\relax\else
         \expandafter\NAT@rem@eq\@tempc
         \def\@tempb{open}\ifx\@tempa\@tempb
          \xdef\NAT@open{\@tempc}\fi
         \def\@tempb{close}\ifx\@tempa\@tempb
          \xdef\NAT@close{\@tempc}\fi
         \def\@tempb{aysep}\ifx\@tempa\@tempb
          \xdef\NAT@aysep{\@tempc}\fi
         \def\@tempb{yysep}\ifx\@tempa\@tempb
          \xdef\NAT@yrsep{\@tempc}\fi
         \def\@tempb{notesep}\ifx\@tempa\@tempb
          \xdef\NAT@cmt{\@tempc}\fi
         \def\@tempb{citesep}\ifx\@tempa\@tempb
          \xdef\NAT@sep{\@tempc}\fi
       \fi
      }%
      \NAT@@setcites
      }
      \renewcommand\citestyle[1]{%
        \ifcsname bibstyle@#1\endcsname%
        \csname bibstyle@#1\endcsname\let\bibstyle\@gobble%
        \else%
        \@latex@error{Undefined `#1' citestyle}%
        \fi
      }%
    \fi
    \newcommand{\bibstyle@acmauthoryear}{%
      \setcitestyle{%
        authoryear,%
        open={[},close={]},citesep={;},%
        aysep={},yysep={,},%
        notesep={, }}}
    \newcommand{\bibstyle@acmnumeric}{%
      \setcitestyle{%
        numbers,sort&compress,%
        open={[},close={]},citesep={,},%
        notesep={, }}}
    \if@ACM@natbib
    \citestyle{acmnumeric}
    \fi
    \if@ACM@journal
      \renewcommand\keywordsname{Additional Key Words and Phrases}%
    \else
      \renewcommand\keywordsname{Keywords}%
    \fi
    \if@ACM@engage
       \renewcommand\abstractname{Synopsis}%
    \fi
    \ifx\ACM@languages\@empty
    \else
      \RequirePackage[\ACM@languages]{babel}%
      \addto\captionsenglish{%
          \if@ACM@journal
            \renewcommand\keywordsname{Additional Key Words and Phrases}%
          \else
            \renewcommand\keywordsname{Keywords}%
          \fi
          \renewcommand\acksname{Acknowledgements}%
          \if@ACM@engage
             \renewcommand\abstractname{Synopsis}%
          \fi
      }%
      \addto\captionsfrench{%
          \if@ACM@journal
            \renewcommand\keywordsname{Mots Clés et Phrases Supplémentaires}%
          \else
            \renewcommand\keywordsname{Mots clés}%
          \fi
          \renewcommand\acksname{Remerciements}%
      }%
      \addto\captionsgerman{%
          \if@ACM@journal
            \renewcommand\keywordsname{Zusätzliche Schlagwörter und Phrasen}%
          \else
            \renewcommand\keywordsname{Schlagwörter}%
          \fi
          \renewcommand\acksname{Danksagungen}%
      }%
      \addto\captionsspanish{%
          \if@ACM@journal
            \renewcommand\keywordsname{Palabras y Frases Claves Adicionales}%
          \else
            \renewcommand\keywordsname{Palabras claves}%
          \fi
          \renewcommand\acksname{Expresiones de gratitud}%
      }%
    \fi
    \newcommand\ACM@lang@check[1]{%
      \ifx\ACM@languages\@empty\relax
      \ClassError{\@classname}{%
        Command \string#1 \MessageBreak is used in monlingual document}{%
        You used a command (\string#1) \MessageBreak
        that does not have a meaning \MessageBreak
        unless are languages are defined. \MessageBreak
        Please choose the languages in \string\documentclass
        \MessageBreak
        (e.g. \string\documentclass[languages={french, english}]{acmart}),
        \MessageBreak
        or delete the command.}%
      \fi}
    \def\@translatedtitle{}
    \newcommand\translatedtitle[2]{\ACM@lang@check{\translatedtitle}%
    \g@addto@macro\@translatedtitle{\par\foreignlanguage{#1}{#2}}}
    \def\@translatedsubtitle{}
    \newcommand\translatedsubtitle[2]{\ACM@lang@check{\translatedsubtitle}%
    \g@addto@macro\@translatedsubtitle{\par\foreignlanguage{#1}{#2}}}
    \def\@translatedkeywords{}
    \newcommand\translatedkeywords[2]{\ACM@lang@check{\translatedkeywords}%
    \g@addto@macro\@translatedkeywords{\@mktranslatedkeywords{#1}{#2}}}
    \def\@translatedabstracts{}
    \newenvironment{translatedabstract}[1]{\Collect@Body
      \@savetranslatedabstract\@mktranslatedabstract{#1}}{}
    \long\def\@savetranslatedabstract#1{\if@ACM@maketitle@typeset
      \ClassError{\@classname}{Abstract must be defined before maketitle
        command. Please move it!}\fi
      \ACM@lang@check{translatedabstract}%
      \g@addto@macro\@translatedabstracts{\bgroup#1\egroup}}
    \def\@startsection#1#2#3#4#5#6{%
      \if@noskipsec \leavevmode \fi
      \par
      \@tempskipa #4\relax
      \@afterindenttrue
      \ifdim \@tempskipa <\z@
        \@tempskipa -\@tempskipa \@afterindentfalse
      \fi
      \if@nobreak
        \everypar{}%
      \else
        \addpenalty\@secpenalty\addvspace\@tempskipa
      \fi
      \@ifstar
        {\@ssect{#3}{#4}{#5}{#6}}%
        {\@dblarg{\@sect{#1}{#2}{#3}{#4}{#5}{#6}}}}
    \def\@sect#1#2#3#4#5#6[#7]#8{%
      \edef\@toclevel{\ifnum#2=\@m 0\else\number#2\fi}%
      \ifnum #2>\c@secnumdepth
        \let\@svsec\@empty
      \else
        \refstepcounter{#1}%
        \protected@edef\@svsec{\@seccntformat{#1}\relax}%
      \fi
      \@tempskipa #5\relax
      \ifdim \@tempskipa>\z@
        \begingroup
          #6{%
            \@hangfrom{\hskip #3\relax\@svsec}%
              \interlinepenalty \@M #8\@@par}%
        \endgroup
        \csname #1mark\endcsname{#7}%
        \ifnum #2>\c@secnumdepth \else
            \@tochangmeasure{\csname the#1\endcsname}%
        \fi
        \addcontentsline{toc}{#1}{%
          \ifnum #2>\c@secnumdepth \else
            \protect\numberline{\csname the#1\endcsname}%
          \fi
          #7}%
      \else
        \def\@svsechd{%
          #6{\hskip #3\relax
          \@svsec #8}%
          \csname #1mark\endcsname{#7}%
          \ifnum #2>\c@secnumdepth \else
            \@tochangmeasure{\csname the#1\endcsname\space}%
          \fi
          \addcontentsline{toc}{#1}{%
            \ifnum #2>\c@secnumdepth \else
              \protect\numberline{\csname the#1\endcsname}%
            \fi
            #7}}%
      \fi
      \@xsect{#5}}
    \def\@xsect#1{%
      \@tempskipa #1\relax
      \ifdim \@tempskipa>\z@
        \par \nobreak
        \vskip \@tempskipa
        \@afterheading
      \else
        \@nobreakfalse
        \global\@noskipsectrue
        \everypar{%
          \if@noskipsec
            \global\@noskipsecfalse
           {\setbox\z@\lastbox}%
            \clubpenalty\@M
            \begingroup \@svsechd \endgroup
            \unskip
            \@tempskipa #1\relax
            \hskip -\@tempskipa
          \else
            \clubpenalty \@clubpenalty
            \everypar{}%
          \fi}%
      \fi
      \ignorespaces}
    \def\@ssect#1#2#3#4#5{%
      \@tempskipa #3\relax
      \ifdim \@tempskipa>\z@
        \begingroup
          #4{%
            \@hangfrom{\hskip #1}%
              \interlinepenalty \@M #5\@@par}%
        \endgroup
      \else
        \def\@svsechd{#4{\hskip #1\relax #5}}%
      \fi
      \@xsect{#3}}
    \def\@seccntformat#1{\csname the#1\endcsname\quad}
    \def\@starttoc#1#2{\begingroup\makeatletter
      \setTrue{#1}%
      \par\removelastskip\vskip\z@skip
      \@startsection{section}\@M\z@{\linespacing\@plus\linespacing}%
        {.5\linespacing}{\centering\contentsnamefont}{#2}%
      \@input{\jobname.#1}%
      \if@filesw
        \@xp\newwrite\csname tf@#1\endcsname
        \immediate\@xp\openout\csname tf@#1\endcsname \jobname.#1\relax
      \fi
      \global\@nobreakfalse \endgroup
      \addvspace{32\p@\@plus14\p@}%
    }
    \def\l@section{\@tocline{1}{0pt}{1pc}{2pc}{}}
    \def\l@subsection{\@tocline{2}{0pt}{1pc}{3pc}{}}
    \def\l@subsubsection{\@tocline{3}{0pt}{1pc}{5pc}{}}
    \def\@makefntext{\noindent\@makefnmark}
    \if@ACM@sigchiamode
    \long\def\@footnotetext#1{\marginpar{%
        \reset@font\small
        \interlinepenalty\interfootnotelinepenalty
        \protected@edef\@currentlabel{%
           \csname p@footnote\endcsname\@thefnmark
        }%
        \color@begingroup
          \@makefntext{%
            \rule\z@\footnotesep\ignorespaces#1\@finalstrut\strutbox}%
        \color@endgroup}}%
    \fi
    \long\def\@mpfootnotetext#1{%
      \global\setbox\@mpfootins\vbox{%
        \unvbox\@mpfootins
        \reset@font\footnotesize
        \hsize\columnwidth
        \@parboxrestore
        \protected@edef\@currentlabel
             {\csname p@mpfootnote\endcsname\@thefnmark}%
        \color@begingroup\centering
          \@makefntext{%
            \rule\z@\footnotesep\ignorespaces#1\@finalstrut\strutbox}%
        \color@endgroup}}
    \def\@makefnmark{\hbox{\@textsuperscript{\normalfont\@thefnmark}}}
    \let\@footnotemark@nolink\@footnotemark
    \let\@footnotetext@nolink\@footnotetext
    \RequirePackage[bookmarksnumbered,unicode]{hyperref}
    \RequirePackage{hyperxmp}
    \pdfstringdefDisableCommands{%
      \def\addtocounter#1#2{}%
      \def\unskip{}%
      \def\textbullet{- }%
      \def\textrightarrow{ -> }%
      \def\footnotemark{}%
    }
    \urlstyle{rm}
    \ifcase\ACM@format@nr
    \relax % manuscript
    \or % acmsmall
    \or % acmlarge
    \or % acmtog
    \or % sigconf
    \or % siggraph
    \or % sigplan
      \urlstyle{sf}
    \or % sigchi
    \or % sigchi-a
      \urlstyle{sf}
    \or % acmengage
    \or % acmcp
    \fi
    \AtEndPreamble{%
      \if@ACM@urlbreakonhyphens
        \def\do@url@hyp{\do\-}%
      \fi
      \if@ACM@screen
        \hypersetup{colorlinks,
          linkcolor=ACMPurple,
          citecolor=ACMPurple,
          urlcolor=ACMDarkBlue,
          filecolor=ACMDarkBlue}
        \else
        \hypersetup{hidelinks}
      \fi
      \hypersetup{pdflang={en},
        pdfdisplaydoctitle}}
    \if@ACM@natbib
      \let\citeN\cite
      \let\cite\citep
      \let\citeANP\citeauthor
      \let\citeNN\citeyearpar
      \let\citeyearNP\citeyear
      \let\citeNP\citealt
      \DeclareRobustCommand\citeA
         {\begingroup\NAT@swafalse
           \let\NAT@ctype\@ne\NAT@partrue\NAT@fullfalse\NAT@open\NAT@citetp}%
      \providecommand\newblock{}%
    \else
      \AtBeginDocument{%
        \let\shortcite\cite%
        \providecommand\citename[1]{#1}}
    \fi
    \newcommand\shortcite[2][]{%
      \ifNAT@numbers\cite[#1]{#2}\else\citeyearpar[#1]{#2}\fi}
    \def\bibliographystyle#1{%
      \ifx\@begindocumenthook\@undefined\else
        \expandafter\AtBeginDocument
      \fi
        {\if@filesw
           \immediate\write\@auxout{\string\bibstyle{#1}}%
         \fi}}
    \RequirePackage{graphicx}
    \RequirePackage[prologue]{xcolor}
    \definecolor[named]{ACMBlue}{cmyk}{1,0.1,0,0.1}
    \definecolor[named]{ACMYellow}{cmyk}{0,0.16,1,0}
    \definecolor[named]{ACMOrange}{cmyk}{0,0.42,1,0.01}
    \definecolor[named]{ACMRed}{cmyk}{0,0.90,0.86,0}
    \definecolor[named]{ACMLightBlue}{cmyk}{0.49,0.01,0,0}
    \definecolor[named]{ACMGreen}{cmyk}{0.20,0,1,0.19}
    \definecolor[named]{ACMPurple}{cmyk}{0.55,1,0,0.15}
    \definecolor[named]{ACMDarkBlue}{cmyk}{1,0.58,0,0.21}
    \if@ACM@authordraft
      \RequirePackage{draftwatermark}
      \SetWatermarkFontSize{0.5in}
      \SetWatermarkColor[gray]{.9}
      \SetWatermarkText{\parbox{12em}{\centering
          Unpublished working draft.\\
          Not for distribution.}}
    \else
      \if@ACM@sigchiamode
        \if@ACM@nonacm\else
          \RequirePackage{draftwatermark}
          \SetWatermarkFontSize{0.5in}
          \SetWatermarkColor[gray]{.9}
          \SetWatermarkText{\parbox{12em}{\centering
              Legacy document. \\
              Not for publication in an ACM venue}}
        \fi
      \fi
    \fi
    \RequirePackage{geometry}
    \ifcase\ACM@format@nr
    \relax % manuscript
       \geometry{letterpaper,head=13pt,
       marginparwidth=6pc,heightrounded}%
    \or % acmsmall
       \geometry{twoside=true,
         includeheadfoot, head=13pt, foot=2pc,
         paperwidth=6.75in, paperheight=10in,
         top=58pt, bottom=44pt, inner=46pt, outer=46pt,
         marginparwidth=2pc,heightrounded
       }%
    \or % acmlarge
       \geometry{twoside=true, head=13pt, foot=2pc,
         paperwidth=8.5in, paperheight=11in,
         includeheadfoot,
         top=78pt, bottom=114pt, inner=81pt, outer=81pt,
         marginparwidth=4pc,heightrounded
         }%
    \or % acmtog
       \geometry{twoside=true, head=13pt, foot=2pc,
         paperwidth=8.5in, paperheight=11in,
         includeheadfoot, columnsep=24pt,
         top=52pt, bottom=75pt, inner=52pt, outer=52pt,
         marginparwidth=2pc,heightrounded
         }%
    \or % sigconf
       \geometry{twoside=true, head=13pt,
         paperwidth=8.5in, paperheight=11in,
         includeheadfoot, columnsep=2pc,
         top=57pt, bottom=73pt, inner=54pt, outer=54pt,
         marginparwidth=2pc,heightrounded
         }%
    \or % siggraph
       \geometry{twoside=true, head=13pt,
         paperwidth=8.5in, paperheight=11in,
         includeheadfoot, columnsep=2pc,
         top=57pt, bottom=73pt, inner=54pt, outer=54pt,
         marginparwidth=2pc,heightrounded
         }%
    \or % sigplan
       \geometry{twoside=true, head=13pt,
         paperwidth=8.5in, paperheight=11in,
         includeheadfoot=false, columnsep=2pc,
         top=1in, bottom=1in, inner=0.75in, outer=0.75in,
         marginparwidth=2pc,heightrounded
         }%
    \or % sigchi
       \geometry{twoside=true, head=13pt,
         paperwidth=8.5in, paperheight=11in,
         includeheadfoot, columnsep=2pc,
         top=66pt, bottom=73pt, inner=54pt, outer=54pt,
         marginparwidth=2pc,heightrounded
         }%
    \or % sigchi-a
       \geometry{twoside=false, head=13pt,
         paperwidth=11in, paperheight=8.5in,
         includeheadfoot, marginparsep=72pt,
         marginparwidth=170pt, columnsep=20pt,
         top=72pt, bottom=72pt, left=314pt, right=72pt
         }%
         \@mparswitchfalse
         \reversemarginpar
    \or % acmengage
       \geometry{twoside=true, head=13pt,
         paperwidth=8.5in, paperheight=11in,
         includeheadfoot, columnsep=2pc,
         top=57pt, bottom=73pt, inner=54pt, outer=54pt,
         marginparwidth=2pc,heightrounded
         }%
    \or % acmcp
       \geometry{twoside=true,
         includeheadfoot, head=13pt, foot=2pc,
         paperwidth=6.75in, paperheight=10in,
         top=58pt, bottom=44pt, inner=46pt, outer=46pt,
         marginparwidth=2pc,heightrounded
       }%
    \fi
    \setlength\parindent{10\p@}
    \setlength\parskip{\z@}
    \ifcase\ACM@format@nr
    \relax % manuscript
    \or % acmsmall
    \or % acmlarge
    \or % acmtog
      \setlength\parindent{9\p@}%
    \or % sigconf
    \or % siggraph
    \or % sigplan
    \or % sigchi
    \or % sigchi-a
    \or % acmengage
    \or % acmcp
    \fi
    \setlength\normalparindent{\parindent}
    \def\copyrightpermissionfootnoterule{\kern-3\p@
      \hrule \@width \columnwidth \kern 2.6\p@}
    \RequirePackage{manyfoot}
    \SelectFootnoteRule[2]{copyrightpermission}
    \DeclareNewFootnote{authorsaddresses}
    \SelectFootnoteRule[2]{copyrightpermission}
    \DeclareNewFootnote{copyrightpermission}
    \def\footnoterule{\kern-3\p@
      \hrule \@width 4pc \kern 2.6\p@}
    \def\endminipage{%
        \par
        \unskip
        \ifvoid\@mpfootins\else
          \vskip\skip\@mpfootins
          \normalcolor
          \unvbox\@mpfootins
        \fi
        \@minipagefalse
      \color@endgroup
      \egroup
      \expandafter\@iiiparbox\@mpargs{\unvbox\@tempboxa}}
    \def\@textbottom{\vskip \z@ \@plus 1pt}
    \let\@texttop\relax
    \ifcase\ACM@format@nr
    \relax % manuscript
    \or % acmsmall
    \or % acmlarge
    \or % acmtog
      \flushbottom
    \or % sigconf
      \flushbottom
    \or % siggraph
      \flushbottom
    \or % sigplan
      \flushbottom
    \or % sigchi
      \flushbottom
    \or % sigchi-a
    \or % acmengage
      \flushbottom
    \or % acmcp
      \flushbottom
    \fi
    \ifPDFTeX
    \input{glyphtounicode}
    \pdfglyphtounicode{f_f}{FB00}
    \pdfglyphtounicode{f_f_i}{FB03}
    \pdfglyphtounicode{f_f_l}{FB04}
    \pdfglyphtounicode{f_i}{FB01}
    \pdfglyphtounicode{t_t}{0074 0074}
    \pdfglyphtounicode{f_t}{0066 0074}
    \pdfglyphtounicode{T_h}{0054 0068}
    \pdfgentounicode=1
    \RequirePackage{cmap}
    \fi
    \newif\if@ACM@newfonts
    \@ACM@newfontstrue
    \IfFileExists{libertine.sty}{}{\ClassWarning{\@classname}{You do not
        have the libertine package installed.  Please upgrade your
        TeX}\@ACM@newfontsfalse}
    \IfFileExists{zi4.sty}{}{\ClassWarning{\@classname}{You do not
        have the inconsolata (zi4.sty) package installed.  Please upgrade your
        TeX}\@ACM@newfontsfalse}
    \IfFileExists{newtxmath.sty}{}{\ClassWarning{\@classname}{You do not
        have the newtxmath package installed.  Please upgrade your
        TeX}\@ACM@newfontsfalse}
    \if@ACM@newfonts
      \ifxetex
        \RequirePackage{amssymb}
        \RequirePackage{unicode-math}
        \setmathfont[Scale=MatchUppercase]{LibertinusMath-Regular.otf}
        \setmathfont{latinmodern-math.otf}[range={cal}]
        \RequirePackage[tt=false]{libertine}
        \setmonofont[StylisticSet=3]{inconsolata}
      \else
        \ifluatex
          \RequirePackage{amssymb}
          \RequirePackage{unicode-math}
          \setmathfont[Scale=MatchUppercase]{LibertinusMath-Regular.otf}
          \setmathfont{latinmodern-math.otf}[range={cal}]
          \RequirePackage[tt=false]{libertine}
          \setmonofont[StylisticSet=3]{inconsolata}
        \else
           \RequirePackage[T1]{fontenc}
           \RequirePackage[tt=false, type1=true]{libertine}
           \RequirePackage[varqu]{zi4}
           \RequirePackage[libertine]{newtxmath}
        \fi
      \fi
    \fi
    \let\liningnums\@undefined
    \AtEndPreamble{%
      \DeclareTextFontCommand{\liningnums}{\libertineLF}}
    \if@ACM@sigchiamode
      \renewcommand{\familydefault}{\sfdefault}
    \fi
    \newif\if@Description@present
    \@Description@presenttrue
    \newif\if@undescribed@images
    \@undescribed@imagesfalse
    \newcommand\Description[2][]{\global\@Description@presenttrue\ignorespaces}
    \AtEndDocument{\if@undescribed@images
      \ClassWarningNoLine{\@classname}{Some images may lack
        descriptions.\MessageBreak
      ACM is committed to complying with the upcoming US ADA
      https://accessiblyapp.com/accessibility-compliance/ada/ and European
      Accessibility Act
      (EAA) https://accessiblyapp.com/accessibility-compliance/eaa/
      regulations by actively working to ensure our publications and
      application services are accessible to individuals with
      disabilities, adhering to the WCAG guidelines to provide a seamless
      experience for all users, and regularly reviewing our accessibility
      practices to maintain compliance with evolving standards. \MessageBreak
      To this end, we strongly encourage our authors to provide
      alternative text and captions for images and multimedia content. It
      is also important to optimize color contrast for the visually
      impaired. Taking these important steps when creating your papers
      will ensure that the widest possible audience can ingest your
      work.}\fi}
    \AtBeginEnvironment{figure}{\@Description@presentfalse
      \let\@vspace\@vspace@orig
      \let\@vspacer\@vspacer@orig}
    \AtBeginEnvironment{figure*}{\@Description@presentfalse
      \let\@vspace\@vspace@orig
      \let\@vspacer\@vspacer@orig}
    \AtEndEnvironment{figure}{\if@Description@present\else
      \global\@undescribed@imagestrue
      \ClassWarning{\@classname}{A possible image without description}\fi}
    \AtEndEnvironment{figure*}{\if@Description@present\else
      \global\@undescribed@imagestrue
      \ClassWarning{\@classname}{A possible image without description}\fi}
    \AtBeginEnvironment{table}{\let\@vspace\@vspace@orig
      \let\@vspacer\@vspacer@orig}
    \AtBeginEnvironment{table*}{\let\@vspace\@vspace@orig
      \let\@vspacer\@vspacer@orig}
    \AtBeginEnvironment{algorithm}{\let\@vspace\@vspace@orig
      \let\@vspacer\@vspacer@orig}
    \AtBeginEnvironment{algorithm*}{\let\@vspace\@vspace@orig
      \let\@vspacer\@vspacer@orig}
    \AtBeginEnvironment{lstlisting}{\let\@vspace\@vspace@orig
      \let\@vspacer\@vspacer@orig}
    \AtBeginEnvironment{lstlisting*}{\let\@vspace\@vspace@orig
      \let\@vspacer\@vspacer@orig}
    \AtBeginEnvironment{minted}{\let\@vspace\@vspace@orig
      \let\@vspacer\@vspacer@orig}
    \AtBeginEnvironment{minted*}{\let\@vspace\@vspace@orig
      \let\@vspacer\@vspacer@orig}
    \AtBeginEnvironment{listing}{\let\@vspace\@vspace@orig
      \let\@vspacer\@vspacer@orig}
    \AtBeginEnvironment{listing*}{\let\@vspace\@vspace@orig
      \let\@vspacer\@vspacer@orig}
    \AtBeginEnvironment{lstinputlisting}{\let\@vspace\@vspace@orig
      \let\@vspacer\@vspacer@orig}
    \AtBeginEnvironment{lstinputlisting*}{\let\@vspace\@vspace@orig
      \let\@vspacer\@vspacer@orig}
    
    \RequirePackage{caption, float}
    \captionsetup[table]{position=top}
    \if@ACM@journal
      \captionsetup{labelfont={sf, small},
        textfont={sf, small}, margin=\z@}
      \captionsetup[figure]{name={Fig.}}
    \else
      \captionsetup{labelfont={bf},
        textfont={bf}, labelsep=colon, margin=\z@}
      \ifcase\ACM@format@nr
      \relax % manuscript
      \or % acmsmall
      \or % acmlarge
      \or % acmtog
      \or % sigconf
      \or % siggraph
        \captionsetup{textfont={it}}
      \or % sigplan
        \captionsetup{labelfont={bf},
          textfont={normalfont}, labelsep=period, margin=\z@}
      \or % sigchi
        \captionsetup[figure]{labelfont={bf, small},
          textfont={bf, small}}
        \captionsetup[table]{labelfont={bf, small},
          textfont={bf, small}}
      \or % sigchi-a
        \captionsetup[figure]{labelfont={bf, small},
          textfont={bf, small}}
        \captionsetup[table]{labelfont={bf, small},
          textfont={bf, small}}
      \or % acmengage
      \or % acmcp
      \fi
    \fi
    \newfloat{sidebar}{}{sbar}
    \floatname{sidebar}{Sidebar}
    \renewenvironment{sidebar}{\Collect@Body\@sidebar}{}
    \long\def\@sidebar#1{\bgroup\let\@vspace\@vspace@orig
      \let\@vspacer\@vspacer@orig\captionsetup{type=sidebar}%
      \marginpar{\small#1}\egroup}
    \newenvironment{marginfigure}{\Collect@Body\@marginfigure}{}
    \long\def\@marginfigure#1{\bgroup
      \let\@vspace\@vspace@orig
      \let\@vspacer\@vspacer@orig
      \captionsetup{type=figure}%
      \marginpar{\@Description@presentfalse\centering
        \small#1\if@Description@present\else
          \global\@undescribed@imagestrue
          \ClassWarning{\@classname}{A possible image without description}
          \fi}%
      \egroup}
    \newenvironment{margintable}{\Collect@Body\@margintable}{}
    \long\def\@margintable#1{\bgroup\let\@vspace\@vspace@orig
      \let\@vspacer\@vspacer@orig\captionsetup{type=table}%
      \marginpar{\centering\small#1}\egroup}
    \newdimen\fulltextwidth
    \fulltextwidth=\dimexpr(\textwidth+\marginparwidth+\marginparsep)
    \if@ACM@sigchiamode
    \def\@dblfloat{\bgroup\let\@vspace\@vspace@orig
      \let\@vspacer\@vspacer@orig\columnwidth=\fulltextwidth
      \let\@endfloatbox\@endwidefloatbox
      \def\@fpsadddefault{\def\@fps{tp}}%
      \@float}
    \fi
    \if@ACM@sigchiamode
    \def\end@dblfloat{%
        \end@float\egroup}
    \fi
    \def\@endwidefloatbox{%
      \par\vskip\z@skip
      \@minipagefalse
      \outer@nobreak
      \egroup
      \color@endbox
      \global\setbox\@currbox=\vbox{\moveleft
        \dimexpr(\fulltextwidth-\textwidth)\box\@currbox}%
      \wd\@currbox=\textwidth
    }
    \ifcase\ACM@format@nr
    \relax % manuscript
    \or % acmsmall
    \or % acmlarge
    \or % acmtog
    \or % sigconf
    \or % siggraph
    \or % sigplan
    \def\labelenumi{\theenumi.}
    \def\labelenumii{\theenumii.}
    \def\labelenumiii{\theenumiii.}
    \def\labelenumiv{\theenumiv.}
    \or % sigchi
    \or % sigchi-a
    \or % acmengage
    \or % acmcp
    \fi
    \newdimen\@ACM@labelwidth
    \AtBeginDocument{%
      \setlength\labelsep{4pt}
      \setlength{\@ACM@labelwidth}{6.5pt}
    
      %% First-level list: when beginning after the first line of an
      %% indented paragraph or ending before an indented paragraph, labels
      %% should not hang to the left of the preceding/following text.
      \setlength\leftmargini{\z@}
      \addtolength\leftmargini{\parindent}
      \addtolength\leftmargini{2\labelsep}
      \addtolength\leftmargini{\@ACM@labelwidth}
    
      %% Second-level and higher lists.
      \setlength\leftmarginii{\z@}
      \addtolength\leftmarginii{0.5\labelsep}
      \addtolength\leftmarginii{\@ACM@labelwidth}
      \setlength\leftmarginiii{\leftmarginii}
      \setlength\leftmarginiv{\leftmarginiii}
      \setlength\leftmarginv{\leftmarginiv}
      \setlength\leftmarginvi{\leftmarginv}
      \@listi}
    \newskip\listisep
    \listisep\smallskipamount
    \def\@listI{\leftmargin\leftmargini
      \labelwidth\leftmargini \advance\labelwidth-\labelsep
      \listparindent\z@
      \topsep\listisep}
    \let\@listi\@listI
    \def\@listii{\leftmargin\leftmarginii
      \labelwidth\leftmarginii \advance\labelwidth-\labelsep
      \topsep\z@skip}
    \def\@listiii{\leftmargin\leftmarginiii
      \labelwidth\leftmarginiii \advance\labelwidth-\labelsep}
    \def\@listiv{\leftmargin\leftmarginiv
      \labelwidth\leftmarginiv \advance\labelwidth-\labelsep}
    \def\@listv{\leftmargin\leftmarginv
      \labelwidth\leftmarginv \advance\labelwidth-\labelsep}
    \def\@listvi{\leftmargin\leftmarginvi
      \labelwidth\leftmarginvi \advance\labelwidth-\labelsep}
    \renewcommand{\descriptionlabel}[1]{\upshape\bfseries #1}
    \renewenvironment{description}{\list{}{%
        \labelwidth\@ACM@labelwidth
        \let\makelabel\descriptionlabel}%
    }{
      \endlist
    }
    \let\enddescription=\endlist % for efficiency
    \newif\if@ACM@maketitle@typeset
    \@ACM@maketitle@typesetfalse
    \define@choicekey*+{ACM}{acmJournal}[\@journalCode\@journalCode@nr]{%
      ACMJCSS,%
      ACMJDS,%
      AILET,%
      CIE,%
      CSUR,%
      DGOV,%
      DLT,%
      DTRAP,%
      FAC,%
      GAMES,%
      HEALTH,%
      IMWUT,%
      JACM,%
      JATS,%
      JDIQ,%
      JDS,%
      JEA,%
      JERIC,%
      JETC,%
      JOCCH,%
      JRC,%
      PACMCGIT,%
      PACMHCI,%
      PACMMOD,%
      PACMNET,%
      PACMPL,%
      PACMSE,%
      POMACS,%
      TAAS,%
      TACCESS,%
      TACO,%
      TAIS,%
      TAISAP,%
      TALG,%
      TALLIP,%
      TAP,%
      TCPS,%
      TDS,%
      TEAC,%
      TECS,%
      TELO,%
      THRI,%
      TIIS,%
      TIOT,%
      TISSEC,%
      TIST,%
      TKDD,%
      TMIS,%
      TOCE,%
      TOCHI,%
      TOCL,%
      TOCS,%
      TOCT,%
      TODAES,%
      TODS,%
      TOG,%
      TOIS,%
      TOIT,%
      TOMACS,%
      TOMM,%
      TOMPECS,%
      TOMS,%
      TOPC,%
      TOPLAS,%
      TOPML,%
      TOPS,%
      TORS,%
      TOS,%
      TOSEM,%
      TOSN,%
      TQC,%
      TRETS,%
      TSAS,%
      TSC,%
      TSLP,%
      TWEB,%
      FACMP%
    }{%
    \ifcase\@journalCode@nr
    \relax % ACMJCSS
      \def\@journalName{ACM Journal on Computing and Sustainable Societies}%
      \def\@journalNameShort{ACM J. Comput. Sustain. Soc.}%
      \def\@permissionCodeOne{2834-5533}%
      \def\@permissionCodeTwo{2834-5533}%
    \or % ACMJCDS
      \def\@journalName{ACM Journal of Data Science}%
      \def\@journalNameShort{ACM J. Data Sci.}%
      \def\@permissionCodeOne{0000-0000}%
      \def\@permissionCodeTwo{0000-0000}%
    \or % AILET
      \def\@journalName{ACM AI Letters}%
      \def\@journalNameShort{ACM AI Lett.}%
      \def\@permissionCodeOne{3068-8590}%
      \def\@permissionCodeTwo{3068-8590}%
    \or % CIE
      \def\@journalName{ACM Computers in Entertainment}%
      \def\@journalNameShort{ACM Comput. Entertain.}%
      \def\@permissionCodeOne{1544-3574}%
    \or % CSUR
      \def\@journalName{ACM Computing Surveys}%
      \def\@journalNameShort{ACM Comput. Surv.}%
      \def\@permissionCodeOne{0360-0300}%
      \def\@permissionCodeTwo{1557-7341}%
    \or % DGOV
      \def\@journalName{Digital Government: Research and Practice}%
      \def\@journalNameShort{Digit. Gov. Res. Pract.}%
      \def\@permissionCodeOne{2639-0175}%
      \def\@permissionCodeTwo{2639-0175}%
    \or % DLT
      \def\@journalName{Distributed Ledger Technologies: Research and Practice}%
      \def\@journalNameShort{Distrib. Ledger Technol.}%
      \def\@permissionCodeOne{2769-6472}%
      \def\@permissionCodeTwo{2769-6480}%
    \or % DTRAP
      \def\@journalName{Digital Threats: Research and Practice}%
      \def\@journalNameShort{Digit. Threat. Res. Pract.}%
      \def\@permissionCodeOne{2576-5337}%
      \def\@permissionCodeTwo{2576-5337}%
    \or % FAC
      \def\@journalName{Formal Aspects of Computing}%
      \def\@journalNameShort{Form. Asp. Comput.}%
      \def\@permissionCodeOne{0934-5043}%
      \def\@permissionCodeTwo{1433-299X}%
    \or % GAMES
      \def\@journalName{ACM Games: Research and Practice}%
      \def\@journalNameShort{ACM Games}%
      \def\@permissionCodeOne{2832-5516}%
      \def\@permissionCodeTwo{2832-5516}%
    \or % HEALTH
      \def\@journalName{ACM Transactions on Computing for Healthcare}%
      \def\@journalNameShort{ACM Trans. Comput. Healthcare}%
      \def\@permissionCodeOne{2637-8051}%
      \def\@permissionCodeTwo{2637-8051}%
    \or % IMWUT
      \def\@journalName{Proceedings of the ACM on Interactive, Mobile,
        Wearable and Ubiquitous Technologies}%
      \def\@journalNameShort{Proc. ACM Interact. Mob. Wearable Ubiquitous Technol.}%
      \def\@permissionCodeOne{2474-9567}%
      \def\@permissionCodeTwo{2474-9567}%
      \@ACM@screentrue
      \PackageInfo{\@classname}{Using screen mode due to \@journalCode}%
    \or % JACM
      \def\@journalName{Journal of the ACM}%
      \def\@journalNameShort{J. ACM}%
      \def\@permissionCodeOne{0004-5411}%
      \def\@permissionCodeTwo{1557-735X}%
    \or % JATS
      \def\@journalName{Journal on Autonomous Transportation Systems}%
      \def\@journalNameShort{ACM J. Auton. Transport. Syst.}%
      \def\@permissionCodeOne{2833-0528}%
      \def\@permissionCodeTwo{2833-0528}%
    \or % JDIQ
      \def\@journalName{ACM Journal of Data and Information Quality}%
      \def\@journalNameShort{ACM J. Data Inform. Quality}%
      \def\@permissionCodeOne{1936-1955}%
      \def\@permissionCodeTwo{1936-1963}%
    \or % JDS
      \def\@journalName{ACM/IMS Journal of Data Science}%
      \def\@journalNameShort{ACM/IMS J. Data Sci.}%
      \def\@permissionCodeOne{2831-3194}%
      \def\@permissionCodeTwo{2831-3194}%
    \or % JEA
      \def\@journalName{ACM Journal of Experimental Algorithmics}%
      \def\@journalNameShort{ACM J. Exp. Algor.}%
      \def\@permissionCodeOne{1084-6654}%
      \def\@permissionCodeTwo{1084-6654}%
    \or % JERIC
      \def\@journalName{ACM Journal of Educational Resources in Computing}%
      \def\@journalNameShort{ACM J. Edu. Resources in Comput.}%
      \def\@permissionCodeOne{1073-0516}%
    \or % JETC
      \def\@journalName{ACM Journal on Emerging Technologies in Computing Systems}%
      \def\@journalNameShort{ACM J. Emerg. Technol. Comput. Syst.}%
      \def\@pe
  • references.bib610 B
    @inproceedings{doe2024defense,
      author    = {Doe, Jane and Roe, Richard},
      title     = {A Practical Defense Against Example Attacks},
      booktitle = {Proceedings of the ACM SIGSAC Conference on Computer and Communications Security},
      year      = {2024},
      pages     = {1201--1215},
      publisher = {ACM}
    }
    
    @inproceedings{smith2025measurement,
      author    = {Smith, John and Lee, Ada},
      title     = {Measuring the Attack Surface in the Wild},
      booktitle = {Proceedings of the ACM SIGSAC Conference on Computer and Communications Security},
      year      = {2025},
      pages     = {77--91},
      publisher = {ACM}
    }
    
  • main.pdfprebuilt · 348 KBReplaced by the first recompile.

    Binary file, seeded as-is.

  • main.synctex.gzprebuilt · 12 KBReplaced by the first recompile.

    Binary file, seeded as-is.