summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorYann Herklotz <git@yannherklotz.com>2021-10-07 13:43:16 +0100
committerYann Herklotz <git@yannherklotz.com>2021-10-07 13:43:16 +0100
commitf9ca386bda2fe89287b9bb65d3d28e0c150d8984 (patch)
treec7ad596237f3d63829d7a7574a93f220a9fc721d
downloadfpga20_fubfst-f9ca386bda2fe89287b9bb65d3d28e0c150d8984.tar.gz
fpga20_fubfst-f9ca386bda2fe89287b9bb65d3d28e0c150d8984.zip
Add initial filesHEADmaster
-rw-r--r--.gitignore290
-rw-r--r--Makefile9
-rw-r--r--paper/ACM-Reference-Format.bst2900
-rw-r--r--paper/Makefile4
-rw-r--r--paper/acmart.cls2876
-rw-r--r--paper/conference.bib509
-rw-r--r--paper/data/example_gen.v56
-rw-r--r--paper/data/length.csv2617
-rw-r--r--paper/data/length_no_combine_out_downscale.csv2152
-rw-r--r--paper/fubfst_fpga2020.tex946
-rw-r--r--presentation/ExampleRun/output2/fuzz_1/actual_correct.v12
-rw-r--r--presentation/ExampleRun/output2/fuzz_1/actual_wrong.v12
-rw-r--r--presentation/ExampleRun/output2/fuzz_1/equiv_identity_yosys/top.v8
-rw-r--r--presentation/ExampleRun/output2/fuzz_1/identity/syn_identity.v77
-rw-r--r--presentation/ExampleRun/output2/fuzz_1/identity/syn_identity_colour.v77
-rw-r--r--presentation/ExampleRun/output2/fuzz_1/identity/syn_identity_red1.v52
-rw-r--r--presentation/ExampleRun/output2/fuzz_1/identity/syn_identity_red1_colour.v52
-rw-r--r--presentation/ExampleRun/output2/fuzz_1/identity/syn_identity_red2.v40
-rw-r--r--presentation/ExampleRun/output2/fuzz_1/identity/syn_identity_red2_colour.v40
-rw-r--r--presentation/ExampleRun/output2/fuzz_1/identity/syn_identity_red2_colour2.v40
-rw-r--r--presentation/ExampleRun/output2/fuzz_1/identity/syn_identity_red3.v35
-rw-r--r--presentation/ExampleRun/output2/fuzz_1/identity/syn_identity_red4.v27
-rw-r--r--presentation/ExampleRun/output2/fuzz_1/identity/syn_identity_red5.v15
-rw-r--r--presentation/ExampleRun/output2/fuzz_1/reduce_identity_yosys.v9
-rw-r--r--presentation/ExampleRun/output2/fuzz_1/reduce_sim_yosys.v27
-rw-r--r--presentation/ExampleRun/output2/fuzz_1/yosys/syn_yosys.v1441
-rw-r--r--presentation/Makefile4
-rw-r--r--presentation/beamercolorthememetropolis-highcontrast.sty39
-rw-r--r--presentation/beamercolorthememetropolis.sty138
-rw-r--r--presentation/beamerfontthememetropolis.sty325
-rw-r--r--presentation/beamerinnerthememetropolis.sty297
-rw-r--r--presentation/beamerouterthememetropolis.sty137
-rw-r--r--presentation/beamerthememetropolis.sty107
-rw-r--r--presentation/paper-code.pdfbin0 -> 2380 bytes
-rw-r--r--presentation/presentation.tex1309
-rw-r--r--presentation/verismith-github.pdfbin0 -> 2380 bytes
36 files changed, 16679 insertions, 0 deletions
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..e4d5d9f
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,290 @@
+## Core latex/pdflatex auxiliary files:
+*.aux
+*.lof
+*.log
+*.lot
+*.fls
+*.out
+*.toc
+*.fmt
+*.fot
+*.cb
+*.cb2
+.*.lb
+
+## Intermediate documents:
+*.dvi
+*.xdv
+*-converted-to.*
+# these rules might exclude image files for figures etc.
+# *.ps
+# *.eps
+# *.pdf
+
+## Generated if empty string is given at "Please type another file name for output:"
+.pdf
+
+## Bibliography auxiliary files (bibtex/biblatex/biber):
+*.bbl
+*.bcf
+*.blg
+*-blx.aux
+*-blx.bib
+*.run.xml
+
+## Build tool auxiliary files:
+*.fdb_latexmk
+*.synctex
+*.synctex(busy)
+*.synctex.gz
+*.synctex.gz(busy)
+*.pdfsync
+
+## Build tool directories for auxiliary files
+# latexrun
+latex.out/
+
+## Auxiliary and intermediate files from other packages:
+# algorithms
+*.alg
+*.loa
+
+# achemso
+acs-*.bib
+
+# amsthm
+*.thm
+
+# beamer
+*.nav
+*.pre
+*.snm
+*.vrb
+
+# changes
+*.soc
+
+# comment
+*.cut
+
+# cprotect
+*.cpt
+
+# elsarticle (documentclass of Elsevier journals)
+*.spl
+
+# endnotes
+*.ent
+
+# fixme
+*.lox
+
+# feynmf/feynmp
+*.mf
+*.mp
+*.t[1-9]
+*.t[1-9][0-9]
+*.tfm
+
+#(r)(e)ledmac/(r)(e)ledpar
+*.end
+*.?end
+*.[1-9]
+*.[1-9][0-9]
+*.[1-9][0-9][0-9]
+*.[1-9]R
+*.[1-9][0-9]R
+*.[1-9][0-9][0-9]R
+*.eledsec[1-9]
+*.eledsec[1-9]R
+*.eledsec[1-9][0-9]
+*.eledsec[1-9][0-9]R
+*.eledsec[1-9][0-9][0-9]
+*.eledsec[1-9][0-9][0-9]R
+
+# glossaries
+*.acn
+*.acr
+*.glg
+*.glo
+*.gls
+*.glsdefs
+*.lzo
+*.lzs
+
+# uncomment this for glossaries-extra (will ignore makeindex's style files!)
+# *.ist
+
+# gnuplottex
+*-gnuplottex-*
+
+# gregoriotex
+*.gaux
+*.glog
+*.gtex
+
+# htlatex
+*.4ct
+*.4tc
+*.idv
+*.lg
+*.trc
+*.xref
+
+# hyperref
+*.brf
+
+# knitr
+*-concordance.tex
+# TODO Uncomment the next line if you use knitr and want to ignore its generated tikz files
+# *.tikz
+*-tikzDictionary
+
+# listings
+*.lol
+
+# luatexja-ruby
+*.ltjruby
+
+# makeidx
+*.idx
+*.ilg
+*.ind
+
+# minitoc
+*.maf
+*.mlf
+*.mlt
+*.mtc[0-9]*
+*.slf[0-9]*
+*.slt[0-9]*
+*.stc[0-9]*
+
+# minted
+_minted*
+*.pyg
+
+# morewrites
+*.mw
+
+# newpax
+*.newpax
+
+# nomencl
+*.nlg
+*.nlo
+*.nls
+
+# pax
+*.pax
+
+# pdfpcnotes
+*.pdfpc
+
+# sagetex
+*.sagetex.sage
+*.sagetex.py
+*.sagetex.scmd
+
+# scrwfile
+*.wrt
+
+# sympy
+*.sout
+*.sympy
+sympy-plots-for-*.tex/
+
+# pdfcomment
+*.upa
+*.upb
+
+# pythontex
+*.pytxcode
+pythontex-files-*/
+
+# tcolorbox
+*.listing
+
+# thmtools
+*.loe
+
+# TikZ & PGF
+*.dpth
+*.md5
+*.auxlock
+
+# todonotes
+*.tdo
+
+# vhistory
+*.hst
+*.ver
+
+# easy-todo
+*.lod
+
+# xcolor
+*.xcp
+
+# xmpincl
+*.xmpi
+
+# xindy
+*.xdy
+
+# xypic precompiled matrices and outlines
+*.xyc
+*.xyd
+
+# endfloat
+*.ttt
+*.fff
+
+# Latexian
+TSWLatexianTemp*
+
+## Editors:
+# WinEdt
+*.bak
+*.sav
+
+# Texpad
+.texpadtmp
+
+# LyX
+*.lyx~
+
+# Kile
+*.backup
+
+# gummi
+.*.swp
+
+# KBibTeX
+*~[0-9]*
+
+# TeXnicCenter
+*.tps
+
+# auto folder when using emacs and auctex
+./auto/*
+*.el
+
+# expex forward references with \gathertags
+*-tags.tex
+
+# standalone packages
+*.sta
+
+# Makeindex log files
+*.lpz
+
+# xwatermark package
+*.xwm
+
+# REVTeX puts footnotes in the bibliography by default, unless the nofootinbib
+# option is specified. Footnotes are the stored in a file with suffix Notes.bib.
+# Uncomment the next line to have this generated file ignored.
+#*Notes.bib
+
+*.vtc
diff --git a/Makefile b/Makefile
new file mode 100644
index 0000000..5f7c1bc
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,9 @@
+TOPTARGETS := all clean
+SUBDIRS := $(wildcard */.)
+
+$(TOPTARGETS): $(SUBDIRS)
+
+$(SUBDIRS):
+ $(MAKE) -C $@ $(MAKECMDGOALS)
+
+.PHONY: $(TOPTARGETS) $(SUBDIRS)
diff --git a/paper/ACM-Reference-Format.bst b/paper/ACM-Reference-Format.bst
new file mode 100644
index 0000000..78bf792
--- /dev/null
+++ b/paper/ACM-Reference-Format.bst
@@ -0,0 +1,2900 @@
+%%% -*-BibTeX-*-
+%%% ====================================================================
+%%% @BibTeX-style-file{
+%%% author = "Nelson H. F. Beebe, Boris Veytsman and Gerald Murray",
+%%% version = "2.1",
+%%% date = "14 June 2017",
+%%% 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
+ 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
+ }
+ {}
+ { 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 { 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$
+}
+
+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 * "}" * }
+ { "Article \bibinfo{articleno}{" 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
+ "\bibinfo{year}{"
+ year empty.or.unknown
+ { "[n.\,d.]" }
+ { 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
+ { }
+ {
+ %% Use \urldef here for the same reason it is used in output.url,
+ %% see output.url for further discussion.
+ "\urldef\tempurl%" writeln
+ "\url{https://doi.org/" strip.doi * "}" * writeln
+ "\showDOI{\tempurl}" 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$
+ "{" *
+ primaryclass empty.or.unknown
+ { eprintclass empty.or.unknown
+ { }
+ { eprintclass "/" * * }
+ if$
+ }
+ { primaryclass "/" * * }
+ if$
+ eprint "}" * *
+ writeln
+ }
+ if$
+}
+
+
+%
+% Changes by BV 2011/04/15. Do not output
+% url if doi is defined
+%
+FUNCTION { output.url } % UTAH
+{ % return with stack untouched
+ % output URL and associated lastaccessed fields
+ doi empty.or.unknown
+ {
+ url empty.or.unknown
+ { }
+ {
+ %% 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}" * 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$
+ write$
+ " \bibinfo{year}{[n.d.]}"
+ "\natexlab{" extra.label * "}" * *
+ mid.sentence 'output.state :=
+ }
+ { 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
+ {
+ date empty.or.unknown
+ { }
+ { " (" * date * ")" * }
+ if$
+ }
+ {
+ date empty.or.unknown
+ { " (" * city * ")" * }
+ { " (" * city * ", " * date * ")" * }
+ 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 "})}" *}
+ 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 }
+ { 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. Sociology" } {
+ journal "American Mathematical Monthly" = { "Amer. Math. Monthly" } {
+ journal "American Mathematical Society Translations" = { "Amer. Math. Soc. Transl." } {
+ journal "Applied Mathematics and Computation" = { "Appl. Math. Comput." } {
+ journal "British Journal of Mathematical and Statistical Psychology" = { "Brit. J. Math. Statist. Psych." } {
+ journal "Bulletin of the American Mathematical Society" = { "Bull. Amer. Math. Soc." } {
+ journal "Canadian Mathematical Bulletin" = { "Canad. Math. Bull." } {
+ journal "Communications of the ACM" = { "Commun. ACM" } {
+ journal "Communications of the {ACM}" = { "Commun. ACM" } {
+ journal "Computers and Structures" = { "Comput. \& Structures" } {
+ journal "Contemporary Mathematics" = { "Contemp. Math." } {
+ journal "Crelle's Journal" = { "Crelle's J." } {
+ journal "Giornale di Mathematiche" = { "Giorn. Mat." } {
+ journal "IEEE Transactions on Aerospace and Electronic Systems" = { "IEEE Trans. Aerospace Electron. Systems" } {
+ journal "{IEEE} Transactions on Aerospace and Electronic Systems" = { "IEEE Trans. Aerospace Electron. Systems" } {
+ journal "IEEE Transactions on Automatic Control" = { "IEEE Trans. Automat. Control" } {
+ journal "{IEEE} Transactions on Automatic Control" = { "IEEE Trans. Automat. Control" } {
+ journal "IEEE Transactions on Computers" = { "IEEE Trans. Comput." } {
+ journal "{IEEE} Transactions on Computers" = { "IEEE Trans. Comput." } {
+ journal "IMA Journal of Numerical Analysis" = { "IMA J. Numer. Anal." } {
+ journal "{IMA} Journal of Numerical Analysis" = { "IMA J. Numer. Anal." } {
+ journal "Information Processing Letters" = { "Inform. Process. Lett." } {
+ journal "International Journal for Numerical Methods in Engineering" = { "Internat. J. Numer. Methods Engrg." } {
+ journal "International Journal of Control" = { "Internat. J. Control" } {
+ journal "International Journal of Supercomputing Applications" = { "Internat. J. Supercomputing Applic." } {
+ journal "Journal of Computational Physics" = { "J. Comput. Phys." } {
+ journal "Journal of Computational and Applied Mathematics" = { "J. Comput. Appl. Math." } {
+ journal "Journal of Computer and System Sciences" = { "J. Comput. System Sci." } {
+ journal "Journal of Mathematical Analysis and Applications" = { "J. Math. Anal. Appl." } {
+ journal "Journal of Mathematical Physics" = { "J. Math. Phys." } {
+ journal "Journal of Parallel and Distributed Computing" = { "J. Parallel and Distrib. Comput." } {
+ journal "Journal of Research of the National Bureau of Standards" = { "J. Res. Nat. Bur. Standards" } {
+ journal "Journal of VLSI and Computer Systems" = { "J. VLSI Comput. Syst." } {
+ journal "Journal of {VLSI} and Computer Systems" = { "J. VLSI Comput. Syst." } {
+ journal "Journal of the ACM" = { "J. ACM" } {
+ journal "Journal of the American Statistical Association" = { "J. Amer. Statist. Assoc." } {
+ journal "Journal of the Institute of Mathematics and its Applications" = { "J. Inst. Math. Appl." } {
+ journal "Journal of the Society for Industrial and Applied Mathematics" = { "J. Soc. Indust. Appl. Math." } {
+ journal "Journal of the Society for Industrial and Applied Mathematics, Series B, Numerical Analysis" = { "J. Soc. Indust. Appl. Math. Ser. B Numer. Anal." } {
+ journal "Linear Algebra and its Applications" = { "Linear Algebra Appl." } {
+ journal "Mathematica Scandinavica" = { "Math. Scand." } {
+ journal "Mathematical Tables and Other Aids to Computation" = { "Math. Tables Aids Comput." } {
+ journal "Mathematics of Computation" = { "Math. Comp." } {
+ journal "Mathematische Annalen" = { "Math. Ann." } {
+ journal "Numerische Mathematik" = { "Numer. Math." } {
+ journal "Pacific Journal of Mathematics" = { "Pacific J. Math." } {
+ journal "Parallel Computing" = { "Parallel Comput." } {
+ journal "Philosophical Magazine" = { "Philos. Mag." } {
+ journal "Proceedings of the American Mathematical Society" = { "Proc. Amer. Math. Soc." } {
+ journal "Proceedings of the IEEE" = { "Proc. IEEE" } {
+ journal "Proceedings of the {IEEE}" = { "Proc. IEEE" } {
+ journal "Proceedings of the National Academy of Sciences of the USA" = { "Proc. Nat. Acad. Sci. U. S. A." } {
+ journal "Quarterly Journal of Mathematics, Oxford, Series (2)" = { "Quart. J. Math. Oxford Ser. (2)" } {
+ journal "Quarterly of Applied Mathematics" = { "Quart. Appl. Math." } {
+ journal "Review of the International Statisical Institute" = { "Rev. Inst. Internat. Statist." } {
+ journal "SIAM Journal on Algebraic and Discrete Methods" = { "SIAM J. Algebraic Discrete Methods" } {
+ journal "{SIAM} Journal on Algebraic and Discrete Methods" = { "SIAM J. Algebraic Discrete Methods" } {
+ journal "SIAM Journal on Applied Mathematics" = { "SIAM J. Appl. Math." } {
+ journal "{SIAM} Journal on Applied Mathematics" = { "SIAM J. Appl. Math." } {
+ journal "SIAM Journal on Computing" = { "SIAM J. Comput." } {
+ journal "{SIAM} Journal on Computing" = { "SIAM J. Comput." } {
+ journal "SIAM Journal on Matrix Analysis and Applications" = { "SIAM J. Matrix Anal. Appl." } {
+ journal "{SIAM} Journal on Matrix Analysis and Applications" = { "SIAM J. Matrix Anal. Appl." } {
+ journal "SIAM Journal on Numerical Analysis" = { "SIAM J. Numer. Anal." } {
+ journal "{SIAM} Journal on Numerical Analysis" = { "SIAM J. Numer. Anal." } {
+ journal "SIAM Journal on Scientific and Statistical Computing" = { "SIAM J. Sci. Statist. Comput." } {
+ journal "{SIAM} Journal on Scientific and Statistical Computing" = { "SIAM J. Sci. Statist. Comput." } {
+ journal "SIAM Review" = { "SIAM Rev." } {
+ journal "{SIAM} Review" = { "SIAM Rev." } {
+ journal "Software Practice and Experience" = { "Software Prac. Experience" } {
+ journal "Statistical Science" = { "Statist. Sci." } {
+ journal "The Computer Journal" = { "Comput. J." } {
+ journal "Transactions of the American Mathematical Society" = { "Trans. Amer. Math. Soc." } {
+ journal "USSR Computational Mathematics and Mathematical Physics" = { "U. S. S. R. Comput. Math. and Math. Phys." } {
+ journal "{USSR} Computational Mathematics and Mathematical Physics" = { "U. S. S. R. Comput. Math. and Math. Phys." } {
+ journal "Zeitschrift fur Angewandte Mathematik und Mechanik" = { "Z. Angew. Math. Mech." } {
+ journal "Zeitschrift fur Angewandte Mathematik und Physik" = { "Z. Angew. Math. Phys." } {
+ journal
+ } if$ } if$ } if$ } if$ } if$ } if$ } if$ } if$ } if$ } if$ } if$
+ } if$ } if$ } if$ } if$ } if$ } if$ } if$ } if$ } if$ } if$ } if$
+ } if$ } if$ } if$ } if$ } if$ } if$ } if$ } if$ } if$ } if$ } if$
+ } if$ } if$ } if$ } if$ } if$ } if$ } if$ } if$ } if$ } if$ } if$
+ } if$ } if$ } if$ } if$ } if$ } if$ } if$ } if$ } if$ } if$ } if$
+ } if$ } if$ } if$ } if$ } if$ } if$ } if$ } if$ } if$ } if$ } if$
+ } if$ } if$ } if$ } if$ } if$ } if$ } if$ } if$ } if$ } if$ } if$
+ } if$ } if$ } if$ } if$ } if$ } if$ } if$ } if$
+}
+
+FUNCTION { format.journal.volume.number.day.month.year }
+{
+ % By Young (and Spencer)
+ % GNP - fixed bugs with missing volume, number, and/or pages
+ %
+ % Format journal, volume, number, pages for article types.
+ %
+ journal empty.or.unknown
+ { "no journal in " cite$ * warning$ "" }
+ { "\bibinfo{journal}{"
+ journal.canon.abbrev emphasize *
+ "}" * }
+ if$
+
+ number empty.or.unknown
+ {
+ volume empty.or.unknown
+ { "no number and no volume in " cite$ * warning$ "" * }
+ { " " * " \bibinfo{volume}{" * volume * "}" * }
+ if$
+ }
+ {
+ volume empty.or.unknown
+ {
+ "unusual to have number, but no volume, for " cite$ * warning$
+ " \bibinfo{number}{" * number * "}" *
+ }
+ { " \bibinfo{volume}{" * volume * "}, \bibinfo{number}{" *
+ number * "}" *}
+ if$
+ }
+ if$
+ after.block 'output.state :=
+
+ % Sometimes proceedings are published in journals
+ % In this case we do not want to put year, day and month here
+
+ type$ "inproceedings" =
+ { }
+ {format.day.month.year * }
+ if$
+}
+
+FUNCTION { format.chapter.pages }
+{
+ chapter empty.or.unknown
+ 'format.pages
+ { type empty.or.unknown
+ { "Chapter" } % gnp - changed to mixed case
+ { type "t" change.case$ }
+ if$
+ chapter tie.or.space.connect
+ pages empty.or.unknown
+ {"page numbers missing in " cite$ * warning$} % gnp - added check
+ { ", " * format.pages * }
+ if$
+ }
+ if$
+}
+
+FUNCTION { format.in.emphasize.booktitle }
+{ % jtb: format for collections or proceedings not appearing in a journal
+ booktitle empty.or.unknown
+ { "" }
+ { "In " format.emphasize.booktitle * }
+ if$
+}
+
+FUNCTION { format.in.booktitle }
+{ % jtb: format for proceedings appearing in a journal
+ booktitle empty.or.unknown
+ { "" }
+ { "In \bibinfo{booktitle}{" booktitle * "}" * }
+ if$
+}
+
+FUNCTION { format.in.ed.booktitle }
+{
+ booktitle empty.or.unknown
+ { "" }
+ { editor empty.or.unknown
+ { "In " format.emphasize.booktitle * }
+ % jtb: swapped editor location
+ { "In " format.emphasize.booktitle * ", " * format.editors.fml * }
+ if$
+ }
+ if$
+}
+
+FUNCTION { format.thesis.type }
+{ % call with default type on stack top
+ type empty.or.unknown
+ 'skip$ % use default type
+ {
+ pop$ % discard default type
+ % NO: it is silly to have to brace protect every degree type!: type "t" change.case$
+ type
+ }
+ if$
+}
+
+FUNCTION { format.tr.number }
+{
+ "\bibinfo{type}{"
+ type empty.or.unknown
+ { "{T}echnical {R}eport" }
+ 'type
+ if$
+ "}" * *
+ number empty.or.unknown
+ { "t" change.case$ }
+ %% LOOKS BAD: { "." * number tie.or.space.connect }
+ %% Prefer "Research report RJ687." to "Research report. RJ687."
+ { number tie.or.space.connect }
+ if$
+}
+
+FUNCTION { format.advisor }
+{
+ advisor empty.or.unknown
+ { "" }
+ { "Advisor(s) " advisor * }
+ if$
+}
+
+FUNCTION { format.article.crossref }
+{ "See"
+ "\citeN{" * crossref * "}" *
+}
+
+FUNCTION { format.crossref.editor }
+{
+ editor #1 "{vv~}{ll}" format.name$
+ editor num.names$ duplicate$
+ #2 >
+ { pop$ " et~al\mbox{.}" * } % jrh: avoid spacing problems
+ { #2 <
+ 'skip$
+ { editor #2 "{ff }{vv }{ll}{ jj}" format.name$ "others" =
+ { " et~al\mbox{.}" * } % jrh: avoid spacing problems
+ { " and " * editor #2 "{vv~}{ll}" format.name$ * }
+ if$
+ }
+ if$
+ }
+ if$
+}
+
+FUNCTION { format.book.crossref }
+{
+ volume empty.or.unknown
+ { "empty volume in " cite$ * "'s crossref of " * crossref * warning$
+ "In "
+ }
+ { "Volume" volume tie.or.space.connect % gnp - changed to mixed case
+ " of " *
+ }
+ if$
+ editor empty.or.unknown
+ editor field.or.null author field.or.null =
+ or
+ { key empty.or.unknown
+ { series empty.or.unknown
+ { "need editor, key, or series for " cite$ * " to crossref " *
+ crossref * warning$
+ "" *
+ }
+ { series emphasize * }
+ if$
+ }
+ { key * }
+ if$
+ }
+ { format.crossref.editor * }
+ if$
+ " \citeN{" * crossref * "}" *
+}
+
+FUNCTION { format.incoll.inproc.crossref }
+{ "See"
+ " \citeN{" * crossref * "}" *
+}
+
+FUNCTION { format.lab.names }
+{
+ % format.lab.names:
+ %
+ % determines "short" names for the abbreviated author information.
+ % "Long" labels are created in calc.label, using the routine my.full.label
+ % to format author and editor fields.
+ %
+ % There are 4 cases for labels. (n=3 in the example)
+ % a) one author Foo
+ % b) one to n Foo, Bar and Baz
+ % c) use of "and others" Foo, Bar et al.
+ % d) more than n Foo et al.
+
+ 's :=
+ s num.names$ 'numnames :=
+ numnames #2 > % change number to number of others allowed before
+ % forcing "et al".
+ { s #1 "{vv~}{ll}" format.name$ " et~al\mbox{.}" * } % jrh: \mbox{} added
+ {
+ numnames #1 - 'namesleft :=
+ #2 'nameptr :=
+ s #1 "{vv~}{ll}" format.name$
+ { namesleft #0 > }
+ { nameptr numnames =
+ { s nameptr "{ff }{vv }{ll}{ jj}" format.name$ "others" =
+ { " et~al\mbox{.}" * } % jrh: avoid spacing problems
+ { " and " * s nameptr "{vv~}{ll}" format.name$ * }
+ if$
+ }
+ { ", " * s nameptr "{vv~}{ll}" format.name$ * }
+ if$
+ nameptr #1 + 'nameptr :=
+ namesleft #1 - 'namesleft :=
+ }
+ while$
+ }
+ if$
+}
+
+FUNCTION { author.key.label }
+{
+ author empty.or.unknown
+ { key empty.or.unknown
+ { "no key, author in " cite$ * warning$
+ cite$ #1 #3 substring$ }
+ 'key
+ if$
+ }
+ { author format.lab.names }
+ if$
+}
+
+FUNCTION { editor.key.organization.label }
+{ % added - gnp. Provide label formatting by organization if editor is null.
+ editor empty.or.unknown
+ { organization empty.or.unknown
+ { key empty.or.unknown
+ { "no key, editor or organization in " cite$ * warning$
+ cite$ #1 #3 substring$ }
+ 'key
+ if$
+ }
+ { organization }
+ if$
+ }
+ { editor format.lab.names }
+ if$
+}
+
+FUNCTION { author.editor.key.label }
+{
+ author empty.or.unknown
+ { editor empty.or.unknown
+ { key empty.or.unknown
+ { "no key, author, or editor in " cite$ * warning$
+ cite$ #1 #3 substring$ }
+ 'key
+ if$
+ }
+ { editor format.lab.names }
+ if$
+ }
+ { author format.lab.names }
+ if$
+}
+
+FUNCTION { author.editor.key.organization.label }
+{ % added - gnp. Provide label formatting by organization if author is null.
+ author empty.or.unknown
+ { editor empty.or.unknown
+ { organization empty.or.unknown
+ { key empty.or.unknown
+ { "no key, author, editor or organization in " cite$ * warning$
+ cite$ #1 #3 substring$ }
+ 'key
+ if$
+ }
+ { organization }
+ if$
+ }
+ { editor format.lab.names }
+ if$
+ }
+ { author format.lab.names }
+ if$
+}
+
+% Calculate label and leave it on stack
+FUNCTION { calc.basic.label }
+{
+ type$ "book" =
+ type$ "inbook" =
+ or
+ type$ "article" =
+ or
+ 'author.editor.key.label
+ { type$ "proceedings" =
+ type$ "periodical" =
+ or
+ 'editor.key.organization.label
+ { type$ "manual" =
+ 'author.editor.key.organization.label
+ 'author.key.label
+ if$
+ }
+ if$
+ }
+ if$
+ duplicate$
+ year empty.or.unknown
+ { "[n.d.]" }
+ { year field.or.null purify$ #-1 #4 substring$}
+ if$
+ *
+ 'basic.label.year :=
+}
+
+FUNCTION { calc.label }
+{
+ % Changed - GNP. See also author.editor.organization.sort, editor.organization.sort
+ % Form label for BibTeX entry. The classification of which fields are used
+ % for which type of entry (book, inbook, etc.) are taken from alpha.bst.
+ % The change here from newapa is to also include organization as a
+ % citation label if author or editor is missing.
+
+ calc.basic.label
+
+ author empty.or.unknown % generate the full label citation information.
+ {
+ editor empty.or.unknown
+ {
+ organization empty.or.unknown
+ {
+ key empty.or.unknown
+ {
+ "no author, editor, organization, or key in " cite$ * warning$
+ "??"
+ }
+ { key }
+ if$
+ }
+ { organization }
+ if$
+ }
+ { editor my.full.label }
+ if$
+ }
+ { author my.full.label }
+ if$
+
+ % leave label on the stack, to be popped when required.
+
+ "}{" * swap$ * "}{" *
+ % year field.or.null purify$ #-1 #4 substring$ *
+ %
+ % save the year for sort processing afterwards (adding a, b, c, etc.)
+ %
+ year empty.or.unknown
+ { "[n.d.]" }
+ { year field.or.null purify$ #-1 #4 substring$}
+ if$
+ 'label.year :=
+}
+
+
+FUNCTION { output.bibitem }
+{
+ newline$
+ "\bibitem[\protect\citeauthoryear{" write$
+ calc.label write$
+ sort.year write$
+ "}]%" writeln
+ " {" write$
+ cite$ write$
+ "}" writeln
+ ""
+ before.all 'output.state :=
+}
+
+
+FUNCTION { output.issue.doi.coden.isxn.lccn.url.eprint }
+{ % enter and return with stack empty
+ %% We switch now from buffered output to output of complete lines, so
+ %% that the Issue .. URL data have their own lines, and are less likely
+ %% to be line-wrapped by BibTeX's short-sighted algorithm, which wraps
+ %% lines longer than 79 characters, backtracking to what it thinks is
+ %% a break point in the string. Any such wrapping MUST be undone to
+ %% prevent percent-newline from appearing in DOIs and URLs. The
+ %% output data are intentionally wrapped in \showxxx{} macros at
+ %% beginning of line, and that supply their own punctuation (if they
+ %% are not defined to suppress output entirely), to make it easier for
+ %% other software to recover them from .bbl files.
+ %%
+ %% It also makes it possible to later change the macro definitions
+ %% to suppress particular output values, or alter their appearance.
+ %%
+ %% Note that it is possible for theses, technical reports, and
+ %% manuals to have ISBNs, and anything that has an ISBN may also
+ %% have an ISSN. When there are no values for these keys, there
+ %% is no output generated for them here.
+
+ "\newblock" writeln
+ after.block 'output.state :=
+
+ output.issue
+ output.isbn
+ output.coden % CODEN is functionally like ISSN, so output them sequentially
+ output.issn
+ output.lccn
+ output.doi % DOI is ALWAYS last according to CrossRef DOI documentation
+ output.eprint
+ output.url % but ACM wants URL last
+}
+
+FUNCTION { output.issue.doi.coden.isxn.lccn.url.eprint.note }
+{ % enter with stack empty, return with empty string on stack
+ output.issue.doi.coden.isxn.lccn.url.eprint
+ note empty.or.unknown
+ { }
+ {
+ "\newblock" writeln
+ output.note
+ }
+ if$
+ ""
+}
+
+FUNCTION { output.issue.doi.coden.isxn.lccn.url.eprint.note.check }
+{ % enter with stack empty, return with empty string on stack
+ output.issue.doi.coden.isxn.lccn.url.eprint
+ note empty.or.unknown
+ { }
+ {
+ "\newblock" writeln
+ output.note.check
+ }
+ if$
+ ""
+}
+
+FUNCTION { article }
+{
+ output.bibitem
+
+ author empty.or.unknown
+ {
+ editor empty.or.unknown
+ { "neither author and editor supplied for " cite$ * warning$ }
+ { format.editors "editor" output.check }
+ if$
+ }
+ { format.authors "author" output.check }
+ if$
+
+ author format.no.key output % added
+ output.year.check % added
+ new.block
+ format.articletitle "title" output.check
+ new.block
+ howpublished empty.or.unknown
+ { }
+ { "\bibinfo{howpublished}{" howpublished "}" * * output }
+ if$
+
+ crossref missing$
+ { format.journal.volume.number.day.month.year output}
+ {
+ "cross reference in @Article{...} is unusual" warning$
+ format.article.crossref output.nonnull
+ }
+ if$
+
+ format.pages.check.without.articleno output
+ format.articleno.numpages output
+ fin.block
+ output.issue.doi.coden.isxn.lccn.url.eprint.note
+ fin.entry
+}
+
+FUNCTION { book }
+{
+ output.bibitem
+ author empty.or.unknown
+ { format.editors "author and editor" output.check }
+ { format.authors output.nonnull
+ crossref missing$
+ { "author and editor" editor either.or.check }
+ 'skip$
+ if$
+ }
+ if$
+ output.year.check % added
+ new.block
+ format.btitle "title" output.check
+ crossref missing$
+ { new.sentence % jtb: start a new sentence for series/volume
+ format.bvolume output
+ new.block
+ format.number.series output
+ new.sentence
+ publisher "publisher" bibinfo.output.check
+ address "address" bibinfo.output.check % jtb: require address
+ fin.sentence
+ pages empty.or.unknown
+ { format.bookpages } % use bookpages when pages empty
+ { format.pages.check "pages" tie.or.space.connect }
+ if$
+ output
+ }
+ { new.block
+ format.book.crossref output.nonnull
+ }
+ if$
+ fin.block
+ output.issue.doi.coden.isxn.lccn.url.eprint.note
+ fin.entry
+}
+
+FUNCTION { booklet }
+{
+ output.bibitem
+ format.authors output
+ author format.key output % added
+ output.year.check % added
+ new.block
+ format.title "title" output.check
+ new.block
+ howpublished empty.or.unknown
+ { }
+ { "\bibinfo{howpublished}{" howpublished "}" * * output }
+ if$
+ address output
+ fin.block
+ output.issue.doi.coden.isxn.lccn.url.eprint.note
+ fin.entry
+}
+
+FUNCTION { inbook }
+{
+ output.bibitem
+ author empty.or.unknown
+ { format.editors
+ "author and editor" output.check
+ }
+ { format.authors output.nonnull
+ crossref missing$
+ { "author and editor" editor either.or.check }
+ 'skip$
+ if$
+ }
+ if$
+ output.year.check % added
+ new.block
+ format.btitle "title" output.check
+ crossref missing$
+ { new.sentence % jtb: start a new sentence for series/volume
+ format.bvolume output
+ new.block
+ format.number.series output
+ new.sentence
+ publisher "publisher" bibinfo.output.check
+ address "address" bibinfo.output.check % jtb: require address
+ format.bookpages output
+ format.chapter.pages
+ "chapter and pages" output.check % jtb: moved from before publisher
+ }
+ {
+ format.bookpages output
+ format.chapter.pages "chapter and pages" output.check
+ new.block
+ format.book.crossref output.nonnull
+ }
+ if$
+ fin.block
+ output.issue.doi.coden.isxn.lccn.url.eprint.note
+ fin.entry
+}
+
+FUNCTION { incollection }
+{
+ output.bibitem
+ format.authors "author" output.check
+ author format.key output % added
+ output.year.check % added
+ new.block
+ format.articletitle "title" output.check
+ new.block
+ crossref missing$
+ { format.in.ed.booktitle "booktitle" output.check
+ new.sentence % jtb: start a new sentence for series/volume
+ format.bvolume output
+ format.number.series output
+ new.sentence
+ publisher "publisher" bibinfo.output.check
+ address "address" bibinfo.output.check % jtb: require address
+ format.bookpages output
+ format.chapter.pages output % gnp - was special.output.nonnull
+ % left out comma before page numbers
+ % jtb: moved from before publisher
+ }
+ {
+ format.incoll.inproc.crossref output.nonnull
+ format.chapter.pages output
+ }
+ if$
+ fin.block
+ output.issue.doi.coden.isxn.lccn.url.eprint.note
+ fin.entry
+}
+
+FUNCTION { inproceedings }
+{
+ output.bibitem
+ format.authors "author" output.check
+ author format.key output % added
+ output.year.check % added
+ new.block
+ format.articletitle "title" output.check
+ howpublished empty.or.unknown
+ { }
+ { "\bibinfo{howpublished}{" howpublished "}" * * output.dot.space }
+ if$
+ crossref missing$
+ {
+ journal missing$ % jtb: proceedings appearing in journals
+ { format.in.emphasize.booktitle format.city "booktitle" output.check.dot.space
+ format.series output.removenospace
+ format.editors.fml output % BV 2011/09/27 Moved dot to comma
+ format.bvolume.noseries output
+ new.sentence
+ organization output
+ publisher "publisher" bibinfo.output.check % jtb: require publisher (?)
+ address "address" bibinfo.output.check % jtb: require address
+ format.bookpages output
+ }
+ {
+ format.in.booktitle format.city "booktitle" output.check
+ format.editors.fml output
+ new.sentence
+ format.journal.volume.number.day.month.year output
+ }
+ if$
+ format.articleno output
+ format.pages.check.without.articleno output
+ }
+ {
+ format.incoll.inproc.crossref output.nonnull
+ format.articleno output
+ format.pages.check.without.articleno output
+ }
+ if$
+ format.articleno.numpages output
+ fin.block
+ output.issue.doi.coden.isxn.lccn.url.eprint.note
+ fin.entry
+}
+
+FUNCTION { conference } { inproceedings }
+
+FUNCTION { manual }
+{
+ output.bibitem
+ author empty.or.unknown
+ { editor empty.or.unknown
+ { organization "organization" output.check
+ organization format.key output } % if all else fails, use key
+ { format.editors "author and editor" output.check }
+ if$
+ }
+ { format.authors output.nonnull }
+ if$
+ output.year.check % added
+ new.block
+ format.btitle "title" output.check
+ organization address new.block.checkb
+ % jtb: back to normal style: organization, address
+ organization "organization" output.check
+ address output
+ fin.block
+ output.issue.doi.coden.isxn.lccn.url.eprint.note
+ fin.entry
+}
+
+FUNCTION { mastersthesis }
+{
+ output.bibitem
+ format.authors "author" output.check
+ author format.key output % added
+ output.year.check % added
+ new.block
+ format.title emphasize "title" output.check % NB: ACM style requires emphasized thesis title
+ new.block
+ "\bibinfo{thesistype}{Master's\ thesis}" format.thesis.type output
+ new.sentence
+ school "school" bibinfo.output.check
+ address empty.or.unknown
+ { }
+ { "\bibinfo{address}{" address * "}" * output }
+ if$
+ new.block
+ format.advisor output
+ fin.block
+ output.issue.doi.coden.isxn.lccn.url.eprint.note
+ fin.entry
+}
+
+FUNCTION { misc }
+{
+ output.bibitem
+ format.authors "author" output.check
+ author format.key output % added
+ output.year.check % added
+ title howpublished new.block.checkb
+ format.title output
+ new.block
+ howpublished empty.or.unknown
+ { }
+ { "\bibinfo{howpublished}{" howpublished "}" * * output }
+ if$
+ "" output.nonnull.dot.space
+ calc.format.page.count output
+ fin.block
+ output.issue.doi.coden.isxn.lccn.url.eprint.note
+ fin.entry
+}
+
+FUNCTION { online } { manual }
+
+FUNCTION { game } { manual }
+
+FUNCTION { artifactsoftware } { manual }
+
+FUNCTION { artifactdataset } { manual }
+
+FUNCTION { software } { manual }
+
+FUNCTION { dataset } { manual }
+
+FUNCTION { phdthesis }
+{
+ output.bibitem
+ format.authors "author" output.check
+ author format.key output % added
+ output.year.check % added
+ new.block
+ format.title emphasize "title" output.check % NB: ACM style requires emphasized thesis title
+ new.block
+ "\bibinfo{thesistype}{Ph.D. Dissertation}" format.thesis.type output
+ new.sentence
+ school "school" bibinfo.output.check
+ address empty.or.unknown
+ { }
+ { "\bibinfo{address}{" address * "}" * output }
+ if$
+ new.block
+ format.advisor output
+ fin.block
+ output.issue.doi.coden.isxn.lccn.url.eprint.note
+ fin.entry
+}
+
+FUNCTION {format.date}
+{ year empty.or.unknown
+ { month empty.or.unknown
+ {
+ "" % output empty date if year/month both empty
+ day empty.or.unknown
+ { }
+ { "there's a day but no month or year in " cite$ * warning$ }
+ if$
+ }
+ { "there's a month but no year in " cite$ * warning$
+ month
+ day empty.or.unknown
+ { }
+ { " " * day * }
+ if$
+ }
+ if$
+ }
+ { month empty.or.unknown
+ {
+ year % output only year if month empty
+ day empty.or.unknown
+ { }
+ { "there's a day and year but no month in " cite$ * warning$ }
+ if$
+ }
+ {
+ month " " *
+ day empty.or.unknown
+ { }
+ { day * ", " * }
+ if$
+ year *
+ }
+ if$
+ }
+ if$
+}
+
+FUNCTION {new.block.checka}
+{
+ empty.or.unknown
+ 'skip$
+ 'new.block
+ if$
+}
+
+FUNCTION { periodical }
+{
+ output.bibitem
+ editor empty.or.unknown
+ { organization output }
+ { format.editors output.nonnull }
+ if$
+ new.block
+ output.year.check
+ new.sentence
+ format.articletitle "title" output.check
+ format.journal.volume.number.day.month.year output
+ calc.format.page.count output
+ fin.entry
+}
+
+FUNCTION { proceedings }
+{
+ output.bibitem
+ editor empty.or.unknown
+ { organization output
+ organization format.key output } % gnp - changed from author format.key
+ { format.editors output.nonnull }
+ if$
+ % author format.key output % gnp - removed (should be either
+ % editor or organization
+ output.year.check % added (newapa)
+ new.block
+ format.btitle format.city "title" output.check % jtb: added city
+ new.sentence
+ format.bvolume output
+ format.number.series output
+ new.sentence
+ organization output
+ % jtb: normal order: publisher, address
+ publisher empty.or.unknown
+ { }
+ { "\bibinfo{publisher}{" publisher * "}" * output }
+ if$
+ address empty.or.unknown
+ { }
+ { "\bibinfo{address}{" address * "}" * output }
+ if$
+ fin.block
+ output.issue.doi.coden.isxn.lccn.url.eprint.note
+ fin.entry
+}
+
+FUNCTION { collection } { proceedings }
+
+FUNCTION { techreport }
+{
+ output.bibitem
+ format.authors "author" output.check
+ author format.key output % added
+ output.year.check % added
+ new.block
+ format.btitle "title" output.check
+ new.block
+% format.tr.number output % jtb: moved month ...
+ format.tr.number output new.sentence % Gerry - need dot 2011/09/28
+ institution "institution" bibinfo.output.check
+ address empty.or.unknown
+ { }
+ { "\bibinfo{address}{" address "}" * * output }
+ if$
+ new.sentence
+ format.named.pages output
+ % ACM omits year at end in transactions style
+ % format.day.month.year output.nonnull.dot.space % jtb: ... to here (no parens)
+ fin.block
+ output.issue.doi.coden.isxn.lccn.url.eprint.note
+ fin.entry
+}
+
+FUNCTION { unpublished }
+{
+ output.bibitem
+ format.authors
+ "author" output.check
+ author format.key output % added
+ output.year.check % added
+ new.block
+ format.title "title" output.check
+ fin.sentence
+ output.day.month.year % UTAH
+ calc.format.page.count output
+ fin.block
+ output.issue.doi.coden.isxn.lccn.url.eprint.note.check
+ fin.entry
+}
+
+FUNCTION { default.type } { misc }
+
+%%% ACM journal-style month definitions: full name if 1--5 letters, else
+%%% abbreviation of 3 or 4 characters and a dot
+
+MACRO {jan} {"Jan."}
+
+MACRO {feb} {"Feb."}
+
+MACRO {mar} {"March"}
+
+MACRO {apr} {"April"}
+
+MACRO {may} {"May"}
+
+MACRO {jun} {"June"}
+
+MACRO {jul} {"July"}
+
+MACRO {aug} {"Aug."}
+
+MACRO {sep} {"Sept."}
+
+MACRO {oct} {"Oct."}
+
+MACRO {nov} {"Nov."}
+
+MACRO {dec} {"Dec."}
+
+
+
+READ
+
+FUNCTION { sortify }
+{
+ purify$
+ "l" change.case$
+}
+
+FUNCTION { chop.word }
+{
+ 's :=
+ 'len :=
+ s #1 len substring$ =
+ { s len #1 + global.max$ substring$ }
+ 's
+ if$
+}
+
+FUNCTION { sort.format.names }
+{
+ 's :=
+ #1 'nameptr :=
+ ""
+ s num.names$ 'numnames :=
+ numnames 'namesleft :=
+ { namesleft #0 > }
+ { nameptr #1 >
+ { " " * }
+ 'skip$
+ if$
+ s nameptr "{vv{ } }{ll{ }}{ f{ }}{ jj{ }}" format.name$ 't :=
+ nameptr numnames = t "others" = and
+ { " et~al" * }
+ { t sortify * }
+ if$
+ nameptr #1 + 'nameptr :=
+ namesleft #1 - 'namesleft :=
+ }
+ while$
+}
+
+FUNCTION { sort.format.title }
+{
+ 't :=
+ "A " #2
+ "An " #3
+ "The " #4 t chop.word
+ chop.word
+ chop.word
+ sortify
+ #1 global.max$ substring$
+}
+
+FUNCTION { author.sort }
+{
+ author empty.or.unknown
+ { key empty.or.unknown
+ { "to sort, need author or key in " cite$ * warning$
+ "" }
+ { key sortify }
+ if$
+ }
+ { author sort.format.names }
+ if$
+}
+
+FUNCTION { author.editor.sort }
+{
+ author empty.or.unknown
+ {
+ editor empty.or.unknown
+ {
+ key empty.or.unknown
+ { "to sort, need author, editor, or key in " cite$ * warning$
+ ""
+ }
+ { key sortify }
+ if$
+ }
+ { editor sort.format.names }
+ if$
+ }
+ { author sort.format.names }
+ if$
+}
+
+FUNCTION { editor.organization.sort }
+{
+ % added - GNP. Stack editor or organization for sorting (from alpha.bst).
+ % Unlike alpha.bst, we need entire names, not abbreviations
+
+ editor empty.or.unknown
+ { organization empty.or.unknown
+ { key empty.or.unknown
+ { "to sort, need editor, organization, or key in " cite$ * warning$
+ ""
+ }
+ { key sortify }
+ if$
+ }
+ { organization sortify }
+ if$
+ }
+ { editor sort.format.names }
+ if$
+}
+
+FUNCTION { author.editor.organization.sort }
+{
+ % added - GNP. Stack author or organization for sorting (from alpha.bst).
+ % Unlike alpha.bst, we need entire names, not abbreviations
+
+ author empty.or.unknown
+ {
+ editor empty.or.unknown
+ { organization empty.or.unknown
+ { key empty.or.unknown
+ { "to sort, need author, editor, or key in " cite$ * warning$
+ ""
+ }
+ { key sortify }
+ if$
+ }
+ { organization sortify }
+ if$
+ }
+ { editor sort.format.names }
+ if$
+ }
+ { author sort.format.names }
+ if$
+}
+
+FUNCTION { presort }
+{
+ % Presort creates the bibentry's label via a call to calc.label, and then
+ % sorts the entries based on entry type. Chicago.bst adds support for
+ % including organizations as the sort key; the following is stolen from
+ % alpha.bst.
+
+ calc.label
+ basic.label.year
+ swap$
+ " "
+ swap$
+ * *
+ " "
+ *
+ sortify
+ year field.or.null purify$ #-1 #4 substring$ * % add year
+ " "
+ *
+ type$ "book" =
+ type$ "inbook" =
+ or
+ type$ "article" =
+ or
+ 'author.editor.sort
+ { type$ "proceedings" =
+ type$ "periodical" =
+ or
+ 'editor.organization.sort
+ { type$ "manual" =
+ 'author.editor.organization.sort
+ 'author.sort
+ if$
+ }
+ if$
+ }
+ if$
+ #1 entry.max$ substring$ % added for newapa
+ 'sort.label := % added for newapa
+ sort.label % added for newapa
+ *
+ " "
+ *
+ title field.or.null
+ sort.format.title
+ *
+ #1 entry.max$ substring$
+ 'sort.key$ :=
+}
+
+
+
+ITERATE { presort }
+
+SORT % by label, year, author/editor, title
+
+% From plainnat.bst
+STRINGS { longest.label }
+
+INTEGERS { longest.label.width number.label }
+
+FUNCTION {initialize.longest.label}
+{ "" 'longest.label :=
+ #0 int.to.chr$ 'last.label :=
+ "" 'next.extra :=
+ #0 'longest.label.width :=
+ #0 'last.extra.num :=
+ #0 'number.label :=
+}
+
+
+
+FUNCTION { initialize.extra.label.stuff }
+{ #0 int.to.chr$ 'last.label :=
+ "" 'next.extra :=
+ #0 'last.extra.num :=
+}
+
+FUNCTION { forward.pass }
+{
+ % Pass through all entries, comparing current entry to last one.
+ % Need to concatenate year to the stack (done by calc.label) to determine
+ % if two entries are the same (see presort)
+
+ last.label
+ calc.basic.label year field.or.null purify$ #-1 #4 substring$ * % add year
+ #1 entry.max$ substring$ = % are they equal?
+ { last.extra.num #1 + 'last.extra.num :=
+ last.extra.num int.to.chr$ 'extra.label :=
+ }
+ { "a" chr.to.int$ 'last.extra.num :=
+ "" 'extra.label :=
+ calc.basic.label year field.or.null purify$ #-1 #4 substring$ * % add year
+ #1 entry.max$ substring$ 'last.label := % assign to last.label
+ }
+ if$
+ number.label #1 + 'number.label :=
+}
+
+FUNCTION { reverse.pass }
+{
+ next.extra "b" =
+ { "a" 'extra.label := }
+ 'skip$
+ if$
+ label.year extra.label * 'sort.year :=
+ extra.label 'next.extra :=
+}
+
+EXECUTE {initialize.extra.label.stuff}
+EXECUTE {initialize.longest.label}
+
+
+ITERATE {forward.pass}
+
+REVERSE {reverse.pass}
+
+FUNCTION { bib.sort.order }
+{
+ sort.label
+ " "
+ *
+ year field.or.null sortify
+ *
+ " "
+ *
+ title field.or.null
+ sort.format.title
+ *
+ #1 entry.max$ substring$
+ 'sort.key$ :=
+}
+
+ITERATE { bib.sort.order }
+
+SORT % by sort.label, year, title --- giving final bib. order.
+
+FUNCTION { begin.bib }
+{
+ %% Set to #0 show 13-digit ISBN in preference to 10-digit ISBN.
+ %% Set to #1 to show both 10-digit and 13-digit ISBNs.
+ #1 'show-isbn-10-and-13 :=
+
+ "%%% -*-BibTeX-*-" writeln
+ "%%% Do NOT edit. File created by BibTeX with style" writeln
+ "%%% ACM-Reference-Format-Journals [18-Jan-2012]." writeln
+ "" writeln
+
+ preamble$ empty.or.unknown
+ 'skip$
+ { preamble$ writeln }
+ if$
+ "\begin{thebibliography}{" number.label int.to.str$ * "}" * writeln
+ "" writeln
+ "%%% ====================================================================" writeln
+ "%%% NOTE TO THE USER: you can override these defaults by providing" writeln
+ "%%% customized versions of any of these macros before the \bibliography" writeln
+ "%%% command. Each of them MUST provide its own final punctuation," writeln
+ "%%% except for \shownote{}, \showDOI{}, and \showURL{}. The latter two" writeln
+ "%%% do not use final punctuation, in order to avoid confusing it with" writeln
+ "%%% the Web address." writeln
+ "%%%" writeln
+ "%%% To suppress output of a particular field, define its macro to expand" writeln
+ "%%% to an empty string, or better, \unskip, like this:" writeln
+ "%%%" writeln
+ "%%% \newcommand{\showDOI}[1]{\unskip} % LaTeX syntax" writeln
+ "%%%" writeln
+ "%%% \def \showDOI #1{\unskip} % plain TeX syntax" writeln
+ "%%%" writeln
+ "%%% ====================================================================" writeln
+ "" writeln
+
+ %% ACM publications do not use CODEN, ISSN, and LCCN data, so their default
+ %% macro wrappers expand to \unskip, discarding their values and unwanted
+ %% space.
+ %%
+ %% For other publications, prior definitions like these may be useful:
+ %%
+ %% Plain TeX:
+ %% \def \showCODEN #1{CODEN #1.}
+ %% \def \showISSN #1{ISSN #1.}
+ %% \def \showLCCN #1{LCCN #1.}
+ %%
+ %% LaTeX:
+ %% \newcommand{\showCODEN}[1]{CODEN #1.}
+ %% \newcommand{\showISSN}[1]#1{ISSN #1.}
+ %% \newcommand{\showLCCN}[1]{LCCN #1.}
+
+ "\ifx \showCODEN \undefined \def \showCODEN #1{\unskip} \fi" writeln
+ "\ifx \showDOI \undefined \def \showDOI #1{#1}\fi" writeln
+ % ACM styles omit ISBNs, but they can be included by suitable definitions of
+ % \showISBNx and \showISBNxiii before the .bbl file is read
+ "\ifx \showISBNx \undefined \def \showISBNx #1{\unskip} \fi" writeln
+ "\ifx \showISBNxiii \undefined \def \showISBNxiii #1{\unskip} \fi" writeln
+ "\ifx \showISSN \undefined \def \showISSN #1{\unskip} \fi" writeln
+ "\ifx \showLCCN \undefined \def \showLCCN #1{\unskip} \fi" writeln
+ "\ifx \shownote \undefined \def \shownote #1{#1} \fi" writeln % NB: final period supplied by add.period$ above
+ "\ifx \showarticletitle \undefined \def \showarticletitle #1{#1} \fi" writeln
+ "\ifx \showURL \undefined \def \showURL {\relax} \fi" writeln
+ "% The following commands are used for tagged output and should be " writeln
+ "% invisible to TeX" writeln
+ "\providecommand\bibfield[2]{#2}" writeln
+ "\providecommand\bibinfo[2]{#2}" writeln
+ "\providecommand\natexlab[1]{#1}" writeln
+ "\providecommand\showeprint[2][]{arXiv:#2}" writeln
+}
+
+EXECUTE {begin.bib}
+
+EXECUTE {init.state.consts}
+
+ITERATE {call.type$}
+
+FUNCTION { end.bib }
+{
+ newline$
+ "\end{thebibliography}"
+ writeln
+}
+
+EXECUTE {end.bib}
diff --git a/paper/Makefile b/paper/Makefile
new file mode 100644
index 0000000..65e84e0
--- /dev/null
+++ b/paper/Makefile
@@ -0,0 +1,4 @@
+all: $(subst .tex,.pdf,$(wildcard *.tex))
+
+%.pdf: %.tex
+ latexmk -pdf -shell-escape -pdflatex="lualatex" $< </dev/null
diff --git a/paper/acmart.cls b/paper/acmart.cls
new file mode 100644
index 0000000..afba327
--- /dev/null
+++ b/paper/acmart.cls
@@ -0,0 +1,2876 @@
+%%
+%% 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}
+[2019/10/19 v1.65 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}
+\define@choicekey*+{acmart.cls}{format}[\ACM@format\ACM@format@nr]{%
+ manuscript, acmsmall, acmlarge, acmtog, sigconf, siggraph,
+ sigplan, sigchi, sigchi-a}[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{acmart.cls}{format=#1}}}
+\@DeclareACMFormat{manuscript}
+\@DeclareACMFormat{acmsmall}
+\@DeclareACMFormat{acmlarge}
+\@DeclareACMFormat{acmtog}
+\@DeclareACMFormat{sigconf}
+\@DeclareACMFormat{siggraph}
+\@DeclareACMFormat{sigplan}
+\@DeclareACMFormat{sigchi}
+\@DeclareACMFormat{sigchi-a}
+\ExecuteOptionsX{format}
+\define@boolkey+{acmart.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+{acmart.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+{acmart.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+{acmart.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+{acmart.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+{acmart.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+{acmart.cls}[@ACM@]{balance}[true]{}{%
+ \PackageError{\@classname}{The option balance can be either true or
+ false}}
+\ExecuteOptionsX{balance}
+\define@boolkey+{acmart.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+{acmart.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+{acmart.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+{acmart.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{9pt}{\edef\ACM@fontsize{\CurrentOption}}
+\DeclareOptionX{10pt}{\edef\ACM@fontsize{\CurrentOption}}
+\DeclareOptionX{11pt}{\edef\ACM@fontsize{\CurrentOption}}
+\DeclareOptionX{12pt}{\edef\ACM@fontsize{\CurrentOption}}
+\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@sigchiamode
+\ifnum\ACM@format@nr=5\relax % siggraph
+ \ClassWarning{\@classname}{The format siggraph is now obsolete.
+ I am switching to sigconf.}
+ \setkeys{acmart.cls}{format=sigconf}
+\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
+\or % sigconf
+ \@ACM@journalfalse
+\or % siggraph
+ \@ACM@journalfalse
+ \or % sigplan
+ \@ACM@journalfalse
+ \or % sigchi
+ \@ACM@journalfalse
+\or % sigchi-a
+ \@ACM@journalfalse
+ \@ACM@sigchiamodetrue
+\fi
+\if@ACM@journal
+ \@ACM@journal@bibstriptrue
+\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{10pt}%
+ \or % sigchi-a
+ \def\ACM@fontsize{10pt}%
+ \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
+\RequirePackage{textcase}
+\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
+\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\@seccntformat#1{\csname the#1\endcsname\quad}
+\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\@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{2}{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}
+\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}
+\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.}}
+\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
+\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
+\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
+\fi
+\RequirePackage{iftex}
+\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
+\fi
+\RequirePackage{cmap}
+\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 zi4 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
+ \RequirePackage[T1]{fontenc}
+\ifxetex
+ \RequirePackage[tt=false]{libertine}
+ \setmonofont{inconsolata}
+\else
+ \RequirePackage[tt=false, type1=true]{libertine}
+\fi
+\RequirePackage[varqu]{zi4}
+\RequirePackage[libertine]{newtxmath}
+\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}\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}
+\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}}
+ \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
+\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]{%
+ CIE,%
+ CSUR,%
+ DGOV,%
+ DTRAP,%
+ HEALTH,%
+ IMWUT,%
+ JACM,%
+ JDIQ,%
+ JEA,%
+ JERIC,%
+ JETC,%
+ JOCCH,%
+ PACMCGIT,%
+ PACMHCI,%
+ PACMPL,%
+ POMACS,%
+ TAAS,%
+ TACCESS,%
+ TACO,%
+ 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,%
+ TOPS,%
+ TOPLAS,%
+ TOS,%
+ TOSEM,%
+ TOSN,%
+ TQC,%
+ TRETS,%
+ TSAS,%
+ TSC,%
+ TSLP,%
+ TWEB,%
+ FACMP%
+}{%
+\ifcase\@journalCode@nr
+\relax % 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}%
+\or % DGOV
+ \def\@journalName{Digital Government: Research and Practice}%
+ \def\@journalNameShort{Digit. Gov. Res. Pract.}%
+ \def\@permissionCodeOne{2639-0175}%
+\or % DTRAP
+ \def\@journalName{Digital Threats: Research and Practice}%
+ \def\@journalNameShort{Digit. Threat. Res. Pract.}%
+ \def\@permissionCodeOne{2576-5337}%
+\or % HEALTH
+ \def\@journalName{ACM Transactions on Computing for Healthcare}%
+ \def\@journalNameShort{ACM Trans. Comput. Healthcare}%
+ \def\@permissionCodeOne{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}%
+ \@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}%
+\or % JDIQ
+ \def\@journalName{ACM Journal of Data and Information Quality}%
+ \def\@journalNameShort{ACM J. Data Inform. Quality}%
+ \def\@permissionCodeOne{1936-1955}%
+\or % JEA
+ \def\@journalName{ACM Journal of Experimental Algorithmics}%
+ \def\@journalNameShort{ACM J. Exp. Algor.}%
+ \def\@permissionCodeOne{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\@permissionCodeOne{1550-4832}%
+\or % JOCCH
+ \def\@journalName{ACM Journal on Computing and Cultural Heritage}%
+ \def\@journalNameShort{ACM J. Comput. Cult. Herit.}%
+\or % PACMCGIT
+ \def\@journalName{Proceedings of the ACM on Computer Graphics and Interactive Techniques}%
+ \def\@journalNameShort{Proc. ACM Comput. Graph. Interact. Tech.}%
+ \def\@permissionCodeOne{2577-6193}%
+ \@ACM@screentrue
+ \PackageInfo{\@classname}{Using screen mode due to \@journalCode}%
+\or % PACMHCI
+ \def\@journalName{Proceedings of the ACM on Human-Computer Interaction}%
+ \def\@journalNameShort{Proc. ACM Hum.-Comput. Interact.}%
+ \def\@permissionCodeOne{2573-0142}%
+ \@ACM@screentrue
+ \PackageInfo{\@classname}{Using screen mode due to \@journalCode}%
+\or % PACMPL
+ \def\@journalName{Proceedings of the ACM on Programming Languages}%
+ \def\@journalNameShort{Proc. ACM Program. Lang.}%
+ \def\@permissionCodeOne{2475-1421}%
+ \@ACM@screentrue
+ \PackageInfo{\@classname}{Using screen mode due to \@journalCode}%
+\or % POMACS
+ \def\@journalName{Proceedings of the ACM on Measurement and Analysis of Computing Systems}%
+ \def\@journalNameShort{Proc. ACM Meas. Anal. Comput. Syst.}%
+ \def\@permissionCodeOne{2476-1249}%
+ \@ACM@screentrue
+ \PackageInfo{\@classname}{Using screen mode due to \@journalCode}%
+\or % TAAS
+ \def\@journalName{ACM Transactions on Autonomous and Adaptive Systems}%
+ \def\@journalNameShort{ACM Trans. Autonom. Adapt. Syst.}%
+ \def\@permissionCodeOne{1556-4665}%
+\or % TACCESS
+ \def\@journalName{ACM Transactions on Accessible Computing}%
+ \def\@journalNameShort{ACM Trans. Access. Comput.}%
+ \def\@permissionCodeOne{1936-7228}%
+\or % TACO
+ \def\@journalName{ACM Transactions on Architecture and Code Optimization}%
+ \def\@journalNameShort{ACM Trans. Arch. Code Optim.}%
+\or % TALG
+ \def\@journalName{ACM Transactions on Algorithms}%
+ \def\@journalNameShort{ACM Trans. Algor.}%
+ \def\@permissionCodeOne{1549-6325}%
+\or % TALLIP
+ \def\@journalName{ACM Transactions on Asian and Low-Resource Language Information Processing}%
+ \def\@journalNameShort{ACM Trans. Asian Low-Resour. Lang. Inf. Process.}%
+ \def\@permissionCodeOne{2375-4699}%
+\or % TAP
+ \def\@journalName{ACM Transactions on Applied Perception}%
+\or % TCPS
+ \def\@journalName{ACM Transactions on Cyber-Physical Systems}%
+\or % TDS
+ \def\@journalName{ACM Transactions on Data Science}%
+ \def\@journalNameShort{ACM Trans. Data Sci.}%
+ \def\@permissionCodeOne{2577-3224}%
+\or % TEAC
+ \def\@journalName{ACM Transactions on Economics and Computation}%
+\or % TECS
+ \def\@journalName{ACM Transactions on Embedded Computing Systems}%
+ \def\@journalNameShort{ACM Trans. Embedd. Comput. Syst.}%
+ \def\@permissionCodeOne{1539-9087}%
+\or % TELO
+ \def\@journalName{ACM Transactions on Evolutionary Learning}%
+ \def\@journalNameShort{ACM Trans. Evol. Learn.}%
+ \def\@permissionCodeOne{2688-3007}%
+\or % THRI
+ \def\@journalName{ACM Transactions on Human-Robot Interaction}%
+ \def\@journalNameShort{ACM Trans. Hum.-Robot Interact.}%
+ \def\@permissionCodeOne{2573-9522}%
+\or % TIIS
+ \def\@journalName{ACM Transactions on Interactive Intelligent Systems}%
+ \def\@journalNameShort{ACM Trans. Interact. Intell. Syst.}%
+ \def\@permissionCodeOne{2160-6455}%
+\or % TIOT
+ \def\@journalName{ACM Transactions on Internet of Things}%
+ \def\@journalNameShort{ACM Trans. Internet Things}%
+ \def\@permissionCodeOne{2577-6207}%
+\or % TISSEC
+ \def\@journalName{ACM Transactions on Information and System Security}%
+ \def\@journalNameShort{ACM Trans. Info. Syst. Sec.}%
+ \def\@permissionCodeOne{1094-9224}%
+\or % TIST
+ \def\@journalName{ACM Transactions on Intelligent Systems and Technology}%
+ \def\@journalNameShort{ACM Trans. Intell. Syst. Technol.}%
+ \def\@permissionCodeOne{2157-6904}%
+\or % TKDD
+ \def\@journalName{ACM Transactions on Knowledge Discovery from Data}%
+ \def\@journalNameShort{ACM Trans. Knowl. Discov. Data.}%
+ \def\@permissionCodeOne{1556-4681}%
+\or % TMIS
+ \def\@journalName{ACM Transactions on Management Information Systems}%
+ \def\@journalNameShort{ACM Trans. Manag. Inform. Syst.}%
+ \def\@permissionCodeOne{2158-656X}%
+\or % TOCE
+ \def\@journalName{ACM Transactions on Computing Education}%
+ \def\@journalNameShort{ACM Trans. Comput. Educ.}%
+ \def\@permissionCodeOne{1946-6226}%
+\or % TOCHI
+ \def\@journalName{ACM Transactions on Computer-Human Interaction}%
+ \def\@journalNameShort{ACM Trans. Comput.-Hum. Interact.}%
+ \def\@permissionCodeOne{1073-0516}%
+\or % TOCL
+ \def\@journalName{ACM Transactions on Computational Logic}%
+ \def\@journalNameShort{ACM Trans. Comput. Logic}%
+ \def\@permissionCodeOne{1529-3785}%
+\or % TOCS
+ \def\@journalName{ACM Transactions on Computer Systems}%
+ \def\@journalNameShort{ACM Trans. Comput. Syst.}%
+ \def\@permissionCodeOne{0734-2071}%
+\or % TOCT
+ \def\@journalName{ACM Transactions on Computation Theory}%
+ \def\@journalNameShort{ACM Trans. Comput. Theory}%
+ \def\@permissionCodeOne{1942-3454}%
+\or % TODAES
+ \def\@journalName{ACM Transactions on Design Automation of Electronic Systems}%
+ \def\@journalNameShort{ACM Trans. Des. Autom. Electron. Syst.}%
+ \def\@permissionCodeOne{1084-4309}%
+\or % TODS
+ \def\@journalName{ACM Transactions on Database Systems}%
+ \def\@journalNameShort{ACM Trans. Datab. Syst.}%
+ \def\@permissionCodeOne{0362-5915}%
+\or % TOG
+ \def\@journalName{ACM Transactions on Graphics}%
+ \def\@journalNameShort{ACM Trans. Graph.}%
+ \def\@permissionCodeOne{0730-0301}
+\or % TOIS
+ \def\@journalName{ACM Transactions on Information Systems}%
+ \def\@permissionCodeOne{1046-8188}%
+\or % TOIT
+ \def\@journalName{ACM Transactions on Internet Technology}%
+ \def\@journalNameShort{ACM Trans. Internet Technol.}%
+ \def\@permissionCodeOne{1533-5399}%
+\or % TOMACS
+ \def\@journalName{ACM Transactions on Modeling and Computer Simulation}%
+ \def\@journalNameShort{ACM Trans. Model. Comput. Simul.}%
+\or % TOMM
+ \def\@journalName{ACM Transactions on Multimedia Computing, Communications and Applications}%
+ \def\@journalNameShort{ACM Trans. Multimedia Comput. Commun. Appl.}%
+ \def\@permissionCodeOne{1551-6857}%
+ \def\@permissionCodeTwo{0100}%
+\or % TOMPECS
+ \def\@journalName{ACM Transactions on Modeling and Performance Evaluation of Computing Systems}%
+ \def\@journalNameShort{ACM Trans. Model. Perform. Eval. Comput. Syst.}%
+ \def\@permissionCodeOne{2376-3639}%
+\or % TOMS
+ \def\@journalName{ACM Transactions on Mathematical Software}%
+ \def\@journalNameShort{ACM Trans. Math. Softw.}%
+ \def\@permissionCodeOne{0098-3500}%
+\or % TOPC
+ \def\@journalName{ACM Transactions on Parallel Computing}%
+ \def\@journalNameShort{ACM Trans. Parallel Comput.}%
+ \def\@permissionCodeOne{1539-9087}%
+\or % TOPS
+ \def\@journalName{ACM Transactions on Privacy and Security}%
+ \def\@journalNameShort{ACM Trans. Priv. Sec.}%
+ \def\@permissionCodeOne{2471-2566}%
+\or % TOPLAS
+ \def\@journalName{ACM Transactions on Programming Languages and Systems}%
+ \def\@journalNameShort{ACM Trans. Program. Lang. Syst.}%
+ \def\@permissionCodeOne{0164-0925}%
+\or % TOS
+ \def\@journalName{ACM Transactions on Storage}%
+ \def\@journalNameShort{ACM Trans. Storage}%
+ \def\@permissionCodeOne{1553-3077}%
+\or % TOSEM
+ \def\@journalName{ACM Transactions on Software Engineering and Methodology}%
+ \def\@journalNameShort{ACM Trans. Softw. Eng. Methodol.}%
+ \def\@permissionCodeOne{1049-331X}%
+\or % TOSN
+ \def\@journalName{ACM Transactions on Sensor Networks}%
+ \def\@journalNameShort{ACM Trans. Sensor Netw.}%
+ \def\@permissionCodeOne{1550-4859}%
+\or % TQC
+ \def\@journalName{ACM Transactions on Quantum Computing}%
+ \def\@journalNameShort{ACM Trans. Quantum Comput.}%
+ \def\@permissionCodeOne{2643-6817}%
+\or % TRETS
+ \def\@journalName{ACM Transactions on Reconfigurable Technology and Systems}%
+ \def\@journalNameShort{ACM Trans. Reconfig. Technol. Syst.}%
+ \def\@permissionCodeOne{1936-7406}%
+\or % TSAS
+ \def\@journalName{ACM Transactions on Spatial Algorithms and Systems}%
+ \def\@journalNameShort{ACM Trans. Spatial Algorithms Syst.}%
+ \def\@permissionCodeOne{2374-0353}%
+\or % TSC
+ \def\@journalName{ACM Transactions on Social Computing}%
+ \def\@journalNameShort{ACM Trans. Soc. Comput.}%
+ \def\@permissionCodeOne{2469-7818}%
+\or % TSLP
+ \def\@journalName{ACM Transactions on Speech and Language Processing}%
+ \def\@journalNameShort{ACM Trans. Speech Lang. Process.}%
+ \def\@permissionCodeOne{1550-4875}%
+\or % TWEB
+ \def\@journalName{ACM Transactions on the Web}%
+ \def\@journalNameShort{ACM Trans. Web}%
+ \def\@permissionCodeOne{1559-1131}%
+\else % FACMP, a dummy journal
+ \def\@journalName{Forthcoming ACM Publication}%
+ \def\@journalNameShort{ACM Forthcoming}%
+ \def\@permissionCodeOne{XXXX-XXXX}%
+\fi
+\ClassInfo{\@classname}{Using journal code \@journalCode}%
+}{%
+ \ClassError{\@classname}{Incorrect journal #1}%
+}%
+\def\acmJournal#1{\setkeys{ACM}{acmJournal=#1}%
+ \global\@ACM@journal@bibstriptrue}
+\def\@journalCode@nr{0}
+\def\@journalName{}%
+\def\@journalNameShort{\@journalName}%
+\def\@permissionCodeOne{XXXX-XXXX}%
+\def\@permissionCodeTwo{}%
+\newcommand\acmConference[4][]{%
+ \gdef\acmConference@shortname{#1}%
+ \gdef\acmConference@name{#2}%
+ \gdef\acmConference@date{#3}%
+ \gdef\acmConference@venue{#4}%
+ \ifx\acmConference@shortname\@empty
+ \gdef\acmConference@shortname{#2}%
+ \fi
+ \global\@ACM@journal@bibstripfalse
+}
+\if@ACM@journal\else
+\acmConference[Conference'17]{ACM Conference}{July 2017}{Washington,
+ DC, USA}%
+\fi
+\def\acmBooktitle#1{\gdef\@acmBooktitle{#1}}
+\acmBooktitle{Proceedings of \acmConference@name
+ \ifx\acmConference@name\acmConference@shortname\else
+ \ (\acmConference@shortname)\fi}
+\def\@editorsAbbrev{(Ed.)}
+\def\@acmEditors{}
+\def\editor#1{\ifx\@acmEditors\@empty
+ \gdef\@acmEditors{#1}%
+ \else
+ \gdef\@editorsAbbrev{(Eds.)}%
+ \g@addto@macro\@acmEditors{\and#1}%
+\fi}
+\def\subtitle#1{\def\@subtitle{#1}}
+\subtitle{}
+\newcount\num@authorgroups
+\num@authorgroups=0\relax
+\newcount\num@authors
+\num@authors=0\relax
+\newif\if@insideauthorgroup
+\@insideauthorgroupfalse
+\renewcommand\author[2][]{%
+ \IfSubStr{#2}{,}{\ClassWarning{\@classname}{Do not put several
+ authors in the same \string\author\space macro!}}{}%
+ \global\advance\num@authors by 1\relax
+ \if@insideauthorgroup\else
+ \global\advance\num@authorgroups by 1\relax
+ \global\@insideauthorgrouptrue
+ \fi
+ \ifx\addresses\@empty
+ \if@ACM@anonymous
+ \gdef\addresses{\@author{Anonymous Author(s)%
+ \ifx\@acmSubmissionID\@empty\else\\Submission Id:
+ \@acmSubmissionID\fi}}%
+ \gdef\authors{Anonymous Author(s)}%
+ \else
+ \gdef\addresses{\@author{#2}}%
+ \gdef\authors{#2}%
+ \fi
+ \else
+ \if@ACM@anonymous\else
+ \g@addto@macro\addresses{\and\@author{#2}}%
+ \g@addto@macro\authors{\and#2}%
+ \fi
+ \fi
+ \if@ACM@anonymous
+ \ifx\shortauthors\@empty
+ \gdef\shortauthors{Anon.
+ \ifx\@acmSubmissionID\@empty\else Submission Id:
+ \@acmSubmissionID\fi}%
+ \fi
+ \else
+ \def\@tempa{#1}%
+ \ifx\@tempa\@empty
+ \ifx\shortauthors\@empty
+ \gdef\shortauthors{#2}%
+ \else
+ \g@addto@macro\shortauthors{\and#2}%
+ \fi
+ \else
+ \ifx\shortauthors\@empty
+ \gdef\shortauthors{#1}%
+ \else
+ \g@addto@macro\shortauthors{\and#1}%
+ \fi
+ \fi
+ \fi}
+\newcommand{\affiliation}[2][]{%
+ \global\@insideauthorgroupfalse
+ \if@ACM@anonymous\else
+ \g@addto@macro\addresses{\affiliation{#1}{#2}}%
+ \fi}
+\define@boolkey+{@ACM@affiliation@}[@ACM@affiliation@]{obeypunctuation}%
+[true]{}{\ClassError{\@classname}{The option obeypunctuation can be either true or false}}
+\def\additionalaffiliation#1{\authornote{\@additionalaffiliation{#1}}}
+\def\@additionalaffiliation#1{\bgroup
+ \def\position##1{\ignorespaces}%
+ \def\institution##1{##1\ignorespaces}%
+ \def\department{\@ifnextchar[{\@department}{\@department[]}}%
+ \def\@department[##1]##2{\unskip, ##2\ignorespaces}%
+ \let\streetaddress\position
+ \let\city\position
+ \let\state\position
+ \let\postcode\position
+ \let\country\position
+ Also with #1\unskip.\egroup}
+\renewcommand{\email}[2][]{%
+ \IfSubStr{#2}{,}{\ClassWarning{\@classname}{Do not put several
+ addresses in the same \string\email\space macro!}}{}%
+ \if@ACM@anonymous\else
+ \g@addto@macro\addresses{\email{#1}{#2}}%
+ \fi}
+\def\orcid#1{\unskip\ignorespaces}
+\def\authorsaddresses#1{\def\@authorsaddresses{#1}}
+\authorsaddresses{\@mkauthorsaddresses}
+\def\@titlenotes{}
+\def\titlenote#1{%
+ \g@addto@macro\@title{\footnotemark}%
+ \if@ACM@anonymous
+ \g@addto@macro\@titlenotes{%
+ \stepcounter{footnote}\footnotetext{Title note}}%
+ \else
+ \g@addto@macro\@titlenotes{\stepcounter{footnote}\footnotetext{#1}}%
+ \fi}
+\def\@subtitlenotes{}
+\def\subtitlenote#1{%
+ \g@addto@macro\@subtitle{\footnotemark}%
+ \if@ACM@anonymous
+ \g@addto@macro\@subtitlenotes{%
+ \stepcounter{footnote}\footnotetext{Subtitle note}}%
+ \else
+ \g@addto@macro\@subtitlenotes{%
+ \stepcounter{footnote}\footnotetext{#1}}%
+ \fi}
+\def\@authornotes{}
+\def\authornote#1{%
+ \if@ACM@anonymous\else
+ \g@addto@macro\addresses{\@authornotemark}%
+ \g@addto@macro\@authornotes{%
+ \stepcounter{footnote}\footnotetext{#1}}%
+ \fi}
+\newcommand\authornotemark[1][\relax]{%
+ \ifx#1\relax\relax\relax
+ \g@addto@macro\addresses{\@authornotemark}%
+ \else
+ \g@addto@macro\addresses{\@@authornotemark{#1}}%
+ \fi}
+\def\acmVolume#1{\def\@acmVolume{#1}}
+\acmVolume{1}
+\def\acmNumber#1{\def\@acmNumber{#1}}
+\acmNumber{1}
+\def\acmArticle#1{\def\@acmArticle{#1}}
+\acmArticle{}
+\def\acmArticleSeq#1{\def\@acmArticleSeq{#1}}
+\acmArticleSeq{\@acmArticle}
+\def\acmYear#1{\def\@acmYear{#1}}
+\acmYear{\the\year}
+\def\acmMonth#1{\def\@acmMonth{#1}}
+\acmMonth{\the\month}
+\def\@acmPubDate{\ifcase\@acmMonth\or
+ January\or February\or March\or April\or May\or June\or
+ July\or August\or September\or October\or November\or
+ December\fi~\@acmYear}
+\def\acmPrice#1{\def\@acmPrice{#1}}
+\acmPrice{15.00}
+\def\acmSubmissionID#1{\def\@acmSubmissionID{#1}}
+\acmSubmissionID{}
+\def\acmISBN#1{\def\@acmISBN{#1}}
+\acmISBN{978-x-xxxx-xxxx-x/YY/MM}
+\def\acmDOI#1{\def\@acmDOI{#1}}
+\acmDOI{10.1145/nnnnnnn.nnnnnnn}
+\newif\if@ACM@badge
+\@ACM@badgefalse
+\newlength\@ACM@badge@width
+\setlength\@ACM@badge@width{5pc}
+\newlength\@ACM@title@width
+\newlength\@ACM@badge@skip
+\setlength\@ACM@badge@skip{1pc}
+\newcommand\acmBadgeR[2][]{\@ACM@badgetrue
+ \def\@acmBadgeR@url{#1}%
+ \def\@acmBadgeR@image{#2}}
+\def\@acmBadgeR@url{}
+\def\@acmBadgeR@image{}
+\newcommand\acmBadgeL[2][]{\@ACM@badgetrue
+ \def\@acmBadgeL@url{#1}%
+ \def\@acmBadgeL@image{#2}}
+\def\@acmBadgeL@url{}
+\def\@acmBadgeL@image{}
+\def\startPage#1{\def\@startPage{#1}}
+\startPage{}
+\def\terms#1{\ClassWarning{\@classname}{The command \string\terms{} is
+ obsolete. I am going to ignore it}}
+\def\keywords#1{\def\@keywords{#1}}
+\keywords{}
+\renewenvironment{abstract}{\Collect@Body\@saveabstract}{}
+\long\def\@saveabstract#1{\if@ACM@maketitle@typeset
+ \ClassError{\@classname}{Abstract must be defined before maketitle
+ command. Please move it!}\fi
+ \long\gdef\@abstract{#1}}
+\@saveabstract{}
+\long\def\@lempty{}
+\define@boolkey+{@ACM@topmatter@}[@ACM@]{printccs}[true]{%
+ \if@ACM@printccs
+ \ClassInfo{\@classname}{Printing CCS}%
+ \else
+ \ClassInfo{\@classname}{Suppressing CCS}%
+ \fi}{\ClassError{\@classname}{The option printccs can be either true or false}}
+\define@boolkey+{@ACM@topmatter@}[@ACM@]{printacmref}[true]{%
+ \if@ACM@printacmref
+ \ClassInfo{\@classname}{Printing bibformat}%
+ \else
+ \ClassInfo{\@classname}{Suppressing bibformat}%
+ \fi}{\ClassError{\@classname}{The option printacmref can be either true or false}}
+\define@boolkey+{@ACM@topmatter@}[@ACM@]{printfolios}[true]{%
+ \if@ACM@printfolios
+ \ClassInfo{\@classname}{Printing folios}%
+ \else
+ \ClassInfo{\@classname}{Suppressing folios}%
+ \fi}{\ClassError{\@classname}{The option printfolios can be either true or false}}
+\define@cmdkey{@ACM@topmatter@}[@ACM@]{authorsperrow}[0]{%
+ \IfInteger{#1}{\ClassInfo{\@classname}{Setting authorsperrow to
+ #1}}{\ClassWarning{\@classname}{The parameter authorsperrow must be
+ numerical. Ignoring the input #1}\gdef\@ACM@authorsperrow{0}}}
+\def\settopmatter#1{\setkeys{@ACM@topmatter@}{#1}}
+\settopmatter{printccs=true, printacmref=true}
+\if@ACM@manuscript
+ \settopmatter{printfolios=true}
+\else
+ \if@ACM@journal
+ \settopmatter{printfolios=true}
+ \else
+ \settopmatter{printfolios=false}
+ \fi
+\fi
+\settopmatter{authorsperrow=0}
+\def\@received{}
+\newcommand\received[2][]{\def\@tempa{#1}%
+ \ifx\@tempa\@empty
+ \ifx\@received\@empty
+ \gdef\@received{Received #2}%
+ \else
+ \g@addto@macro{\@received}{; revised #2}%
+ \fi
+ \else
+ \ifx\@received\@empty
+ \gdef\@received{#1 #2}%
+ \else
+ \g@addto@macro{\@received}{; #1 #2}%
+ \fi
+ \fi}
+\AtEndDocument{%
+ \ifx\@received\@empty\else
+ \par\bigskip\noindent\small\normalfont\@received\par
+ \fi}
+\RequirePackage{comment}
+\excludecomment{CCSXML}
+\let\@concepts\@empty
+\newcounter{@concepts}
+\newcommand\ccsdesc[2][100]{%
+ \ccsdesc@parse#1~#2~~\ccsdesc@parse@end}
+\RequirePackage{textcomp}
+\def\ccsdesc@parse#1~#2~#3~{%
+ \stepcounter{@concepts}%
+ \expandafter\ifx\csname CCS@General@#2\endcsname\relax
+ \expandafter\gdef\csname CCS@General@#2\endcsname{\textbullet\
+ \textbf{#2}}%
+ \expandafter\gdef\csname CCS@Punctuation@#2\endcsname{; }%
+ \expandafter\gdef\csname CCS@Specific@#2\endcsname{}%
+ \g@addto@macro{\@concepts}{\csname CCS@General@#2\endcsname
+ \csname CCS@Punctuation@#2\endcsname
+ \csname CCS@Specific@#2\endcsname}%
+ \fi
+ \ifx#3\relax\relax\else
+ \expandafter\gdef\csname CCS@Punctuation@#2\endcsname{
+ \textrightarrow\ }%
+ \expandafter\g@addto@macro\expandafter{\csname CCS@Specific@#2\endcsname}{%
+ \addtocounter{@concepts}{-1}%
+ \ifnum#1>499\textbf{#3}\else
+ \ifnum#1>299\textit{#3}\else
+ #3\fi\fi\ifnum\value{@concepts}=0.\else; \fi}%
+ \fi
+\ccsdesc@parse@finish}
+\def\ccsdesc@parse@finish#1\ccsdesc@parse@end{}
+\newif\if@printcopyright
+\@printcopyrighttrue
+\newif\if@printpermission
+\@printpermissiontrue
+\newif\if@acmowned
+\@acmownedtrue
+\define@choicekey*{ACM@}{acmcopyrightmode}[%
+ \acm@copyrightinput\acm@copyrightmode]{none,%
+ acmcopyright,acmlicensed,rightsretained,%
+ usgov,usgovmixed,cagov,cagovmixed,licensedusgovmixed,%
+ licensedcagov,licensedcagovmixed,othergov,licensedothergov,%
+ iw3c2w3,iw3c2w3g}{%
+ \@printpermissiontrue
+ \@printcopyrighttrue
+ \@acmownedtrue
+ \ifnum\acm@copyrightmode=0\relax % none
+ \@printpermissionfalse
+ \@printcopyrightfalse
+ \@acmownedfalse
+ \fi
+ \ifnum\acm@copyrightmode=2\relax % acmlicensed
+ \@acmownedfalse
+ \fi
+ \ifnum\acm@copyrightmode=3\relax % rightsretained
+ \@acmownedfalse
+ \AtBeginDocument{\acmPrice{}}%
+ \fi
+ \ifnum\acm@copyrightmode=4\relax % usgov
+ \@printpermissiontrue
+ \@printcopyrightfalse
+ \@acmownedfalse
+ \AtBeginDocument{\acmPrice{}}%
+ \fi
+ \ifnum\acm@copyrightmode=6\relax % cagov
+ \@acmownedfalse
+ \fi
+ \ifnum\acm@copyrightmode=8\relax % licensedusgovmixed
+ \@acmownedfalse
+ \fi
+ \ifnum\acm@copyrightmode=9\relax % licensedcagov
+ \@acmownedfalse
+ \fi
+ \ifnum\acm@copyrightmode=10\relax % licensedcagovmixed
+ \@acmownedfalse
+ \fi
+ \ifnum\acm@copyrightmode=11\relax % othergov
+ \@acmownedtrue
+ \fi
+ \ifnum\acm@copyrightmode=12\relax % licensedothergov
+ \@acmownedfalse
+ \fi
+ \ifnum\acm@copyrightmode=13\relax % iw3c2w3
+ \@acmownedfalse
+ \AtBeginDocument{\acmPrice{}}%
+ \fi
+ \ifnum\acm@copyrightmode=14\relax % iw3c2w3g
+ \@acmownedfalse
+ \AtBeginDocument{\acmPrice{}}%
+ \fi}
+\def\setcopyright#1{\setkeys{ACM@}{acmcopyrightmode=#1}}
+\setcopyright{acmcopyright}
+\def\@copyrightowner{%
+ \ifcase\acm@copyrightmode\relax % none
+ \or % acmcopyright
+ Association for Computing Machinery.
+ \or % acmlicensed
+ Copyright held by the owner/author(s). Publication rights licensed to
+ ACM\@.
+ \or % rightsretained
+ Copyright held by the owner/author(s).
+ \or % usgov
+ \or % usgovmixed
+ Association for Computing Machinery.
+ \or % cagov
+ Crown in Right of Canada.
+ \or %cagovmixed
+ Association for Computing Machinery.
+ \or %licensedusgovmixed
+ Copyright held by the owner/author(s). Publication rights licensed to
+ ACM\@.
+ \or % licensedcagov
+ Crown in Right of Canada. Publication rights licensed to
+ ACM\@.
+ \or %licensedcagovmixed
+ Copyright held by the owner/author(s). Publication rights licensed to
+ ACM\@.
+ \or % othergov
+ Association for Computing Machinery.
+ \or % licensedothergov
+ Copyright held by the owner/author(s). Publication rights licensed to
+ ACM\@.
+ \or % ic2w3www
+ IW3C2 (International World Wide Web Conference Committee), published
+ under Creative Commons CC-BY~4.0 License.
+ \or % ic2w3wwwgoogle
+ IW3C2 (International World Wide Web Conference Committee), published
+ under Creative Commons CC-BY-NC-ND~4.0 License.
+ \fi}
+\def\@formatdoi#1{\url{https://doi.org/#1}}
+\def\@copyrightpermission{%
+ \ifcase\acm@copyrightmode\relax % none
+ \or % acmcopyright
+ Permission to make digital or hard copies of all or part of this
+ work for personal or classroom use is granted without fee provided
+ that copies are not made or distributed for profit or commercial
+ advantage and that copies bear this notice and the full citation on
+ the first page. Copyrights for components of this work owned by
+ others than ACM must be honored. Abstracting with credit is
+ permitted. To copy otherwise, or republish, to post on servers or to
+ redistribute to lists, requires prior specific permission
+ and\hspace*{.5pt}/or a fee. Request permissions from
+ permissions@acm.org.
+ \or % acmlicensed
+ Permission to make digital or hard copies of all or part of this
+ work for personal or classroom use is granted without fee provided
+ that copies are not made or distributed for profit or commercial
+ advantage and that copies bear this notice and the full citation on
+ the first page. Copyrights for components of this work owned by
+ others than the author(s) must be honored. Abstracting with credit
+ is permitted. To copy otherwise, or republish, to post on servers
+ or to redistribute to lists, requires prior specific permission
+ and\hspace*{.5pt}/or a fee. Request permissions from
+ permissions@acm.org.
+ \or % rightsretained
+ Permission to make digital or hard copies of part or all of this work
+ for personal or classroom use is granted without fee provided that
+ copies are not made or distributed for profit or commercial advantage
+ and that copies bear this notice and the full citation on the first
+ page. Copyrights for third-party components of this work must be
+ honored. For all other uses, contact the
+ owner\hspace*{.5pt}/author(s).
+ \or % usgov
+ This paper is authored by an employee(s) of the United States
+ Government and is in the public domain. Non-exclusive copying or
+ redistribution is allowed, provided that the article citation is
+ given and the authors and agency are clearly identified as its
+ source.
+ \or % usgovmixed
+ ACM acknowledges that this contribution was authored or co-authored
+ by an employee, contractor, or affiliate of the United States government. As such,
+ the United States government retains a nonexclusive, royalty-free right to
+ publish or reproduce this article, or to allow others to do so, for
+ government purposes only.
+ \or % cagov
+ This article was authored by employees of the Government of Canada.
+ As such, the Canadian government retains all interest in the
+ copyright to this work and grants to ACM a nonexclusive,
+ royalty-free right to publish or reproduce this article, or to allow
+ others to do so, provided that clear attribution is given both to
+ the authors and the Canadian government agency employing them.
+ Permission to make digital or hard copies for personal or classroom
+ use is granted. Copies must bear this notice and the full citation
+ on the first page. Copyrights for components of this work owned by
+ others than the Canadian Government must be honored. To copy
+ otherwise, distribute, republish, or post, requires prior specific
+ permission and\hspace*{.5pt}/or a fee. Request permissions from
+ permissions@acm.org.
+ \or % cagovmixed
+ ACM acknowledges that this contribution was co-authored by an
+ affiliate of the national government of Canada. As such, the Crown
+ in Right of Canada retains an equal interest in the copyright.
+ Reprints must include clear attribution to ACM and the author's
+ government agency affiliation. Permission to make digital or hard
+ copies for personal or classroom use is granted. Copies must bear
+ this notice and the full citation on the first page. Copyrights for
+ components of this work owned by others than ACM must be honored.
+ To copy otherwise, distribute, republish, or post, requires prior
+ specific permission and\hspace*{.5pt}/or a fee. Request permissions
+ from permissions@acm.org.
+ \or % licensedusgovmixed
+ Publication rights licensed to ACM\@. ACM acknowledges that this
+ contribution was authored or co-authored by an employee, contractor
+ or affiliate of the United States government. As such, the
+ Government retains a nonexclusive, royalty-free right to publish or
+ reproduce this article, or to allow others to do so, for Government
+ purposes only.
+ \or % licensedcagov
+ This article was authored by employees of the Government of Canada.
+ As such, the Canadian government retains all interest in the
+ copyright to this work and grants to ACM a nonexclusive,
+ royalty-free right to publish or reproduce this article, or to allow
+ others to do so, provided that clear attribution is given both to
+ the authors and the Canadian government agency employing them.
+ Permission to make digital or hard copies for personal or classroom
+ use is granted. Copies must bear this notice and the full citation
+ on the first page. Copyrights for components of this work owned by
+ others than the Canadian Government must be honored. To copy
+ otherwise, distribute, republish, or post, requires prior specific
+ permission and\hspace*{.5pt}/or a fee. Request permissions from
+ permissions@acm.org.
+ \or % licensedcagovmixed
+ Publication rights licensed to ACM\@. ACM acknowledges that this
+ contribution was authored or co-authored by an employee, contractor
+ or affiliate of the national government of Canada. As such, the
+ Government retains a nonexclusive, royalty-free right to publish or
+ reproduce this article, or to allow others to do so, for Government
+ purposes only.
+ \or % othergov
+ ACM acknowledges that this contribution was authored or co-authored
+ by an employee, contractor or affiliate of a national government. As
+ such, the Government retains a nonexclusive, royalty-free right to
+ publish or reproduce this article, or to allow others to do so, for
+ Government purposes only.
+ \or % licensedothergov
+ Publication rights licensed to ACM\@. ACM acknowledges that this
+ contribution was authored or co-authored by an employee, contractor
+ or affiliate of a national government. As such, the Government
+ retains a nonexclusive, royalty-free right to publish or reproduce
+ this article, or to allow others to do so, for Government purposes
+ only.
+ \or % iw3c2w3
+ This paper is published under the Creative Commons Attribution~4.0
+ International (CC-BY~4.0) license. Authors reserve their rights to
+ disseminate the work on their personal and corporate Web sites with
+ the appropriate attribution.
+ \or % iw3c2w3g
+ This paper is published under the Creative Commons
+ Attribution-NonCommercial-NoDerivs~4.0 International
+ (CC-BY-NC-ND~4.0) license. Authors reserve their rights to
+ disseminate the work on their personal and corporate Web sites with
+ the appropriate attribution.
+ \fi}
+\def\copyrightyear#1{\def\@copyrightyear{#1}}
+\copyrightyear{\@acmYear}
+\def\@teaserfigures{}
+\newenvironment{teaserfigure}{\Collect@Body\@saveteaser}{}
+\long\def\@saveteaser#1{\g@addto@macro\@teaserfigures{\@teaser{#1}}}
+\renewcommand{\thanks}[1]{%
+ \@ifnotempty{#1}{%
+ \if@ACM@anonymous
+ \g@addto@macro\thankses{\thanks{A note}}%
+ \else
+ \g@addto@macro\thankses{\thanks{#1}}%
+ \fi}}
+\newbox\mktitle@bx
+\def\maketitle{%
+ \@ACM@maketitle@typesettrue
+ \if@ACM@anonymous
+ % Anonymize omission of \author-s
+ \ifnum\num@authorgroups=0\author{}\fi
+ \fi
+ \begingroup
+ \let\@vspace\@vspace@orig
+ \let\@vspacer\@vspacer@orig
+ \let\@footnotemark\@footnotemark@nolink
+ \let\@footnotetext\@footnotetext@nolink
+ \renewcommand\thefootnote{\@fnsymbol\c@footnote}%
+ \hsize=\textwidth
+ \def\@makefnmark{\hbox{\@textsuperscript{\@thefnmark}}}%
+ \@mktitle\if@ACM@sigchiamode\else\@mkauthors\fi\@mkteasers
+ \@printtopmatter
+ \if@ACM@sigchiamode\@mkauthors\fi
+ \setcounter{footnote}{0}%
+ \def\@makefnmark{\hbox{\@textsuperscript{\normalfont\@thefnmark}}}%
+ \@titlenotes
+ \@subtitlenotes
+ \@authornotes
+ \let\@makefnmark\relax
+ \let\@thefnmark\relax
+ \let\@makefntext\noindent
+ \ifx\@empty\thankses\else
+ \footnotetextauthorsaddresses{%
+ \def\par{\let\par\@par}\parindent\z@\@setthanks}%
+ \fi
+ \ifx\@empty\@authorsaddresses\else
+ \if@ACM@anonymous\else
+ \if@ACM@journal@bibstrip
+ \footnotetextauthorsaddresses{%
+ \def\par{\let\par\@par}\parindent\z@\@setauthorsaddresses}%
+ \fi
+ \fi
+ \fi
+ \if@ACM@nonacm\else\footnotetextcopyrightpermission{%
+ \if@ACM@authordraft
+ \raisebox{-2ex}[\z@][\z@]{\makebox[0pt][l]{\large\bfseries
+ Unpublished working draft. Not for distribution.}}%
+ \color[gray]{0.9}%
+ \fi
+ \parindent\z@\parskip0.1\baselineskip
+ \if@ACM@authorversion\else
+ \if@printpermission\@copyrightpermission\par\fi
+ \fi
+ \if@ACM@manuscript\else
+ \if@ACM@journal@bibstrip\else % Print the conference information
+ {\itshape \acmConference@shortname, \acmConference@date, \acmConference@venue}\par
+ \fi
+ \fi
+ \if@printcopyright
+ \copyright\ \@copyrightyear\ \@copyrightowner\\
+ \else
+ \@copyrightyear.\
+ \fi
+ \if@ACM@manuscript
+ Manuscript submitted to ACM\\
+ \else
+ \if@ACM@authorversion
+ This is the author's version of the work. It is posted here for
+ your personal use. Not for redistribution. The definitive Version
+ of Record was published in
+ \if@ACM@journal@bibstrip
+ \emph{\@journalName}%
+ \else
+ \emph{\@acmBooktitle}%
+ \fi
+ \ifx\@acmDOI\@empty
+ .
+ \else
+ , \@formatdoi{\@acmDOI}.
+ \fi\\
+ \else
+ \if@ACM@nonacm\else
+ \if@ACM@journal@bibstrip
+ \@permissionCodeOne/\@acmYear/\@acmMonth-ART\@acmArticle
+ \ifx\@acmPrice\@empty\else\ \$\@acmPrice\fi\\
+ \@formatdoi{\@acmDOI}%
+ \else % Conference
+ \ifx\@acmISBN\@empty\else ACM~ISBN~\@acmISBN
+ \ifx\@acmPrice\@empty.\else\dots\$\@acmPrice\fi\\\fi
+ \ifx\@acmDOI\@empty\else\@formatdoi{\@acmDOI}\fi%
+ \fi
+ \fi
+ \fi
+ \fi}
+ \fi
+ \endgroup
+ \setcounter{footnote}{0}%
+ \@mkabstract
+ \if@ACM@printccs
+ \ifx\@concepts\@empty\else\bgroup
+ {\@specialsection{CCS Concepts}%
+ \@concepts\par}\egroup
+ \fi
+ \fi
+ \ifx\@keywords\@empty\else\bgroup
+ {\if@ACM@journal
+ \@specialsection{Additional Key Words and Phrases}%
+ \else
+ \@specialsection{Keywords}%
+ \fi
+ \@keywords}\par\egroup
+ \fi
+ \andify\authors
+ \andify\shortauthors
+ \global\let\authors=\authors
+ \global\let\shortauthors=\shortauthors
+ \if@ACM@printacmref
+ \@mkbibcitation
+ \fi
+ \hypersetup{%
+ pdfauthor={\authors},
+ pdftitle={\@title},
+ pdfsubject={\@concepts},
+ pdfkeywords={\@keywords},
+ pdfcreator={LaTeX with acmart
+ \csname ver@acmart.cls\endcsname\space
+ and hyperref
+ \csname ver@hyperref.sty\endcsname}}%
+ \global\@topnum\z@ % this prevents floats from falling
+ % at the top of page 1
+ \global\@botnum\z@ % we do not want them to be on the bottom either
+ \@printendtopmatter
+ \@afterindentfalse
+ \@afterheading
+}
+\def\@specialsection#1{%
+ \ifcase\ACM@format@nr
+ \relax % manuscript
+ \par\medskip\small\noindent#1: %
+ \or % acmsmall
+ \par\medskip\small\noindent#1: %
+ \or % acmlarge
+ \par\medskip\small\noindent#1: %
+ \or % acmtog
+ \par\medskip\small\noindent#1: %
+ \or % sigconf
+ \section*{#1}%
+ \or % siggraph
+ \section*{#1}%
+ \or % sigplan
+ \paragraph*{#1}%
+ \or % sigchi
+ \section*{#1}%
+ \or % sigchi-a
+ \section*{#1}%
+ \fi}
+\def\@printtopmatter{%
+ \ifx\@startPage\@empty
+ \gdef\@startPage{1}%
+ \else
+ \setcounter{page}{\@startPage}%
+ \fi
+ \thispagestyle{firstpagestyle}%
+ \noindent
+ \ifcase\ACM@format@nr
+ \relax % manuscript
+ \box\mktitle@bx\par
+ \or % acmsmall
+ \box\mktitle@bx\par
+ \or % acmlarge
+ \box\mktitle@bx\par
+ \or % acmtog
+ \twocolumn[\box\mktitle@bx]%
+ \or % sigconf
+ \twocolumn[\box\mktitle@bx]%
+ \or % siggraph
+ \twocolumn[\box\mktitle@bx]%
+ \or % sigplan
+ \twocolumn[\box\mktitle@bx]%
+ \or % sigchi
+ \twocolumn[\box\mktitle@bx]%
+ \or % sigchi-a
+ \par\box\mktitle@bx\par\bigskip
+ \if@ACM@badge
+ \marginpar{\noindent
+ \ifx\@acmBadgeL@image\@empty\else
+ \href{\@acmBadgeL@url}{%
+ \includegraphics[width=\@ACM@badge@width]{\@acmBadgeL@image}}%
+ \hskip\@ACM@badge@skip
+ \fi
+ \ifx\@acmBadgeR@image\@empty\else
+ \href{\@acmBadgeR@url}{%
+ \includegraphics[width=\@ACM@badge@width]{\@acmBadgeR@image}}%
+ \fi}%
+ \fi
+ \fi
+}
+\def\@mktitle{%
+ \ifcase\ACM@format@nr
+ \relax % manuscript
+ \@mktitle@i
+ \or % acmsmall
+ \@mktitle@i
+ \or % acmlarge
+ \@mktitle@i
+ \or % acmtog
+ \@mktitle@i
+ \or % sigconf
+ \@mktitle@iii
+ \or % siggraph
+ \@mktitle@iii
+ \or % sigplan
+ \@mktitle@iii
+ \or % sigchi
+ \@mktitle@iii
+ \or % sigchi-a
+ \@mktitle@iv
+ \fi
+}
+\def\@titlefont{%
+ \ifcase\ACM@format@nr
+ \relax % manuscript
+ \LARGE\sffamily\bfseries
+ \or % acmsmall
+ \LARGE\sffamily\bfseries
+ \or % acmlarge
+ \LARGE\sffamily\bfseries
+ \or % acmtog
+ \Huge\sffamily
+ \or % sigconf
+ \Huge\sffamily\bfseries
+ \or % siggraph
+ \Huge\sffamily\bfseries
+ \or % sigplan
+ \Huge\bfseries
+ \or % sigchi
+ \Huge\sffamily\bfseries
+ \or % sigchi-a
+ \Huge\bfseries
+ \fi}
+\def\@subtitlefont{\normalsize
+ \ifcase\ACM@format@nr
+ \relax % manuscript
+ \mdseries
+ \or % acmsmall
+ \mdseries
+ \or % acmlarge
+ \mdseries
+ \or % acmtog
+ \LARGE
+ \or % sigconf
+ \LARGE\mdseries
+ \or % siggraph
+ \LARGE\mdseries
+ \or % sigplan
+ \LARGE\mdseries
+ \or % sigchi
+ \LARGE\mdseries
+ \or % sigchi-a
+ \mdseries
+ \fi}
+\def\@mktitle@i{\hsize=\textwidth
+ \@ACM@title@width=\hsize
+ \ifx\@acmBadgeL@image\@empty\else
+ \advance\@ACM@title@width by -\@ACM@badge@width
+ \advance\@ACM@title@width by -\@ACM@badge@skip
+ \fi
+ \ifx\@acmBadgeR@image\@empty\else
+ \advance\@ACM@title@width by -\@ACM@badge@width
+ \advance\@ACM@title@width by -\@ACM@badge@skip
+ \fi
+ \setbox\mktitle@bx=\vbox{\noindent\@titlefont
+ \ifx\@acmBadgeL@image\@empty\else
+ \raisebox{-.5\baselineskip}[\z@][\z@]{\href{\@acmBadgeL@url}{%
+ \includegraphics[width=\@ACM@badge@width]{\@acmBadgeL@image}}}%
+ \hskip\@ACM@badge@skip
+ \fi
+ \parbox[t]{\@ACM@title@width}{\raggedright
+ \@titlefont\noindent
+ \@title
+ \ifx\@subtitle\@empty\else
+ \par\noindent{\@subtitlefont\@subtitle}
+ \fi}%
+ \ifx\@acmBadgeR@image\@empty\else
+ \hskip\@ACM@badge@skip
+ \raisebox{-.5\baselineskip}[\z@][\z@]{\href{\@acmBadgeR@url}{%
+ \includegraphics[width=\@ACM@badge@width]{\@acmBadgeR@image}}}%
+ \fi
+ \par\bigskip}}%
+\def\@mktitle@iii{\hsize=\textwidth
+ \setbox\mktitle@bx=\vbox{\@titlefont\centering
+ \@ACM@title@width=\hsize
+ \if@ACM@badge
+ \advance\@ACM@title@width by -2\@ACM@badge@width
+ \advance\@ACM@title@width by -2\@ACM@badge@skip
+ \parbox[b]{\@ACM@badge@width}{\strut
+ \ifx\@acmBadgeL@image\@empty\else
+ \raisebox{-.5\baselineskip}[\z@][\z@]{\href{\@acmBadgeL@url}{%
+ \includegraphics[width=\@ACM@badge@width]{\@acmBadgeL@image}}}%
+ \fi}%
+ \hskip\@ACM@badge@skip
+ \fi
+ \parbox[t]{\@ACM@title@width}{\centering\@titlefont
+ \@title
+ \ifx\@subtitle\@empty\else
+ \par\noindent{\@subtitlefont\@subtitle}
+ \fi
+ }%
+ \if@ACM@badge
+ \hskip\@ACM@badge@skip
+ \parbox[b]{\@ACM@badge@width}{\strut
+ \ifx\@acmBadgeR@image\@empty\else
+ \raisebox{-.5\baselineskip}[\z@][\z@]{\href{\@acmBadgeR@url}{%
+ \includegraphics[width=\@ACM@badge@width]{\@acmBadgeR@image}}}%
+ \fi}%
+ \fi
+ \par\bigskip}}%
+\def\@mktitle@iv{\hsize=\textwidth
+ \setbox\mktitle@bx=\vbox{\raggedright\leftskip5pc\@titlefont
+ \noindent\leavevmode\leaders\hrule height 2pt\hfill\kern0pt\par
+ \noindent\@title
+ \ifx\@subtitle\@empty\else
+ \par\noindent\@subtitlefont\@subtitle
+ \fi
+ \par\bigskip}}%
+\newbox\@ACM@commabox
+\def\@ACM@addtoaddress#1{%
+ \ifvmode\else
+ \if@ACM@affiliation@obeypunctuation\else
+ \setbox\@ACM@commabox=\hbox{, }%
+ \unskip\cleaders\copy\@ACM@commabox\hskip\wd\@ACM@commabox
+ \fi\fi
+ #1}
+\def\streetaddress#1{\unskip\ignorespaces}
+\def\postcode#1{\unskip\ignorespaces}
+\if@ACM@journal
+ \def\position#1{\unskip\ignorespaces}
+ \def\institution#1{\unskip~#1\ignorespaces}
+ \def\city#1{\unskip\ignorespaces}
+ \def\state#1{\unskip\ignorespaces}
+ \newcommand\department[2][0]{\unskip\ignorespaces}
+ \def\country#1{\if@ACM@affiliation@obeypunctuation\else, \fi#1\ignorespaces}
+\else
+ \def\position#1{\if@ACM@affiliation@obeypunctuation#1\else#1\par\fi}%
+ \def\institution#1{\if@ACM@affiliation@obeypunctuation#1\else#1\par\fi}%
+ \newcommand\department[2][0]{\if@ACM@affiliation@obeypunctuation
+ #2\else#2\par\fi}%
+ \let\city\@ACM@addtoaddress
+ \let\state\@ACM@addtoaddress
+ \let\country\@ACM@addtoaddress
+\fi
+\def\@mkauthors{\begingroup
+ \hsize=\textwidth
+ \ifcase\ACM@format@nr
+ \relax % manuscript
+ \@mkauthors@i
+ \or % acmsmall
+ \@mkauthors@i
+ \or % acmlarge
+ \@mkauthors@i
+ \or % acmtog
+ \@mkauthors@i
+ \or % sigconf
+ \@mkauthors@iii
+ \or % siggraph
+ \@mkauthors@iii
+ \or % sigplan
+ \@mkauthors@iii
+ \or % sigchi
+ \@mkauthors@iii
+ \or % sigchi-a
+ \@mkauthors@iv
+ \fi
+ \endgroup
+}
+\def\@authorfont{\Large\sffamily}
+\def\@affiliationfont{\normalsize\normalfont}
+\ifcase\ACM@format@nr
+\relax % manuscript
+\or % acmsmall
+ \def\@authorfont{\large\sffamily}
+ \def\@affiliationfont{\small\normalfont}
+\or % acmlarge
+\or % acmtog
+ \def\@authorfont{\LARGE\sffamily}
+ \def\@affiliationfont{\large}
+\or % sigconf
+ \def\@authorfont{\LARGE}
+ \def\@affiliationfont{\large}
+\or % siggraph
+ \def\@authorfont{\normalsize\normalfont}
+ \def\@affiliationfont{\normalsize\normalfont}
+\or % sigplan
+ \def\@authorfont{\Large\normalfont}
+ \def\@affiliationfont{\normalsize\normalfont}
+\or % sigchi
+ \def\@authorfont{\bfseries}
+ \def\@affiliationfont{\mdseries}
+\or % sigchi-a
+ \def\@authorfont{\bfseries}
+ \def\@affiliationfont{\mdseries}
+\fi
+\def\@typeset@author@line{%
+ \andify\@currentauthors\par\noindent
+ \@currentauthors\def\@currentauthors{}%
+ \ifx\@currentaffiliations\@empty\else
+ \andify\@currentaffiliations
+ \unskip, {\@currentaffiliations}\par
+ \fi
+ \def\@currentaffiliations{}}
+\def\@mkauthors@i{%
+ \def\@currentauthors{}%
+ \def\@currentaffiliations{}%
+ \global\let\and\@typeset@author@line
+ \def\@author##1{%
+ \ifx\@currentauthors\@empty
+ \gdef\@currentauthors{\@authorfont\MakeTextUppercase{##1}}%
+ \else
+ \g@addto@macro{\@currentauthors}{\and\MakeTextUppercase{##1}}%
+ \fi
+ \gdef\and{}}%
+ \def\email##1##2{}%
+ \def\affiliation##1##2{%
+ \def\@tempa{##2}\ifx\@tempa\@empty\else
+ \ifx\@currentaffiliations\@empty
+ \gdef\@currentaffiliations{%
+ \setkeys{@ACM@affiliation@}{obeypunctuation=false}%
+ \setkeys{@ACM@affiliation@}{##1}%
+ \@affiliationfont##2}%
+ \else
+ \g@addto@macro{\@currentaffiliations}{\and
+ \setkeys{@ACM@affiliation@}{obeypunctuation=false}%
+ \setkeys{@ACM@affiliation@}{##1}##2}%
+ \fi
+ \fi
+ \global\let\and\@typeset@author@line}%
+ \global\setbox\mktitle@bx=\vbox{\noindent\box\mktitle@bx\par\medskip
+ \noindent\addresses\@typeset@author@line
+ \par\medskip}%
+}
+\newbox\author@bx
+\newdimen\author@bx@wd
+\newskip\author@bx@sep
+\author@bx@sep=1pc\relax
+\def\@typeset@author@bx{\bgroup\hsize=\author@bx@wd
+ \def\and{\par}\normalbaselines
+ \global\setbox\author@bx=\vtop{\if@ACM@sigchiamode\else\centering\fi
+ \@authorfont\@currentauthors\par\@affiliationfont
+ \@currentaffiliation}\egroup
+ \box\author@bx\hspace{\author@bx@sep}%
+ \gdef\@currentauthors{}%
+ \gdef\@currentaffiliation{}}
+\def\@mkauthors@iii{%
+ \author@bx@wd=\textwidth\relax
+ \advance\author@bx@wd by -\author@bx@sep\relax
+ \ifnum\@ACM@authorsperrow>0\relax
+ \divide\author@bx@wd by \@ACM@authorsperrow\relax
+ \else
+ \ifcase\num@authorgroups
+ \relax % 0?
+ \or % 1=one author per row
+ \or % 2=two authors per row
+ \divide\author@bx@wd by \num@authorgroups\relax
+ \or % 3=three authors per row
+ \divide\author@bx@wd by \num@authorgroups\relax
+ \or % 4=two authors per row (!)
+ \divide\author@bx@wd by 2\relax
+ \else % three authors per row
+ \divide\author@bx@wd by 3\relax
+ \fi
+ \fi
+ \advance\author@bx@wd by -\author@bx@sep\relax
+ \gdef\@currentauthors{}%
+ \gdef\@currentaffiliation{}%
+ \def\@author##1{\ifx\@currentauthors\@empty
+ \gdef\@currentauthors{\par##1}%
+ \else
+ \g@addto@macro\@currentauthors{\par##1}%
+ \fi
+ \gdef\and{}}%
+ \def\email##1##2{\ifx\@currentaffiliation\@empty
+ \gdef\@currentaffiliation{\bgroup
+ \mathchardef\UrlBreakPenalty=10000\nolinkurl{##2}\egroup}%
+ \else
+ \g@addto@macro\@currentaffiliation{\par\bgroup
+ \mathchardef\UrlBreakPenalty=10000\nolinkurl{##2}\egroup}%
+ \fi}%
+ \def\affiliation##1##2{\ifx\@currentaffiliation\@empty
+ \gdef\@currentaffiliation{%
+ \setkeys{@ACM@affiliation@}{obeypunctuation=false}%
+ \setkeys{@ACM@affiliation@}{##1}##2}%
+ \else
+ \g@addto@macro\@currentaffiliation{\par
+ \setkeys{@ACM@affiliation@}{obeypunctuation=false}%
+ \setkeys{@ACM@affiliation@}{##1}##2}%
+ \fi
+ \global\let\and\@typeset@author@bx
+}%
+ \hsize=\textwidth
+ \global\setbox\mktitle@bx=\vbox{\noindent
+ \box\mktitle@bx\par\medskip\leavevmode
+ \lineskip=1pc\relax\centering\hspace*{-1em}%
+ \addresses\let\and\@typeset@author@bx\and\par\bigskip}}
+\def\@mkauthors@iv{%
+ \author@bx@wd=\columnwidth\relax
+ \advance\author@bx@wd by -\author@bx@sep\relax
+ \ifnum\@ACM@authorsperrow>0\relax
+ \divide\author@bx@wd by \@ACM@authorsperrow\relax
+ \else
+ \ifcase\num@authorgroups
+ \relax % 0?
+ \or % 1=one author per row
+ \else % 2=two authors per row
+ \divide\author@bx@wd by 2\relax
+ \fi
+ \fi
+ \advance\author@bx@wd by -\author@bx@sep\relax
+ \gdef\@currentauthors{}%
+ \gdef\@currentaffiliation{}%
+ \def\@author##1{\ifx\@currentauthors\@empty
+ \gdef\@currentauthors{\par##1}%
+ \else
+ \g@addto@macro\@currentauthors{\par##1}%
+ \fi
+ \gdef\and{}}%
+ \def\email##1##2{\ifx\@currentaffiliation\@empty
+ \gdef\@currentaffiliation{\nolinkurl{##2}}%
+ \else
+ \g@addto@macro\@currentaffiliation{\par\nolinkurl{##2}}%
+ \fi}%
+ \def\affiliation##1##2{\ifx\@currentaffiliation\@empty
+ \gdef\@currentaffiliation{%
+ \setkeys{@ACM@affiliation@}{obeypunctuation=false}%
+ \setkeys{@ACM@affiliation@}{##1}##2}%
+ \else
+ \g@addto@macro\@currentaffiliation{\par
+ \setkeys{@ACM@affiliation@}{obeypunctuation=false}%
+ \setkeys{@ACM@affiliation@}{##1}##2}%
+ \fi
+ \global\let\and\@typeset@author@bx}%
+ \bgroup\hsize=\columnwidth
+ \par\raggedright\leftskip=\z@
+ \lineskip=1pc\noindent
+ \addresses\let\and\@typeset@author@bx\and\par\bigskip\egroup}
+\def\@mkauthorsaddresses{%
+ \ifnum\num@authors>1\relax
+ Authors' \else Author's \fi
+ \ifnum\num@authorgroups>1\relax
+ addresses: \else address: \fi
+ \bgroup
+ \def\streetaddress##1{\unskip, ##1}%
+ \def\postcode##1{\unskip, ##1}%
+ \def\position##1{\unskip\ignorespaces}%
+ \def\institution##1{\unskip, ##1}%
+ \def\city##1{\unskip, ##1}%
+ \def\state##1{\unskip, ##1}%
+ \renewcommand\department[2][0]{\unskip\@addpunct, ##2}%
+ \def\country##1{\unskip, ##1}%
+ \def\and{\unskip; }%
+ \def\@author##1{##1}%
+ \def\email##1##2{\unskip, \nolinkurl{##2}}%
+ \addresses
+ \egroup}
+\def\@setaddresses{}
+\def\@authornotemark{\g@addto@macro\@currentauthors{\footnotemark\relax}}
+\def\@@authornotemark#1{\g@addto@macro\@currentauthors{\footnotemark[#1]}}
+\def\@mkteasers{%
+ \ifx\@teaserfigures\@empty\else
+ \def\@teaser##1{\par\bigskip\bgroup
+ \captionsetup{type=figure}##1\egroup\par}
+ \global\setbox\mktitle@bx=\vbox{\noindent\box\mktitle@bx\par
+ \noindent\@Description@presentfalse
+ \@teaserfigures\par\if@Description@present\else
+ \global\@undescribed@imagestrue
+ \ClassWarning{\@classname}{A possible image without
+ description}\fi
+ \medskip}%
+ \fi}
+\def\@mkabstract{\bgroup
+ \ifx\@abstract\@lempty\else
+ {\phantomsection\addcontentsline{toc}{section}{Abstract}%
+ \if@ACM@journal
+ \everypar{\setbox\z@\lastbox\everypar{}}\small
+ \else
+ \section*{\abstractname}%
+ \fi
+ \ignorespaces\@abstract\par}%
+ \fi\egroup}
+\def\@mkbibcitation{\bgroup
+ \let\@vspace\@vspace@orig
+ \let\@vspacer\@vspacer@orig
+ \def\@pages@word{\ifnum\getrefnumber{TotPages}=1\relax page\else pages\fi}%
+ \def\footnotemark{}%
+ \def\\{\unskip{} \ignorespaces}%
+ \def\footnote{\ClassError{\@classname}{Please do not use footnotes
+ inside a \string\title{} or \string\author{} command! Use
+ \string\titlenote{} or \string\authornote{} instead!}}%
+ \def\@article@string{\ifx\@acmArticle\@empty{\ }\else,
+ Article~\@acmArticle\ \fi}%
+ \par\medskip\small\noindent{\bfseries ACM Reference Format:}\par\nobreak
+ \noindent\bgroup
+ \def\\{\unskip{}, \ignorespaces}\authors\egroup. \@acmYear. \@title
+ \ifx\@subtitle\@empty. \else: \@subtitle. \fi
+ \if@ACM@nonacm\else
+ % The 'nonacm' option disables 'printacmref' by default,
+ % and the present \@mkbibcitation definition is never used
+ % in this case. The conditional remains useful if the user
+ % explicitly sets \settopmatter{printacmref=true}.
+ \if@ACM@journal@bibstrip
+ \textit{\@journalNameShort}
+ \@acmVolume, \@acmNumber \@article@string (\@acmPubDate),
+ \ref{TotPages}~\@pages@word.
+ \else
+ In \textit{\@acmBooktitle}%
+ \ifx\@acmEditors\@empty\textit{.}\else
+ \andify\@acmEditors\textit{, }\@acmEditors~\@editorsAbbrev.%
+ \fi\
+ ACM, New York, NY, USA%
+ \@article@string\unskip, \ref{TotPages}~\@pages@word.
+ \fi
+ \fi
+ \ifx\@acmDOI\@empty\else\@formatdoi{\@acmDOI}\fi
+\par\egroup}
+\def\@printendtopmatter{\bgroup
+ \let\@vspace\@vspace@orig
+ \let\@vspacer\@vspacer@orig
+ \par\bigskip
+ \egroup}
+\def\@setthanks{\long\def\thanks##1{\par##1\@addpunct.}\thankses}
+\def\@setauthorsaddresses{\@authorsaddresses\unskip\@addpunct.}
+\RequirePackage{fancyhdr}
+\let\ACM@ps@plain\ps@plain
+\let\ACM@ps@myheadings\ps@myheadings
+\let\ACM@ps@headings\ps@headings
+\def\ACM@restore@pagestyle{%
+ \let\ps@plain\ACM@ps@plain
+ \let\ps@myheadings\ACM@ps@myheadings
+ \let\ps@headings\ACM@ps@headings}
+\AtBeginDocument{\ACM@restore@pagestyle}
+\if@ACM@review
+ \newsavebox{\ACM@linecount@bx}
+ \newlength\ACM@linecount@bxht
+ \newcount\ACM@linecount
+ \ACM@linecount\@ne\relax
+ \def\ACM@mk@linecount{%
+ \savebox{\ACM@linecount@bx}[4em][t]{\parbox[t]{4em}{\normalfont
+ \normalsize
+ \setlength{\ACM@linecount@bxht}{0pt}%
+ \loop{\color{red}\scriptsize\the\ACM@linecount}\\
+ \global\advance\ACM@linecount by \@ne
+ \addtolength{\ACM@linecount@bxht}{\baselineskip}%
+ \ifdim\ACM@linecount@bxht<\textheight\repeat
+ {\color{red}\scriptsize\the\ACM@linecount}\hfill
+ \global\advance\ACM@linecount by \@ne}}}
+\fi
+\def\ACM@linecountL{%
+ \if@ACM@review
+ \ACM@mk@linecount
+ \begin{picture}(0,0)%
+ \put(-26,-22){\usebox{\ACM@linecount@bx}}%
+ \end{picture}%
+ \fi}
+\def\ACM@linecountR{%
+ \if@ACM@review
+ \ACM@mk@linecount
+ \begin{picture}(0,0)%
+ \put(20,-22){\usebox{\ACM@linecount@bx}}%
+ \end{picture}%
+ \fi}
+\if@ACM@timestamp
+ % Subtracting 30 from \time gives us the effect of rounding down despite
+ % \numexpr rounding to nearest
+ \newcounter{ACM@time@hours}
+ \setcounter{ACM@time@hours}{\numexpr (\time - 30) / 60 \relax}
+ \newcounter{ACM@time@minutes}
+ \setcounter{ACM@time@minutes}{\numexpr \time - \theACM@time@hours * 60 \relax}
+ \newcommand\ACM@timestamp{%
+ \footnotesize%
+ \ifx\@acmSubmissionID\@empty\relax\else
+ Submission ID: \@acmSubmissionID.{ }%
+ \fi
+ \the\year-\two@digits{\the\month}-\two@digits{\the\day}{ }%
+ \two@digits{\theACM@time@hours}:\two@digits{\theACM@time@minutes}{. }%
+ Page \thepage\ of \@startPage--\pageref*{TotPages}.%
+ }
+\fi
+\def\@shortauthors{%
+ \if@ACM@anonymous
+ Anon.
+ \ifx\@acmSubmissionID\@empty\else Submission Id: \@acmSubmissionID\fi
+ \else\shortauthors\fi}
+\def\@headfootfont{\sffamily\footnotesize}
+\AtBeginDocument{%
+\fancypagestyle{standardpagestyle}{%
+ \fancyhf{}%
+ \renewcommand{\headrulewidth}{\z@}%
+ \renewcommand{\footrulewidth}{\z@}%
+ \def\@acmArticlePage{%
+ \ifx\@acmArticle\empty%
+ \if@ACM@printfolios\thepage\fi%
+ \else%
+ \@acmArticle\if@ACM@printfolios:\thepage\fi%
+ \fi%
+ }%
+ \if@ACM@journal@bibstrip
+ \ifcase\ACM@format@nr
+ \relax % manuscript
+ \fancyhead[LE]{\ACM@linecountL\if@ACM@printfolios\thepage\fi}%
+ \fancyhead[RO]{\if@ACM@printfolios\thepage\fi}%
+ \fancyhead[RE]{\@shortauthors}%
+ \fancyhead[LO]{\ACM@linecountL\shorttitle}%
+ \if@ACM@nonacm\else%
+ \fancyfoot[RO,LE]{\footnotesize Manuscript submitted to ACM}
+ \fi%
+ \or % acmsmall
+ \fancyhead[LE]{\ACM@linecountL\@headfootfont\@acmArticlePage}%
+ \fancyhead[RO]{\@headfootfont\@acmArticlePage}%
+ \fancyhead[RE]{\@headfootfont\@shortauthors}%
+ \fancyhead[LO]{\ACM@linecountL\@headfootfont\shorttitle}%
+ \if@ACM@nonacm\else%
+ \fancyfoot[RO,LE]{\footnotesize \@journalNameShort, Vol. \@acmVolume, No.
+ \@acmNumber, Article \@acmArticle. Publication date: \@acmPubDate.}%
+ \fi
+ \or % acmlarge
+ \fancyhead[LE]{\ACM@linecountL\@headfootfont
+ \@acmArticlePage\quad\textbullet\quad\@shortauthors}%
+ \fancyhead[LO]{\ACM@linecountL}%
+ \fancyhead[RO]{\@headfootfont
+ \shorttitle\quad\textbullet\quad\@acmArticlePage}%
+ \if@ACM@nonacm\else%
+ \fancyfoot[RO,LE]{\footnotesize \@journalNameShort, Vol. \@acmVolume, No.
+ \@acmNumber, Article \@acmArticle. Publication date: \@acmPubDate.}%
+ \fi
+ \or % acmtog
+ \fancyhead[LE]{\ACM@linecountL\@headfootfont
+ \@acmArticlePage\quad\textbullet\quad\@shortauthors}%
+ \fancyhead[LO]{\ACM@linecountL}%
+ \fancyhead[RE]{\ACM@linecountR}%
+ \fancyhead[RO]{\@headfootfont
+ \shorttitle\quad\textbullet\quad\@acmArticlePage\ACM@linecountR}%
+ \if@ACM@nonacm\else%
+ \fancyfoot[RO,LE]{\footnotesize \@journalNameShort, Vol. \@acmVolume, No.
+ \@acmNumber, Article \@acmArticle. Publication date: \@acmPubDate.}%
+ \fi
+ \else % Proceedings
+ \fancyfoot[C]{\if@ACM@printfolios\footnotesize\thepage\fi}%
+ \fancyhead[LO]{\ACM@linecountL\@headfootfont\shorttitle}%
+ \fancyhead[RE]{\@headfootfont\@shortauthors\ACM@linecountR}%
+ \if@ACM@nonacm\else%
+ \fancyhead[LE]{\ACM@linecountL\@headfootfont\footnotesize
+ \acmConference@shortname,
+ \acmConference@date, \acmConference@venue}%
+ \fancyhead[RO]{\@headfootfont
+ \acmConference@shortname,
+ \acmConference@date, \acmConference@venue\ACM@linecountR}%
+ \fi
+ \fi
+ \else % Proceedings
+ \fancyfoot[C]{\if@ACM@printfolios\footnotesize\thepage\fi}%
+ \fancyhead[LO]{\ACM@linecountL\@headfootfont\shorttitle}%
+ \fancyhead[RE]{\@headfootfont\@shortauthors\ACM@linecountR}%
+ \if@ACM@nonacm\else%
+ \fancyhead[LE]{\ACM@linecountL\@headfootfont
+ \acmConference@shortname,
+ \acmConference@date, \acmConference@venue}%
+ \fancyhead[RO]{\@headfootfont
+ \acmConference@shortname,
+ \acmConference@date, \acmConference@venue\ACM@linecountR}%
+ \fi
+ \fi
+ \if@ACM@sigchiamode
+ \fancyheadoffset[L]{\dimexpr(\marginparsep+\marginparwidth)}%
+ \fi
+ \if@ACM@timestamp
+ \fancyfoot[LO,RE]{\ACM@timestamp}
+ \fi
+}%
+\pagestyle{standardpagestyle}
+}
+\newdimen\@folio@wd
+\@folio@wd=\z@
+\newdimen\@folio@ht
+\@folio@ht=\z@
+\newdimen\@folio@voffset
+\@folio@voffset=\z@
+\def\@folio@max{1}
+\ifcase\ACM@format@nr
+\relax % manuscript
+\or % acmsmall
+ \@folio@wd=45.75pt\relax
+ \@folio@ht=1.25in\relax
+ \@folio@voffset=.2in\relax
+ \def\@folio@max{8}
+\or % acmlarge
+ \@folio@wd=43.25pt\relax
+ \@folio@ht=79pt\relax
+ \@folio@voffset=.55in\relax
+ \def\@folio@max{10}
+\fi
+\def\@folioblob{\@tempcnta=0\@acmArticleSeq\relax
+ \ifnum\@tempcnta=0\relax\else
+ \loop
+ \ifnum\@tempcnta>\@folio@max\relax
+ \advance\@tempcnta by - \@folio@max
+ \repeat
+ \advance\@tempcnta by -1\relax
+ \@tempdima=\@folio@ht\relax
+ \multiply\@tempdima by \the\@tempcnta\relax
+ \advance\@tempdima by -\@folio@voffset\relax
+ \begin{picture}(0,0)
+ \makebox[\z@]{\raisebox{-\@tempdima}{%
+ \rlap{%
+ \raisebox{-0.45\@folio@ht}[\z@][\z@]{%
+ \rule{\@folio@wd}{\@folio@ht}}}%
+ \parbox{\@folio@wd}{%
+ \centering
+ \textcolor{white}{\LARGE\sffamily\bfseries\@acmArticle}}}}
+ \end{picture}\fi}
+
+\AtBeginDocument{%
+\fancypagestyle{firstpagestyle}{%
+ \fancyhf{}%
+ \renewcommand{\headrulewidth}{\z@}%
+ \renewcommand{\footrulewidth}{\z@}%
+ \if@ACM@journal@bibstrip
+ \ifcase\ACM@format@nr
+ \relax % manuscript
+ \fancyhead[L]{\ACM@linecountL}%
+ \fancyfoot[RO,LE]{\if@ACM@printfolios\small\thepage\fi}%
+ \if@ACM@nonacm\else%
+ \fancyfoot[RE,LO]{\footnotesize Manuscript submitted to ACM}%
+ \fi%
+ \or % acmsmall
+ \if@ACM@nonacm\else%
+ \fancyfoot[RO,LE]{\footnotesize \@journalNameShort, Vol. \@acmVolume, No.
+ \@acmNumber, Article \@acmArticle. Publication date:
+ \@acmPubDate.}%
+ \fi%
+ \fancyhead[LE]{\ACM@linecountL\@folioblob}%
+ \fancyhead[LO]{\ACM@linecountL}%
+ \fancyhead[RO]{\@folioblob}%
+ \fancyheadoffset[RO,LE]{0.6\@folio@wd}%
+ \or % acmlarge
+ \if@ACM@nonacm\else%
+ \fancyfoot[RO,LE]{\footnotesize \@journalNameShort, Vol. \@acmVolume, No.
+ \@acmNumber, Article \@acmArticle. Publication date:
+ \@acmPubDate.}%
+ \fi%
+ \fancyhead[RO]{\@folioblob}%
+ \fancyhead[LE]{\ACM@linecountL\@folioblob}%
+ \fancyhead[LO]{\ACM@linecountL}%
+ \fancyheadoffset[RO,LE]{1.4\@folio@wd}%
+ \or % acmtog
+ \if@ACM@nonacm\else%
+ \fancyfoot[RO,LE]{\footnotesize \@journalNameShort, Vol. \@acmVolume, No.
+ \@acmNumber, Article \@acmArticle. Publication date:
+ \@acmPubDate.}%
+ \fi%
+ \fancyhead[L]{\ACM@linecountL}%
+ \fancyhead[R]{\ACM@linecountR}%
+ \else % Conference proceedings
+ \fancyhead[L]{\ACM@linecountL}%
+ \fancyhead[R]{\ACM@linecountR}%
+ \fancyfoot[C]{\if@ACM@printfolios\footnotesize\thepage\fi}%
+ \fi
+ \else
+ \fancyhead[L]{\ACM@linecountL}%
+ \fancyhead[R]{\ACM@linecountR}%
+ \fancyfoot[C]{\if@ACM@printfolios\footnotesize\thepage\fi}%
+ \fi
+ \if@ACM@timestamp
+ \ifnum\ACM@format@nr=0\relax % Manuscript
+ \fancyfoot[LO,RE]{\ACM@timestamp\quad
+ \if@ACM@nonacm\else
+ \footnotesize Manuscript submitted to ACM
+ \fi}
+ \else
+ \fancyfoot[LO,RE]{\ACM@timestamp}
+ \fi
+ \fi
+}}
+\def\ACM@NRadjust#1{%
+ \begingroup
+ \expandafter\ifx\csname Sectionformat\endcsname\relax
+ % do nothing when \Sectionformat is unknown
+ \def\next{\endgroup #1}%
+ \else
+ \def\next{\endgroup
+ \let\realSectionformat\Sectionformat
+ \def\ACM@sect@format@{#1}%
+ \let\Sectionformat\ACM@NR@adjustedSectionformat
+ %% next lines added 2018-06-17 to ensure section number is styled
+ \let\real@adddotafter\@adddotafter
+ \let\@adddotafter\ACM@adddotafter
+ #1{}% imposes the styles, but nullifies \MakeUppercase
+ \let\@adddotafter\real@adddotafter
+ }%
+ \fi \next
+}
+\def\ACM@NR@adjustedSectionformat#1#2{%
+ \realSectionformat{\ACM@sect@format{#1}}{#2}%
+ \let\Sectionformat\realSectionformat}
+\DeclareRobustCommand{\ACM@sect@format}{\ACM@sect@format@}
+\def\ACM@sect@format@null#1{#1}
+\let\ACM@sect@format@\ACM@sect@format@null
+\AtBeginDocument{%
+ \expandafter\ifx\csname LTX@adddotafter\endcsname\relax
+ \let\LTX@adddotafter\@adddotafter
+ \fi
+}
+\def\ACM@adddotafter#1{\ifx\relax#1\relax\else\LTX@adddotafter{#1}\fi}
+\renewcommand\section{\@startsection{section}{1}{\z@}%
+ {-.75\baselineskip \@plus -2\p@ \@minus -.2\p@}%
+ {.25\baselineskip}%
+ {\ACM@NRadjust\@secfont}}
+\renewcommand\subsection{\@startsection{subsection}{2}{\z@}%
+ {-.75\baselineskip \@plus -2\p@ \@minus -.2\p@}%
+ {.25\baselineskip}%
+ {\ACM@NRadjust\@subsecfont}}
+\renewcommand\subsubsection{\@startsection{subsubsection}{3}{\z@}%
+ {-.5\baselineskip \@plus -2\p@ \@minus -.2\p@}%
+ {-3.5\p@}%
+ {\ACM@NRadjust{\@subsubsecfont\@adddotafter}}}
+\renewcommand\paragraph{\@startsection{paragraph}{4}{\parindent}%
+ {-.5\baselineskip \@plus -2\p@ \@minus -.2\p@}%
+ {-3.5\p@}%
+ {\ACM@NRadjust{\@parfont\@adddotafter}}}
+\renewcommand\part{\@startsection{part}{9}{\z@}%
+ {-10\p@ \@plus -4\p@ \@minus -2\p@}%
+ {4\p@}%
+ {\ACM@NRadjust\@parfont}}
+\def\section@raggedright{\@rightskip\@flushglue
+ \rightskip\@rightskip
+ \leftskip\z@skip
+ \parindent\z@}
+\def\@secfont{\sffamily\bfseries\section@raggedright\MakeTextUppercase}
+\def\@subsecfont{\sffamily\bfseries\section@raggedright}
+\def\@subsubsecfont{\sffamily\itshape}
+\def\@parfont{\itshape}
+\setcounter{secnumdepth}{3}
+\ifcase\ACM@format@nr
+\relax % manuscript
+\or % acmsmall
+\or % acmlarge
+ \def\@secfont{\sffamily\large\section@raggedright\MakeTextUppercase}
+ \def\@subsecfont{\sffamily\large\section@raggedright}
+\or % acmtog
+ \def\@secfont{\sffamily\large\section@raggedright\MakeTextUppercase}
+ \def\@subsecfont{\sffamily\large\section@raggedright}
+\or % sigconf
+ \def\@secfont{\bfseries\Large\section@raggedright\MakeTextUppercase}
+ \def\@subsecfont{\bfseries\Large\section@raggedright}
+\or % siggraph
+ \def\@secfont{\sffamily\bfseries\Large\section@raggedright\MakeTextUppercase}
+ \def\@subsecfont{\sffamily\bfseries\Large\section@raggedright}
+\or % sigplan
+ \def\@secfont{\bfseries\Large\section@raggedright}
+ \def\@subsecfont{\bfseries\section@raggedright}
+ \renewcommand\subsubsection{\@startsection{subsubsection}{3}{\z@}%
+ {-.75\baselineskip \@plus -2\p@ \@minus -.2\p@}%
+ {.25\baselineskip}%
+ {\@subsubsecfont}}
+ \def\@subsubsecfont{\bfseries\section@raggedright}
+ \renewcommand\paragraph{\@startsection{paragraph}{4}{\z@}%
+ {-.5\baselineskip \@plus -2\p@ \@minus -.2\p@}%
+ {-3.5\p@}%
+ {\@parfont\@addspaceafter}}
+ \def\@parfont{\bfseries\itshape}
+ \renewcommand\subparagraph{\@startsection{subparagraph}{5}{\z@}%
+ {-.5\baselineskip \@plus -2\p@ \@minus -.2\p@}%
+ {-3.5\p@}%
+ {\@subparfont\@addspaceafter}}
+ \def\@subparfont{\itshape}
+\or % sigchi
+ \setcounter{secnumdepth}{1}
+ \def\@secfont{\sffamily\bfseries\section@raggedright\MakeTextUppercase}
+ \def\@subsecfont{\sffamily\bfseries\section@raggedright}
+\or % sigchi-a
+ \setcounter{secnumdepth}{0}
+ \def\@secfont{\sffamily\bfseries\section@raggedright\MakeTextUppercase}
+ \def\@subsecfont{\sffamily\bfseries\section@raggedright}
+\fi
+\def\@adddotafter#1{#1\@addpunct{.}}
+\def\@addspaceafter#1{#1\@addpunct{\enspace}}
+\providecommand*\@dotsep{4.5}
+\def\@acmplainbodyfont{\itshape}
+\def\@acmplainindent{\parindent}
+\def\@acmplainheadfont{\scshape}
+\def\@acmplainnotefont{\@empty}
+\ifcase\ACM@format@nr
+\relax % manuscript
+\or % acmsmall
+\or % acmlarge
+\or % acmtog
+\or % sigconf
+\or % siggraph
+\or % sigplan
+ \def\@acmplainbodyfont{\itshape}
+ \def\@acmplainindent{\z@}
+ \def\@acmplainheadfont{\bfseries}
+ \def\@acmplainnotefont{\normalfont}
+\or % sigchi
+\or % sigchi-a
+\fi
+\newtheoremstyle{acmplain}%
+ {.5\baselineskip\@plus.2\baselineskip
+ \@minus.2\baselineskip}% space above
+ {.5\baselineskip\@plus.2\baselineskip
+ \@minus.2\baselineskip}% space below
+ {\@acmplainbodyfont}% body font
+ {\@acmplainindent}% indent amount
+ {\@acmplainheadfont}% head font
+ {.}% punctuation after head
+ {.5em}% spacing after head
+ {\thmname{#1}\thmnumber{ #2}\thmnote{ {\@acmplainnotefont(#3)}}}% head spec
+\def\@acmdefinitionbodyfont{\normalfont}
+\def\@acmdefinitionindent{\parindent}
+\def\@acmdefinitionheadfont{\itshape}
+\def\@acmdefinitionnotefont{\@empty}
+\ifcase\ACM@format@nr
+\relax % manuscript
+\or % acmsmall
+\or % acmlarge
+\or % acmtog
+\or % sigconf
+\or % siggraph
+\or % sigplan
+ \def\@acmdefinitionbodyfont{\normalfont}
+ \def\@acmdefinitionindent{\z@}
+ \def\@acmdefinitionheadfont{\bfseries}
+ \def\@acmdefinitionnotefont{\normalfont}
+\or % sigchi
+\or % sigchi-a
+\fi
+\newtheoremstyle{acmdefinition}%
+ {.5\baselineskip\@plus.2\baselineskip
+ \@minus.2\baselineskip}% space above
+ {.5\baselineskip\@plus.2\baselineskip
+ \@minus.2\baselineskip}% space below
+ {\@acmdefinitionbodyfont}% body font
+ {\@acmdefinitionindent}% indent amount
+ {\@acmdefinitionheadfont}% head font
+ {.}% punctuation after head
+ {.5em}% spacing after head
+ {\thmname{#1}\thmnumber{ #2}\thmnote{ {\@acmdefinitionnotefont(#3)}}}% head spec
+\theoremstyle{acmplain}
+\AtEndPreamble{%
+ \if@ACM@acmthm
+ \theoremstyle{acmplain}
+ \@ifundefined{theorem}{%
+ \newtheorem{theorem}{Theorem}[section]
+ }{}
+ \@ifundefined{conjecture}{%
+ \newtheorem{conjecture}[theorem]{Conjecture}
+ }{}
+ \@ifundefined{proposition}{%
+ \newtheorem{proposition}[theorem]{Proposition}
+ }{}
+ \@ifundefined{lemma}{%
+ \newtheorem{lemma}[theorem]{Lemma}
+ }{}
+ \@ifundefined{corollary}{%
+ \newtheorem{corollary}[theorem]{Corollary}
+ }{}
+ \theoremstyle{acmdefinition}
+ \@ifundefined{example}{%
+ \newtheorem{example}[theorem]{Example}
+ }{}
+ \@ifundefined{definition}{%
+ \newtheorem{definition}[theorem]{Definition}
+ }{}
+ \fi
+ \theoremstyle{acmplain}
+}
+\def\@proofnamefont{\scshape}
+\def\@proofindent{\indent}
+\ifcase\ACM@format@nr
+\relax % manuscript
+\or % acmsmall
+\or % acmlarge
+\or % acmtog
+\or % sigconf
+\or % siggraph
+\or % sigplan
+ \def\@proofnamefont{\itshape}
+ \def\@proofindent{\noindent}
+\or % sigchi
+\or % sigchi-a
+\fi
+\renewenvironment{proof}[1][\proofname]{\par
+ \pushQED{\qed}%
+ \normalfont \topsep6\p@\@plus6\p@\relax
+ \trivlist
+ \item[\@proofindent\hskip\labelsep
+ {\@proofnamefont #1\@addpunct{.}}]\ignorespaces
+}{%
+ \popQED\endtrivlist\@endpefalse
+}
+\AtEndPreamble{%
+ \if@ACM@balance
+ \ifcase\ACM@format@nr
+ \relax % manuscript
+ \global\@ACM@balancefalse
+ \or % acmsmall
+ \global\@ACM@balancefalse
+ \or % acmlarge
+ \global\@ACM@balancefalse
+ \or % acmtog
+ \RequirePackage{balance}%
+ \or % sigconf
+ \RequirePackage{balance}%
+ \or % siggraph
+ \RequirePackage{balance}%
+ \or % sigplan
+ \RequirePackage{balance}%
+ \or % sigchi
+ \RequirePackage{balance}%
+ \or % sigchi-a
+ \global\@ACM@balancefalse
+ \fi
+ \fi
+}
+\AtEndDocument{%
+ \if@ACM@balance
+ \if@twocolumn
+ \balance
+ \fi\fi}
+\newcommand\acksname{Acknowledgments}
+\specialcomment{acks}{%
+ \begingroup
+ \section*{\acksname}
+ \phantomsection\addcontentsline{toc}{section}{\acksname}
+}{%
+ \endgroup
+}
+\def\grantsponsor#1#2#3{#2}
+\newcommand\grantnum[3][]{#3%
+ \def\@tempa{#1}\ifx\@tempa\@empty\else\space(\url{#1})\fi}
+\AtEndPreamble{%
+\if@ACM@screen
+ \includecomment{screenonly}
+ \excludecomment{printonly}
+\else
+ \excludecomment{screenonly}
+ \includecomment{printonly}
+\fi
+\if@ACM@anonymous
+ \excludecomment{anonsuppress}
+ \excludecomment{acks}
+\else
+ \includecomment{anonsuppress}
+\fi}
+\newcommand\showeprint[2][arxiv]{%
+ \def\@tempa{#1}%
+ \ifx\@tempa\@empty\def\@tempa{arxiv}\fi
+ \def\@tempb{arxiv}%
+ \ifx\@tempa\@tempb
+ arXiv:\href{http://arxiv.org/abs/#2}{#2}\else arXiv:#2%
+ \fi}
+\let\@vspace@orig=\@vspace
+\let\@vspacer@orig=\@vspacer
+\apptocmd{\@vspace}{\ClassWarning{\@classname}{\string\vspace\space should
+ only be used to provide space above/below surrounding
+ objects}}{}{}
+\apptocmd{\@vspacer}{\ClassWarning{\@classname}{\string\vspace\space should
+ only be used to provide space above/below surrounding
+ objects}}{}{}
+\let\ACM@origbaselinestretch\baselinestretch
+\AtEndDocument{\ifx\baselinestretch\ACM@origbaselinestretch\else
+ \ClassError{\@classname}{An attempt to redefine
+ \string\baselinestretch\space detected. Please do not do this for
+ ACM submissions!}\fi}
+\normalsize\normalfont\frenchspacing
+\endinput
+%%
+%% End of file `acmart.cls'.
diff --git a/paper/conference.bib b/paper/conference.bib
new file mode 100644
index 0000000..43c8599
--- /dev/null
+++ b/paper/conference.bib
@@ -0,0 +1,509 @@
+@incollection{wang09_chapt_logic,
+ address = "Boston",
+ author = "Jie-Hong Jiang and Srinivas Devadas",
+ booktitle = "Electronic Design Automation",
+ doi = "10.1016/B978-0-12-374364-0.50013-8",
+ editor = "Laung-Terng Wang and Yao-Wen Chang and Kwang-Ting Cheng",
+ isbn = "978-0-12-374364-0",
+ pages = "299 - 404",
+ publisher = "Morgan Kaufmann",
+ title = "CHAPTER 6 - Logic synthesis in a nutshell",
+ year = 2009,
+}
+
+@inproceedings{yang11_findin_under_bugs_c_compil,
+ author = {Yang, Xuejun and Chen, Yang and Eide, Eric and Regehr, John},
+ title = {Finding and Understanding Bugs in C Compilers},
+ booktitle = {Proceedings of the 32nd ACM SIGPLAN Conference on Programming
+ Language Design and Implementation},
+ year = 2011,
+ pages = {283--294},
+ doi = {10.1145/1993498.1993532},
+ url = {https://doi.org/10.1145/1993498.1993532},
+ acmid = 1993532,
+ address = {New York, NY, USA},
+ isbn = {978-1-4503-0663-8},
+ keywords = {automated testing, compiler defect, compiler testing, random
+ program generation, random testing},
+ location = {San Jose, California, USA},
+ numpages = 12,
+ publisher = {ACM},
+ series = {PLDI '11},
+}
+
+@software{herklotz_verismith,
+ author = {Yann Herklotz and
+ John Wickerson},
+ title = {Verismith: FPGA '20 Artifact},
+ month = dec,
+ year = 2019,
+ publisher = {Zenodo},
+ version = {fpga20},
+ doi = {10.5281/zenodo.3559802},
+ url = {https://doi.org/10.5281/zenodo.3559802}
+}
+
+@inproceedings{regehr12_test_reduc_c_compil_bugs,
+ author = {Regehr, John and Chen, Yang and Cuoq, Pascal and Eide, Eric
+ and Ellison, Chucky and Yang, Xuejun},
+ title = {Test-case Reduction for C Compiler Bugs},
+ booktitle = {Proceedings of the 33rd ACM SIGPLAN Conference on Programming
+ Language Design and Implementation},
+ year = 2012,
+ pages = {335--346},
+ doi = {10.1145/2254064.2254104},
+ url = {https://doi.org/10.1145/2254064.2254104},
+ acmid = 2254104,
+ address = {New York, NY, USA},
+ isbn = {978-1-4503-1205-9},
+ keywords = {automated testing, bug reporting, compiler defect, compiler
+ testing, random testing, test-case minimization},
+ location = {Beijing, China},
+ numpages = 12,
+ publisher = {ACM},
+ series = {PLDI '12},
+}
+
+@inproceedings{lidbury15_many_compil_fuzzin,
+ author = {Lidbury, Christopher and Lascu, Andrei and Chong, Nathan and
+ Donaldson, Alastair F.},
+ title = {Many-core Compiler Fuzzing},
+ booktitle = {Proceedings of the 36th ACM SIGPLAN Conference on Programming
+ Language Design and Implementation},
+ year = 2015,
+ pages = {65--76},
+ doi = {10.1145/2737924.2737986},
+ url = {https://doi.org/10.1145/2737924.2737986},
+ acmid = 2737986,
+ address = {New York, NY, USA},
+ isbn = {978-1-4503-3468-6},
+ keywords = {Compilers, GPUs, OpenCL, concurrency, metamor- phic testing,
+ random testing},
+ location = {Portland, OR, USA},
+ numpages = 12,
+ publisher = {ACM},
+ series = {PLDI '15},
+}
+
+@incollection{seligman15_chapt_formal,
+ address = "Boston",
+ author = "Erik Seligman and Tom Schubert and M V Achutha Kiran Kumar",
+ booktitle = "Formal Verification",
+ doi = "10.1016/B978-0-12-800727-3.00008-3",
+ editor = "Erik Seligman and Tom Schubert and M V Achutha Kiran Kumar",
+ isbn = "978-0-12-800727-3",
+ keywords = "Formal Equivalence Verification (FEV), Equivalence Checking
+ (EC), combinational equivalence, sequential equivalence,
+ optimization, synthesis",
+ pages = "225 - 259",
+ publisher = "Morgan Kaufmann",
+ title = "Chapter 8 - Formal equivalence verification",
+ year = 2015,
+}
+
+@misc{wolf_yosys_open_synth_suite,
+ author = {Clifford Wolf},
+ title = {{Yosys Open SYnthesis Suite}},
+ url = {https://bit.ly/2kAXg0q},
+ urldate = {2019-01-11},
+ year = 2019,
+}
+
+@misc{joyce_dan_joyces,
+ author = {Dan Joyce},
+ title = {Dan Joyce's 16 bug types only found with gate-level
+ simulation},
+ url = {https://bit.ly/2nnO22M},
+ urldate = {2019-08-02},
+ year = 2019,
+}
+
+@inproceedings{loow19_verif_compil_verif_proces,
+ author = {L\"{o}\"{o}w, Andreas and Kumar, Ramana and Tan, Yong Kiam and Myreen, Magnus O. and Norrish, Michael and Abrahamsson, Oskar and Fox, Anthony},
+ title = {Verified Compilation on a Verified Processor},
+ booktitle = {Proceedings of the 40th ACM SIGPLAN Conference on Programming Language Design and Implementation},
+ series = {PLDI '19},
+ year = {2019},
+ isbn = {978-1-4503-6712-7},
+ location = {Phoenix, AZ, USA},
+ pages = {1041--1053},
+ numpages = {13},
+ doi = {10.1145/3314221.3314622},
+ acmid = {3314622},
+ publisher = {ACM},
+ address = {New York, NY, USA},
+ keywords = {compiler verification, hardware verification, program verification, verified stack},
+}
+
+@inproceedings{mcdonald06_logic_equiv_check_arriv_fpga_devel,
+ author = {McDonald, William and Liao, Janny},
+ title = {Logic Equivalence Checking has Arrived for {FPGA} Developers},
+ booktitle = {Design and Verification Conference (DVCon)},
+ year = 2006,
+ month = Jan,
+}
+
+@techreport{05_veril_regis_trans_level_synth,
+ type = {Standard},
+ key = {IEEE Std 1364.1},
+ title = {IEEE Standard for {Verilog} Register Transfer Level Synthesis},
+ journal = {IEC 62142-2005 First edition 2005-06 IEEE Std 1364.1},
+ volume = {},
+ number = {},
+ pages = {1-116},
+ year = {2005},
+ doi = {10.1109/IEEESTD.2005.339572},
+ ISSN = {},
+ keywords = {IEC Standards;Verilog;Registers},
+ month = {},
+}
+
+@article{mckeeman98_differ_testin_softw,
+ author = {McKeeman, William M},
+ title = {Differential Testing for Software},
+ journal = {Digital Technical Journal},
+ volume = 10,
+ number = 1,
+ pages = {100--107},
+ year = 1998,
+}
+
+@article{zeller02_simpl_isolat_failur_induc_input,
+ author = {A. {Zeller} and R. {Hildebrandt}},
+ title = {Simplifying and Isolating Failure-Inducing Input},
+ journal = {IEEE Transactions on Software Engineering},
+ volume = 28,
+ number = 2,
+ pages = {183-200},
+ year = 2002,
+ doi = {10.1109/32.988498},
+ url = {https://doi.org/10.1109/32.988498},
+ keywords = {program debugging;program testing;online front-ends;test
+ case;delta debugging algorithm;failure-inducing input;Mozilla
+ web browser;user actions;HTML;500 MHz;Vehicle crash
+ testing;Debugging;Automatic testing;HTML;Computer
+ crashes;Computer Society;Prototypes;Databases;Computer
+ bugs;Turning},
+ month = {Feb},
+}
+
+@misc{xilinx_vivad_desig_suite,
+ author = {Xilinx},
+ title = {{Vivado Design Suite}},
+ url = {https://bit.ly/2wZAmld},
+ urldate = {2019-01-14},
+ year = 2019,
+}
+
+@misc{xilinx_xst_synth_overv,
+ author = {Xilinx},
+ title = {{XST} Synthesis Overview},
+ url = {https://bit.ly/2lGtkjL},
+ urldate = {2019-01-11},
+ year = 2019,
+}
+
+@misc{wolf_vlogh,
+ author = {Clifford Wolf},
+ title = {{VlogHammer}},
+ url = {https://bit.ly/2kCxjO3},
+ urldate = {2019-01-11},
+ year = 2019,
+}
+
+@article{choi17_kami,
+ author = {Choi, Joonwon and Vijayaraghavan, Muralidaran and Sherman,
+ Benjamin and Chlipala, Adam and Arvind},
+ title = {Kami: a Platform for High-Level Parametric Hardware
+ Specification and Its Modular Verification},
+ journal = {Proc. ACM Program. Lang.},
+ volume = 1,
+ number = {ICFP},
+ pages = {24:1--24:30},
+ year = 2017,
+ doi = {10.1145/3110268},
+ acmid = 3110268,
+ address = {New York, NY, USA},
+ articleno = 24,
+ issn = {2475-1421},
+ issue_date = {September 2017},
+ keywords = {formal verification, hardware, proof assistants},
+ month = Aug,
+ numpages = 30,
+ publisher = {ACM},
+}
+
+@misc{intel_intel_quart,
+ author = {Intel},
+ title = {{Intel Quartus}},
+ url =
+ {https://intel.ly/2m7wbCs},
+ urldate = {2019-01-14},
+ year = 2019,
+}
+
+@misc{cadence_confor_equiv_check,
+ author = {Cadence},
+ title = {{Conformal Equivalence Checker}},
+ url = {https://bit.ly/2mkp0aa},
+ urldate = {2019-01-14},
+ year = 2019,
+}
+
+@inproceedings{ratchev03_verif_correc_fpga_logic_synth_algor,
+ author = {Ratchev, Boris and Hutton, Mike and Baeckler, Gregg and van
+ Antwerpen, Babette},
+ title = {Verifying the Correctness of FPGA Logic Synthesis Algorithms},
+ booktitle = {Proceedings of the 2003 ACM/SIGDA Eleventh International
+ Symposium on Field Programmable Gate Arrays},
+ year = 2003,
+ pages = {127--135},
+ doi = {10.1145/611817.611837},
+ url = {https://doi.org/10.1145/611817.611837},
+ acmid = 611837,
+ address = {New York, NY, USA},
+ isbn = {1-58113-651-X},
+ keywords = {FPGA, programmable logic, synthesis, test, verification},
+ location = {Monterey, California, USA},
+ numpages = 9,
+ publisher = {ACM},
+ series = {FPGA '03},
+}
+
+@inproceedings{aagaard91,
+ author = {M. {Aagaard} and M. {Leeser}},
+ title = {A formally verified system for logic synthesis},
+ booktitle = {[1991 Proceedings] IEEE International Conference on Computer
+ Design: VLSI in Computers and Processors},
+ year = 1991,
+ pages = {346-350},
+ doi = {10.1109/ICCD.1991.139915},
+ keywords = {Boolean functions;formal specification;logic CAD;formally
+ verified system;logic synthesis;correctness;weak division
+ algorithm;Boolean simplification;programming language ML;Nuprl
+ proof development
+ system;errors;implementation;Hardware;Algorithm design and
+ analysis;Registers;Logic programming;Computer
+ languages;Process design;Boolean algebra;High level
+ synthesis;Circuit synthesis;Boolean functions},
+ month = Oct,
+}
+
+@inproceedings{braibant13_formal_verif_hardw_synth,
+ author = "Braibant, Thomas and Chlipala, Adam",
+ title = "Formal Verification of Hardware Synthesis",
+ booktitle = "Computer Aided Verification",
+ year = 2013,
+ pages = "213--228",
+ abstract = "We report on the implementation of a certified compiler for a
+ high-level hardware description language (HDL) called Fe-Si
+ (FEatherweight SynthesIs). Fe-Si is a simplified version of
+ Bluespec, an HDL based on a notion of guarded atomic
+ actions. Fe-Si is defined as a dependently typed deep
+ embedding in Coq. The target language of the compiler
+ corresponds to a synthesisable subset of Verilog or VHDL. A
+ key aspect of our approach is that input programs to the
+ compiler can be defined and proved correct inside Coq. Then,
+ we use extraction and a Verilog back-end (written in OCaml) to
+ get a certified version of a hardware design.",
+ address = "Berlin, Heidelberg",
+ editor = "Sharygina, Natasha and Veith, Helmut",
+ isbn = "978-3-642-39799-8",
+ publisher = "Springer",
+}
+
+@InProceedings{flor18_pi_ware,
+ author = {Jo{\~a}o Paulo Pizani Flor and Wouter Swierstra and Yorick
+ Sijsling},
+ title = {{Pi-Ware: Hardware Description and Verification in Agda}},
+ booktitle = {21st International Conference on Types for Proofs and Programs
+ (TYPES 2015)},
+ year = 2018,
+ volume = 69,
+ pages = {9:1--9:27},
+ doi = {10.4230/LIPIcs.TYPES.2015.9},
+ url = {https://doi.org/10.4230/LIPIcs.TYPES.2015.9},
+ ISBN = {978-3-95977-030-9},
+ ISSN = {1868-8969},
+ URN = {urn:nbn:de:0030-drops-84791},
+ address = {Dagstuhl, Germany},
+ annote = {Keywords: dependently typed programming, Agda, EDSL, hardware
+ description languages, functional programming},
+ editor = {Tarmo Uustalu},
+ publisher = {Schloss Dagstuhl--Leibniz-Zentrum fuer Informatik},
+ series = {Leibniz International Proceedings in Informatics (LIPIcs)},
+}
+
+@misc{constable86_implem_mathem_nuprl_proof_devel_system,
+ author = {Robert L. Constable and others},
+ title = {Implementing Mathematics with The Nuprl Proof Development
+ System},
+ year = 1986,
+}
+
+@misc{mcpeak_delta,
+ author = {Scott McPeak},
+ title = {{Delta}},
+ url = {https://bit.ly/2kncyG5},
+ urldate = {2019-06-11},
+ year = 2019,
+}
+
+@inproceedings{leroy06_formal_certif_compil_back,
+ author = {Leroy, Xavier},
+ title = {Formal Certification of a Compiler Back-end or: Programming a
+ Compiler with a Proof Assistant},
+ booktitle = {Conference Record of the 33rd ACM SIGPLAN-SIGACT Symposium on
+ Principles of Programming Languages},
+ year = 2006,
+ pages = {42--54},
+ doi = {10.1145/1111037.1111042},
+ url = {https://doi.org/10.1145/1111037.1111042},
+ acmid = 1111042,
+ address = {New York, NY, USA},
+ isbn = {1-59593-027-2},
+ keywords = {certified compilation, compiler transformations and
+ optimizations, program proof, semantic preservation, the Coq
+ theorem prover},
+ location = {Charleston, South Carolina, USA},
+ numpages = 13,
+ publisher = {ACM},
+ series = {POPL '06},
+}
+
+@InProceedings{brayton10_abc,
+ author = "Brayton, Robert and Mishchenko, Alan",
+ title = {{ABC}: An academic industrial-strength verification tool},
+ booktitle = "Computer Aided Verification",
+ year = 2010,
+ pages = "24--40",
+ abstract = "ABC is a public-domain system for logic synthesis and formal
+ verification of binary logic circuits appearing in synchronous
+ hardware designs. ABC combines scalable logic transformations
+ based on And-Inverter Graphs (AIGs), with a variety of
+ innovative algorithms. A focus on the synergy of sequential
+ synthesis and sequential verification leads to improvements in
+ both domains. This paper introduces ABC, motivates its
+ development, and illustrates its use in formal verification.",
+ address = "Berlin, Heidelberg",
+ editor = "Touili, Tayssir and Cook, Byron and Jackson, Paul",
+ isbn = "978-3-642-14295-6",
+ publisher = "Springer",
+}
+
+@InProceedings{moura08_z3,
+ author = "de Moura, Leonardo and Bj{\o}rner, Nikolaj",
+ title = {{Z3}: An Efficient {SMT} Solver},
+ booktitle = "Tools and Algorithms for the Construction and Analysis of
+ Systems",
+ year = 2008,
+ pages = "337--340",
+ abstract = "Satisfiability Modulo Theories (SMT) problem is a decision
+ problem for logical first order formulas with respect to
+ combinations of background theories such as: arithmetic,
+ bit-vectors, arrays, and uninterpreted functions. Z3 is a new
+ and efficient SMT Solver freely available from Microsoft
+ Research. It is used in various software verification and
+ analysis applications.",
+ address = "Berlin, Heidelberg",
+ editor = "Ramakrishnan, C. R. and Rehof, Jakob",
+ isbn = "978-3-540-78800-3",
+ publisher = "Springer",
+}
+
+@techreport{barrett17_smt_lib_stand,
+ author = {Clark Barrett and Pascal Fontaine and Cesare Tinelli},
+ institution = {Department of Computer Science, The University of Iowa},
+ title = {{The SMT-LIB Standard: Version 2.6}},
+ year = 2017,
+}
+
+@article{06_ieee_stand_veril_hardw_descr_languag,
+ author = {},
+ title = {{IEEE} Standard for {Verilog} Hardware Description Language},
+ journal = {IEEE Std 1364-2005 (Revision of IEEE Std 1364-2001)},
+ pages = {1--560},
+ year = 2006,
+ doi = {10.1109/IEEESTD.2006.99495},
+}
+
+@misc{zalewski15_americ,
+ author = {Zalewski, Michal},
+ title = {American fuzzy lop},
+ url = {http://lcamtuf.coredump.cx/afl/},
+ urldate = {2019-01-15},
+ year = 2015,
+}
+
+@inproceedings{misherghi06_hdd,
+ author = {Misherghi, Ghassan and Su, Zhendong},
+ title = {HDD: Hierarchical Delta Debugging},
+ booktitle = {Proceedings of the 28th International Conference on Software
+ Engineering},
+ year = 2006,
+ pages = {142--151},
+ doi = {10.1145/1134285.1134307},
+ url = {https://doi.org/10.1145/1134285.1134307},
+ acmid = 1134307,
+ address = {New York, NY, USA},
+ isbn = {1-59593-375-1},
+ keywords = {automated debugging, delta debugging},
+ location = {Shanghai, China},
+ numpages = 10,
+ publisher = {ACM},
+ series = {ICSE '06},
+}
+
+@inproceedings{brummayer09_fuzzin_delta_smt_solver,
+ author = {Brummayer, Robert and Biere, Armin},
+ title = {Fuzzing and Delta-debugging SMT Solvers},
+ booktitle = {Proceedings of the 7th International Workshop on
+ Satisfiability Modulo Theories},
+ year = 2009,
+ pages = {1--5},
+ doi = {10.1145/1670412.1670413},
+ url = {https://doi.org/10.1145/1670412.1670413},
+ acmid = 1670413,
+ address = {New York, NY, USA},
+ isbn = {978-1-60558-484-3},
+ location = {Montreal, Canada},
+ numpages = 5,
+ publisher = {ACM},
+ series = {SMT '09},
+}
+
+@inproceedings{tao10_autom_testin_approac_compil_based,
+ author = {Q. {Tao} and W. {Wu} and C. {Zhao} and W. {Shen}},
+ title = {An Automatic Testing Approach for Compiler Based on
+ Metamorphic Testing Technique},
+ booktitle = {2010 Asia Pacific Software Engineering Conference},
+ year = 2010,
+ pages = {270-279},
+ doi = {10.1109/APSEC.2010.39},
+ url = {https://doi.org/10.1109/APSEC.2010.39},
+ keywords = {automatic programming;formal verification;program
+ compilers;program testing;software development
+ management;automatic testing;metamorphic testing;compiler
+ testing;equivalence preservation relation;Mettoc;fault
+ detection capability;Testing;Program
+ processors;Semantics;Equations;Grammar;Software
+ systems;compiler;metamorphic testing;test automation;test
+ oracle;test input generation},
+ month = {Nov},
+}
+
+@misc{intel_intel_fpga_sdk_openc,
+ author = {Intel},
+ title = {{Intel} {FPGA} {SDK} for {OpenCL} software technology},
+ url = {https://intel.ly/2WXoTj8},
+ urldate = {2019-11-07},
+ year = 2019,
+}
+
+@misc{williams_icarus_veril,
+ author = {Stephen Williams},
+ title = {Icarus Verilog},
+ url = {http://iverilog.icarus.com/},
+ urldate = {2019-12-14},
+ year = 2019,
+}
diff --git a/paper/data/example_gen.v b/paper/data/example_gen.v
new file mode 100644
index 0000000..21c78a0
--- /dev/null
+++ b/paper/data/example_gen.v
@@ -0,0 +1,56 @@
+module top #(parameter param0 = 5'h9e23848124)
+(y, clk, wire0, wire1, wire2, wire3);
+ // *** Declarations ***
+ output wire [(5'h31):(1'h0)] y;
+ input wire [(1'h0):(1'h0)] clk;
+ input wire [(3'h6):(1'h0)] wire0;
+ input wire [(4'ha):(1'h0)] wire1;
+ input wire signed [(4'ha):(1'h0)] wire2;
+ input wire [(4'hb):(1'h0)] wire3;
+ reg [(3'h2):(1'h0)] reg20 = (1'h0);
+ reg [(3'h5):(1'h0)] reg19 = (1'h0);
+ reg [(3'h4):(1'h0)] reg18 = (1'h0);
+ reg [(2'h2):(1'h0)] reg17 = (1'h0);
+ reg [(4'ha):(1'h0)] reg16 = (1'h0);
+ reg signed [(4'h9):(1'h0)] reg15 = (1'h0);
+ wire [(3'h6):(1'h0)] wire5;
+ wire [(2'h3):(1'h0)] wire4;
+ // *** Assign output ***
+ assign y =
+ {reg20,reg19,reg18,reg17,reg16,reg15,wire5,wire4};
+ // *** Random module items ***
+ assign wire4 = (((~wire1) ? ((((15'h9ecc51592fdeb04)
+ ? reg17[(5'h2):(2'h2)] : (reg18 ? wire2 : wire0))
+ ? $unsigned(((-2'ha73a956341f45c0) << reg18)) :
+ wire1[(4'ha):(3'h7)]) - reg18) :
+ reg15[(4'h9):(3'h7)]) >>> $unsigned($signed((
+ reg16[(4'ha):(3'h7)] ? ((wire1 && reg16) &&
+ {reg15, reg15, wire3}) : (reg18 ? (~&wire3) :
+ (-39'ha7a1419cd4ea34a))))));
+ assign wire5 = $signed(((wire2 ? (
+ (-8'h5e411249da4f335) ? (4'hb2fa97daeae9ff) :
+ wire1) : (wire4 ? wire2 : wire1)) ?
+ $signed(wire3) : ({(7'hbac46141008d14)} >>>
+ (&wire0))));
+ always @(posedge clk) begin
+ for (reg15 = (1'h0); (reg15 < (2'h2)); reg15 =
+ (reg15 + (1'h1))) begin
+ if (((wire3 == (~(reg16 + wire1))) >=
+ {$signed(wire0[(2'h2):(1'h0)])}))
+ reg16 <= ($unsigned($unsigned(wire1)) <
+ wire3[(1'h1):(1'h1)]);
+ else reg16 <= $unsigned(reg17[(2'h2):(2'h0)]);
+ reg17 <= wire3[(1'h0):(1'h0)];
+ end
+ reg18 <= $signed(({wire0} ~^ wire3));
+ end
+ always @(posedge clk) begin
+ if (wire3[(4'h9):(3'h6)])
+ reg19 = $signed($unsigned(wire1)) <<
+ $unsigned({wire1});
+ reg20 <= ({({(~|wire3), $unsigned(reg19)} ?
+ reg16 : reg15[(2'h2):(1'h1)]),
+ (~&((wire0 ? wire3 : reg17) ~^ reg18))}
+ || ((~&(wire3[(4'hb):(4'h9)] ? wire4 : (+wire5)))));
+ end
+endmodule
diff --git a/paper/data/length.csv b/paper/data/length.csv
new file mode 100644
index 0000000..d15b52e
--- /dev/null
+++ b/paper/data/length.csv
@@ -0,0 +1,2617 @@
+Name,Status,Size,Synthesis time,Equivalence check time,Reduction time
+Fuzz 2,0,97,72.213154,30.351107,0
+Fuzz 3,0,97,72.107126,8.283589,0
+Fuzz 4,0,113,72.627819,9.169093,0
+Fuzz 5,0,52,70.292304,3.383418,0
+Fuzz 6,0,78,70.467495,7.598596,0
+Fuzz 7,0,100,71.800208,17.387735,0
+Fuzz 8,0,75,70.648575,6.823855,0
+Fuzz 9,0,100,72.173855,24.920506,0
+Fuzz 10,0,76,74.66807,16.293053,0
+Fuzz 11,0,93,70.981204,12.551382,0
+Fuzz 12,0,128,72.194749,78.626333,0
+Fuzz 13,0,79,72.929616,9.673849,0
+Fuzz 14,0,102,74.861803,13.589483,0
+Fuzz 15,1,120,71.468803,10.044264,60.91985
+Fuzz 16,0,79,73.50775,9.473712,0
+Fuzz 17,0,113,71.628112,12.900366,0
+Fuzz 18,0,95,71.899553,7.233327,0
+Fuzz 19,0,133,71.798428,10.818776,0
+Fuzz 20,0,75,72.726009,16.836844,0
+Fuzz 21,0,99,71.986274,9.023912,0
+Fuzz 22,0,116,72.442222,36.854771,0
+Fuzz 23,0,96,73.162476,15.83677,0
+Fuzz 24,0,55,73.135028,10.940641,0
+Fuzz 25,0,137,71.011369,8.136483,0
+Fuzz 26,0,84,70.426512,7.390233,0
+Fuzz 27,0,80,71.570905,8.68711,0
+Fuzz 28,0,117,72.624937,13.499185,0
+Fuzz 29,0,105,72.445475,12.03254,0
+Fuzz 30,0,62,70.546746,3.522396,0
+Fuzz 31,0,99,71.868961,5.822072,0
+Fuzz 32,0,105,72.861619,12.497174,0
+Fuzz 33,0,114,73.011325,30.919105,0
+Fuzz 34,0,95,73.571294,22.570827,0
+Fuzz 35,0,68,72.926198,10.356774,0
+Fuzz 36,0,97,70.958879,9.747489,0
+Fuzz 37,0,79,72.797123,13.502913,0
+Fuzz 38,0,137,73.336558,11.256354,0
+Fuzz 39,0,91,71.392906,4.493441,0
+Fuzz 40,0,68,71.684014,3.027745,0
+Fuzz 41,0,72,72.259845,11.974873,0
+Fuzz 42,1,114,73.349932,30.855516,106.101325
+Fuzz 43,0,55,71.941988,4.887139,0
+Fuzz 44,0,78,71.86393,66.067369,0
+Fuzz 45,0,104,72.565643,19.718194,0
+Fuzz 46,0,83,71.439622,13.06575,0
+Fuzz 47,0,152,73.251999,11.767299,0
+Fuzz 48,0,103,70.426832,7.136901,0
+Fuzz 49,0,64,71.656793,6.822624,0
+Fuzz 50,0,92,71.546353,16.052132,0
+Fuzz 2,0,108,70.813172,15.608984,0
+Fuzz 3,0,133,71.869894,12.365701,0
+Fuzz 4,1,81,73.241003,538.04457,0
+Fuzz 5,0,95,72.054601,15.245509,0
+Fuzz 6,0,105,72.191168,15.062141,0
+Fuzz 7,0,70,70.859404,6.199871,0
+Fuzz 8,0,74,71.589715,11.488594,0
+Fuzz 9,0,106,74.131819,20.612512,0
+Fuzz 10,0,106,71.661651,11.203731,0
+Fuzz 11,0,118,71.32141,16.207469,0
+Fuzz 12,0,93,71.593636,9.709564,0
+Fuzz 13,0,56,70.595528,6.90988,0
+Fuzz 14,0,100,73.365177,10.09774,0
+Fuzz 15,0,83,72.617642,4.331741,0
+Fuzz 16,0,89,71.122469,14.097337,0
+Fuzz 17,0,82,71.420561,2.788458,0
+Fuzz 18,0,76,72.348735,10.914952,0
+Fuzz 19,1,68,70.001125,12.705994,71.886072
+Fuzz 20,0,111,71.892366,10.841272,0
+Fuzz 21,0,102,71.518867,22.736011,0
+Fuzz 22,0,49,72.502107,14.835006,0
+Fuzz 23,1,97,73.03165,11.174623,88.049551
+Fuzz 24,1,97,73.339281,12.917166,498.406589
+Fuzz 25,0,82,70.936074,65.992604,0
+Fuzz 26,0,139,72.504874,32.661305,0
+Fuzz 27,0,106,72.038703,6.258363,0
+Fuzz 28,0,91,70.23454,7.648954,0
+Fuzz 29,0,68,70.049031,3.517361,0
+Fuzz 30,0,79,70.720477,5.900091,0
+Fuzz 31,0,80,72.714292,6.911821,0
+Fuzz 32,0,90,74.210637,13.574628,0
+Fuzz 33,1,120,70.401073,5.618416,305.765282
+Fuzz 34,0,77,71.51602,9.300688,0
+Fuzz 35,0,97,72.738859,24.546814,0
+Fuzz 36,0,78,71.611694,5.375414,0
+Fuzz 37,0,99,76.554312,45.349892,0
+Fuzz 38,0,87,74.560597,7.812257,0
+Fuzz 39,0,97,73.960336,8.002069,0
+Fuzz 40,0,68,70.397616,4.188788,0
+Fuzz 41,0,99,71.693144,9.797944,0
+Fuzz 42,0,82,70.65965,5.51343,0
+Fuzz 43,0,150,72.336575,65.647721,0
+Fuzz 44,0,51,69.650338,3.756907,0
+Fuzz 45,0,104,71.574694,7.451263,0
+Fuzz 46,0,110,73.534522,24.744197,0
+Fuzz 47,0,90,71.853122,11.200799,0
+Fuzz 48,0,76,72.844757,3.900667,0
+Fuzz 49,0,85,70.692119,7.501628,0
+Fuzz 50,0,68,71.582632,7.040757,0
+Fuzz 2,0,68,71.23475,5.586519,0
+Fuzz 3,0,94,72.868734,29.118109,0
+Fuzz 4,0,98,71.23802,6.739023,0
+Fuzz 5,0,112,71.773394,14.472313,0
+Fuzz 6,0,70,70.977435,9.758708,0
+Fuzz 7,0,83,71.740352,6.227962,0
+Fuzz 8,0,126,73.553515,14.43171,0
+Fuzz 9,0,62,72.747637,7.967126,0
+Fuzz 10,0,76,70.582714,6.861605,0
+Fuzz 11,0,111,70.8642,8.741647,0
+Fuzz 12,0,58,71.038558,9.333232,0
+Fuzz 13,0,54,69.116079,3.976352,0
+Fuzz 14,0,75,70.67698,5.589506,0
+Fuzz 15,1,96,72.722682,7.843115,136.169789
+Fuzz 16,0,87,71.238858,2.049206,0
+Fuzz 17,0,81,73.047798,16.504951,0
+Fuzz 18,0,94,71.496956,18.402798,0
+Fuzz 19,0,87,70.286746,10.803142,0
+Fuzz 20,0,82,69.988747,12.026459,0
+Fuzz 21,0,111,74.321011,30.414965,0
+Fuzz 22,0,86,70.612455,5.674614,0
+Fuzz 23,0,99,70.882858,8.215736,0
+Fuzz 24,0,115,72.327692,8.728208,0
+Fuzz 25,0,109,70.685643,4.154702,0
+Fuzz 26,0,87,70.952685,9.07412,0
+Fuzz 27,0,98,71.096356,53.730589,0
+Fuzz 28,0,123,72.768117,9.660027,0
+Fuzz 29,0,76,74.711182,14.140467,0
+Fuzz 30,0,56,72.04589,5.636075,0
+Fuzz 31,0,77,71.385472,5.253115,0
+Fuzz 32,0,84,73.682916,9.11756,0
+Fuzz 33,0,116,73.703773,21.945054,0
+Fuzz 34,0,78,72.799321,19.240172,0
+Fuzz 35,0,106,71.995595,10.724727,0
+Fuzz 36,0,65,71.845336,7.212887,0
+Fuzz 37,0,101,72.318125,18.456101,0
+Fuzz 38,0,88,72.933826,16.3346,0
+Fuzz 39,0,95,71.632697,26.172928,0
+Fuzz 40,0,100,70.555431,4.618343,0
+Fuzz 41,0,81,71.233992,11.691167,0
+Fuzz 42,0,72,72.678735,15.095746,0
+Fuzz 43,0,97,71.463511,10.654373,0
+Fuzz 44,0,113,70.115833,5.600819,0
+Fuzz 45,0,115,72.64598,18.774146,0
+Fuzz 46,0,101,70.702071,6.774873,0
+Fuzz 47,0,85,73.072245,40.847889,0
+Fuzz 48,0,109,70.180675,5.829755,0
+Fuzz 49,0,154,73.152884,58.851659,0
+Fuzz 50,0,112,71.120068,14.467445,0
+Fuzz 2,0,61,70.535889,6.273501,0
+Fuzz 3,0,99,73.342382,9.837386,0
+Fuzz 4,0,112,71.202689,8.719854,0
+Fuzz 5,0,62,74.593901,4.632781,0
+Fuzz 6,0,91,80.963895,6.651114,0
+Fuzz 7,0,115,81.264531,81.723822,0
+Fuzz 8,0,90,71.656531,7.450326,0
+Fuzz 9,0,72,71.303168,4.952234,0
+Fuzz 10,0,48,72.777864,8.538641,0
+Fuzz 11,0,91,71.299484,6.330751,0
+Fuzz 12,0,108,72.641953,10.549468,0
+Fuzz 13,0,97,72.565927,22.744067,0
+Fuzz 14,0,107,71.173504,8.573297,0
+Fuzz 15,0,69,72.583867,6.573389,0
+Fuzz 16,1,82,69.872158,2.535952,0
+Fuzz 17,0,63,71.503131,8.229518,0
+Fuzz 18,0,113,72.003699,19.049805,0
+Fuzz 19,0,87,71.342458,16.028948,0
+Fuzz 20,0,69,72.521107,25.034479,0
+Fuzz 21,0,93,71.970633,12.661545,0
+Fuzz 22,0,88,70.197406,2.874407,0
+Fuzz 23,0,114,71.952326,296.077919,0
+Fuzz 24,0,74,72.83374,5.061495,0
+Fuzz 25,0,77,71.380983,7.213448,0
+Fuzz 26,1,110,74.086696,23.255829,318.739279
+Fuzz 27,0,72,72.83509,6.160995,0
+Fuzz 28,0,92,74.593,20.387428,0
+Fuzz 29,0,134,72.032109,22.603598,0
+Fuzz 30,0,118,71.801201,16.121868,0
+Fuzz 31,0,106,71.152301,5.315473,0
+Fuzz 32,0,115,72.262988,11.244465,0
+Fuzz 33,0,72,70.20169,11.081377,0
+Fuzz 34,0,84,72.760194,7.177626,0
+Fuzz 35,0,97,72.164121,16.723615,0
+Fuzz 36,0,88,73.094313,17.259815,0
+Fuzz 37,0,75,71.855872,3.725018,0
+Fuzz 38,0,90,72.106197,240.661805,0
+Fuzz 39,1,110,74.136274,20.403008,612.977189
+Fuzz 40,0,78,71.145778,6.21945,0
+Fuzz 41,0,85,74.242337,25.545889,0
+Fuzz 42,0,116,73.248092,130.945617,0
+Fuzz 43,0,116,72.155758,19.344282,0
+Fuzz 44,0,80,72.380946,5.04477,0
+Fuzz 45,0,79,73.045036,9.460359,0
+Fuzz 46,0,103,70.619644,9.338503,0
+Fuzz 47,0,84,71.073653,10.965195,0
+Fuzz 48,0,78,70.318487,12.376326,0
+Fuzz 49,0,144,72.449675,62.45692,0
+Fuzz 50,0,97,70.573546,6.495619,0
+Fuzz 2,0,113,72.150687,17.641374,0
+Fuzz 3,0,79,72.72968,14.001347,0
+Fuzz 4,0,82,71.957686,10.59238,0
+Fuzz 5,0,107,71.75453,11.927132,0
+Fuzz 6,0,83,72.876595,16.946815,0
+Fuzz 7,0,71,70.886955,10.642756,0
+Fuzz 8,0,135,72.926148,25.067904,0
+Fuzz 9,0,97,72.840625,2.768772,0
+Fuzz 10,0,102,81.174804,14.7902,0
+Fuzz 11,1,108,77.911102,9.678868,0
+Fuzz 12,0,91,75.979753,12.251083,0
+Fuzz 13,0,86,70.664501,7.065472,0
+Fuzz 14,0,82,73.02015,4.532338,0
+Fuzz 15,0,129,70.680005,78.63326,0
+Fuzz 16,1,93,72.376364,13.281724,86.529724
+Fuzz 17,0,83,72.530955,4.425277,0
+Fuzz 18,0,78,74.018934,17.456067,0
+Fuzz 19,0,90,71.48424,7.280371,0
+Fuzz 20,1,97,71.325904,22.563805,69.191198
+Fuzz 21,0,127,72.692573,4.2216,0
+Fuzz 22,0,109,72.934928,11.640774,0
+Fuzz 23,0,90,71.915721,11.558026,0
+Fuzz 24,0,89,72.436823,27.823569,0
+Fuzz 25,0,57,71.805477,4.448779,0
+Fuzz 26,0,85,72.303433,16.721193,0
+Fuzz 27,0,71,72.299291,10.575003,0
+Fuzz 28,0,126,73.236177,13.726781,0
+Fuzz 29,0,106,73.205397,14.640526,0
+Fuzz 30,0,102,71.682621,29.491516,0
+Fuzz 31,0,111,72.344222,13.610118,0
+Fuzz 32,0,82,71.443831,6.673614,0
+Fuzz 33,0,77,72.915024,6.699192,0
+Fuzz 34,0,85,72.306195,5.689255,0
+Fuzz 35,0,83,73.970528,86.02642,0
+Fuzz 36,0,94,71.799398,54.71589,0
+Fuzz 37,0,85,71.245786,6.102364,0
+Fuzz 38,0,87,72.468637,13.586901,0
+Fuzz 39,1,88,72.462004,306.430066,399.151807
+Fuzz 40,0,85,69.967379,4.845733,0
+Fuzz 41,0,144,73.019147,19.971445,0
+Fuzz 42,0,107,72.708127,10.508837,0
+Fuzz 43,0,70,72.967817,147.825946,0
+Fuzz 44,0,70,71.013162,5.258131,0
+Fuzz 45,0,90,71.0776,16.894697,0
+Fuzz 46,1,79,71.152634,8.864119,244.527142
+Fuzz 47,0,75,71.311408,10.732782,0
+Fuzz 48,0,122,72.942674,16.861725,0
+Fuzz 49,0,98,72.463523,20.394409,0
+Fuzz 50,0,106,72.180651,13.955544,0
+Fuzz 2,0,117,73.675582,20.308143,0
+Fuzz 3,0,94,71.901344,15.787219,0
+Fuzz 4,0,93,71.457544,5.571358,0
+Fuzz 5,0,86,73.195481,9.999508,0
+Fuzz 6,0,80,70.346795,5.78297,0
+Fuzz 7,0,79,72.498738,11.738449,0
+Fuzz 8,0,117,74.125417,154.627884,0
+Fuzz 9,0,55,71.229619,16.812246,0
+Fuzz 10,0,109,72.218112,19.039334,0
+Fuzz 11,0,70,72.957121,5.695963,0
+Fuzz 12,0,52,72.583699,4.734636,0
+Fuzz 13,0,85,71.953507,5.387151,0
+Fuzz 14,0,60,71.901531,6.646291,0
+Fuzz 15,0,110,71.272301,10.664963,0
+Fuzz 16,0,62,72.4722,9.882931,0
+Fuzz 17,0,62,72.103805,5.816316,0
+Fuzz 18,0,62,71.600356,3.385295,0
+Fuzz 19,0,66,70.803037,4.249087,0
+Fuzz 20,0,111,73.336694,13.384325,0
+Fuzz 21,0,92,73.779369,99.566735,0
+Fuzz 22,0,79,71.711892,3.502302,0
+Fuzz 23,0,108,74.542941,14.113463,0
+Fuzz 24,0,129,71.329479,12.591357,0
+Fuzz 25,0,51,72.198902,8.250319,0
+Fuzz 26,0,86,72.781296,12.009015,0
+Fuzz 27,0,81,71.426791,10.769372,0
+Fuzz 28,0,90,71.954581,23.005061,0
+Fuzz 29,0,72,69.659723,5.666986,0
+Fuzz 30,0,66,70.656395,6.93958,0
+Fuzz 31,0,134,71.831935,25.94821,0
+Fuzz 32,0,101,70.559566,16.813632,0
+Fuzz 33,0,78,71.639276,4.231461,0
+Fuzz 34,0,91,71.665038,13.717499,0
+Fuzz 35,0,100,72.963956,12.053105,0
+Fuzz 36,0,65,70.849774,2.811546,0
+Fuzz 37,0,96,71.899284,8.796955,0
+Fuzz 38,0,58,71.505668,4.903193,0
+Fuzz 39,0,96,70.71358,8.676929,0
+Fuzz 40,0,108,71.824015,9.219443,0
+Fuzz 41,0,68,72.851743,11.702817,0
+Fuzz 42,0,95,70.642613,6.232958,0
+Fuzz 43,0,119,72.566559,11.405367,0
+Fuzz 44,0,131,71.341764,11.649369,0
+Fuzz 45,0,72,71.850631,7.005851,0
+Fuzz 46,0,94,72.166242,18.297237,0
+Fuzz 47,0,77,72.803919,6.195452,0
+Fuzz 48,0,80,71.662982,4.88861,0
+Fuzz 49,0,126,72.487574,24.916235,0
+Fuzz 50,0,84,73.074394,25.008879,0
+Fuzz 2,0,72,71.898545,10.18463,0
+Fuzz 3,0,140,73.448849,11.740949,0
+Fuzz 4,0,94,70.618355,5.686553,0
+Fuzz 5,0,95,73.125285,12.354128,0
+Fuzz 6,0,132,73.417076,50.238654,0
+Fuzz 7,0,111,71.446141,62.562576,0
+Fuzz 8,0,123,73.558527,21.364527,0
+Fuzz 9,0,56,71.506237,4.246274,0
+Fuzz 10,0,106,70.210163,7.667558,0
+Fuzz 11,0,67,69.275242,4.554096,0
+Fuzz 12,0,152,72.017758,8.410394,0
+Fuzz 13,0,121,73.281834,13.940221,0
+Fuzz 14,0,94,71.834421,9.671135,0
+Fuzz 15,0,64,71.135394,9.423067,0
+Fuzz 16,0,74,72.55299,8.06501,0
+Fuzz 17,0,114,75.124516,18.424881,0
+Fuzz 18,0,78,69.752601,4.726059,0
+Fuzz 19,1,75,71.00709,5.420364,0
+Fuzz 20,0,94,73.926812,10.968712,0
+Fuzz 21,0,100,72.644524,10.464666,0
+Fuzz 22,0,95,73.385522,15.356706,0
+Fuzz 23,0,88,72.511898,14.394803,0
+Fuzz 24,0,135,72.535581,11.898005,0
+Fuzz 25,0,122,72.200273,26.259648,0
+Fuzz 26,0,81,71.792887,11.473407,0
+Fuzz 27,0,69,73.316434,28.036574,0
+Fuzz 28,0,88,73.244136,22.138679,0
+Fuzz 29,0,103,72.884179,24.97936,0
+Fuzz 30,0,99,71.162618,9.364345,0
+Fuzz 31,0,86,71.757734,12.273212,0
+Fuzz 32,0,105,73.501928,41.877092,0
+Fuzz 33,0,116,72.050079,9.120408,0
+Fuzz 34,0,62,72.654608,9.59932,0
+Fuzz 35,0,122,72.012693,7.110707,0
+Fuzz 36,0,93,72.756849,17.132151,0
+Fuzz 37,0,132,73.821852,27.603154,0
+Fuzz 38,0,114,73.496391,7.511909,0
+Fuzz 39,0,103,73.205837,11.179884,0
+Fuzz 40,0,67,72.331921,6.440604,0
+Fuzz 41,0,74,71.627706,4.770693,0
+Fuzz 42,1,91,70.663186,5.798591,854.636805
+Fuzz 43,0,107,72.066125,4.271298,0
+Fuzz 44,0,125,72.458184,19.390881,0
+Fuzz 45,0,99,72.878836,16.225274,0
+Fuzz 46,0,76,71.143874,7.428704,0
+Fuzz 47,0,105,71.588831,18.653781,0
+Fuzz 48,0,85,72.222616,12.736413,0
+Fuzz 49,0,92,72.153401,17.954274,0
+Fuzz 50,0,79,71.26077,5.960241,0
+Fuzz 2,0,88,70.783437,26.409645,0
+Fuzz 3,0,80,72.193413,8.204509,0
+Fuzz 4,0,92,72.505204,10.490189,0
+Fuzz 5,1,141,74.322398,49.744778,50.775764
+Fuzz 6,0,96,72.64045,28.071292,0
+Fuzz 7,0,72,71.592184,7.277961,0
+Fuzz 8,0,75,72.293558,5.482781,0
+Fuzz 9,0,79,74.177219,9.899511,0
+Fuzz 10,0,85,70.412834,5.022453,0
+Fuzz 11,0,102,72.770977,11.785039,0
+Fuzz 12,0,59,72.111887,4.779127,0
+Fuzz 13,0,100,71.856078,4.21951,0
+Fuzz 14,0,70,72.170537,9.666168,0
+Fuzz 15,0,71,69.973842,2.716516,0
+Fuzz 16,1,78,72.810783,16.009704,566.664064
+Fuzz 17,0,60,71.3137,2.936566,0
+Fuzz 18,0,78,72.809067,5.894206,0
+Fuzz 19,0,81,73.189603,20.439222,0
+Fuzz 20,1,68,70.621838,3.453057,0
+Fuzz 21,0,69,70.60831,6.833688,0
+Fuzz 22,0,110,73.285554,21.737264,0
+Fuzz 23,0,121,73.537006,12.223618,0
+Fuzz 24,0,64,71.804171,3.918601,0
+Fuzz 25,0,71,72.378693,10.627825,0
+Fuzz 26,0,82,72.353711,8.427188,0
+Fuzz 27,0,88,73.872841,17.601689,0
+Fuzz 28,0,115,70.698782,10.608464,0
+Fuzz 29,0,123,72.384396,13.774047,0
+Fuzz 30,0,70,72.53965,5.99271,0
+Fuzz 31,0,82,74.113657,35.915466,0
+Fuzz 32,0,79,73.468041,7.322493,0
+Fuzz 33,0,61,71.951583,2.718523,0
+Fuzz 34,0,121,72.697964,19.770921,0
+Fuzz 35,0,107,72.039063,12.762273,0
+Fuzz 36,0,120,70.617563,18.167776,0
+Fuzz 37,0,90,71.266377,25.135865,0
+Fuzz 38,0,87,72.079965,7.764311,0
+Fuzz 39,0,89,71.689371,7.215882,0
+Fuzz 40,0,80,71.653345,8.282752,0
+Fuzz 41,0,91,71.993222,16.27418,0
+Fuzz 42,0,74,72.958033,5.989285,0
+Fuzz 43,0,84,72.453099,44.326212,0
+Fuzz 44,0,64,70.218206,5.309972,0
+Fuzz 45,0,102,73.329871,31.86736,0
+Fuzz 46,0,85,70.325281,14.846283,0
+Fuzz 47,0,90,71.867509,11.344932,0
+Fuzz 48,0,113,70.999782,11.011211,0
+Fuzz 49,0,99,71.919837,18.411862,0
+Fuzz 50,0,72,72.664818,9.258251,0
+Fuzz 2,1,148,75.929442,900.068787,0
+Fuzz 3,0,102,72.03701,10.55496,0
+Fuzz 4,1,62,71.844898,4.582746,89.34701
+Fuzz 5,0,61,71.706569,6.410236,0
+Fuzz 6,0,82,70.37478,7.918856,0
+Fuzz 7,0,107,71.593587,20.629952,0
+Fuzz 8,0,71,72.608683,25.211952,0
+Fuzz 9,0,100,72.38363,26.968391,0
+Fuzz 10,0,86,71.335782,17.813541,0
+Fuzz 11,0,98,71.531574,13.729262,0
+Fuzz 12,0,76,71.51593,15.948766,0
+Fuzz 13,0,86,71.897134,13.97414,0
+Fuzz 14,0,92,71.710362,11.712341,0
+Fuzz 15,0,66,69.816189,3.656946,0
+Fuzz 16,0,87,70.419838,11.682352,0
+Fuzz 17,1,110,71.831532,20.678355,164.653116
+Fuzz 18,0,75,70.489976,27.075734,0
+Fuzz 19,0,116,72.068551,17.562364,0
+Fuzz 20,1,112,70.622302,7.116525,426.069941
+Fuzz 21,0,73,71.128,2.828138,0
+Fuzz 22,0,108,71.218929,12.563623,0
+Fuzz 23,0,100,72.553795,21.532287,0
+Fuzz 24,0,76,73.038388,11.678741,0
+Fuzz 25,0,97,71.315899,10.191302,0
+Fuzz 26,0,75,71.817977,6.625727,0
+Fuzz 27,0,102,71.608584,21.657353,0
+Fuzz 28,0,79,69.984794,4.400903,0
+Fuzz 29,0,64,72.230023,12.391952,0
+Fuzz 30,0,84,71.253015,25.431978,0
+Fuzz 31,0,72,70.473919,8.75654,0
+Fuzz 32,0,108,70.420151,21.079054,0
+Fuzz 33,0,121,71.814485,25.119054,0
+Fuzz 34,0,92,72.420728,16.37572,0
+Fuzz 35,0,117,72.177631,15.65761,0
+Fuzz 36,0,71,70.704793,8.678057,0
+Fuzz 37,0,81,70.556781,12.483576,0
+Fuzz 38,0,123,73.380391,18.601423,0
+Fuzz 39,0,65,68.716728,4.00117,0
+Fuzz 40,0,67,71.569951,7.531108,0
+Fuzz 41,0,109,72.605916,14.849058,0
+Fuzz 42,0,74,73.636431,29.091796,0
+Fuzz 43,0,103,71.657039,21.472128,0
+Fuzz 44,0,86,70.947543,16.418145,0
+Fuzz 45,1,138,73.421385,40.304387,471.103121
+Fuzz 46,0,71,72.176521,7.023042,0
+Fuzz 47,0,82,74.348929,82.199688,0
+Fuzz 48,0,87,72.974281,20.779783,0
+Fuzz 49,0,102,72.969279,7.212703,0
+Fuzz 50,0,97,72.378909,12.382816,0
+Fuzz 2,0,76,75.246644,7.556215,0
+Fuzz 3,0,82,72.677605,5.996487,0
+Fuzz 4,0,104,73.359033,23.573771,0
+Fuzz 5,0,96,73.651721,35.895095,0
+Fuzz 6,0,61,70.605872,4.451269,0
+Fuzz 7,0,116,72.862114,12.164939,0
+Fuzz 8,0,110,72.593017,18.353368,0
+Fuzz 9,0,75,72.153725,7.145366,0
+Fuzz 10,0,82,71.402383,10.495622,0
+Fuzz 11,0,80,73.58839,6.503882,0
+Fuzz 12,0,69,72.680376,8.882953,0
+Fuzz 13,0,102,70.929042,7.111561,0
+Fuzz 14,0,66,73.857148,7.108102,0
+Fuzz 15,0,86,71.619342,12.915796,0
+Fuzz 16,0,105,71.089986,9.366953,0
+Fuzz 17,0,146,72.5766,17.964759,0
+Fuzz 18,0,97,72.074475,9.391085,0
+Fuzz 19,0,94,74.881671,59.720001,0
+Fuzz 20,0,75,72.118034,19.207394,0
+Fuzz 21,0,89,71.813321,9.40874,0
+Fuzz 22,0,112,72.158004,10.329787,0
+Fuzz 23,0,91,72.827761,6.903147,0
+Fuzz 24,0,93,72.278289,19.128749,0
+Fuzz 25,1,83,73.62527,900.066747,0
+Fuzz 26,1,66,80.341718,12.316694,189.134385
+Fuzz 27,0,77,71.366279,5.905164,0
+Fuzz 28,0,78,71.461339,8.364697,0
+Fuzz 29,0,61,70.754668,4.860026,0
+Fuzz 30,0,97,71.699417,4.6182,0
+Fuzz 31,0,80,72.634617,8.183572,0
+Fuzz 32,0,69,70.465024,5.953412,0
+Fuzz 33,0,63,72.171822,8.23034,0
+Fuzz 34,0,69,76.410337,14.277488,0
+Fuzz 35,0,94,73.51914,9.973637,0
+Fuzz 36,0,104,74.311797,18.679911,0
+Fuzz 37,0,126,72.2258,4.196222,0
+Fuzz 38,0,83,70.910206,6.546096,0
+Fuzz 39,0,69,72.820388,12.185302,0
+Fuzz 40,0,68,70.729002,2.573087,0
+Fuzz 41,0,112,72.159847,3.516236,0
+Fuzz 42,0,86,71.988137,6.389956,0
+Fuzz 43,0,114,73.764412,9.399301,0
+Fuzz 44,0,70,71.671979,9.085999,0
+Fuzz 45,0,131,72.641697,95.792401,0
+Fuzz 46,0,105,72.709569,14.17986,0
+Fuzz 47,0,113,72.651337,20.415269,0
+Fuzz 48,0,97,72.846879,11.097662,0
+Fuzz 49,0,81,69.101283,2.32688,0
+Fuzz 50,0,119,74.328781,212.039023,0
+Fuzz 2,0,76,71.016859,10.234574,0
+Fuzz 3,0,106,72.27057,5.060809,0
+Fuzz 4,0,91,71.923831,14.569548,0
+Fuzz 5,0,130,72.012803,48.055677,0
+Fuzz 6,0,75,73.025223,7.499726,0
+Fuzz 7,0,143,73.019525,16.457674,0
+Fuzz 8,0,93,71.522847,12.91775,0
+Fuzz 9,0,115,71.372305,12.318349,0
+Fuzz 10,0,91,72.342084,13.192152,0
+Fuzz 11,0,104,72.813606,16.463988,0
+Fuzz 12,0,70,71.520533,6.326437,0
+Fuzz 13,0,62,70.486229,9.155235,0
+Fuzz 14,0,75,72.33048,5.15431,0
+Fuzz 15,0,95,71.872201,6.638001,0
+Fuzz 16,0,93,69.553803,6.539132,0
+Fuzz 17,0,99,72.037801,4.1048,0
+Fuzz 18,0,83,71.209681,5.577207,0
+Fuzz 19,0,89,73.469853,54.89104,0
+Fuzz 20,0,66,72.057818,5.997025,0
+Fuzz 21,0,133,72.497572,25.968429,0
+Fuzz 22,0,103,72.571954,7.172104,0
+Fuzz 23,0,100,71.310546,11.330675,0
+Fuzz 24,0,102,72.081028,10.995553,0
+Fuzz 25,0,60,69.689524,4.267279,0
+Fuzz 26,0,93,72.56937,22.620374,0
+Fuzz 27,0,101,70.432943,4.376338,0
+Fuzz 28,0,100,72.927336,10.761453,0
+Fuzz 29,0,75,72.523341,9.281062,0
+Fuzz 30,0,86,70.02891,17.021568,0
+Fuzz 31,0,67,72.285559,7.462129,0
+Fuzz 32,0,78,73.707592,4.992584,0
+Fuzz 33,0,100,73.385209,8.866212,0
+Fuzz 34,0,89,71.874381,8.635939,0
+Fuzz 35,0,77,71.938181,7.899568,0
+Fuzz 36,0,78,70.254844,6.476422,0
+Fuzz 37,0,88,71.323153,4.043311,0
+Fuzz 38,1,118,72.511975,18.460933,604.799536
+Fuzz 39,0,111,71.561018,12.199302,0
+Fuzz 40,0,105,73.625424,23.249588,0
+Fuzz 41,0,85,73.497408,19.02015,0
+Fuzz 42,0,163,73.524387,40.989254,0
+Fuzz 43,0,113,71.486128,10.877728,0
+Fuzz 44,0,108,71.663603,10.162516,0
+Fuzz 45,1,74,72.93726,10.569869,98.136341
+Fuzz 46,0,72,70.764976,11.659818,0
+Fuzz 47,0,86,70.970067,5.155875,0
+Fuzz 48,0,95,70.299109,3.279149,0
+Fuzz 49,0,59,70.352344,2.489066,0
+Fuzz 50,0,79,74.297055,6.768649,0
+Fuzz 2,0,95,71.332596,18.976422,0
+Fuzz 3,1,125,71.732148,18.496767,665.065772
+Fuzz 4,0,121,71.906106,91.011075,0
+Fuzz 5,0,121,72.288453,14.911797,0
+Fuzz 6,0,66,71.456957,9.318868,0
+Fuzz 7,0,82,73.249211,11.046966,0
+Fuzz 8,0,87,72.484898,15.208076,0
+Fuzz 9,0,85,71.511325,6.688873,0
+Fuzz 10,0,124,72.311302,9.923351,0
+Fuzz 11,0,87,72.743777,27.218852,0
+Fuzz 12,0,117,71.396618,9.702063,0
+Fuzz 13,0,78,71.28016,10.143002,0
+Fuzz 14,0,91,71.238917,7.472161,0
+Fuzz 15,0,57,71.095379,6.222462,0
+Fuzz 16,0,111,71.66022,11.429513,0
+Fuzz 17,0,114,72.246304,12.821643,0
+Fuzz 18,0,81,72.77926,6.645711,0
+Fuzz 19,0,126,72.846679,12.731124,0
+Fuzz 20,0,109,71.676487,7.470626,0
+Fuzz 21,0,84,71.000572,4.954555,0
+Fuzz 22,0,94,71.695262,8.038313,0
+Fuzz 23,0,107,71.639333,20.588902,0
+Fuzz 24,0,116,72.315519,15.007853,0
+Fuzz 25,0,87,71.978997,10.480063,0
+Fuzz 26,0,74,71.368921,4.324329,0
+Fuzz 27,0,89,72.802542,17.060157,0
+Fuzz 28,0,69,70.686098,5.063817,0
+Fuzz 29,0,114,70.807099,10.501077,0
+Fuzz 30,0,99,72.720549,7.101287,0
+Fuzz 31,0,97,71.021316,3.657825,0
+Fuzz 32,0,67,72.935004,8.816597,0
+Fuzz 33,0,98,71.316895,7.816012,0
+Fuzz 34,0,115,74.472648,28.634217,0
+Fuzz 35,0,99,70.765939,6.486534,0
+Fuzz 36,0,104,73.660484,16.470622,0
+Fuzz 37,0,86,71.835803,4.23202,0
+Fuzz 38,0,150,71.722026,31.982702,0
+Fuzz 39,0,74,72.571641,10.993823,0
+Fuzz 40,0,99,73.245768,19.911971,0
+Fuzz 41,0,102,71.018674,7.545885,0
+Fuzz 42,0,113,73.170579,19.962679,0
+Fuzz 43,0,174,74.290408,148.250614,0
+Fuzz 44,0,109,76.166659,19.371848,0
+Fuzz 45,0,86,71.203625,5.57117,0
+Fuzz 46,0,59,72.130315,8.011634,0
+Fuzz 47,0,88,73.841275,30.993745,0
+Fuzz 48,0,112,75.851491,15.393503,0
+Fuzz 49,0,76,71.011621,9.479626,0
+Fuzz 50,0,105,70.463767,6.787775,0
+Fuzz 2,1,91,72.891656,3.986932,0
+Fuzz 3,1,108,71.060077,7.804975,0
+Fuzz 4,0,114,72.765386,32.295155,0
+Fuzz 5,0,91,71.239037,9.0584,0
+Fuzz 6,0,94,71.496722,10.145028,0
+Fuzz 7,0,80,71.620496,9.919079,0
+Fuzz 8,0,101,71.434741,8.895604,0
+Fuzz 9,0,86,73.160561,4.90891,0
+Fuzz 10,0,54,72.783531,10.421439,0
+Fuzz 11,0,109,71.114449,7.597028,0
+Fuzz 12,0,75,72.030776,5.862252,0
+Fuzz 13,0,70,69.6447,6.699222,0
+Fuzz 14,0,83,71.986597,10.794936,0
+Fuzz 15,0,93,72.662684,9.466819,0
+Fuzz 16,0,79,71.093394,6.489933,0
+Fuzz 17,0,75,71.637999,16.586761,0
+Fuzz 18,0,74,70.352528,4.56008,0
+Fuzz 19,0,84,72.376614,16.453654,0
+Fuzz 20,0,60,70.031368,4.191387,0
+Fuzz 21,0,77,71.841079,8.15036,0
+Fuzz 22,0,92,71.921141,6.826709,0
+Fuzz 23,0,102,74.325541,34.756008,0
+Fuzz 24,0,76,71.471814,5.293553,0
+Fuzz 25,0,143,73.015514,17.618414,0
+Fuzz 26,0,84,74.045314,8.866899,0
+Fuzz 27,0,87,72.289875,4.814625,0
+Fuzz 28,0,125,72.199492,28.92318,0
+Fuzz 29,0,104,73.445675,5.468091,0
+Fuzz 30,0,77,70.865393,10.589604,0
+Fuzz 31,0,123,72.108367,26.876998,0
+Fuzz 32,0,141,75.492802,54.431652,0
+Fuzz 33,0,100,72.327819,18.124994,0
+Fuzz 34,1,68,71.131195,3.146294,71.297349
+Fuzz 35,0,86,71.540239,4.394164,0
+Fuzz 36,0,80,70.717256,11.241074,0
+Fuzz 37,0,88,71.677486,4.282618,0
+Fuzz 38,0,60,71.93023,2.862184,0
+Fuzz 39,0,93,71.411747,8.911989,0
+Fuzz 40,1,116,70.613362,2.718217,0
+Fuzz 41,0,75,71.800649,6.742317,0
+Fuzz 42,0,60,72.07405,5.951309,0
+Fuzz 43,0,74,71.031555,4.722375,0
+Fuzz 44,0,89,71.914152,10.13047,0
+Fuzz 45,0,49,69.943665,2.143088,0
+Fuzz 46,0,149,72.938433,71.450667,0
+Fuzz 47,0,77,71.787834,14.038493,0
+Fuzz 48,0,95,72.14804,8.902795,0
+Fuzz 49,0,95,74.764505,21.188532,0
+Fuzz 50,0,79,74.191004,47.725392,0
+Fuzz 2,0,71,71.612156,3.854806,0
+Fuzz 3,0,92,70.11407,5.063754,0
+Fuzz 4,0,91,70.353031,5.087029,0
+Fuzz 5,0,91,73.517123,2.944104,0
+Fuzz 6,0,98,73.599664,21.701613,0
+Fuzz 7,0,98,72.463299,20.363091,0
+Fuzz 8,0,109,70.042467,11.310162,0
+Fuzz 9,0,105,86.405966,22.669062,0
+Fuzz 10,0,76,77.948136,9.385365,0
+Fuzz 11,0,108,74.938829,28.535361,0
+Fuzz 12,0,74,71.00306,5.629236,0
+Fuzz 13,0,115,71.982266,10.16993,0
+Fuzz 14,0,68,71.678035,13.098983,0
+Fuzz 15,0,98,74.227247,30.207123,0
+Fuzz 16,0,97,72.244486,10.508144,0
+Fuzz 17,0,88,71.718706,6.510346,0
+Fuzz 18,0,96,71.751993,7.574762,0
+Fuzz 19,0,150,72.196545,15.995139,0
+Fuzz 20,0,102,73.098627,18.665294,0
+Fuzz 21,0,72,71.47137,11.701284,0
+Fuzz 22,0,73,71.532183,16.42322,0
+Fuzz 23,0,80,71.186233,18.549649,0
+Fuzz 24,0,82,73.925263,24.192587,0
+Fuzz 25,0,93,70.304967,15.838306,0
+Fuzz 26,0,106,70.720584,14.57599,0
+Fuzz 27,0,68,71.941867,6.731753,0
+Fuzz 28,0,80,70.819964,6.727897,0
+Fuzz 29,0,95,71.995,39.469046,0
+Fuzz 30,0,76,71.929282,2.298778,0
+Fuzz 31,0,89,70.565461,7.837088,0
+Fuzz 32,0,80,72.604306,7.92612,0
+Fuzz 33,0,117,72.600233,9.881593,0
+Fuzz 34,0,89,73.029866,9.074247,0
+Fuzz 35,0,79,70.361929,4.765433,0
+Fuzz 36,0,115,71.473916,23.144591,0
+Fuzz 37,0,66,72.174181,11.211901,0
+Fuzz 38,0,91,71.784363,10.209403,0
+Fuzz 39,0,73,70.973922,5.799725,0
+Fuzz 40,0,52,71.051127,7.566371,0
+Fuzz 41,0,66,71.5734,10.500819,0
+Fuzz 42,0,123,71.966174,15.449809,0
+Fuzz 43,0,78,71.696505,5.271043,0
+Fuzz 44,0,89,70.185178,9.35515,0
+Fuzz 45,0,113,72.388498,9.747392,0
+Fuzz 46,0,85,74.308424,25.025472,0
+Fuzz 47,0,83,70.736331,9.758621,0
+Fuzz 48,0,84,71.822096,12.845106,0
+Fuzz 49,0,72,74.212033,8.54609,0
+Fuzz 50,0,105,75.775195,10.490929,0
+Fuzz 2,0,58,71.878083,2.814546,0
+Fuzz 3,0,76,71.270541,4.512826,0
+Fuzz 4,0,119,74.638493,19.089165,0
+Fuzz 5,0,75,71.134914,6.144759,0
+Fuzz 6,0,102,71.982597,18.82968,0
+Fuzz 7,0,96,70.328581,6.90279,0
+Fuzz 8,0,89,71.914518,41.577443,0
+Fuzz 9,0,91,70.946962,10.112741,0
+Fuzz 10,0,65,71.906544,18.141351,0
+Fuzz 11,0,121,72.421474,17.006532,0
+Fuzz 12,0,88,71.087429,6.455903,0
+Fuzz 13,0,64,71.525008,5.285791,0
+Fuzz 14,0,57,71.913807,3.538023,0
+Fuzz 15,0,55,70.8599,4.328443,0
+Fuzz 16,0,97,71.148501,10.245865,0
+Fuzz 17,0,48,70.955447,1.916892,0
+Fuzz 18,0,113,70.677336,5.056083,0
+Fuzz 19,0,72,71.39894,8.360063,0
+Fuzz 20,0,80,70.438163,4.842148,0
+Fuzz 21,1,69,71.863749,11.109644,307.673319
+Fuzz 22,0,101,71.992059,6.090996,0
+Fuzz 23,0,115,72.207988,23.642166,0
+Fuzz 24,0,90,73.138296,9.820278,0
+Fuzz 25,0,63,71.90306,10.203417,0
+Fuzz 26,0,92,72.719544,9.006831,0
+Fuzz 27,0,77,71.338738,9.666879,0
+Fuzz 28,0,56,71.223752,8.829015,0
+Fuzz 29,0,121,72.258789,14.784533,0
+Fuzz 30,0,105,73.842059,21.144801,0
+Fuzz 31,0,89,73.148401,21.290992,0
+Fuzz 32,0,91,70.909914,5.335987,0
+Fuzz 33,0,95,70.367679,2.73668,0
+Fuzz 34,0,96,71.013009,2.842592,0
+Fuzz 35,0,69,69.929265,7.661233,0
+Fuzz 36,0,87,72.778058,9.915111,0
+Fuzz 37,0,65,72.466158,5.311799,0
+Fuzz 38,1,105,74.541616,835.631758,0
+Fuzz 39,0,74,71.376151,28.140916,0
+Fuzz 40,0,79,70.928637,12.662143,0
+Fuzz 41,0,61,70.530298,10.154852,0
+Fuzz 42,0,79,72.104408,8.290528,0
+Fuzz 43,0,88,72.829697,14.461674,0
+Fuzz 44,0,75,72.185715,8.593807,0
+Fuzz 45,0,120,74.375031,77.471808,0
+Fuzz 46,1,121,73.522143,37.459864,1071.646125
+Fuzz 47,0,67,70.194104,5.747033,0
+Fuzz 48,0,88,72.849368,14.528156,0
+Fuzz 49,0,84,70.6619,10.979095,0
+Fuzz 50,0,93,70.992698,5.297212,0
+Fuzz 2,0,85,70.247014,5.974528,0
+Fuzz 3,0,113,71.217058,12.579065,0
+Fuzz 4,0,79,70.695461,5.248237,0
+Fuzz 5,0,97,72.616868,20.745888,0
+Fuzz 6,0,73,72.341137,20.524423,0
+Fuzz 7,0,99,71.693275,5.154605,0
+Fuzz 8,1,82,73.482603,4.335133,0
+Fuzz 9,0,101,73.564619,16.597183,0
+Fuzz 10,0,66,72.450942,5.068834,0
+Fuzz 11,0,80,70.721994,3.279575,0
+Fuzz 12,0,75,71.831423,13.305834,0
+Fuzz 13,0,96,71.56648,6.729488,0
+Fuzz 14,0,74,70.55187,7.186251,0
+Fuzz 15,0,90,72.309677,9.024661,0
+Fuzz 16,0,75,69.629684,9.549607,0
+Fuzz 17,0,67,71.359844,6.005129,0
+Fuzz 18,0,91,72.130381,14.258598,0
+Fuzz 19,0,73,72.087011,14.061049,0
+Fuzz 20,0,104,71.632963,13.348429,0
+Fuzz 21,0,103,74.203387,42.687199,0
+Fuzz 22,1,70,71.260329,5.27077,295.015914
+Fuzz 23,0,95,71.408766,8.362732,0
+Fuzz 24,0,62,70.294865,5.215643,0
+Fuzz 25,0,133,72.634167,14.290421,0
+Fuzz 26,0,100,73.331245,19.000318,0
+Fuzz 27,0,100,70.638099,24.75038,0
+Fuzz 28,0,80,72.430799,6.350407,0
+Fuzz 29,0,60,72.246137,3.712746,0
+Fuzz 30,0,91,70.884742,2.670996,0
+Fuzz 31,0,96,72.467725,18.430362,0
+Fuzz 32,0,78,71.513935,2.343454,0
+Fuzz 33,0,104,72.411608,34.089254,0
+Fuzz 34,0,74,72.433731,4.27112,0
+Fuzz 35,0,81,70.530075,4.749024,0
+Fuzz 36,0,115,71.45126,13.533854,0
+Fuzz 37,0,108,71.725924,14.573726,0
+Fuzz 38,0,46,70.937631,9.239784,0
+Fuzz 39,0,116,70.739178,8.006253,0
+Fuzz 40,0,90,71.750778,16.002522,0
+Fuzz 41,1,91,72.811733,12.666752,241.062697
+Fuzz 42,0,118,70.271457,6.092366,0
+Fuzz 43,0,98,69.445467,5.648369,0
+Fuzz 44,0,79,71.54553,11.055467,0
+Fuzz 45,0,85,73.803034,9.708596,0
+Fuzz 46,0,95,70.945282,8.31847,0
+Fuzz 47,0,86,70.204303,3.995808,0
+Fuzz 48,0,89,71.391621,6.546147,0
+Fuzz 49,1,99,72.354724,24.149113,133.88411
+Fuzz 50,0,65,70.220878,6.444013,0
+Fuzz 2,1,82,72.68749,36.269001,0
+Fuzz 3,0,68,70.727141,4.56203,0
+Fuzz 4,0,47,70.056069,3.170618,0
+Fuzz 5,0,80,70.331257,8.151504,0
+Fuzz 6,0,81,70.882814,8.991646,0
+Fuzz 7,0,128,73.355058,20.345355,0
+Fuzz 8,0,60,72.237238,2.631224,0
+Fuzz 9,0,83,73.738543,13.829378,0
+Fuzz 10,0,76,69.37916,5.35515,0
+Fuzz 11,0,121,73.409191,13.591441,0
+Fuzz 12,0,105,71.042958,6.574443,0
+Fuzz 13,0,92,71.572769,6.826294,0
+Fuzz 14,0,76,70.612503,8.451166,0
+Fuzz 15,1,90,72.240464,24.478012,101.502916
+Fuzz 16,0,62,71.86399,4.084694,0
+Fuzz 17,0,79,69.729963,3.621142,0
+Fuzz 18,0,56,69.686779,4.583126,0
+Fuzz 19,0,80,72.546717,8.055236,0
+Fuzz 20,0,74,73.651757,33.221381,0
+Fuzz 21,0,104,70.455157,14.73201,0
+Fuzz 22,0,79,73.297857,12.282305,0
+Fuzz 23,0,76,71.350149,9.782277,0
+Fuzz 24,0,96,71.48675,7.175298,0
+Fuzz 25,0,100,73.119866,38.653218,0
+Fuzz 26,1,69,72.209847,526.003178,0
+Fuzz 27,0,71,74.031076,212.327995,0
+Fuzz 28,0,101,71.012078,23.179537,0
+Fuzz 29,0,72,69.763405,1.876861,0
+Fuzz 30,0,69,70.255704,5.459831,0
+Fuzz 31,0,63,71.289117,4.097019,0
+Fuzz 32,0,90,74.019085,29.499402,0
+Fuzz 33,0,110,72.251631,8.936644,0
+Fuzz 34,0,102,74.270221,12.56832,0
+Fuzz 35,0,98,71.862558,19.370652,0
+Fuzz 36,0,79,71.702224,8.14957,0
+Fuzz 37,0,81,73.03832,29.686548,0
+Fuzz 38,0,101,72.179104,5.594029,0
+Fuzz 39,0,76,71.825651,4.911826,0
+Fuzz 40,0,49,71.301435,2.374658,0
+Fuzz 41,0,100,71.259326,6.79674,0
+Fuzz 42,0,87,70.780159,8.078642,0
+Fuzz 43,0,62,70.27418,6.440596,0
+Fuzz 44,0,111,73.061588,13.841964,0
+Fuzz 45,0,83,71.692188,20.059775,0
+Fuzz 46,0,126,72.817881,14.186275,0
+Fuzz 47,0,99,69.888253,48.388827,0
+Fuzz 48,0,87,71.884437,13.380101,0
+Fuzz 49,0,85,70.566748,4.101427,0
+Fuzz 50,0,106,72.38556,31.617651,0
+Fuzz 2,0,79,71.781347,6.136497,0
+Fuzz 3,0,68,71.462557,5.89536,0
+Fuzz 4,0,63,70.195672,2.972945,0
+Fuzz 5,0,117,72.521668,37.434361,0
+Fuzz 6,0,79,73.148004,8.633358,0
+Fuzz 7,1,74,70.589166,2.920763,0
+Fuzz 8,0,122,73.355292,22.221481,0
+Fuzz 9,0,74,71.046051,6.832658,0
+Fuzz 10,0,82,72.79368,25.829759,0
+Fuzz 11,0,99,70.371669,8.208893,0
+Fuzz 12,0,76,72.419099,25.229823,0
+Fuzz 13,0,56,70.819883,7.867761,0
+Fuzz 14,1,119,71.53482,26.962691,0
+Fuzz 15,0,86,71.595314,10.930778,0
+Fuzz 16,0,104,73.936127,70.297222,0
+Fuzz 17,0,83,72.691182,12.053852,0
+Fuzz 18,0,126,72.935179,9.238047,0
+Fuzz 19,0,108,72.160456,27.670363,0
+Fuzz 20,0,88,72.034003,4.431275,0
+Fuzz 21,0,76,71.614834,24.133576,0
+Fuzz 22,0,95,71.940792,13.850066,0
+Fuzz 23,1,90,74.131076,6.808102,0
+Fuzz 24,0,99,70.970988,8.58722,0
+Fuzz 25,0,56,70.344169,4.017626,0
+Fuzz 26,0,69,70.637804,9.19757,0
+Fuzz 27,0,50,70.626847,7.366613,0
+Fuzz 28,0,67,71.932697,5.059219,0
+Fuzz 29,0,55,69.518334,3.423086,0
+Fuzz 30,0,90,73.332239,21.37199,0
+Fuzz 31,1,97,73.131082,5.046366,0
+Fuzz 32,0,90,71.646296,6.541456,0
+Fuzz 33,0,66,71.790633,12.60483,0
+Fuzz 34,0,77,71.822169,10.760977,0
+Fuzz 35,1,95,73.481089,9.157957,81.169872
+Fuzz 36,0,92,70.537186,9.687736,0
+Fuzz 37,0,81,71.084145,4.745151,0
+Fuzz 38,0,100,71.883623,8.555525,0
+Fuzz 39,0,104,74.685588,13.72113,0
+Fuzz 40,0,80,69.838777,3.440477,0
+Fuzz 41,1,90,72.681126,6.702395,0
+Fuzz 42,0,98,71.955398,7.772337,0
+Fuzz 43,0,95,72.214869,5.111335,0
+Fuzz 44,0,66,72.796987,4.97155,0
+Fuzz 45,0,84,71.006367,10.917315,0
+Fuzz 46,0,70,72.631134,17.431271,0
+Fuzz 47,0,92,73.241706,10.462326,0
+Fuzz 48,0,66,72.604698,12.949229,0
+Fuzz 49,0,86,75.498568,15.669184,0
+Fuzz 50,0,78,71.766622,73.83846,0
+Fuzz 2,0,103,73.098282,27.752321,0
+Fuzz 3,0,103,70.167859,8.09041,0
+Fuzz 4,0,126,69.886881,10.929565,0
+Fuzz 5,0,74,73.291911,7.2289,0
+Fuzz 6,0,73,70.498085,5.352549,0
+Fuzz 7,0,108,73.737294,74.519769,0
+Fuzz 8,0,118,73.343543,13.783593,0
+Fuzz 9,0,70,72.276321,9.713165,0
+Fuzz 10,0,92,74.125787,14.029644,0
+Fuzz 11,0,121,71.266235,20.465892,0
+Fuzz 12,0,83,78.743301,6.809167,0
+Fuzz 13,0,68,70.060533,7.036961,0
+Fuzz 14,0,121,73.278791,14.76173,0
+Fuzz 15,0,98,72.6237,10.621879,0
+Fuzz 16,0,83,70.545261,5.699392,0
+Fuzz 17,0,100,72.740824,19.801,0
+Fuzz 18,0,105,71.30167,15.157662,0
+Fuzz 19,0,68,72.263704,4.667527,0
+Fuzz 20,0,99,72.302474,9.637657,0
+Fuzz 21,0,69,71.368562,31.231607,0
+Fuzz 22,0,73,72.089124,15.598355,0
+Fuzz 23,0,106,71.105696,9.491364,0
+Fuzz 24,0,111,71.959167,8.909284,0
+Fuzz 25,1,55,71.712949,4.03468,0
+Fuzz 26,0,93,72.379994,9.838101,0
+Fuzz 27,0,78,73.105588,9.343236,0
+Fuzz 28,0,104,71.975646,12.503979,0
+Fuzz 29,0,79,71.002138,52.316723,0
+Fuzz 30,0,119,72.192961,23.219315,0
+Fuzz 31,0,111,72.556128,23.646643,0
+Fuzz 32,0,81,73.137791,20.038173,0
+Fuzz 33,0,74,71.952928,7.528723,0
+Fuzz 34,0,70,71.491123,4.548051,0
+Fuzz 35,0,98,71.710201,8.288668,0
+Fuzz 36,0,106,71.387158,17.445891,0
+Fuzz 37,0,82,70.44774,4.651512,0
+Fuzz 38,0,66,72.415069,7.908228,0
+Fuzz 39,0,91,71.381647,10.53208,0
+Fuzz 40,0,92,72.507229,7.396636,0
+Fuzz 41,0,93,70.884384,3.513661,0
+Fuzz 42,0,90,70.997095,8.394862,0
+Fuzz 43,0,89,69.748049,9.365297,0
+Fuzz 44,0,90,73.753819,6.752253,0
+Fuzz 45,0,92,70.835594,4.71212,0
+Fuzz 46,0,88,71.983695,13.024862,0
+Fuzz 47,0,78,71.33342,6.998522,0
+Fuzz 48,0,92,71.303748,78.264649,0
+Fuzz 49,0,97,70.188137,13.477828,0
+Fuzz 50,0,85,70.946339,11.072972,0
+Fuzz 2,0,81,73.428398,10.464738,0
+Fuzz 3,0,87,71.147495,16.172329,0
+Fuzz 4,0,66,71.964131,11.826444,0
+Fuzz 5,0,105,73.123608,21.058936,0
+Fuzz 6,0,74,71.728996,8.81724,0
+Fuzz 7,0,99,72.732895,22.453587,0
+Fuzz 8,0,68,71.866679,6.588333,0
+Fuzz 9,0,87,72.411008,8.511957,0
+Fuzz 10,0,101,73.192956,8.427286,0
+Fuzz 11,0,109,71.75454,12.363347,0
+Fuzz 12,0,75,71.325809,10.042042,0
+Fuzz 13,0,81,72.198023,10.971397,0
+Fuzz 14,0,123,73.400028,37.062877,0
+Fuzz 15,0,88,71.692405,10.103537,0
+Fuzz 16,0,77,73.568641,16.107485,0
+Fuzz 17,0,76,72.608564,2.536401,0
+Fuzz 18,0,76,71.01301,7.130469,0
+Fuzz 19,0,102,74.123059,42.80197,0
+Fuzz 20,0,73,70.204828,7.699993,0
+Fuzz 21,0,104,70.702909,5.445061,0
+Fuzz 22,0,124,74.250535,27.19599,0
+Fuzz 23,0,56,73.663643,4.572705,0
+Fuzz 24,0,89,72.545169,25.390417,0
+Fuzz 25,0,103,71.508765,7.106298,0
+Fuzz 26,0,74,71.752802,4.688547,0
+Fuzz 27,0,123,72.288733,11.970929,0
+Fuzz 28,0,93,72.23819,7.133517,0
+Fuzz 29,0,73,72.723567,15.689035,0
+Fuzz 30,0,107,72.779639,34.57038,0
+Fuzz 31,0,68,73.91556,15.050839,0
+Fuzz 32,0,119,74.011662,24.672744,0
+Fuzz 33,0,66,72.759522,15.281775,0
+Fuzz 34,0,98,75.320805,36.071241,0
+Fuzz 35,0,122,71.982428,6.910147,0
+Fuzz 36,0,109,73.206738,15.665514,0
+Fuzz 37,0,105,71.534386,13.393704,0
+Fuzz 38,0,112,71.841921,15.519651,0
+Fuzz 39,0,96,72.200166,11.267474,0
+Fuzz 40,0,107,72.873242,58.34355,0
+Fuzz 41,0,102,72.439933,8.133765,0
+Fuzz 42,0,82,73.509438,7.258911,0
+Fuzz 43,0,89,72.094314,2.74626,0
+Fuzz 44,1,83,72.089796,5.675771,75.510342
+Fuzz 45,0,63,72.972975,10.099044,0
+Fuzz 46,0,105,71.213067,6.360414,0
+Fuzz 47,0,102,73.265717,15.688208,0
+Fuzz 48,0,90,72.565605,18.699586,0
+Fuzz 49,0,78,71.644537,8.888923,0
+Fuzz 50,0,69,71.462196,4.431893,0
+Fuzz 2,0,80,72.453536,12.114278,0
+Fuzz 3,0,63,72.517136,11.373753,0
+Fuzz 4,0,104,73.97432,31.150566,0
+Fuzz 5,0,58,72.328685,3.159559,0
+Fuzz 6,0,124,74.015041,23.202303,0
+Fuzz 7,0,103,71.65224,14.759366,0
+Fuzz 8,0,98,71.286252,18.866778,0
+Fuzz 9,0,83,70.742054,6.402028,0
+Fuzz 10,0,94,71.729167,9.388987,0
+Fuzz 11,0,84,71.426962,7.169716,0
+Fuzz 12,0,88,69.551652,6.415524,0
+Fuzz 13,0,93,70.707445,8.195321,0
+Fuzz 14,0,128,72.402089,32.93753,0
+Fuzz 15,0,84,71.24155,6.501453,0
+Fuzz 16,0,102,73.099456,28.36637,0
+Fuzz 17,0,71,72.483117,2.571123,0
+Fuzz 18,0,86,71.6757,11.074442,0
+Fuzz 19,0,87,69.786326,9.453817,0
+Fuzz 20,0,80,71.951487,11.311706,0
+Fuzz 21,0,90,69.998948,7.30184,0
+Fuzz 22,0,96,69.937028,10.485622,0
+Fuzz 23,0,122,72.937042,3.779915,0
+Fuzz 24,0,81,70.152293,5.838414,0
+Fuzz 25,0,83,70.296792,14.194863,0
+Fuzz 26,0,73,70.273775,5.600256,0
+Fuzz 27,0,73,72.106063,11.098482,0
+Fuzz 28,0,88,71.198025,11.170127,0
+Fuzz 29,0,82,72.061103,7.114787,0
+Fuzz 30,0,72,72.03414,8.746053,0
+Fuzz 31,0,95,71.432115,12.703863,0
+Fuzz 32,0,75,74.539289,2.912936,0
+Fuzz 33,0,147,75.805866,31.950459,0
+Fuzz 34,0,96,76.605096,6.417733,0
+Fuzz 35,0,103,74.515318,16.433631,0
+Fuzz 36,0,80,72.031638,8.370058,0
+Fuzz 37,0,102,71.07034,6.096283,0
+Fuzz 38,0,72,71.617438,5.754422,0
+Fuzz 39,0,106,72.424213,16.680144,0
+Fuzz 40,0,76,73.085374,13.152977,0
+Fuzz 41,0,81,72.317022,10.621502,0
+Fuzz 42,0,89,72.285143,13.358788,0
+Fuzz 43,0,74,71.096194,3.559187,0
+Fuzz 44,0,104,73.141895,44.176248,0
+Fuzz 45,0,103,72.055821,225.382592,0
+Fuzz 46,0,114,74.415564,66.718136,0
+Fuzz 47,0,97,70.234806,10.321466,0
+Fuzz 48,0,94,70.568098,11.340579,0
+Fuzz 49,0,72,71.792731,10.17457,0
+Fuzz 50,0,77,71.178215,7.027224,0
+Fuzz 2,0,130,72.652363,24.842431,0
+Fuzz 3,0,84,70.413549,1.427528,0
+Fuzz 4,0,89,72.640551,13.251102,0
+Fuzz 5,0,87,71.649098,7.604114,0
+Fuzz 6,0,102,71.513886,8.932548,0
+Fuzz 7,0,63,72.126387,9.779601,0
+Fuzz 8,0,73,70.749133,2.82857,0
+Fuzz 9,0,89,71.228548,5.845828,0
+Fuzz 10,0,108,72.253296,10.593245,0
+Fuzz 11,1,78,87.763081,18.486191,58.341691
+Fuzz 12,0,85,70.425584,19.465288,0
+Fuzz 13,0,93,70.821527,7.273236,0
+Fuzz 14,0,105,71.440988,5.871383,0
+Fuzz 15,0,109,72.969092,37.112027,0
+Fuzz 16,0,87,71.751572,9.141122,0
+Fuzz 17,0,88,72.74596,12.387498,0
+Fuzz 18,0,101,73.290925,69.05081,0
+Fuzz 19,0,44,72.462591,3.913623,0
+Fuzz 20,0,81,71.554129,12.004108,0
+Fuzz 21,0,88,71.289806,9.379907,0
+Fuzz 22,0,83,70.728775,1.666329,0
+Fuzz 23,0,110,74.596931,55.224143,0
+Fuzz 24,0,77,71.225885,13.515606,0
+Fuzz 25,0,101,72.105442,16.577559,0
+Fuzz 26,0,73,73.639922,12.931102,0
+Fuzz 27,0,105,70.147273,9.562166,0
+Fuzz 28,0,101,71.372051,12.63437,0
+Fuzz 29,0,98,73.036063,11.734535,0
+Fuzz 30,0,81,72.170574,4.445734,0
+Fuzz 31,0,80,71.399221,11.023257,0
+Fuzz 32,0,95,72.444434,25.24875,0
+Fuzz 33,0,91,69.893361,7.365853,0
+Fuzz 34,0,83,71.252914,4.243262,0
+Fuzz 35,0,80,72.421499,8.589939,0
+Fuzz 36,0,102,72.288818,16.246236,0
+Fuzz 37,0,86,70.893876,17.105871,0
+Fuzz 38,0,119,72.505129,34.623274,0
+Fuzz 39,0,76,70.687317,13.964887,0
+Fuzz 40,0,89,71.186744,4.779621,0
+Fuzz 41,0,61,72.175784,7.89581,0
+Fuzz 42,0,87,70.124146,9.264527,0
+Fuzz 43,0,96,73.171081,13.470545,0
+Fuzz 44,0,104,72.228256,50.197167,0
+Fuzz 45,0,109,73.424177,24.924824,0
+Fuzz 46,0,82,69.995626,7.565415,0
+Fuzz 47,0,87,71.597328,5.910993,0
+Fuzz 48,0,65,70.84573,5.656985,0
+Fuzz 49,0,88,69.895252,5.728363,0
+Fuzz 50,0,108,72.839508,16.32903,0
+Fuzz 2,0,72,71.570807,5.062307,0
+Fuzz 3,0,81,73.066851,9.829039,0
+Fuzz 4,0,91,70.30834,6.876517,0
+Fuzz 5,0,65,70.891005,9.634203,0
+Fuzz 6,0,138,73.793375,20.927909,0
+Fuzz 7,0,73,72.805524,8.808437,0
+Fuzz 8,1,77,71.621109,2.564119,0
+Fuzz 9,0,113,76.036203,11.916237,0
+Fuzz 10,0,73,71.597415,7.827657,0
+Fuzz 11,0,143,72.969273,7.070752,0
+Fuzz 12,0,66,72.433381,7.185585,0
+Fuzz 13,0,103,72.774331,13.712851,0
+Fuzz 14,0,121,72.687816,16.250874,0
+Fuzz 15,1,147,70.761737,4.208314,253.073096
+Fuzz 16,0,78,72.564808,6.464812,0
+Fuzz 17,0,102,70.975249,6.287391,0
+Fuzz 18,0,77,70.322686,6.375694,0
+Fuzz 19,0,116,72.120859,23.215707,0
+Fuzz 20,1,87,71.876756,2.52962,0
+Fuzz 21,0,85,70.98473,17.186384,0
+Fuzz 22,0,103,71.999127,16.095674,0
+Fuzz 23,1,127,72.338541,25.849295,54.069601
+Fuzz 24,0,72,76.900108,23.55292,0
+Fuzz 25,0,118,72.531831,191.274451,0
+Fuzz 26,0,117,71.275156,13.43218,0
+Fuzz 27,0,102,71.016927,11.689054,0
+Fuzz 28,0,115,70.60474,28.366648,0
+Fuzz 29,0,81,72.237162,12.902347,0
+Fuzz 30,0,84,73.718401,17.874899,0
+Fuzz 31,0,80,71.130587,7.69687,0
+Fuzz 32,0,89,71.836942,8.920664,0
+Fuzz 33,1,111,73.904151,811.28165,0
+Fuzz 34,0,64,71.102246,2.17824,0
+Fuzz 35,0,104,71.567307,22.869486,0
+Fuzz 36,0,84,72.727644,18.747713,0
+Fuzz 37,0,74,71.309416,8.372306,0
+Fuzz 38,0,79,71.793269,9.624851,0
+Fuzz 39,0,99,71.156771,12.466283,0
+Fuzz 40,0,107,71.744553,12.967492,0
+Fuzz 41,0,66,70.002495,4.450567,0
+Fuzz 42,0,89,73.267916,16.409105,0
+Fuzz 43,0,61,71.865862,9.493966,0
+Fuzz 44,0,72,71.225714,11.39844,0
+Fuzz 45,0,72,71.472765,4.208206,0
+Fuzz 46,1,79,71.208526,10.613947,726.465447
+Fuzz 47,0,87,71.393222,9.422436,0
+Fuzz 48,0,72,70.236031,6.697532,0
+Fuzz 49,0,69,71.868467,15.120174,0
+Fuzz 50,0,88,71.076686,11.51874,0
+Fuzz 2,1,91,73.923236,900.072731,0
+Fuzz 3,0,89,70.773858,4.736542,0
+Fuzz 4,0,154,72.895053,19.966724,0
+Fuzz 5,0,66,71.846221,7.158155,0
+Fuzz 6,0,76,72.256024,5.380297,0
+Fuzz 7,0,67,71.291121,3.754148,0
+Fuzz 8,0,76,70.113693,3.309482,0
+Fuzz 9,0,136,73.494319,18.346705,0
+Fuzz 10,0,79,73.153498,8.66863,0
+Fuzz 11,0,116,74.16599,16.968075,0
+Fuzz 12,0,100,71.722599,13.783979,0
+Fuzz 13,0,101,71.439227,22.873748,0
+Fuzz 14,0,116,72.539533,15.346438,0
+Fuzz 15,0,65,73.096179,33.408653,0
+Fuzz 16,1,71,72.545673,21.981318,603.986408
+Fuzz 17,0,85,72.206488,18.262857,0
+Fuzz 18,0,122,71.959227,16.286186,0
+Fuzz 19,0,61,74.503524,4.813178,0
+Fuzz 20,0,111,72.492045,3.194944,0
+Fuzz 21,0,79,73.253246,9.42356,0
+Fuzz 22,0,101,71.9112,10.380977,0
+Fuzz 23,0,92,73.124606,9.339151,0
+Fuzz 24,0,71,71.900037,6.700488,0
+Fuzz 25,0,83,76.256628,14.000836,0
+Fuzz 26,0,115,74.659592,7.258768,0
+Fuzz 27,0,82,71.672356,4.049504,0
+Fuzz 28,0,82,71.931213,6.920428,0
+Fuzz 29,0,133,71.714382,15.931039,0
+Fuzz 30,0,85,71.009997,6.028996,0
+Fuzz 31,0,93,70.874478,16.539327,0
+Fuzz 32,0,102,72.522219,6.829983,0
+Fuzz 33,0,65,71.349655,3.448149,0
+Fuzz 34,0,83,73.361488,13.08654,0
+Fuzz 35,0,78,72.19268,5.15207,0
+Fuzz 36,0,98,72.354412,7.783253,0
+Fuzz 37,0,64,72.519981,11.942273,0
+Fuzz 38,0,66,72.557553,10.537973,0
+Fuzz 39,0,68,72.116399,10.663777,0
+Fuzz 40,0,64,72.118608,4.556776,0
+Fuzz 41,0,82,71.688322,5.584313,0
+Fuzz 42,0,89,70.221952,8.875782,0
+Fuzz 43,0,94,71.69405,6.567783,0
+Fuzz 44,0,59,71.780921,5.213879,0
+Fuzz 45,0,72,70.89926,3.508144,0
+Fuzz 46,0,113,72.909015,10.42333,0
+Fuzz 47,0,92,72.212467,4.655538,0
+Fuzz 48,0,94,72.509862,12.824499,0
+Fuzz 49,0,86,72.730606,9.403698,0
+Fuzz 50,0,59,71.138054,7.211499,0
+Fuzz 2,1,127,72.510348,2.434634,0
+Fuzz 3,0,73,71.025377,12.434621,0
+Fuzz 4,0,110,71.49612,19.15037,0
+Fuzz 5,0,98,71.424949,5.617062,0
+Fuzz 6,0,112,72.363722,24.982135,0
+Fuzz 7,0,116,71.521046,9.538825,0
+Fuzz 8,0,74,72.314772,3.883923,0
+Fuzz 9,0,100,69.997261,3.403312,0
+Fuzz 10,0,116,73.081483,11.643975,0
+Fuzz 11,0,87,73.924464,20.145395,0
+Fuzz 12,0,116,74.044808,34.351607,0
+Fuzz 13,0,95,71.268649,9.708175,0
+Fuzz 14,0,63,71.302469,14.400037,0
+Fuzz 15,0,114,73.216351,6.092739,0
+Fuzz 16,0,110,70.852568,7.603858,0
+Fuzz 17,0,115,76.128493,144.198445,0
+Fuzz 18,0,68,77.029883,6.378753,0
+Fuzz 19,0,100,72.97255,36.664687,0
+Fuzz 20,0,88,70.207832,5.630741,0
+Fuzz 21,0,96,74.203787,10.040964,0
+Fuzz 22,0,92,72.447084,7.54614,0
+Fuzz 23,0,116,74.053569,44.397344,0
+Fuzz 24,0,101,71.261814,11.940303,0
+Fuzz 25,0,97,71.872024,10.24049,0
+Fuzz 26,0,84,71.495344,7.80159,0
+Fuzz 27,0,131,72.135369,11.79459,0
+Fuzz 28,0,69,71.695368,4.703967,0
+Fuzz 29,0,101,73.164894,10.113277,0
+Fuzz 30,0,74,71.746153,5.99708,0
+Fuzz 31,0,117,72.341167,38.163748,0
+Fuzz 32,0,73,72.065694,7.325596,0
+Fuzz 33,0,88,72.623503,12.09129,0
+Fuzz 34,0,96,73.880035,30.267829,0
+Fuzz 35,0,100,71.690386,17.604085,0
+Fuzz 36,0,75,70.950153,7.400055,0
+Fuzz 37,0,93,71.980465,8.667215,0
+Fuzz 38,0,102,72.544677,46.281452,0
+Fuzz 39,0,82,70.738532,4.722599,0
+Fuzz 40,0,59,75.677984,5.256104,0
+Fuzz 41,0,64,72.441764,11.663375,0
+Fuzz 42,0,51,71.282393,9.005208,0
+Fuzz 43,0,93,71.302017,4.91243,0
+Fuzz 44,0,74,71.107309,11.985104,0
+Fuzz 45,0,79,84.952983,19.85738,0
+Fuzz 46,0,68,73.747697,12.877095,0
+Fuzz 47,0,67,70.434345,8.006248,0
+Fuzz 48,0,119,70.495093,13.561717,0
+Fuzz 49,0,139,73.34205,45.518594,0
+Fuzz 50,0,100,72.301163,8.312495,0
+Fuzz 2,0,74,70.093612,4.493758,0
+Fuzz 3,0,85,72.049374,6.691549,0
+Fuzz 4,0,86,72.026313,8.244669,0
+Fuzz 5,0,81,72.867764,12.035154,0
+Fuzz 6,0,73,74.082267,5.684248,0
+Fuzz 7,0,65,69.83771,2.263197,0
+Fuzz 8,0,84,72.764283,6.790675,0
+Fuzz 9,0,83,75.245522,16.733199,0
+Fuzz 10,0,96,72.553476,7.473348,0
+Fuzz 11,0,96,73.518708,21.359752,0
+Fuzz 12,0,47,72.804797,8.887458,0
+Fuzz 13,0,69,71.00214,7.057209,0
+Fuzz 14,0,134,73.233574,19.564375,0
+Fuzz 15,0,75,72.908495,15.50845,0
+Fuzz 16,0,87,71.636344,7.72179,0
+Fuzz 17,0,84,72.221582,15.74872,0
+Fuzz 18,1,91,71.703712,11.532388,359.879727
+Fuzz 19,0,125,73.543084,12.314711,0
+Fuzz 20,1,80,71.401645,14.538315,396.771197
+Fuzz 21,0,65,71.43881,8.626555,0
+Fuzz 22,0,92,72.505163,7.913815,0
+Fuzz 23,0,33,72.83336,2.756963,0
+Fuzz 24,1,136,74.40928,45.163875,386.744332
+Fuzz 25,1,96,70.939745,2.791638,0
+Fuzz 26,0,111,72.87638,10.56966,0
+Fuzz 27,0,81,72.22867,9.696485,0
+Fuzz 28,0,97,71.827767,11.539604,0
+Fuzz 29,0,77,70.992101,7.651072,0
+Fuzz 30,0,73,69.309295,7.733202,0
+Fuzz 31,0,93,71.682495,8.916871,0
+Fuzz 32,0,107,71.845283,12.171461,0
+Fuzz 33,0,62,70.222585,5.047255,0
+Fuzz 34,0,55,72.388036,2.592892,0
+Fuzz 35,0,106,72.307431,11.743243,0
+Fuzz 36,0,79,72.309002,10.649676,0
+Fuzz 37,0,80,72.673296,9.205421,0
+Fuzz 38,0,84,71.614436,15.731459,0
+Fuzz 39,0,115,73.280006,14.585897,0
+Fuzz 40,0,91,71.47269,9.30927,0
+Fuzz 41,0,74,74.449712,6.382678,0
+Fuzz 42,0,86,77.519642,13.009363,0
+Fuzz 43,0,86,72.231998,20.454492,0
+Fuzz 44,0,61,70.314328,3.555929,0
+Fuzz 45,0,107,72.195157,34.152279,0
+Fuzz 46,0,89,72.022408,105.097192,0
+Fuzz 47,0,72,71.041406,6.304393,0
+Fuzz 48,0,86,70.153741,6.591954,0
+Fuzz 49,0,74,71.5942,9.577979,0
+Fuzz 50,0,87,71.59443,16.983511,0
+Fuzz 2,0,115,72.886298,47.508455,0
+Fuzz 3,0,80,72.404689,10.177548,0
+Fuzz 4,0,75,72.702935,5.305093,0
+Fuzz 5,0,61,71.260558,10.169716,0
+Fuzz 6,0,63,71.94155,7.422682,0
+Fuzz 7,0,67,72.244649,6.318076,0
+Fuzz 8,0,99,71.635847,8.201593,0
+Fuzz 9,0,116,73.826271,47.197417,0
+Fuzz 10,0,56,70.927571,3.362298,0
+Fuzz 11,0,67,72.198447,4.209373,0
+Fuzz 12,0,110,71.107086,7.685288,0
+Fuzz 13,0,133,73.169545,19.584185,0
+Fuzz 14,0,86,73.918002,44.212852,0
+Fuzz 15,0,105,73.821872,8.39802,0
+Fuzz 16,0,105,71.935389,16.825918,0
+Fuzz 17,0,100,71.381549,12.318119,0
+Fuzz 18,0,56,70.436701,5.921353,0
+Fuzz 19,0,105,71.829092,14.087653,0
+Fuzz 20,0,102,71.277467,9.634755,0
+Fuzz 21,0,90,71.750872,8.22486,0
+Fuzz 22,0,114,71.140029,9.398231,0
+Fuzz 23,0,85,70.23645,9.295833,0
+Fuzz 24,0,119,71.925491,12.133447,0
+Fuzz 25,0,114,71.811021,19.042184,0
+Fuzz 26,0,94,71.311836,7.420313,0
+Fuzz 27,0,102,72.103006,3.634101,0
+Fuzz 28,0,133,74.355063,26.91391,0
+Fuzz 29,0,87,72.596677,5.808479,0
+Fuzz 30,0,98,71.723543,6.691221,0
+Fuzz 31,0,82,70.687855,2.75887,0
+Fuzz 32,0,96,72.015696,3.928128,0
+Fuzz 33,0,78,71.849782,16.755743,0
+Fuzz 34,0,75,71.534745,7.994886,0
+Fuzz 35,0,147,72.781978,25.555411,0
+Fuzz 36,0,100,74.162899,18.965671,0
+Fuzz 37,0,93,70.939953,3.444565,0
+Fuzz 38,0,89,71.550756,6.680027,0
+Fuzz 39,0,109,73.753803,40.109624,0
+Fuzz 40,0,58,71.350882,5.774939,0
+Fuzz 41,0,105,71.902482,41.360218,0
+Fuzz 42,0,102,74.047432,56.618188,0
+Fuzz 43,0,104,72.786801,16.696784,0
+Fuzz 44,0,76,72.031158,6.824245,0
+Fuzz 45,0,93,71.499209,6.125122,0
+Fuzz 46,0,90,71.731864,17.854835,0
+Fuzz 47,0,73,71.776155,4.459994,0
+Fuzz 48,0,64,72.04088,12.177297,0
+Fuzz 49,0,114,72.248026,23.807083,0
+Fuzz 50,0,121,71.544781,9.017215,0
+Fuzz 2,0,77,72.015674,8.20214,0
+Fuzz 3,0,103,73.271762,12.463575,0
+Fuzz 4,0,99,73.101077,21.005139,0
+Fuzz 5,0,85,72.405227,14.111219,0
+Fuzz 6,0,53,72.63217,4.830606,0
+Fuzz 7,0,80,83.930649,10.219885,0
+Fuzz 8,0,91,104.415433,4.071275,0
+Fuzz 9,0,109,71.954362,6.343917,0
+Fuzz 10,0,77,72.461421,9.389814,0
+Fuzz 11,0,87,73.094489,8.187421,0
+Fuzz 12,0,108,71.57505,3.609616,0
+Fuzz 13,0,85,72.32066,6.442385,0
+Fuzz 14,0,48,72.345877,4.687499,0
+Fuzz 15,0,81,70.315085,6.276655,0
+Fuzz 16,0,74,71.00872,6.614314,0
+Fuzz 17,0,141,72.928408,27.255631,0
+Fuzz 18,0,103,72.996338,17.187578,0
+Fuzz 19,1,59,70.999092,2.773226,240.532422
+Fuzz 20,0,51,69.803571,4.384196,0
+Fuzz 21,0,74,73.128168,8.003096,0
+Fuzz 22,0,118,75.844348,18.677642,0
+Fuzz 23,1,86,74.026298,11.735696,725.64759
+Fuzz 24,0,97,69.672896,8.305326,0
+Fuzz 25,0,103,71.35593,8.876554,0
+Fuzz 26,0,94,70.764737,11.513662,0
+Fuzz 27,1,62,71.507506,3.742496,0
+Fuzz 28,0,104,70.8593,10.821577,0
+Fuzz 29,0,98,72.588432,15.921247,0
+Fuzz 30,0,98,71.474436,5.123989,0
+Fuzz 31,0,96,71.239445,9.929966,0
+Fuzz 32,0,89,72.077979,44.119806,0
+Fuzz 33,0,71,71.091569,4.42451,0
+Fuzz 34,0,86,70.867841,6.898928,0
+Fuzz 35,0,71,69.812258,6.629021,0
+Fuzz 36,0,63,71.854805,6.097941,0
+Fuzz 37,1,76,71.269036,5.38864,59.597956
+Fuzz 38,1,101,72.269449,6.800112,0
+Fuzz 39,0,78,72.363032,8.991274,0
+Fuzz 40,0,90,71.646276,7.843268,0
+Fuzz 41,0,72,70.148209,3.534746,0
+Fuzz 42,0,59,70.858509,4.895693,0
+Fuzz 43,0,76,70.831171,7.57619,0
+Fuzz 44,0,124,71.903668,13.266757,0
+Fuzz 45,0,70,70.253124,4.545715,0
+Fuzz 46,0,111,73.621581,10.962017,0
+Fuzz 47,0,95,71.635367,11.813459,0
+Fuzz 48,0,70,71.406957,7.686424,0
+Fuzz 49,0,77,73.527776,7.064268,0
+Fuzz 50,0,54,72.318145,13.591332,0
+Fuzz 2,0,96,72.140991,18.8979,0
+Fuzz 3,0,123,72.633563,23.552454,0
+Fuzz 4,0,91,72.404132,14.328749,0
+Fuzz 5,0,97,72.69471,15.592652,0
+Fuzz 6,0,57,72.902943,6.264624,0
+Fuzz 7,0,105,72.832251,9.567153,0
+Fuzz 8,0,84,72.653853,20.050864,0
+Fuzz 9,1,63,71.917576,6.486941,67.38218
+Fuzz 10,0,68,71.669027,6.701393,0
+Fuzz 11,0,54,71.636531,4.887407,0
+Fuzz 12,0,73,71.41741,8.128257,0
+Fuzz 13,0,84,72.469693,9.551136,0
+Fuzz 14,0,95,71.811995,9.737591,0
+Fuzz 15,0,91,71.02475,18.693336,0
+Fuzz 16,0,67,71.701173,9.445171,0
+Fuzz 17,0,84,70.447601,9.425132,0
+Fuzz 18,0,105,71.455129,18.286318,0
+Fuzz 19,0,62,70.764601,3.047091,0
+Fuzz 20,0,101,71.810434,15.219236,0
+Fuzz 21,0,111,72.837576,16.917914,0
+Fuzz 22,0,63,72.139171,20.493392,0
+Fuzz 23,0,76,72.787429,6.689882,0
+Fuzz 24,0,121,72.10353,36.88532,0
+Fuzz 25,0,85,72.057036,19.163977,0
+Fuzz 26,0,70,72.691304,7.547862,0
+Fuzz 27,0,85,72.762551,8.473806,0
+Fuzz 28,0,84,71.642236,16.337392,0
+Fuzz 29,0,79,70.942708,6.471768,0
+Fuzz 30,0,90,72.152702,8.242522,0
+Fuzz 31,0,92,70.515674,9.130582,0
+Fuzz 32,0,78,72.471028,4.625099,0
+Fuzz 33,0,72,69.740815,3.34886,0
+Fuzz 34,0,85,72.629817,9.240952,0
+Fuzz 35,0,89,73.341709,26.875923,0
+Fuzz 36,0,87,70.928115,15.314153,0
+Fuzz 37,0,104,73.338862,24.410643,0
+Fuzz 38,0,48,71.93438,4.640306,0
+Fuzz 39,0,92,83.821117,15.017357,0
+Fuzz 40,0,112,74.993955,71.20637,0
+Fuzz 41,0,82,72.423607,21.366783,0
+Fuzz 42,0,70,72.07567,4.574958,0
+Fuzz 43,0,81,71.262935,8.534768,0
+Fuzz 44,0,103,71.06525,12.737206,0
+Fuzz 45,0,70,71.075801,2.729177,0
+Fuzz 46,0,63,72.152416,5.025018,0
+Fuzz 47,0,77,71.423131,6.316477,0
+Fuzz 48,0,73,70.985187,3.957906,0
+Fuzz 49,0,89,71.378887,11.984809,0
+Fuzz 50,0,88,71.564311,8.558709,0
+Fuzz 2,0,70,71.615606,9.541777,0
+Fuzz 3,0,107,71.708688,38.31662,0
+Fuzz 4,0,81,72.893215,15.904418,0
+Fuzz 5,0,105,73.105671,7.197908,0
+Fuzz 6,0,70,73.442119,4.725963,0
+Fuzz 7,0,81,71.550354,10.443904,0
+Fuzz 8,0,112,72.397975,15.954062,0
+Fuzz 9,0,61,73.13851,16.666076,0
+Fuzz 10,0,101,71.921084,13.048184,0
+Fuzz 11,0,87,72.341699,5.494095,0
+Fuzz 12,0,88,71.69416,11.227643,0
+Fuzz 13,0,92,73.271239,6.462741,0
+Fuzz 14,0,104,72.618414,11.840344,0
+Fuzz 15,0,107,74.456351,32.964725,0
+Fuzz 16,0,67,72.70482,32.626478,0
+Fuzz 17,0,73,73.115828,13.269631,0
+Fuzz 18,0,88,73.131116,17.547622,0
+Fuzz 19,0,76,71.6923,9.201799,0
+Fuzz 20,0,84,72.094125,7.539895,0
+Fuzz 21,0,53,70.889326,6.113774,0
+Fuzz 22,0,91,71.625746,14.932955,0
+Fuzz 23,0,64,70.471446,7.909654,0
+Fuzz 24,0,98,71.24744,18.876843,0
+Fuzz 25,0,88,70.799289,5.71941,0
+Fuzz 26,0,97,72.279843,41.951635,0
+Fuzz 27,0,98,71.547773,21.224422,0
+Fuzz 28,0,85,71.385428,8.611112,0
+Fuzz 29,0,66,71.423627,8.231283,0
+Fuzz 30,0,91,71.428977,10.538395,0
+Fuzz 31,0,77,72.688274,3.429673,0
+Fuzz 32,0,89,74.084621,27.086983,0
+Fuzz 33,0,95,71.966783,13.03026,0
+Fuzz 34,0,109,73.568754,14.489367,0
+Fuzz 35,0,92,73.611342,17.3287,0
+Fuzz 36,1,113,73.234816,23.66569,679.507978
+Fuzz 37,1,100,71.69395,17.690541,91.271185
+Fuzz 38,0,58,70.02131,5.208793,0
+Fuzz 39,0,109,72.480923,18.605858,0
+Fuzz 40,0,120,70.996573,7.032137,0
+Fuzz 41,1,94,71.831058,7.188933,110.253154
+Fuzz 42,0,82,71.811334,4.0718,0
+Fuzz 43,0,128,71.048916,14.698368,0
+Fuzz 44,0,87,72.692999,5.39063,0
+Fuzz 45,0,92,72.845869,9.185946,0
+Fuzz 46,0,101,70.833958,5.530532,0
+Fuzz 47,0,71,71.192825,6.798723,0
+Fuzz 48,0,115,70.993922,20.04578,0
+Fuzz 49,0,68,71.155746,9.530098,0
+Fuzz 50,0,102,71.202562,7.047343,0
+Fuzz 2,0,236,78.716897,505.416207,0
+Fuzz 3,1,161,74.545999,396.767436,0
+Fuzz 4,0,146,75.940006,102.928417,0
+Fuzz 5,0,166,72.959564,15.251962,0
+Fuzz 6,0,179,74.467046,200.464793,0
+Fuzz 7,0,210,74.940093,50.737056,0
+Fuzz 8,0,223,74.163877,45.993998,0
+Fuzz 9,0,192,71.322753,27.964442,0
+Fuzz 10,0,235,80.183532,312.660263,0
+Fuzz 11,0,124,72.142751,16.152375,0
+Fuzz 12,0,224,76.318785,448.695692,0
+Fuzz 13,0,229,74.541889,25.985973,0
+Fuzz 14,0,226,75.939121,56.332232,0
+Fuzz 15,0,217,74.941376,133.429237,0
+Fuzz 16,0,309,77.994622,60.832027,0
+Fuzz 17,1,186,74.64422,624.215162,479.549072
+Fuzz 18,1,198,80.213434,865.744318,0
+Fuzz 19,0,233,75.705069,280.115525,0
+Fuzz 20,0,131,74.091848,24.962645,0
+Fuzz 21,0,153,75.144312,53.058684,0
+Fuzz 22,0,243,76.993753,76.794865,0
+Fuzz 23,0,201,76.064243,46.755812,0
+Fuzz 24,0,215,74.932315,331.109758,0
+Fuzz 25,1,237,76.643573,99.02344,85.781761
+Fuzz 26,1,272,76.214121,94.794676,278.10221
+Fuzz 27,0,161,74.14065,20.180435,0
+Fuzz 28,0,203,74.076747,33.772102,0
+Fuzz 29,1,203,74.738919,55.157572,64.560927
+Fuzz 30,0,188,72.788169,36.676919,0
+Fuzz 31,0,188,74.95398,220.662265,0
+Fuzz 32,0,209,74.13673,64.922408,0
+Fuzz 33,1,164,72.409383,342.223772,0
+Fuzz 34,0,246,72.861721,31.559325,0
+Fuzz 35,0,138,73.074988,17.855677,0
+Fuzz 36,1,155,76.940531,900.077123,0
+Fuzz 37,0,177,72.327001,18.291465,0
+Fuzz 38,1,306,81.659502,900.10339,0
+Fuzz 39,0,179,73.630901,13.85058,0
+Fuzz 40,0,205,73.894434,27.092742,0
+Fuzz 41,0,151,73.290053,16.504929,0
+Fuzz 42,0,164,72.229253,20.238046,0
+Fuzz 43,0,156,74.258682,123.615765,0
+Fuzz 44,0,158,73.319016,48.929958,0
+Fuzz 45,0,156,72.800318,20.09692,0
+Fuzz 46,1,204,75.990514,98.089924,601.393022
+Fuzz 47,0,332,74.388257,229.148342,0
+Fuzz 48,0,196,76.054881,96.957785,0
+Fuzz 49,0,135,71.735488,13.622325,0
+Fuzz 50,0,247,77.028219,304.963232,0
+Fuzz 2,0,166,72.305203,78.444367,0
+Fuzz 3,0,182,73.779503,224.981051,0
+Fuzz 4,0,190,77.638373,164.194262,0
+Fuzz 5,0,244,74.168343,58.860119,0
+Fuzz 6,1,185,76.571965,464.013217,0
+Fuzz 7,1,204,76.589956,774.533673,0
+Fuzz 8,0,160,72.986593,38.395647,0
+Fuzz 9,1,265,75.187898,900.080098,0
+Fuzz 10,0,136,71.975188,6.136885,0
+Fuzz 11,0,156,73.725002,44.095548,0
+Fuzz 12,0,186,75.791617,47.714439,0
+Fuzz 13,1,159,75.746509,34.896951,667.169669
+Fuzz 14,0,132,74.795544,30.318306,0
+Fuzz 15,0,185,72.947239,103.04182,0
+Fuzz 16,0,201,74.94783,49.918728,0
+Fuzz 17,0,180,75.140359,126.804363,0
+Fuzz 18,0,210,75.382385,120.602251,0
+Fuzz 19,0,191,75.246816,101.796002,0
+Fuzz 20,0,210,73.667074,72.10939,0
+Fuzz 21,0,247,75.712538,106.125578,0
+Fuzz 22,0,124,73.156625,66.821809,0
+Fuzz 23,0,175,74.742518,33.579225,0
+Fuzz 24,1,337,80.291214,900.087842,0
+Fuzz 25,0,129,74.828524,12.181682,0
+Fuzz 26,0,244,73.260528,11.574594,0
+Fuzz 27,0,240,77.197876,99.145049,0
+Fuzz 28,0,210,75.693693,200.77969,0
+Fuzz 29,0,235,72.337295,26.600018,0
+Fuzz 30,1,197,74.174746,324.578136,0
+Fuzz 31,1,177,72.073438,2.942739,0
+Fuzz 32,0,151,75.564931,88.565394,0
+Fuzz 33,0,149,74.268908,189.178574,0
+Fuzz 34,0,189,77.735348,215.824269,0
+Fuzz 35,0,180,75.48696,46.271106,0
+Fuzz 36,0,152,72.266507,35.542631,0
+Fuzz 37,0,197,75.308723,59.993798,0
+Fuzz 38,0,200,74.829037,35.347271,0
+Fuzz 39,1,202,78.956591,900.075325,0
+Fuzz 40,0,144,92.620741,181.943731,0
+Fuzz 41,0,192,74.366602,522.115209,0
+Fuzz 42,0,201,75.202491,139.940406,0
+Fuzz 43,1,186,73.590843,51.313228,71.989015
+Fuzz 44,0,222,76.801595,155.469169,0
+Fuzz 45,0,128,75.06676,25.814082,0
+Fuzz 46,0,231,74.984138,75.372296,0
+Fuzz 47,0,109,70.831843,6.540959,0
+Fuzz 48,0,176,75.152017,404.689261,0
+Fuzz 49,1,299,79.692058,723.404299,0
+Fuzz 50,0,163,73.288645,8.474586,0
+Fuzz 2,0,189,75.58251,100.7113,0
+Fuzz 3,0,214,73.540782,55.173957,0
+Fuzz 4,0,149,73.547578,27.966826,0
+Fuzz 5,0,138,75.165015,85.49366,0
+Fuzz 6,1,168,79.556486,900.09077,0
+Fuzz 7,1,166,80.001262,900.120728,0
+Fuzz 8,0,275,73.870696,45.408949,0
+Fuzz 9,0,141,73.753105,62.323159,0
+Fuzz 10,0,248,72.039612,11.216623,0
+Fuzz 11,0,145,73.477981,25.654024,0
+Fuzz 12,1,198,73.300491,72.725516,111.896375
+Fuzz 13,0,172,73.691676,52.056427,0
+Fuzz 14,0,169,73.489026,31.891384,0
+Fuzz 15,1,203,75.426754,93.72247,0
+Fuzz 16,0,142,72.816161,12.223761,0
+Fuzz 17,0,168,73.418591,33.090304,0
+Fuzz 18,1,264,79.114692,628.064091,0
+Fuzz 20,0,207,72.455425,22.286984,0
+Fuzz 21,0,120,71.491165,3.81269,0
+Fuzz 22,0,273,74.64214,177.705672,0
+Fuzz 23,0,175,74.367537,29.906376,0
+Fuzz 24,1,235,74.140291,544.463418,0
+Fuzz 25,1,120,74.564309,67.312291,582.213335
+Fuzz 26,0,158,76.335713,124.071116,0
+Fuzz 27,0,211,75.027094,285.822309,0
+Fuzz 28,1,265,80.628375,900.096422,0
+Fuzz 29,0,146,72.409384,8.830218,0
+Fuzz 30,0,132,71.168842,4.038897,0
+Fuzz 31,1,237,79.52206,900.092448,0
+Fuzz 32,0,167,73.723566,72.475615,0
+Fuzz 33,0,175,72.752801,224.159901,0
+Fuzz 34,0,132,72.752787,93.562473,0
+Fuzz 35,0,164,73.285035,40.744865,0
+Fuzz 36,0,179,74.017231,90.506239,0
+Fuzz 37,0,159,73.979289,54.119368,0
+Fuzz 38,0,128,73.229151,215.667686,0
+Fuzz 39,1,246,78.33931,900.084463,0
+Fuzz 40,1,236,73.48921,36.919931,247.37142
+Fuzz 41,0,195,75.288445,215.096541,0
+Fuzz 42,0,229,76.826567,107.369725,0
+Fuzz 43,0,205,78.452844,139.257868,0
+Fuzz 44,0,153,74.165066,59.43742,0
+Fuzz 45,1,183,74.603738,370.550225,0
+Fuzz 46,0,205,77.629405,76.915823,0
+Fuzz 47,0,148,72.343152,37.822025,0
+Fuzz 48,0,113,73.62902,22.134082,0
+Fuzz 49,1,158,75.612704,900.075935,0
+Fuzz 50,0,169,80.902643,53.696064,0
+Fuzz 2,0,159,77.967958,560.552648,0
+Fuzz 3,0,221,74.232076,202.816645,0
+Fuzz 4,0,193,73.463732,20.313747,0
+Fuzz 5,0,175,74.223599,52.015522,0
+Fuzz 6,0,108,74.105471,12.172012,0
+Fuzz 7,0,197,78.785894,136.535575,0
+Fuzz 8,0,143,74.026254,84.959202,0
+Fuzz 9,0,130,72.865785,126.569094,0
+Fuzz 10,0,221,74.798701,49.851237,0
+Fuzz 11,0,92,71.47339,12.829062,0
+Fuzz 12,1,167,76.224049,37.503736,0
+Fuzz 13,0,131,73.294362,26.997463,0
+Fuzz 14,0,208,75.232007,45.537374,0
+Fuzz 15,0,223,81.106915,133.746324,0
+Fuzz 16,1,189,72.312858,490.661609,0
+Fuzz 17,0,153,75.752455,326.197973,0
+Fuzz 18,0,207,74.099083,63.273678,0
+Fuzz 19,0,188,77.557966,245.729273,0
+Fuzz 20,0,105,74.690271,54.48285,0
+Fuzz 21,1,223,76.394786,900.083576,0
+Fuzz 22,0,180,76.819177,268.005987,0
+Fuzz 23,0,176,73.766978,77.212666,0
+Fuzz 24,1,231,76.485164,900.08563,0
+Fuzz 25,1,257,79.129475,783.113418,0
+Fuzz 26,1,209,75.875414,900.078942,0
+Fuzz 27,0,130,73.740712,8.01298,0
+Fuzz 28,1,222,70.235768,4.595067,240.860349
+Fuzz 29,0,150,71.721883,45.237619,0
+Fuzz 30,1,281,76.480432,900.081901,0
+Fuzz 31,0,155,72.01638,23.956317,0
+Fuzz 32,1,218,75.308473,622.365404,0
+Fuzz 33,0,230,79.184276,66.954109,0
+Fuzz 34,0,108,79.37893,4.978209,0
+Fuzz 35,0,121,80.762512,154.016568,0
+Fuzz 36,0,128,74.201109,18.436087,0
+Fuzz 37,0,123,73.410978,14.384374,0
+Fuzz 38,1,183,75.422247,788.858876,0
+Fuzz 39,0,185,74.639979,212.641699,0
+Fuzz 40,1,223,76.436515,900.07952,0
+Fuzz 41,0,145,73.716187,32.16717,0
+Fuzz 42,0,130,73.783983,19.103463,0
+Fuzz 43,0,99,72.12891,7.387767,0
+Fuzz 44,0,204,75.141246,239.601487,0
+Fuzz 45,1,262,81.742181,900.104078,0
+Fuzz 46,0,182,75.319508,62.113623,0
+Fuzz 47,0,114,72.962778,16.580039,0
+Fuzz 48,0,217,77.2447,153.337561,0
+Fuzz 49,0,147,73.560305,83.309955,0
+Fuzz 50,1,318,78.07217,889.668324,0
+Fuzz 2,0,151,73.74827,71.528815,0
+Fuzz 3,0,181,73.551849,19.255369,0
+Fuzz 4,1,205,75.00625,456.581702,0
+Fuzz 5,0,176,74.727858,47.595449,0
+Fuzz 6,0,129,73.500778,22.401938,0
+Fuzz 7,0,231,73.429814,173.567901,0
+Fuzz 8,0,326,74.289793,43.581777,0
+Fuzz 9,0,276,76.210375,216.268518,0
+Fuzz 10,0,170,72.101386,37.643193,0
+Fuzz 11,0,282,77.208172,49.285194,0
+Fuzz 12,1,217,81.15005,728.609648,0
+Fuzz 13,0,136,76.575444,389.020335,0
+Fuzz 14,0,100,72.084217,8.501281,0
+Fuzz 15,0,199,78.793906,628.073942,0
+Fuzz 16,0,204,76.992987,54.305432,0
+Fuzz 17,0,233,75.360539,91.875517,0
+Fuzz 18,0,214,72.861731,19.779882,0
+Fuzz 19,0,177,74.996251,19.623693,0
+Fuzz 20,0,168,76.839342,205.14648,0
+Fuzz 21,0,206,77.766539,135.195299,0
+Fuzz 22,0,140,73.63383,23.186264,0
+Fuzz 23,1,256,75.443634,900.089422,0
+Fuzz 24,0,214,75.909552,504.909162,0
+Fuzz 25,0,162,72.911563,7.663615,0
+Fuzz 26,1,151,72.634255,900.061843,0
+Fuzz 27,0,230,81.593586,174.542232,0
+Fuzz 28,0,260,74.078996,63.278653,0
+Fuzz 29,0,138,74.014359,42.690749,0
+Fuzz 30,0,235,73.766356,43.035746,0
+Fuzz 31,0,115,74.804335,35.796796,0
+Fuzz 32,0,174,76.045145,54.140058,0
+Fuzz 33,0,173,75.557566,48.036288,0
+Fuzz 34,1,180,74.171087,59.947628,333.506705
+Fuzz 35,0,158,75.370119,99.522405,0
+Fuzz 36,0,137,70.954444,14.021816,0
+Fuzz 37,0,117,74.409829,27.681114,0
+Fuzz 38,1,238,76.901962,900.077434,0
+Fuzz 39,1,270,76.72251,102.50979,263.139573
+Fuzz 40,0,197,76.1445,113.404439,0
+Fuzz 41,0,171,73.220427,36.512803,0
+Fuzz 42,0,219,74.279154,131.459365,0
+Fuzz 43,0,199,75.430408,206.226397,0
+Fuzz 44,0,239,75.924238,42.909145,0
+Fuzz 45,1,169,73.813091,18.344606,433.840217
+Fuzz 46,0,190,73.149387,21.951018,0
+Fuzz 47,0,216,79.620958,154.542156,0
+Fuzz 48,0,142,84.013548,108.949145,0
+Fuzz 49,0,230,76.17984,137.150438,0
+Fuzz 50,1,143,73.619132,11.596176,0
+Fuzz 2,1,356,78.169016,655.055963,177.206037
+Fuzz 3,0,136,72.298073,14.131645,0
+Fuzz 4,0,169,71.44636,7.071621,0
+Fuzz 5,1,171,73.878596,56.40148,201.123547
+Fuzz 6,0,132,73.114324,23.786282,0
+Fuzz 7,0,156,78.29726,73.33465,0
+Fuzz 8,1,297,77.86437,354.688139,0
+Fuzz 9,0,171,77.317609,239.372777,0
+Fuzz 10,0,181,77.230198,106.003432,0
+Fuzz 11,0,224,77.013536,339.524218,0
+Fuzz 12,0,199,72.914371,17.566108,0
+Fuzz 13,0,138,72.925163,17.357442,0
+Fuzz 14,0,187,74.609842,110.862587,0
+Fuzz 15,0,130,72.445373,13.790279,0
+Fuzz 16,0,133,75.084442,87.574511,0
+Fuzz 17,0,112,71.566272,19.36548,0
+Fuzz 18,0,151,71.963911,25.234451,0
+Fuzz 19,0,170,76.134241,93.830021,0
+Fuzz 20,1,212,74.889385,590.4099,0
+Fuzz 21,0,181,77.002697,104.635967,0
+Fuzz 22,0,277,77.806498,47.425866,0
+Fuzz 23,0,228,77.646709,296.258498,0
+Fuzz 24,0,168,74.06757,90.598539,0
+Fuzz 25,0,239,76.161798,164.56534,0
+Fuzz 26,0,138,75.790934,148.925861,0
+Fuzz 27,0,216,72.280405,64.483712,0
+Fuzz 28,1,210,74.492863,514.349608,0
+Fuzz 29,0,295,75.18434,36.479193,0
+Fuzz 30,0,226,75.382918,111.694179,0
+Fuzz 31,0,101,74.488144,36.594887,0
+Fuzz 32,0,187,73.896225,15.859911,0
+Fuzz 33,1,217,73.263278,549.590951,0
+Fuzz 34,0,173,71.765093,130.319189,0
+Fuzz 35,1,193,74.85558,738.636464,0
+Fuzz 36,0,149,73.958578,38.39981,0
+Fuzz 37,0,168,78.061243,39.883398,0
+Fuzz 38,0,154,72.89909,48.937757,0
+Fuzz 39,1,191,80.295377,900.080294,0
+Fuzz 40,0,238,76.424579,153.274325,0
+Fuzz 41,1,195,74.468987,494.545865,0
+Fuzz 42,1,296,79.123297,900.090261,0
+Fuzz 43,0,171,74.313848,33.193255,0
+Fuzz 44,1,129,73.138749,900.08278,0
+Fuzz 45,0,179,77.132957,87.812902,0
+Fuzz 46,0,146,74.338799,80.469618,0
+Fuzz 47,0,209,75.19163,104.993643,0
+Fuzz 48,0,141,71.34849,11.797884,0
+Fuzz 49,0,227,77.287019,108.147779,0
+Fuzz 50,0,201,72.961718,15.132857,0
+Fuzz 2,1,141,76.218726,34.407626,0
+Fuzz 3,0,163,74.482872,43.912468,0
+Fuzz 4,0,149,71.658168,25.908425,0
+Fuzz 5,0,226,74.7915,146.837101,0
+Fuzz 6,1,226,74.947458,90.860661,223.142811
+Fuzz 7,0,248,72.879895,132.519521,0
+Fuzz 8,0,159,83.528197,127.755108,0
+Fuzz 9,0,208,76.811806,504.954571,0
+Fuzz 10,1,278,74.590309,14.585161,0
+Fuzz 11,1,235,73.050895,803.725199,0
+Fuzz 12,0,172,76.02879,249.928018,0
+Fuzz 13,0,158,75.014312,77.013787,0
+Fuzz 14,0,306,75.477609,352.199959,0
+Fuzz 15,0,140,72.70659,32.525928,0
+Fuzz 16,0,184,74.140493,60.154284,0
+Fuzz 17,0,157,73.353776,16.424924,0
+Fuzz 18,0,140,72.549069,8.73038,0
+Fuzz 19,0,137,71.841057,8.223418,0
+Fuzz 20,0,233,73.087955,24.631008,0
+Fuzz 21,0,191,73.220393,32.156837,0
+Fuzz 22,0,156,74.309641,175.677088,0
+Fuzz 23,1,307,147.415219,900.083954,0
+Fuzz 24,0,214,74.740661,42.67898,0
+Fuzz 25,0,293,75.577363,360.805727,0
+Fuzz 26,0,211,75.479596,100.870664,0
+Fuzz 27,1,250,76.537496,900.081915,0
+Fuzz 28,0,157,75.498031,56.017907,0
+Fuzz 29,1,126,75.038236,56.369979,158.40277
+Fuzz 30,0,290,77.638617,53.639341,0
+Fuzz 31,0,184,77.531616,262.231519,0
+Fuzz 32,0,292,74.9387,76.474428,0
+Fuzz 33,0,268,80.619942,161.765031,0
+Fuzz 34,0,121,72.734891,19.961057,0
+Fuzz 35,0,157,75.614849,72.825133,0
+Fuzz 36,0,164,73.829681,134.215302,0
+Fuzz 37,0,113,73.338969,15.162781,0
+Fuzz 38,1,189,76.988739,900.0817,0
+Fuzz 39,0,213,73.984387,72.761878,0
+Fuzz 40,0,158,71.780191,8.394973,0
+Fuzz 41,0,132,72.207861,9.347028,0
+Fuzz 42,1,119,72.983077,42.564304,113.604928
+Fuzz 43,0,167,73.375803,26.619884,0
+Fuzz 44,0,154,73.904745,61.526689,0
+Fuzz 45,0,133,74.048393,45.245625,0
+Fuzz 46,0,206,75.57276,417.27731,0
+Fuzz 47,0,110,71.418066,15.004146,0
+Fuzz 48,0,245,78.271196,200.008942,0
+Fuzz 49,1,266,74.234398,696.693823,0
+Fuzz 50,0,157,72.844201,39.576692,0
+Fuzz 2,1,212,79.309431,762.240339,0
+Fuzz 3,0,159,72.087825,27.664483,0
+Fuzz 4,0,219,74.469162,132.475253,0
+Fuzz 5,0,218,73.11639,346.98003,0
+Fuzz 6,1,222,82.444915,588.248963,0
+Fuzz 7,0,315,74.891011,318.340716,0
+Fuzz 8,0,231,75.371285,151.393037,0
+Fuzz 9,0,356,75.254014,415.377064,0
+Fuzz 10,0,280,79.184477,330.793677,0
+Fuzz 11,1,191,74.716528,900.073706,0
+Fuzz 12,0,116,73.463321,22.526586,0
+Fuzz 13,0,177,75.623093,107.91872,0
+Fuzz 14,0,248,72.368407,7.412878,0
+Fuzz 15,0,217,78.847559,156.353779,0
+Fuzz 16,0,168,73.595858,110.933631,0
+Fuzz 17,0,166,76.075752,79.306215,0
+Fuzz 18,0,134,72.522959,11.667638,0
+Fuzz 19,1,273,77.463561,900.109851,0
+Fuzz 20,0,243,74.988762,96.707858,0
+Fuzz 21,0,189,75.072236,97.949086,0
+Fuzz 22,0,215,75.178639,54.264073,0
+Fuzz 23,0,111,73.67381,18.946199,0
+Fuzz 24,0,210,74.204044,217.024153,0
+Fuzz 25,0,128,73.909778,25.7939,0
+Fuzz 26,1,268,77.768017,900.096577,0
+Fuzz 27,0,170,71.899099,44.528301,0
+Fuzz 28,0,171,73.558794,48.974324,0
+Fuzz 29,1,191,76.740715,837.829403,0
+Fuzz 30,0,195,75.311372,231.189465,0
+Fuzz 31,1,263,76.72783,646.051999,0
+Fuzz 32,0,209,73.132033,24.872062,0
+Fuzz 33,0,251,77.143026,67.852829,0
+Fuzz 34,0,162,71.329245,14.814672,0
+Fuzz 35,0,229,75.703147,184.513567,0
+Fuzz 36,0,175,74.8824,149.843243,0
+Fuzz 37,0,209,80.281023,147.049893,0
+Fuzz 38,0,187,76.885807,361.133783,0
+Fuzz 40,1,195,75.497673,900.092554,0
+Fuzz 41,0,188,72.564438,58.654778,0
+Fuzz 42,0,186,74.844148,27.805187,0
+Fuzz 43,0,103,70.538901,3.706516,0
+Fuzz 44,1,173,75.182321,575.045606,0
+Fuzz 45,0,229,76.697207,487.778353,0
+Fuzz 46,0,112,72.390575,17.898491,0
+Fuzz 47,0,153,73.004846,53.263041,0
+Fuzz 48,0,152,75.668725,29.892141,0
+Fuzz 49,0,159,72.254594,21.763628,0
+Fuzz 50,0,209,73.444005,120.984548,0
+Fuzz 2,0,245,74.082846,379.180869,0
+Fuzz 3,1,155,74.434793,900.073686,0
+Fuzz 4,0,170,74.340928,23.989395,0
+Fuzz 5,0,227,76.513566,118.932969,0
+Fuzz 6,1,221,76.51244,900.081258,0
+Fuzz 7,0,167,73.989463,66.898593,0
+Fuzz 8,0,220,73.889434,17.041832,0
+Fuzz 9,0,166,73.383838,176.329539,0
+Fuzz 10,0,314,75.06893,22.136987,0
+Fuzz 11,0,171,76.243302,45.962766,0
+Fuzz 12,0,230,78.906647,246.899783,0
+Fuzz 13,1,248,81.652224,656.668507,531.433339
+Fuzz 14,0,222,72.06629,6.960443,0
+Fuzz 15,0,156,77.518835,172.094255,0
+Fuzz 16,1,222,79.457437,895.534778,0
+Fuzz 17,0,114,74.333893,53.414789,0
+Fuzz 18,0,155,75.938521,79.662482,0
+Fuzz 19,0,247,76.998845,346.921506,0
+Fuzz 20,0,165,75.119145,94.918698,0
+Fuzz 21,0,151,72.654414,31.151472,0
+Fuzz 22,0,249,75.913758,154.770366,0
+Fuzz 23,0,237,75.66955,38.677037,0
+Fuzz 24,0,139,72.034127,7.02188,0
+Fuzz 25,0,249,74.903167,333.640909,0
+Fuzz 26,0,151,73.763451,30.60323,0
+Fuzz 27,0,166,72.736713,7.625229,0
+Fuzz 28,0,129,72.173773,29.08497,0
+Fuzz 29,0,228,74.811711,32.488331,0
+Fuzz 30,0,165,75.281692,75.252255,0
+Fuzz 31,0,224,75.428309,12.411524,0
+Fuzz 32,0,136,74.263067,120.151816,0
+Fuzz 33,0,212,72.052166,10.393116,0
+Fuzz 34,1,246,75.961427,757.281947,0
+Fuzz 35,0,175,77.517224,39.141859,0
+Fuzz 36,1,290,77.561151,900.092313,0
+Fuzz 37,1,313,80.339959,890.730004,0
+Fuzz 38,0,206,73.788856,113.577996,0
+Fuzz 39,1,246,78.238404,855.502686,0
+Fuzz 40,0,196,75.77786,137.130583,0
+Fuzz 41,1,228,75.880472,701.936638,0
+Fuzz 42,0,173,74.086708,43.883491,0
+Fuzz 43,0,137,75.28393,36.866258,0
+Fuzz 44,0,171,73.422725,32.348621,0
+Fuzz 45,0,201,73.063113,37.379928,0
+Fuzz 46,0,175,73.508441,38.921889,0
+Fuzz 47,1,171,73.777186,78.862981,115.960538
+Fuzz 48,0,114,72.714412,18.80454,0
+Fuzz 49,1,294,82.894285,900.093546,0
+Fuzz 50,0,177,73.797813,26.34927,0
+Fuzz 2,0,376,104.800031,596.26218,0
+Fuzz 3,1,353,87.588456,900.122594,0
+Fuzz 4,1,556,98.218593,900.144101,0
+Fuzz 5,1,493,87.570731,900.100907,0
+Fuzz 6,1,600,116.858952,900.153796,0
+Fuzz 7,0,450,92.99509,602.226759,0
+Fuzz 8,1,337,83.723382,900.135593,0
+Fuzz 9,1,537,90.456709,900.133009,0
+Fuzz 10,1,533,99.10449,900.174025,0
+Fuzz 11,1,412,94.94411,900.120701,0
+Fuzz 12,1,667,89.190714,900.113224,0
+Fuzz 13,1,677,110.158871,900.127433,0
+Fuzz 14,1,534,119.498551,900.212864,0
+Fuzz 15,1,586,103.789251,900.13013,0
+Fuzz 16,1,381,79.975278,462.408724,0
+Fuzz 17,1,485,97.959002,900.141171,0
+Fuzz 18,0,276,79.224562,403.883281,0
+Fuzz 19,1,406,90.673856,900.111871,0
+Fuzz 20,1,551,80.764828,109.857767,390.823869
+Fuzz 21,1,512,95.758382,900.138111,0
+Fuzz 22,0,330,80.549096,80.754668,0
+Fuzz 23,1,469,89.428675,449.831431,534.192448
+Fuzz 24,1,530,82.511666,525.744193,431.328542
+Fuzz 25,1,303,87.65168,900.124286,0
+Fuzz 26,1,579,101.343421,900.151998,0
+Fuzz 27,1,575,118.742291,900.194809,0
+Fuzz 28,1,474,98.034637,672.425781,717.26766
+Fuzz 29,1,357,91.734036,743.697774,799.596819
+Fuzz 30,1,444,88.697989,900.138163,0
+Fuzz 31,1,527,124.964498,900.197276,0
+Fuzz 32,1,405,88.106858,900.121766,0
+Fuzz 33,1,378,211.771485,900.158882,0
+Fuzz 34,1,320,80.342503,900.088165,0
+Fuzz 35,0,455,77.947627,69.083915,0
+Fuzz 36,1,349,84.271246,900.088522,0
+Fuzz 37,1,632,116.307243,900.201578,0
+Fuzz 38,1,419,83.490336,900.100502,0
+Fuzz 39,1,457,83.786297,900.104068,0
+Fuzz 40,1,442,109.194229,900.130561,0
+Fuzz 41,1,422,86.510077,900.129012,0
+Fuzz 42,1,525,103.183201,900.162523,0
+Fuzz 43,1,316,88.470092,849.33943,0
+Fuzz 44,1,511,87.656094,900.137328,0
+Fuzz 45,1,475,86.547602,900.111983,0
+Fuzz 46,1,425,92.647105,900.114285,0
+Fuzz 47,1,407,90.939683,712.607864,1345.269937
+Fuzz 48,1,329,81.549203,900.104284,0
+Fuzz 49,1,565,104.138843,900.180524,0
+Fuzz 50,1,666,91.210407,900.117503,0
+Fuzz 2,1,363,96.165653,900.14143,0
+Fuzz 3,1,392,86.698897,900.108198,0
+Fuzz 4,1,459,82.365578,900.09509,0
+Fuzz 5,1,498,87.358853,900.134987,0
+Fuzz 6,1,543,83.99186,900.087595,0
+Fuzz 7,1,308,84.118267,900.11513,0
+Fuzz 8,1,415,97.509597,320.07193,550.157488
+Fuzz 9,1,466,99.893237,900.142731,0
+Fuzz 10,0,319,76.548395,73.896474,0
+Fuzz 11,1,696,88.709353,900.123396,0
+Fuzz 12,0,392,87.327103,203.860127,0
+Fuzz 13,0,466,84.868236,417.771999,0
+Fuzz 14,1,335,81.720699,823.329768,0
+Fuzz 15,0,502,78.717167,13.337164,0
+Fuzz 16,1,437,106.685912,900.137751,0
+Fuzz 17,1,248,80.070816,790.611028,0
+Fuzz 18,1,529,81.327087,141.881601,277.632509
+Fuzz 19,1,539,85.184819,621.40849,262.140717
+Fuzz 20,0,232,79.995769,280.999849,0
+Fuzz 21,1,573,74.541371,32.54931,552.569765
+Fuzz 22,1,573,93.993508,900.124904,0
+Fuzz 23,1,357,80.727192,900.09936,0
+Fuzz 24,0,560,88.13689,355.299044,0
+Fuzz 25,1,392,79.805162,422.477795,0
+Fuzz 26,0,234,74.816719,460.623726,0
+Fuzz 27,1,453,88.52972,900.126504,0
+Fuzz 28,1,546,102.426305,900.197631,0
+Fuzz 29,1,487,110.331357,900.138562,0
+Fuzz 30,0,196,81.993929,86.262554,0
+Fuzz 31,1,313,80.044384,900.095498,0
+Fuzz 32,1,491,104.892165,900.177476,0
+Fuzz 33,1,523,91.567014,900.112223,0
+Fuzz 34,1,485,101.066928,900.144691,0
+Fuzz 35,0,524,80.089139,327.523692,0
+Fuzz 36,1,449,115.806474,900.218395,0
+Fuzz 37,1,484,84.168538,331.092042,346.050868
+Fuzz 38,1,478,95.342301,900.126224,0
+Fuzz 39,1,765,102.757906,900.1641,0
+Fuzz 41,1,452,83.44794,900.100235,0
+Fuzz 42,1,524,96.767858,900.150967,0
+Fuzz 43,1,475,88.721984,900.117921,0
+Fuzz 44,1,523,89.858079,900.152169,0
+Fuzz 45,1,330,83.955355,900.11497,0
+Fuzz 46,1,411,105.396693,900.155346,0
+Fuzz 47,1,414,125.383514,900.123249,0
+Fuzz 48,1,285,82.816163,900.090801,0
+Fuzz 49,1,505,119.558833,900.386083,0
+Fuzz 50,1,580,120.634894,900.146162,0
+Fuzz 2,0,368,81.043095,142.909041,0
+Fuzz 3,0,528,79.273234,384.283024,0
+Fuzz 4,1,360,85.262665,862.912103,0
+Fuzz 5,1,275,77.680687,98.047329,583.650093
+Fuzz 6,1,433,85.924954,900.103855,0
+Fuzz 7,1,423,80.079382,518.70795,341.837028
+Fuzz 8,1,536,81.829227,900.088204,0
+Fuzz 9,1,632,82.081323,900.098446,0
+Fuzz 10,1,554,92.841905,900.106165,0
+Fuzz 11,1,465,140.368483,900.241776,0
+Fuzz 12,1,338,79.233787,238.726438,77.583488
+Fuzz 13,1,447,87.866742,900.10991,0
+Fuzz 14,1,363,91.883544,900.132025,0
+Fuzz 15,1,399,81.81789,751.916955,295.59713
+Fuzz 16,0,475,83.671598,404.615983,0
+Fuzz 17,1,701,95.262627,900.120552,0
+Fuzz 18,1,563,94.155248,900.125113,0
+Fuzz 19,1,443,95.766729,900.151531,0
+Fuzz 20,1,615,120.815227,900.193456,0
+Fuzz 21,1,505,87.892442,900.116931,0
+Fuzz 22,1,546,116.286986,900.149805,0
+Fuzz 23,1,324,80.49137,549.008525,755.496649
+Fuzz 24,1,717,92.924495,900.127518,0
+Fuzz 25,1,331,83.598548,900.103645,0
+Fuzz 26,0,426,88.098337,523.471524,0
+Fuzz 27,1,572,92.861449,900.126779,0
+Fuzz 28,1,345,87.349688,434.226137,0
+Fuzz 29,1,497,92.471708,900.138259,0
+Fuzz 30,1,656,100.805218,900.128527,0
+Fuzz 31,1,656,81.649619,900.086697,0
+Fuzz 32,1,540,92.672201,900.13505,0
+Fuzz 33,1,442,91.118374,900.136066,0
+Fuzz 34,1,655,85.606082,900.095943,0
+Fuzz 35,1,247,77.688056,900.091813,0
+Fuzz 36,1,468,79.835544,653.398844,0
+Fuzz 37,0,390,76.366335,15.889425,0
+Fuzz 38,0,345,80.817485,94.711707,0
+Fuzz 39,1,523,108.365108,900.179462,0
+Fuzz 40,0,374,76.086968,141.820159,0
+Fuzz 41,1,308,86.745247,900.119034,0
+Fuzz 42,1,575,104.529437,900.168944,0
+Fuzz 43,1,400,84.337397,900.115557,0
+Fuzz 44,0,373,87.361506,625.504605,0
+Fuzz 45,1,634,115.331267,900.199253,0
+Fuzz 46,1,730,93.565888,900.124504,0
+Fuzz 47,0,527,81.490529,141.822315,0
+Fuzz 48,1,379,93.640803,900.128964,0
+Fuzz 49,1,817,112.935579,900.20518,0
+Fuzz 50,1,588,95.52647,900.127145,0
+Fuzz 2,1,415,80.183042,900.094038,0
+Fuzz 3,1,774,99.835822,900.155241,0
+Fuzz 4,1,617,108.670354,900.204167,0
+Fuzz 5,0,614,85.434494,567.561388,0
+Fuzz 6,0,543,78.153148,19.003157,0
+Fuzz 7,1,1154,131.279634,900.225202,0
+Fuzz 8,1,448,93.112216,900.125391,0
+Fuzz 9,1,583,99.680374,900.134467,0
+Fuzz 10,1,996,106.342596,900.176266,0
+Fuzz 11,1,661,113.422164,900.240792,0
+Fuzz 12,1,1172,124.823906,900.198837,0
+Fuzz 13,0,645,91.119913,519.984043,0
+Fuzz 14,1,814,119.352085,900.27401,0
+Fuzz 15,1,881,93.292932,900.111084,0
+Fuzz 16,1,694,100.291282,900.11085,0
+Fuzz 17,1,1057,113.765949,328.881544,0
+Fuzz 18,1,757,116.445666,900.173515,0
+Fuzz 19,1,424,104.522293,900.152155,0
+Fuzz 20,1,908,127.781318,900.192199,0
+Fuzz 21,1,867,95.900539,657.296171,159.048945
+Fuzz 22,0,751,81.876512,196.52539,0
+Fuzz 23,1,759,94.19701,900.124444,0
+Fuzz 24,1,1167,140.856495,900.226937,0
+Fuzz 25,1,1074,136.284659,900.281018,0
+Fuzz 26,1,1022,125.722167,900.263429,0
+Fuzz 27,1,863,107.035225,900.161764,0
+Fuzz 28,1,694,109.368574,900.253762,0
+Fuzz 29,1,1226,133.93796,900.21775,0
+Fuzz 30,1,907,120.489624,900.204767,0
+Fuzz 31,1,855,100.418195,900.1337,0
+Fuzz 32,1,695,91.404311,900.131666,0
+Fuzz 33,1,741,93.575211,900.117859,0
+Fuzz 34,1,517,91.209091,900.121047,0
+Fuzz 35,1,957,114.144088,900.181416,0
+Fuzz 36,1,1676,122.23901,900.151371,0
+Fuzz 37,1,473,89.965331,900.109279,0
+Fuzz 38,1,722,95.127123,900.126395,0
+Fuzz 39,1,1213,152.832291,900.384161,0
+Fuzz 40,1,787,106.92071,900.147665,0
+Fuzz 41,1,1006,120.63557,900.176065,0
+Fuzz 42,1,717,107.461957,900.142185,0
+Fuzz 43,1,793,120.56828,900.188529,0
+Fuzz 44,1,707,109.720048,900.166694,0
+Fuzz 45,1,648,125.980659,900.244817,0
+Fuzz 46,1,875,109.102401,900.185209,0
+Fuzz 47,0,1063,86.075734,160.506039,0
+Fuzz 48,0,758,78.048556,383.190804,0
+Fuzz 49,1,956,123.508628,900.242069,0
+Fuzz 50,1,572,97.576277,900.122743,0
+Fuzz 2,1,978,104.91907,900.156328,0
+Fuzz 3,1,742,106.388289,900.13369,0
+Fuzz 4,1,867,131.243727,900.241214,0
+Fuzz 5,1,707,101.138745,900.172076,0
+Fuzz 6,1,846,129.006713,900.228649,0
+Fuzz 7,1,831,121.334297,900.192858,0
+Fuzz 8,1,874,139.7515,900.235011,0
+Fuzz 9,1,695,126.833524,900.197855,0
+Fuzz 10,1,696,107.187445,900.210264,0
+Fuzz 11,1,855,135.725814,900.193862,0
+Fuzz 12,1,736,98.03505,900.122565,0
+Fuzz 13,1,909,108.374149,900.152881,0
+Fuzz 14,1,728,109.971076,900.261478,0
+Fuzz 15,1,1174,131.408212,900.278315,0
+Fuzz 16,1,887,131.158877,900.210383,0
+Fuzz 17,1,766,116.69378,512.511551,0
+Fuzz 18,1,780,119.56797,900.28203,0
+Fuzz 19,1,703,113.674466,900.211581,0
+Fuzz 20,1,873,103.525723,900.168413,0
+Fuzz 21,1,1016,117.28094,900.168812,0
+Fuzz 22,1,1152,123.943022,900.192882,0
+Fuzz 23,1,1447,147.765543,900.271629,0
+Fuzz 24,1,693,124.196946,900.164557,0
+Fuzz 25,1,938,96.274486,900.121002,0
+Fuzz 26,1,630,99.607721,900.141657,0
+Fuzz 27,1,549,104.120616,900.183807,0
+Fuzz 28,1,864,128.609565,900.234872,0
+Fuzz 29,1,914,91.147765,670.506649,92.961033
+Fuzz 30,1,915,101.728486,262.199384,1289.888875
+Fuzz 31,1,515,106.581705,900.17368,0
+Fuzz 32,1,1076,126.00173,900.25232,0
+Fuzz 33,1,955,126.851649,900.19475,0
+Fuzz 34,1,982,128.057833,900.285358,0
+Fuzz 35,1,673,124.382531,900.190337,0
+Fuzz 36,1,781,105.010471,900.146757,0
+Fuzz 37,1,1102,130.173623,900.217436,0
+Fuzz 38,0,812,81.76746,275.381835,0
+Fuzz 39,0,1140,83.003961,144.928088,0
+Fuzz 40,1,506,109.201785,900.144291,0
+Fuzz 41,1,1079,130.95888,900.199084,0
+Fuzz 42,1,1118,141.817215,900.335533,0
+Fuzz 43,1,589,100.554252,900.127103,0
+Fuzz 44,1,547,113.019109,900.181298,0
+Fuzz 45,1,411,96.976285,900.122086,0
+Fuzz 46,1,841,122.689094,900.231816,0
+Fuzz 47,1,979,117.323985,900.193639,0
+Fuzz 48,1,929,121.034983,900.242403,0
+Fuzz 49,1,559,76.818172,51.842589,71.177253
+Fuzz 50,0,791,79.023308,24.161468,0
+Fuzz 2,1,771,111.539481,900.162403,0
+Fuzz 3,1,1116,117.614439,900.175917,0
+Fuzz 4,1,572,103.568289,900.155206,0
+Fuzz 5,1,1124,130.275806,900.314375,0
+Fuzz 6,0,735,78.910411,28.250564,0
+Fuzz 7,1,1523,160.328815,900.299088,0
+Fuzz 8,1,1052,133.331294,900.256872,0
+Fuzz 9,1,606,106.220382,900.146377,0
+Fuzz 10,1,742,126.759325,830.027693,867.407146
+Fuzz 11,1,803,115.237282,900.13829,0
+Fuzz 12,1,912,117.506658,900.208132,0
+Fuzz 13,1,609,107.385753,900.162217,0
+Fuzz 14,1,1261,128.582433,900.276456,0
+Fuzz 15,1,989,138.106513,900.339524,0
+Fuzz 17,1,681,107.12537,900.169836,0
+Fuzz 18,1,827,112.884024,900.155019,0
+Fuzz 19,1,1093,151.355024,900.275532,0
+Fuzz 20,1,1048,126.960287,900.193761,0
+Fuzz 21,1,838,119.006187,900.197598,0
+Fuzz 22,1,1270,135.376283,900.260754,0
+Fuzz 23,1,801,118.604538,900.250201,0
+Fuzz 24,1,911,107.341824,900.159807,0
+Fuzz 25,1,517,107.291891,900.209423,0
+Fuzz 26,1,487,110.616248,900.184415,0
+Fuzz 27,1,695,105.197598,900.171341,0
+Fuzz 28,1,850,110.650385,900.192074,0
+Fuzz 29,1,891,103.602209,900.197991,0
+Fuzz 30,1,556,113.02594,900.203183,0
+Fuzz 31,1,1183,128.444562,900.261406,0
+Fuzz 32,1,1043,123.001417,900.310135,0
+Fuzz 33,1,930,131.209179,900.223632,0
+Fuzz 34,1,1117,109.687308,900.140031,0
+Fuzz 35,0,554,88.68443,570.870051,0
+Fuzz 36,1,781,129.992374,900.238879,0
+Fuzz 37,1,926,124.15349,900.264773,0
+Fuzz 38,1,530,112.5281,900.165649,0
+Fuzz 39,1,412,100.950834,900.142172,0
+Fuzz 40,0,296,74.556614,15.293266,0
+Fuzz 41,0,803,80.919693,650.880691,0
+Fuzz 42,1,1084,109.523733,900.206904,0
+Fuzz 43,1,884,98.343755,900.146847,0
+Fuzz 44,1,918,128.79421,900.235572,0
+Fuzz 45,1,1523,160.595266,900.318608,0
+Fuzz 46,1,767,101.646652,900.158289,0
+Fuzz 47,1,685,107.775961,900.135915,0
+Fuzz 48,1,412,86.355921,900.123558,0
+Fuzz 49,1,959,112.967131,900.204708,0
+Fuzz 50,1,664,123.269421,900.194562,0
+Fuzz 2,1,1197,154.858567,900.286456,0
+Fuzz 3,1,1217,145.013727,900.246997,0
+Fuzz 4,1,710,110.043809,900.171856,0
+Fuzz 5,1,808,99.800759,900.139697,0
+Fuzz 6,1,775,123.221944,900.193154,0
+Fuzz 7,1,1172,126.396872,900.244446,0
+Fuzz 8,1,1178,162.377698,900.354255,0
+Fuzz 9,1,848,117.406868,900.172926,0
+Fuzz 10,1,904,131.344624,900.233536,0
+Fuzz 11,1,1157,156.56405,900.376135,0
+Fuzz 12,1,976,132.269343,795.049044,0
+Fuzz 13,1,693,143.439802,900.313311,0
+Fuzz 14,1,763,99.124321,900.142037,0
+Fuzz 15,1,799,114.702714,900.209381,0
+Fuzz 16,1,1071,151.037152,900.23878,0
+Fuzz 17,1,970,146.691859,900.246323,0
+Fuzz 18,1,1155,168.180157,900.466598,0
+Fuzz 19,1,686,103.369865,900.188254,0
+Fuzz 20,1,888,115.598297,900.240154,0
+Fuzz 21,1,770,124.014754,900.20262,0
+Fuzz 22,1,702,114.275013,735.364488,226.429212
+Fuzz 23,1,681,118.326859,900.218149,0
+Fuzz 24,1,632,110.023335,900.178532,0
+Fuzz 25,0,937,86.027543,305.494682,0
+Fuzz 26,0,804,86.263781,266.524332,0
+Fuzz 27,1,1204,143.5383,900.328613,0
+Fuzz 28,1,823,119.652895,900.182625,0
+Fuzz 29,1,1401,157.24724,900.324989,0
+Fuzz 30,1,1271,146.125736,900.3474,0
+Fuzz 31,1,1335,142.549411,900.225425,0
+Fuzz 32,1,1008,102.058102,900.137954,0
+Fuzz 33,1,533,92.638417,900.119979,0
+Fuzz 34,1,1095,129.423752,900.231267,0
+Fuzz 35,1,835,124.768714,900.253898,0
+Fuzz 36,1,780,113.401118,900.139014,0
+Fuzz 37,1,954,159.517766,900.228804,0
+Fuzz 38,1,527,96.644712,900.131347,0
+Fuzz 39,0,1035,84.838669,260.52246,0
+Fuzz 40,1,1136,111.950357,900.153828,0
+Fuzz 41,1,1593,197.129619,900.305385,0
+Fuzz 42,1,695,112.481253,900.200229,0
+Fuzz 43,1,890,139.508096,900.222408,0
+Fuzz 44,1,1065,146.734895,900.291604,0
+Fuzz 45,1,878,129.665457,900.238631,0
+Fuzz 46,1,1066,147.569976,900.260981,0
+Fuzz 47,1,1223,145.493359,900.260287,0
+Fuzz 48,1,896,93.577951,900.123161,0
+Fuzz 49,1,1630,210.674913,900.412389,0
+Fuzz 50,1,1306,119.686046,900.188416,0
+Fuzz 2,1,923,151.814494,900.403385,0
+Fuzz 3,1,880,115.755768,900.127612,0
+Fuzz 4,1,1150,167.29422,900.308488,0
+Fuzz 5,1,890,120.49157,900.211906,0
+Fuzz 6,1,819,123.167929,900.194785,0
+Fuzz 7,1,976,137.074575,900.319654,0
+Fuzz 8,1,739,115.769036,900.20269,0
+Fuzz 9,1,913,130.202118,900.242773,0
+Fuzz 10,1,891,130.974003,900.299479,0
+Fuzz 11,1,812,141.735793,900.241062,0
+Fuzz 12,1,1187,143.455181,900.268244,0
+Fuzz 13,1,980,134.011517,900.329495,0
+Fuzz 14,1,947,137.51686,900.231599,0
+Fuzz 15,1,850,105.17804,900.150184,0
+Fuzz 16,1,1269,158.179992,900.323831,0
+Fuzz 17,1,1032,129.878961,900.209803,0
+Fuzz 18,1,1178,113.752416,900.16037,0
+Fuzz 19,1,925,108.393745,900.170834,0
+Fuzz 20,1,690,112.917675,900.202522,0
+Fuzz 21,1,968,122.899508,871.575363,621.338115
+Fuzz 22,1,976,111.084977,172.847591,946.010274
+Fuzz 23,1,1181,152.424661,900.270499,0
+Fuzz 24,1,709,91.922127,900.115881,0
+Fuzz 25,1,1354,140.529068,900.269685,0
+Fuzz 26,1,1021,115.239654,900.227096,0
+Fuzz 28,0,578,112.62707,449.491092,0
+Fuzz 29,1,1012,133.012398,900.262796,0
+Fuzz 30,1,1280,171.751447,900.271485,0
+Fuzz 31,1,1309,128.932912,302.277205,261.838757
+Fuzz 32,1,749,84.107183,900.094156,0
+Fuzz 33,1,667,128.98523,900.342331,0
+Fuzz 34,1,709,110.519245,900.162884,0
+Fuzz 35,1,991,127.074154,900.229586,0
+Fuzz 36,1,672,106.503042,900.152205,0
+Fuzz 37,1,774,121.912836,900.229741,0
+Fuzz 38,1,1629,152.950861,900.252407,0
+Fuzz 39,1,1090,112.633485,900.128514,0
+Fuzz 40,1,649,124.628204,877.009864,858.619379
+Fuzz 41,1,1284,133.682283,900.186609,0
+Fuzz 43,1,1012,116.169164,900.15709,0
+Fuzz 44,0,908,97.704294,282.515829,0
+Fuzz 45,1,923,106.393985,900.161963,0
+Fuzz 46,1,1112,93.211774,900.115234,0
+Fuzz 47,1,670,124.118996,900.218648,0
+Fuzz 48,1,608,122.530831,900.232626,0
+Fuzz 49,1,1343,127.62259,900.139497,0
+Fuzz 50,0,1146,80.623868,104.131248,0
+Fuzz 2,1,1018,151.155335,900.354067,0
+Fuzz 3,1,790,126.370098,900.208496,0
+Fuzz 4,1,825,149.819895,900.394692,0
+Fuzz 5,1,922,159.21781,900.382097,0
+Fuzz 6,1,659,105.344186,900.15833,0
+Fuzz 7,1,807,123.15505,900.283686,0
+Fuzz 8,1,1063,141.137744,900.204616,0
+Fuzz 9,1,466,109.438811,900.203619,0
+Fuzz 10,1,997,111.749792,757.50403,0
+Fuzz 11,1,926,105.757426,900.149562,0
+Fuzz 12,1,972,134.139462,900.263585,0
+Fuzz 13,1,993,154.316675,900.303681,0
+Fuzz 14,1,604,87.971389,900.110416,0
+Fuzz 15,0,751,89.185942,245.501294,0
+Fuzz 17,1,1114,139.801256,900.252114,0
+Fuzz 18,1,846,119.135331,900.206274,0
+Fuzz 19,1,1076,146.485801,900.287176,0
+Fuzz 20,1,979,126.808672,900.175338,0
+Fuzz 21,1,520,94.518898,900.153408,0
+Fuzz 22,1,963,135.59429,900.216166,0
+Fuzz 23,1,1445,154.561102,900.293565,0
+Fuzz 24,1,1184,151.687694,900.288983,0
+Fuzz 25,1,988,146.075016,900.318246,0
+Fuzz 26,1,1092,105.498341,900.133406,0
+Fuzz 27,1,1235,153.216073,891.90046,1077.745076
+Fuzz 28,1,1238,121.970834,900.194249,0
+Fuzz 29,1,1147,145.159732,900.254374,0
+Fuzz 30,1,1074,115.897918,900.16927,0
+Fuzz 31,1,884,122.769095,900.198873,0
+Fuzz 32,1,736,144.572842,900.265093,0
+Fuzz 33,1,844,131.644474,900.252151,0
+Fuzz 34,1,741,81.090049,163.019399,755.54812
+Fuzz 35,1,988,94.421628,900.153341,0
+Fuzz 36,1,952,129.060283,900.251583,0
+Fuzz 37,1,656,100.86045,900.162408,0
+Fuzz 38,1,1054,164.884845,900.359451,0
+Fuzz 39,1,988,169.86254,900.234814,0
+Fuzz 40,1,877,137.925168,900.283404,0
+Fuzz 41,1,879,99.237986,651.582018,0
+Fuzz 42,1,976,128.560937,900.199328,0
+Fuzz 43,1,872,140.429622,900.372252,0
+Fuzz 44,1,659,106.388812,900.158249,0
+Fuzz 45,1,1092,138.044558,900.263135,0
+Fuzz 46,0,633,79.004652,74.211153,0
+Fuzz 47,1,725,148.709923,900.387517,0
+Fuzz 48,1,914,107.437639,900.153678,0
+Fuzz 49,1,851,108.411495,900.135418,0
+Fuzz 50,1,828,115.939757,900.168783,0
+Fuzz 2,1,1928,135.6146,900.211337,0
+Fuzz 4,1,1756,236.996874,900.408447,0
+Fuzz 5,1,1953,337.904579,900.63725,0
+Fuzz 6,1,2171,527.896449,900.838776,0
+Fuzz 7,1,1359,170.485781,900.224741,0
+Fuzz 8,1,1797,246.074359,900.355192,0
+Fuzz 9,1,2102,390.100815,900.549943,0
+Fuzz 10,1,1240,130.089147,900.168221,0
+Fuzz 11,1,1308,170.75871,900.300585,0
+Fuzz 12,1,1910,245.768267,900.397199,0
+Fuzz 13,1,839,170.253312,900.378145,0
+Fuzz 14,1,1581,198.054575,900.403174,0
+Fuzz 15,1,1488,119.129086,717.419814,0
+Fuzz 16,1,1263,167.008088,900.339726,0
+Fuzz 17,1,1454,134.292537,900.228772,0
+Fuzz 18,1,1644,106.538165,900.127676,0
+Fuzz 19,1,1823,216.386098,900.446667,0
+Fuzz 20,1,2226,424.45639,900.86278,0
+Fuzz 21,1,2470,361.777629,900.779274,0
+Fuzz 22,1,2054,147.347653,900.127939,0
+Fuzz 23,1,1975,279.16134,900.389807,0
+Fuzz 24,1,2526,299.661615,900.627083,0
+Fuzz 25,1,1780,271.912504,900.554182,0
+Fuzz 26,1,1285,183.90355,900.366778,0
+Fuzz 27,1,2485,309.45525,900.303402,0
+Fuzz 29,1,1481,249.277132,900.463692,0
+Fuzz 30,1,1239,100.325084,750.037487,0
+Fuzz 31,1,2090,429.943336,900.673833,0
+Fuzz 33,1,1701,321.313402,900.620165,0
+Fuzz 34,1,1525,216.253765,900.4778,0
+Fuzz 35,1,1314,156.73353,900.391896,0
+Fuzz 36,1,1445,159.646608,900.291741,0
+Fuzz 37,1,1776,181.359479,900.452404,0
+Fuzz 38,1,1351,164.3185,900.288491,0
+Fuzz 40,1,2245,184.940678,900.18321,0
+Fuzz 41,1,1174,118.27957,900.146536,0
+Fuzz 42,1,1304,127.795582,674.578504,152.959436
+Fuzz 43,1,1499,160.063233,900.377499,0
+Fuzz 44,1,489,84.295746,900.09441,0
+Fuzz 45,1,1567,182.089004,900.36589,0
+Fuzz 46,1,1062,132.30852,900.274537,0
+Fuzz 48,1,1850,163.598302,900.239485,0
+Fuzz 50,1,1792,199.009003,900.557176,0
+Fuzz 2,1,1970,270.625614,601.576651,0
+Fuzz 3,1,2384,375.329007,900.730994,0
+Fuzz 4,1,1306,129.51163,900.183004,0
+Fuzz 5,1,1325,158.237953,900.428272,0
+Fuzz 6,1,2349,255.612244,900.42354,0
+Fuzz 7,1,2777,355.607489,900.558646,0
+Fuzz 8,1,1302,168.895991,900.392875,0
+Fuzz 9,1,1414,201.99571,900.499127,0
+Fuzz 10,1,1695,216.624287,900.513992,0
+Fuzz 11,1,1456,150.058431,900.41774,0
+Fuzz 12,1,1858,286.507502,900.43282,0
+Fuzz 13,1,897,127.579684,900.160761,0
+Fuzz 14,1,1459,165.444645,900.305766,0
+Fuzz 15,1,2082,272.867538,900.377423,0
+Fuzz 16,1,1354,124.820459,900.305783,0
+Fuzz 17,1,1660,185.657703,900.277948,0
+Fuzz 18,1,927,153.303489,900.433708,0
+Fuzz 19,1,1214,160.622987,900.43447,0
+Fuzz 20,1,2098,96.810546,900.112161,0
+Fuzz 21,1,2436,323.373982,900.505496,0
+Fuzz 22,1,1589,191.900035,900.230092,0
+Fuzz 24,1,1874,226.997902,900.481701,0
+Fuzz 25,1,1737,322.719213,900.621031,0
+Fuzz 26,1,1658,257.076864,900.444938,0
+Fuzz 27,1,1466,175.245034,900.322305,0
+Fuzz 28,1,2379,418.275795,900.694405,0
+Fuzz 29,1,1539,176.847832,900.313073,0
+Fuzz 30,1,1857,186.421528,900.380159,0
+Fuzz 31,1,1574,148.087796,900.227969,0
+Fuzz 33,1,1777,79.074013,26.148689,1094.823954
+Fuzz 34,1,2505,386.935245,900.748097,0
+Fuzz 35,1,1297,159.018676,900.371481,0
+Fuzz 36,1,1183,135.980002,900.229799,0
+Fuzz 37,1,1472,181.662117,900.371665,0
+Fuzz 38,1,2021,309.188297,900.578612,0
+Fuzz 39,1,1903,301.338937,900.343833,0
+Fuzz 40,1,1726,191.239489,900.223912,0
+Fuzz 41,1,1510,182.338172,900.266178,0
+Fuzz 42,1,2113,297.629891,900.335136,0
+Fuzz 43,1,1630,204.327262,900.368334,0
+Fuzz 44,1,1869,310.845571,900.584844,0
+Fuzz 45,1,1982,124.704037,624.955518,442.500247
+Fuzz 46,1,1133,152.213154,900.291577,0
+Fuzz 47,1,1333,151.56614,900.264138,0
+Fuzz 48,1,1543,196.002499,900.417653,0
+Fuzz 49,1,1792,172.972051,900.379218,0
+Fuzz 50,1,1879,258.095603,900.471322,0
+Fuzz 2,1,3005,417.98582,900.661348,0
+Fuzz 3,1,1820,355.644794,900.64828,0
+Fuzz 4,1,2173,358.209408,900.631741,0
+Fuzz 5,1,2288,148.23717,834.886032,1234.787992
+Fuzz 6,1,2469,432.77631,900.976689,0
+Fuzz 7,1,2712,389.715644,900.620584,0
+Fuzz 8,1,1320,190.210793,900.261043,0
+Fuzz 9,1,1915,313.170813,900.667236,0
+Fuzz 10,1,1899,326.856723,900.455339,0
+Fuzz 12,1,1284,173.815538,900.328673,0
+Fuzz 13,1,2503,281.110439,900.350704,0
+Fuzz 14,1,2110,323.767121,900.466135,0
+Fuzz 15,1,1859,202.474569,900.283388,0
+Fuzz 16,1,1194,133.889578,900.269412,0
+Fuzz 17,1,1357,166.238108,900.34209,0
+Fuzz 18,1,2105,284.504381,900.544399,0
+Fuzz 19,1,1803,347.305984,900.51106,0
+Fuzz 21,1,1777,275.920747,900.406071,0
+Fuzz 22,1,2269,164.781247,900.202132,0
+Fuzz 23,1,1648,302.001188,900.538403,0
+Fuzz 24,1,1866,180.895849,900.483183,0
+Fuzz 25,1,2212,457.24705,900.876128,0
+Fuzz 26,1,1516,282.445734,900.59151,0
+Fuzz 27,1,1880,149.402591,900.154856,0
+Fuzz 28,1,2019,273.074181,900.432239,0
+Fuzz 29,1,1969,269.118937,764.717672,0
+Fuzz 30,1,2386,429.59755,900.791945,0
+Fuzz 31,1,2191,269.949526,900.619484,0
+Fuzz 32,1,2660,286.442717,900.235885,0
+Fuzz 33,1,2204,390.396241,900.810661,0
+Fuzz 34,1,1807,296.34697,900.33883,0
+Fuzz 35,1,2775,419.059461,900.555556,0
+Fuzz 36,1,2490,521.933818,900.873039,0
+Fuzz 37,1,3200,479.682888,900.881094,0
+Fuzz 38,1,1612,269.478199,900.53865,0
+Fuzz 39,1,2180,365.950084,900.435813,0
+Fuzz 40,1,1610,276.232721,900.397798,0
+Fuzz 41,1,1933,165.807206,735.90767,124.361412
+Fuzz 42,1,1508,293.108091,900.540142,0
+Fuzz 43,1,1073,153.354513,900.265134,0
+Fuzz 44,1,1799,274.291165,900.351764,0
+Fuzz 46,1,1512,152.343831,900.295603,0
+Fuzz 47,1,1194,96.562942,359.034537,0
+Fuzz 48,1,1708,272.732004,900.54976,0
+Fuzz 49,1,2157,290.890079,900.545556,0
+Fuzz 50,1,2653,115.205693,782.722965,740.456961
+Fuzz 2,1,2529,307.006382,900.421186,0
+Fuzz 3,1,2157,194.330176,900.456573,0
+Fuzz 4,1,2018,309.829943,900.396484,0
+Fuzz 5,1,1604,258.34416,900.48242,0
+Fuzz 6,1,2011,410.941802,900.667565,0
+Fuzz 7,1,1311,186.18959,900.21071,0
+Fuzz 8,1,1126,172.731782,900.275751,0
+Fuzz 9,1,1935,305.042904,900.364418,0
+Fuzz 10,1,2068,173.888595,900.343108,0
+Fuzz 11,1,2009,290.629956,900.541343,0
+Fuzz 13,1,2236,363.560786,900.436692,0
+Fuzz 14,1,1573,178.100705,900.354595,0
+Fuzz 16,1,1832,154.450394,900.291659,0
+Fuzz 17,1,1635,228.573619,900.424983,0
+Fuzz 18,1,1992,324.597633,900.529311,0
+Fuzz 19,1,2088,411.380759,900.711884,0
+Fuzz 20,1,1488,214.072358,900.448158,0
+Fuzz 21,1,1951,311.14646,900.510795,0
+Fuzz 23,1,2295,325.350022,900.508112,0
+Fuzz 24,1,2370,430.323857,901.143697,0
+Fuzz 25,1,1575,150.689227,900.130918,0
+Fuzz 26,1,994,215.539597,900.383704,0
+Fuzz 27,1,2471,384.157445,900.789386,0
+Fuzz 28,1,1891,373.952016,900.628028,0
+Fuzz 29,1,1824,117.98705,900.150335,0
+Fuzz 31,1,2041,174.316771,900.200089,0
+Fuzz 33,1,2228,239.368791,900.364437,0
+Fuzz 34,1,1793,346.429776,900.599337,0
+Fuzz 35,1,1629,220.053258,900.548986,0
+Fuzz 38,1,1565,290.322814,900.48325,0
+Fuzz 39,1,2457,384.352229,900.584447,0
+Fuzz 40,1,2964,359.904766,900.378613,0
+Fuzz 41,1,1522,129.47453,699.582693,0
+Fuzz 42,1,1683,264.646528,900.420157,0
+Fuzz 43,1,1648,270.878737,900.384451,0
+Fuzz 44,1,2106,378.128116,900.522405,0
+Fuzz 45,1,1975,334.197035,900.634611,0
+Fuzz 46,1,1752,290.786605,900.442652,0
+Fuzz 47,1,1644,166.5451,900.247132,0
+Fuzz 48,1,2832,232.876139,900.209395,0
+Fuzz 49,1,1211,168.077553,900.373071,0
+Fuzz 50,1,2762,524.30388,900.810426,0
+Fuzz 2,1,2296,272.333005,601.167533,0
+Fuzz 3,1,2333,349.254256,900.464107,0
+Fuzz 4,1,3088,402.456945,900.500641,0
+Fuzz 5,1,1897,318.184784,900.516925,0
+Fuzz 6,1,2548,409.380575,900.44319,0
+Fuzz 7,1,2736,284.1255,900.388322,0
+Fuzz 8,1,2985,484.836653,900.829231,0
+Fuzz 9,1,2420,441.968231,900.664963,0
+Fuzz 10,1,2146,394.56609,900.512442,0
+Fuzz 11,1,2116,206.830853,900.43479,0
+Fuzz 12,1,2305,132.8294,721.247625,102.281166
+Fuzz 13,1,1691,266.359487,900.46785,0
+Fuzz 14,1,1734,299.125266,900.527546,0
+Fuzz 15,1,2255,387.820403,900.786862,0
+Fuzz 17,1,1794,240.054384,900.438155,0
+Fuzz 18,1,2507,351.634819,900.512632,0
+Fuzz 19,1,2195,310.537432,900.530202,0
+Fuzz 20,1,2415,365.450844,900.587785,0
+Fuzz 21,1,1775,223.080466,900.274854,0
+Fuzz 22,1,1916,374.623525,900.706793,0
+Fuzz 23,1,1978,417.171885,900.813893,0
+Fuzz 24,1,2288,187.069003,900.344873,0
+Fuzz 25,1,3159,385.365025,900.6073,0
+Fuzz 26,1,2003,301.761805,900.472407,0
+Fuzz 27,1,1987,309.143542,900.528963,0
+Fuzz 28,1,2296,427.915622,900.525708,0
+Fuzz 29,1,2500,251.724005,859.316903,1646.376144
+Fuzz 30,1,1489,158.450711,900.19748,0
+Fuzz 31,1,2093,310.154365,900.622441,0
+Fuzz 32,1,1733,427.484169,900.818488,0
+Fuzz 33,1,2227,437.403798,900.893754,0
+Fuzz 34,1,1876,488.998965,900.802485,0
+Fuzz 35,1,1834,133.436787,900.195132,0
+Fuzz 36,1,1772,315.768515,900.536993,0
+Fuzz 37,1,2107,427.31803,900.780341,0
+Fuzz 38,1,2391,380.507129,900.525278,0
+Fuzz 39,1,2144,296.234707,900.446868,0
+Fuzz 40,1,2190,322.407744,900.644391,0
+Fuzz 41,1,1977,267.528686,900.330133,0
+Fuzz 42,1,2873,429.24595,900.774039,0
+Fuzz 43,1,1490,92.070605,363.262096,0
+Fuzz 44,1,1208,157.566333,900.265795,0
+Fuzz 45,1,1624,194.997892,601.154921,0
+Fuzz 46,1,2306,328.77936,900.582425,0
+Fuzz 47,1,2331,235.02547,900.29948,0
+Fuzz 48,1,1384,243.244139,900.397972,0
+Fuzz 49,1,1597,229.305655,900.358803,0
+Fuzz 2,1,2090,499.686617,900.868653,0
+Fuzz 4,1,1877,180.625596,900.29062,0
+Fuzz 6,1,1813,290.839021,900.559346,0
+Fuzz 7,1,1338,160.217426,900.196416,0
+Fuzz 8,1,2177,364.544676,900.556296,0
+Fuzz 9,1,2517,430.472342,900.729273,0
+Fuzz 10,1,2085,304.58963,900.36732,0
+Fuzz 11,1,2435,206.94268,837.80644,1004.60368
+Fuzz 12,1,2765,597.05865,900.849736,0
+Fuzz 13,1,1389,195.831904,900.527029,0
+Fuzz 14,1,1993,264.462326,900.260622,0
+Fuzz 15,1,1980,349.115498,900.478445,0
+Fuzz 16,1,1966,382.268805,900.609859,0
+Fuzz 17,1,1291,255.300614,900.383231,0
+Fuzz 18,1,2452,407.283311,900.680661,0
+Fuzz 19,1,1735,252.773249,900.392943,0
+Fuzz 20,1,1630,221.606181,900.413356,0
+Fuzz 21,1,1806,370.02328,900.686364,0
+Fuzz 22,1,1742,152.125101,900.14227,0
+Fuzz 23,1,2359,360.237999,900.529358,0
+Fuzz 24,1,1281,184.384095,900.407354,0
+Fuzz 25,1,2266,298.785962,900.438464,0
+Fuzz 26,1,1744,246.43215,900.577484,0
+Fuzz 27,1,2296,362.438808,900.56277,0
+Fuzz 28,1,1733,253.831381,900.545728,0
+Fuzz 29,1,2601,443.128435,900.742086,0
+Fuzz 30,1,1979,169.93286,900.362318,0
+Fuzz 31,1,2593,341.522191,900.598586,0
+Fuzz 32,1,2501,178.670171,900.181472,0
+Fuzz 33,1,1615,260.231141,900.491669,0
+Fuzz 34,1,1956,247.685359,866.448492,0
+Fuzz 35,1,2101,258.260572,900.40966,0
+Fuzz 36,1,2040,318.276698,900.56708,0
+Fuzz 37,1,1844,355.863678,900.648754,0
+Fuzz 38,1,2538,491.660522,900.93176,0
+Fuzz 39,1,1678,284.862237,900.401267,0
+Fuzz 40,1,2434,398.432442,900.734535,0
+Fuzz 41,1,2243,486.193836,900.908221,0
+Fuzz 42,1,2189,288.949955,900.464879,0
+Fuzz 43,1,2039,338.826679,900.572609,0
+Fuzz 44,1,2116,438.382402,900.721428,0
+Fuzz 45,1,2116,324.164713,900.618335,0
+Fuzz 46,1,1505,245.68659,900.526637,0
+Fuzz 47,1,1793,128.132968,900.116943,0
+Fuzz 48,1,1081,144.756985,900.265431,0
+Fuzz 50,1,2537,357.136745,900.640511,0
diff --git a/paper/data/length_no_combine_out_downscale.csv b/paper/data/length_no_combine_out_downscale.csv
new file mode 100644
index 0000000..cd8622d
--- /dev/null
+++ b/paper/data/length_no_combine_out_downscale.csv
@@ -0,0 +1,2152 @@
+Name,Status,Size,Synthesis time,Equivalence check time,Reduction time
+Fuzz 2,0,146,74.646423,18.416322,0
+Fuzz 6,0,96,71.873572,2.951203,0
+Fuzz 12,0,93,73.768312,20.033062,0
+Fuzz 16,0,73,71.041271,5.746238,0
+Fuzz 32,0,107,73.262093,7.000148,0
+Fuzz 33,0,74,72.56783,4.49049,0
+Fuzz 42,0,114,72.234503,18.663599,0
+Fuzz 44,0,90,72.998595,4.958672,0
+Fuzz 50,0,102,72.888092,6.610986,0
+Fuzz 5,0,119,71.435644,12.134698,0
+Fuzz 10,0,93,74.242258,6.703888,0
+Fuzz 12,0,78,71.906033,14.568112,0
+Fuzz 24,0,133,74.184486,20.374911,0
+Fuzz 29,0,96,70.19748,6.0631,0
+Fuzz 33,0,82,71.540552,5.564533,0
+Fuzz 44,0,86,73.109718,10.229966,0
+Fuzz 3,0,76,72.866606,14.59476,0
+Fuzz 4,0,85,70.308247,2.511282,0
+Fuzz 10,0,81,71.502238,7.775708,0
+Fuzz 14,0,75,71.294444,4.047284,0
+Fuzz 25,0,91,72.151415,8.589952,0
+Fuzz 28,0,98,72.928641,9.866725,0
+Fuzz 29,0,140,72.703381,17.950128,0
+Fuzz 36,0,99,72.361307,8.37634,0
+Fuzz 49,0,96,73.487432,13.771665,0
+Fuzz 4,0,92,72.491569,15.281942,0
+Fuzz 12,0,103,72.795209,12.656161,0
+Fuzz 13,0,99,74.427538,6.992757,0
+Fuzz 14,0,98,70.045312,3.795373,0
+Fuzz 16,0,124,74.270611,7.986665,0
+Fuzz 18,0,104,72.549294,13.010928,0
+Fuzz 26,0,64,72.161848,5.855788,0
+Fuzz 29,0,87,72.864321,11.010979,0
+Fuzz 30,0,82,74.199903,10.202427,0
+Fuzz 33,0,91,71.372943,7.287287,0
+Fuzz 34,0,106,70.924073,3.254887,0
+Fuzz 44,0,81,72.088089,15.455486,0
+Fuzz 46,0,87,70.05413,2.851799,0
+Fuzz 48,0,72,70.126373,5.106716,0
+Fuzz 7,0,104,73.738724,14.506598,0
+Fuzz 8,0,116,73.858038,13.083628,0
+Fuzz 9,0,65,70.747542,4.368021,0
+Fuzz 10,0,80,71.876338,5.117686,0
+Fuzz 12,0,61,72.111926,5.034091,0
+Fuzz 15,0,97,72.354668,7.946482,0
+Fuzz 17,0,68,71.977546,5.912044,0
+Fuzz 18,0,91,72.424285,5.38757,0
+Fuzz 21,0,70,73.00134,4.578378,0
+Fuzz 22,0,154,72.219678,19.948907,0
+Fuzz 32,0,99,72.093294,10.566633,0
+Fuzz 33,0,113,73.584758,8.638415,0
+Fuzz 39,0,71,72.287111,3.605752,0
+Fuzz 41,0,73,71.140245,10.422933,0
+Fuzz 4,0,105,72.091126,14.260565,0
+Fuzz 13,0,93,72.436777,7.563082,0
+Fuzz 14,0,92,71.14376,2.49087,0
+Fuzz 17,0,137,74.314972,9.736818,0
+Fuzz 22,0,103,72.041909,3.374438,0
+Fuzz 23,0,90,72.943398,8.442618,0
+Fuzz 29,0,133,73.303614,9.147122,0
+Fuzz 30,0,76,72.300971,7.444708,0
+Fuzz 33,0,87,72.568613,11.939648,0
+Fuzz 40,0,108,74.044128,4.924703,0
+Fuzz 42,0,103,71.900063,2.603425,0
+Fuzz 49,0,102,72.735138,12.456125,0
+Fuzz 50,0,93,72.187891,18.750479,0
+Fuzz 4,0,69,72.297291,6.347698,0
+Fuzz 5,0,67,73.234538,3.783072,0
+Fuzz 6,0,104,73.099299,13.808471,0
+Fuzz 8,0,97,71.28665,4.617727,0
+Fuzz 9,0,127,72.977393,12.286098,0
+Fuzz 11,0,104,71.745066,7.720553,0
+Fuzz 16,0,69,73.433271,7.684322,0
+Fuzz 26,0,92,69.350108,4.362028,0
+Fuzz 27,0,64,70.193153,2.268604,0
+Fuzz 32,0,109,72.348221,12.98426,0
+Fuzz 36,0,94,72.276952,15.854082,0
+Fuzz 37,0,134,72.285569,16.477575,0
+Fuzz 38,0,108,73.886427,11.01813,0
+Fuzz 39,0,79,72.141838,9.687501,0
+Fuzz 41,0,126,74.928894,19.680004,0
+Fuzz 42,1,125,73.998385,11.948076,63.630414
+Fuzz 46,0,65,71.415316,4.128493,0
+Fuzz 47,1,81,70.367935,4.92914,425.64257
+Fuzz 9,0,81,72.551417,5.437285,0
+Fuzz 12,1,88,72.22787,6.516477,59.904077
+Fuzz 15,0,70,71.300859,3.061686,0
+Fuzz 16,0,97,74.351251,32.697028,0
+Fuzz 22,0,102,72.010801,7.506647,0
+Fuzz 23,0,104,72.682262,4.864818,0
+Fuzz 28,0,88,70.757599,6.141828,0
+Fuzz 31,0,77,71.644076,4.928095,0
+Fuzz 37,0,97,71.055805,6.711398,0
+Fuzz 45,0,81,74.589155,18.037611,0
+Fuzz 2,0,59,71.301596,5.036293,0
+Fuzz 4,0,123,73.286798,15.314224,0
+Fuzz 6,0,75,70.937955,1.450087,0
+Fuzz 10,0,114,72.173552,9.745631,0
+Fuzz 14,0,83,71.147951,8.407221,0
+Fuzz 16,0,106,70.436457,7.200204,0
+Fuzz 24,0,64,72.829269,2.674092,0
+Fuzz 28,0,87,72.810454,6.559907,0
+Fuzz 30,0,62,70.989,1.492792,0
+Fuzz 33,0,87,73.955372,4.624642,0
+Fuzz 43,0,90,71.32413,5.472087,0
+Fuzz 46,0,93,71.327572,8.033075,0
+Fuzz 4,0,87,72.982998,3.958816,0
+Fuzz 6,0,102,72.061811,10.026887,0
+Fuzz 7,0,50,72.195324,8.499527,0
+Fuzz 12,0,127,74.498196,9.409339,0
+Fuzz 14,0,86,71.213316,9.894672,0
+Fuzz 16,0,54,70.452063,5.005332,0
+Fuzz 19,0,78,70.790035,8.835608,0
+Fuzz 23,0,62,70.179473,4.364302,0
+Fuzz 26,0,78,71.828887,4.618585,0
+Fuzz 32,0,122,73.16632,5.154544,0
+Fuzz 34,0,87,70.254269,3.367667,0
+Fuzz 38,0,84,71.074987,7.945033,0
+Fuzz 39,0,101,72.68422,7.41918,0
+Fuzz 44,0,68,71.509298,3.886047,0
+Fuzz 45,0,78,74.010777,15.857159,0
+Fuzz 46,0,106,72.689723,12.834051,0
+Fuzz 5,0,96,72.090388,3.430054,0
+Fuzz 7,0,99,73.5156,7.782401,0
+Fuzz 15,0,104,72.32454,5.020936,0
+Fuzz 18,0,79,75.373362,15.781834,0
+Fuzz 22,0,68,77.222575,12.12375,0
+Fuzz 24,0,77,75.050859,2.537986,0
+Fuzz 28,0,82,72.889075,5.197562,0
+Fuzz 29,0,131,74.000708,6.048649,0
+Fuzz 36,0,95,75.210864,6.301127,0
+Fuzz 46,0,62,74.7351,9.547083,0
+Fuzz 7,0,90,72.437032,5.326909,0
+Fuzz 9,0,64,74.268964,4.035862,0
+Fuzz 12,0,95,76.232466,10.932054,0
+Fuzz 14,0,76,73.620734,8.207318,0
+Fuzz 15,0,77,77.15357,7.921446,0
+Fuzz 18,0,133,77.212522,11.823027,0
+Fuzz 29,0,101,78.198902,25.884074,0
+Fuzz 33,0,66,75.884508,9.488332,0
+Fuzz 40,0,79,75.67291,11.402531,0
+Fuzz 45,0,69,75.635874,14.009612,0
+Fuzz 2,0,92,71.495902,7.421627,0
+Fuzz 3,0,98,71.386459,12.369502,0
+Fuzz 14,0,95,72.138222,6.391679,0
+Fuzz 15,0,104,72.202227,900,0
+Fuzz 16,0,114,86.616177,55.342485,0
+Fuzz 18,0,75,79.262522,9.563638,0
+Fuzz 19,0,89,71.283796,4.374381,0
+Fuzz 22,0,82,72.715686,14.573082,0
+Fuzz 23,0,91,71.044451,7.513261,0
+Fuzz 26,0,86,71.625706,2.699291,0
+Fuzz 29,0,82,70.811564,2.843621,0
+Fuzz 33,0,71,72.039158,1.840206,0
+Fuzz 34,0,91,72.011175,6.332108,0
+Fuzz 36,0,96,72.485659,4.681577,0
+Fuzz 37,0,75,72.211767,3.705134,0
+Fuzz 39,0,109,71.671473,1.561604,0
+Fuzz 4,0,103,75.927843,8.309996,0
+Fuzz 14,0,67,75.405414,5.978987,0
+Fuzz 15,0,115,77.571815,25.625284,0
+Fuzz 23,0,63,75.389776,9.345969,0
+Fuzz 27,0,69,73.732019,1.735645,0
+Fuzz 29,0,78,77.357802,6.90549,0
+Fuzz 36,0,73,76.614398,10.94118,0
+Fuzz 37,0,68,76.707867,1.988434,0
+Fuzz 43,0,111,75.110987,10.268495,0
+Fuzz 44,0,71,74.234058,3.955254,0
+Fuzz 45,1,116,76.27798,13.125639,257.114763
+Fuzz 47,0,86,75.011004,10.67129,0
+Fuzz 49,0,95,77.34612,13.267495,0
+Fuzz 4,0,104,75.583982,14.668887,0
+Fuzz 5,0,100,76.785659,9.11211,0
+Fuzz 10,0,108,75.765072,8.639623,0
+Fuzz 15,0,93,76.91971,9.809222,0
+Fuzz 27,0,79,74.184038,4.231917,0
+Fuzz 29,0,116,75.254722,13.098536,0
+Fuzz 36,0,126,76.954319,9.456512,0
+Fuzz 40,1,61,74.343246,5.431376,82.656799
+Fuzz 42,0,98,75.344829,11.017243,0
+Fuzz 49,0,123,77.238954,20.510437,0
+Fuzz 6,0,111,75.42603,4.446905,0
+Fuzz 8,0,98,73.14826,4.568752,0
+Fuzz 10,0,61,71.588909,4.566802,0
+Fuzz 18,0,72,71.341439,2.666635,0
+Fuzz 26,0,98,73.032503,13.111283,0
+Fuzz 27,0,97,72.690369,3.62989,0
+Fuzz 34,0,95,71.361858,14.500125,0
+Fuzz 36,0,74,72.621621,6.010067,0
+Fuzz 38,1,123,72.495588,4.20255,146.012417
+Fuzz 43,1,84,72.661005,7.40912,743.699324
+Fuzz 47,0,118,74.224173,12.689687,0
+Fuzz 48,0,85,72.550155,2.691156,0
+Fuzz 6,0,92,73.927824,9.313543,0
+Fuzz 7,0,83,72.69214,3.032107,0
+Fuzz 9,0,79,73.864259,5.418262,0
+Fuzz 11,1,65,72.323161,12.352927,312.481034
+Fuzz 13,0,84,73.431144,10.540884,0
+Fuzz 16,0,97,70.925264,5.853123,0
+Fuzz 19,0,91,71.252654,5.218853,0
+Fuzz 21,0,85,71.777281,8.114251,0
+Fuzz 24,0,88,72.315084,5.509292,0
+Fuzz 25,0,119,73.173787,13.993611,0
+Fuzz 28,0,64,71.475844,4.29899,0
+Fuzz 32,0,77,71.84385,9.091881,0
+Fuzz 41,0,110,71.529812,14.38943,0
+Fuzz 44,0,74,72.595876,8.237137,0
+Fuzz 45,0,111,74.079939,14.893195,0
+Fuzz 47,0,76,72.831254,10.827089,0
+Fuzz 6,0,82,73.970081,5.784058,0
+Fuzz 12,1,92,74.263624,10.505789,77.32313
+Fuzz 14,1,91,73.913235,9.239101,114.665239
+Fuzz 17,0,56,70.942091,5.318331,0
+Fuzz 18,0,130,71.388153,5.135858,0
+Fuzz 19,0,74,72.82001,7.704043,0
+Fuzz 20,0,92,73.773449,11.72382,0
+Fuzz 27,0,138,73.095644,13.236032,0
+Fuzz 29,0,105,74.583277,9.316736,0
+Fuzz 30,1,57,76.722392,900,0
+Fuzz 42,0,73,70.677817,2.951428,0
+Fuzz 2,1,106,79.628853,19.374373,103.718516
+Fuzz 9,0,139,72.536315,15.222407,0
+Fuzz 14,0,91,72.752411,13.970738,0
+Fuzz 16,0,126,73.721093,9.379498,0
+Fuzz 18,0,122,73.026286,18.864982,0
+Fuzz 19,0,86,73.246042,9.035134,0
+Fuzz 22,0,70,70.241642,5.814191,0
+Fuzz 24,0,89,70.334145,6.225499,0
+Fuzz 30,0,59,71.564536,1.743871,0
+Fuzz 39,0,89,71.733506,16.832782,0
+Fuzz 43,0,104,72.251159,6.829772,0
+Fuzz 48,0,60,72.572772,7.512161,0
+Fuzz 50,0,64,71.646463,4.141871,0
+Fuzz 12,0,85,71.235655,8.261464,0
+Fuzz 16,0,135,72.614701,10.567625,0
+Fuzz 17,0,85,71.810983,7.767422,0
+Fuzz 24,0,89,72.510051,12.480236,0
+Fuzz 27,0,122,73.888983,12.599895,0
+Fuzz 32,0,93,72.751039,8.060951,0
+Fuzz 33,1,75,74.506342,15.193782,93.221004
+Fuzz 34,0,84,72.015429,5.583333,0
+Fuzz 35,0,125,72.724306,4.209333,0
+Fuzz 36,0,130,72.821048,13.357093,0
+Fuzz 38,0,93,71.325522,6.161877,0
+Fuzz 41,0,78,72.076806,8.094514,0
+Fuzz 46,0,155,76.131872,17.10673,0
+Fuzz 50,0,81,71.363297,6.942911,0
+Fuzz 5,0,112,72.184424,2.917079,0
+Fuzz 12,0,128,75.027551,32.120629,0
+Fuzz 18,0,90,72.086276,6.844347,0
+Fuzz 22,0,112,73.065978,14.2412,0
+Fuzz 23,0,60,70.594673,2.649629,0
+Fuzz 27,0,83,71.99193,10.675276,0
+Fuzz 31,0,88,72.546522,13.353188,0
+Fuzz 32,0,116,74.097282,18.430866,0
+Fuzz 34,0,51,71.060729,4.236701,0
+Fuzz 38,0,82,71.926058,4.246027,0
+Fuzz 40,1,121,72.632624,13.878333,243.492526
+Fuzz 42,0,107,71.97698,8.776402,0
+Fuzz 46,0,105,70.952255,12.715692,0
+Fuzz 50,1,68,71.859738,7.907802,50.309164
+Fuzz 4,0,74,71.958012,2.720208,0
+Fuzz 10,0,77,72.010071,3.858057,0
+Fuzz 14,0,70,72.82096,6.659791,0
+Fuzz 26,0,78,71.043969,4.348117,0
+Fuzz 28,0,134,74.51849,18.598271,0
+Fuzz 33,0,123,73.02532,11.557775,0
+Fuzz 41,1,103,71.876408,10.194223,450.563587
+Fuzz 43,0,121,71.194717,7.05621,0
+Fuzz 46,0,88,71.153968,5.730992,0
+Fuzz 9,0,71,69.857626,2.769403,0
+Fuzz 10,0,86,73.071051,6.982346,0
+Fuzz 11,0,84,73.193135,5.779337,0
+Fuzz 12,0,74,72.355295,6.701503,0
+Fuzz 16,0,86,71.205659,14.485622,0
+Fuzz 20,0,114,70.295226,11.884002,0
+Fuzz 26,1,94,71.615756,8.354787,63.825712
+Fuzz 30,0,84,73.811898,8.171454,0
+Fuzz 32,0,85,71.312959,6.859778,0
+Fuzz 33,0,93,71.047352,20.263784,0
+Fuzz 36,1,74,71.826916,8.823416,97.93935
+Fuzz 42,0,100,71.62534,5.960061,0
+Fuzz 43,0,105,71.035509,9.172518,0
+Fuzz 50,0,87,71.649043,11.583398,0
+Fuzz 2,0,101,71.826256,5.097935,0
+Fuzz 5,0,98,72.40695,12.3964,0
+Fuzz 7,0,83,70.66008,3.171558,0
+Fuzz 8,0,76,72.376875,5.282925,0
+Fuzz 11,0,93,70.774118,6.063553,0
+Fuzz 12,0,87,71.195809,4.434718,0
+Fuzz 13,0,113,70.146392,5.536441,0
+Fuzz 15,0,82,71.381078,4.401758,0
+Fuzz 16,0,87,71.378131,6.093175,0
+Fuzz 18,0,73,70.104487,6.586496,0
+Fuzz 22,0,118,71.727105,8.171643,0
+Fuzz 24,0,85,71.0813,6.573987,0
+Fuzz 27,0,76,71.607858,2.644539,0
+Fuzz 33,0,80,71.026324,11.486917,0
+Fuzz 37,0,104,72.774842,8.175681,0
+Fuzz 39,0,111,71.407901,5.84555,0
+Fuzz 44,0,62,71.399999,4.425091,0
+Fuzz 3,0,62,70.538592,3.15107,0
+Fuzz 4,0,96,72.991682,21.102657,0
+Fuzz 5,0,86,72.933909,5.430361,0
+Fuzz 10,0,75,71.724353,3.154664,0
+Fuzz 11,1,55,71.346474,2.408092,82.66199
+Fuzz 18,0,78,72.638284,11.414123,0
+Fuzz 22,0,128,72.962124,7.761435,0
+Fuzz 24,0,100,72.94564,12.740614,0
+Fuzz 30,0,91,76.341594,13.868107,0
+Fuzz 32,0,117,72.009841,23.526094,0
+Fuzz 34,0,97,73.100353,5.201199,0
+Fuzz 41,0,70,72.284627,4.38766,0
+Fuzz 44,0,115,74.462923,12.789238,0
+Fuzz 49,0,129,72.092767,8.955184,0
+Fuzz 50,0,92,71.54876,5.695457,0
+Fuzz 6,0,78,70.476408,1.902679,0
+Fuzz 17,0,87,70.848599,6.44124,0
+Fuzz 19,0,65,71.350019,2.396322,0
+Fuzz 25,0,70,73.613046,8.790234,0
+Fuzz 26,0,130,76.569395,22.75876,0
+Fuzz 27,0,107,70.39429,5.82885,0
+Fuzz 33,0,78,73.123736,10.297717,0
+Fuzz 36,0,88,73.85348,8.020748,0
+Fuzz 42,0,71,73.066169,2.24234,0
+Fuzz 45,0,79,71.2799,5.211888,0
+Fuzz 47,0,94,71.859541,17.108008,0
+Fuzz 2,0,58,71.423849,4.839652,0
+Fuzz 3,0,79,74.080797,12.926608,0
+Fuzz 6,0,79,71.734464,7.913331,0
+Fuzz 18,0,118,73.050758,9.45603,0
+Fuzz 19,0,71,71.560835,3.33425,0
+Fuzz 28,0,72,73.030845,7.690309,0
+Fuzz 30,0,92,71.999434,11.736815,0
+Fuzz 35,0,104,72.470798,6.852434,0
+Fuzz 38,0,122,86.058471,8.090734,0
+Fuzz 42,0,99,71.00151,5.949113,0
+Fuzz 50,0,94,73.656657,20.290123,0
+Fuzz 5,0,69,72.855262,5.586084,0
+Fuzz 8,0,71,71.600422,6.547714,0
+Fuzz 10,0,60,72.016401,2.262308,0
+Fuzz 17,0,78,71.645049,5.135306,0
+Fuzz 18,0,110,73.685978,14.390668,0
+Fuzz 20,0,65,74.250988,14.863023,0
+Fuzz 32,0,64,73.217789,7.137366,0
+Fuzz 36,0,96,72.84661,7.603309,0
+Fuzz 37,0,125,71.124369,7.412153,0
+Fuzz 44,0,73,71.620582,9.632945,0
+Fuzz 5,0,87,73.256872,9.925276,0
+Fuzz 18,0,79,73.190907,7.828818,0
+Fuzz 25,0,82,71.326868,4.681311,0
+Fuzz 26,0,84,72.189349,7.404801,0
+Fuzz 29,0,105,72.81377,8.889784,0
+Fuzz 39,0,91,71.704947,5.300794,0
+Fuzz 40,0,123,74.479485,14.6636,0
+Fuzz 45,0,70,71.033479,8.152292,0
+Fuzz 49,0,91,72.441236,5.263391,0
+Fuzz 50,0,62,72.766236,6.279308,0
+Fuzz 2,0,90,72.562864,7.579643,0
+Fuzz 3,0,114,71.44929,6.583908,0
+Fuzz 4,0,104,71.3737,6.516172,0
+Fuzz 7,0,77,72.035856,6.360398,0
+Fuzz 11,0,59,71.178874,6.889521,0
+Fuzz 12,0,73,71.705628,2.689198,0
+Fuzz 13,0,82,72.304703,4.281515,0
+Fuzz 20,1,77,72.482065,7.622785,99.936544
+Fuzz 21,0,110,72.001188,5.210785,0
+Fuzz 24,0,65,71.587494,6.636102,0
+Fuzz 27,0,86,72.238281,3.999046,0
+Fuzz 30,0,145,74.816194,9.166429,0
+Fuzz 31,0,60,72.600552,4.111404,0
+Fuzz 38,0,80,71.569378,5.538709,0
+Fuzz 49,0,120,73.473866,34.06817,0
+Fuzz 5,0,51,71.817207,2.135007,0
+Fuzz 12,0,63,71.117955,6.29421,0
+Fuzz 14,0,115,72.160177,11.16998,0
+Fuzz 18,0,115,71.343533,7.643396,0
+Fuzz 27,1,88,72.365749,12.649579,117.382196
+Fuzz 29,0,88,76.304475,4.376294,0
+Fuzz 30,0,91,72.827358,15.054965,0
+Fuzz 32,0,111,72.664027,11.259749,0
+Fuzz 34,0,67,74.426573,22.301614,0
+Fuzz 37,0,91,74.260734,3.806227,0
+Fuzz 39,0,69,73.726643,6.720132,0
+Fuzz 42,0,101,72.403618,6.240638,0
+Fuzz 46,0,78,71.74652,5.540028,0
+Fuzz 49,0,95,73.597926,8.592435,0
+Fuzz 6,0,92,74.194052,9.311809,0
+Fuzz 9,0,63,72.223469,3.92423,0
+Fuzz 11,0,107,71.394785,6.871988,0
+Fuzz 17,0,102,71.910181,7.176835,0
+Fuzz 21,0,61,72.055059,7.429755,0
+Fuzz 22,0,123,75.571327,14.155757,0
+Fuzz 23,0,67,72.62478,3.437533,0
+Fuzz 24,1,74,71.219331,2.928582,73.529983
+Fuzz 27,0,112,72.592484,5.804971,0
+Fuzz 29,0,96,73.892798,12.931999,0
+Fuzz 33,0,65,71.280199,2.3796,0
+Fuzz 36,0,109,72.770135,34.912576,0
+Fuzz 42,0,101,72.559503,15.275449,0
+Fuzz 43,0,92,70.662336,9.150453,0
+Fuzz 49,0,76,71.535701,7.800557,0
+Fuzz 50,0,90,73.144982,8.085757,0
+Fuzz 2,0,68,75.284955,10.147037,0
+Fuzz 3,0,81,101.603555,11.253669,0
+Fuzz 7,0,81,75.240254,11.160295,0
+Fuzz 11,0,96,73.009551,4.008707,0
+Fuzz 13,0,67,72.8801,6.641468,0
+Fuzz 15,0,102,73.509135,10.921398,0
+Fuzz 17,0,63,72.830065,5.323534,0
+Fuzz 24,0,78,71.775315,5.214451,0
+Fuzz 27,0,87,73.079423,10.32532,0
+Fuzz 31,0,58,71.675253,4.276761,0
+Fuzz 33,0,96,70.808795,2.092185,0
+Fuzz 35,0,101,73.354214,304.974113,0
+Fuzz 36,0,93,73.844946,4.422666,0
+Fuzz 37,0,108,72.48088,6.486585,0
+Fuzz 42,1,95,70.91925,7.717752,306.145554
+Fuzz 43,0,105,72.694239,7.988451,0
+Fuzz 45,1,90,70.606707,7.937552,84.863332
+Fuzz 47,0,94,72.384061,8.27007,0
+Fuzz 48,0,101,71.290765,7.732903,0
+Fuzz 49,0,88,72.353785,4.610396,0
+Fuzz 2,0,72,71.92034,3.401347,0
+Fuzz 5,0,110,71.366963,16.31872,0
+Fuzz 6,0,89,72.657218,8.979658,0
+Fuzz 11,1,84,72.811459,9.793855,63.330286
+Fuzz 15,0,78,72.370466,8.594637,0
+Fuzz 17,0,96,74.727206,15.165785,0
+Fuzz 20,0,111,76.600185,15.044746,0
+Fuzz 32,0,117,77.004553,16.691138,0
+Fuzz 35,0,124,73.430501,15.31728,0
+Fuzz 39,0,93,71.389751,3.840368,0
+Fuzz 46,0,84,71.031998,9.901678,0
+Fuzz 4,0,57,71.05393,2.299137,0
+Fuzz 6,0,126,72.928468,4.460924,0
+Fuzz 9,0,80,70.894858,10.380833,0
+Fuzz 10,0,87,69.397458,5.695926,0
+Fuzz 15,0,104,72.333876,7.24727,0
+Fuzz 19,0,87,72.006567,7.440604,0
+Fuzz 28,0,106,70.431196,10.202601,0
+Fuzz 33,0,79,71.866326,7.634441,0
+Fuzz 39,0,115,71.78892,6.190092,0
+Fuzz 43,0,86,71.505271,5.483843,0
+Fuzz 44,0,106,74.781204,25.403778,0
+Fuzz 5,0,82,71.226979,16.144661,0
+Fuzz 7,0,119,73.888967,20.04781,0
+Fuzz 11,0,149,72.649791,27.685153,0
+Fuzz 12,0,90,70.934084,8.335755,0
+Fuzz 16,0,70,72.534678,5.691589,0
+Fuzz 19,0,68,70.492142,3.096175,0
+Fuzz 20,0,128,72.876358,4.970053,0
+Fuzz 21,0,70,71.154285,4.62881,0
+Fuzz 24,0,64,72.155101,5.31168,0
+Fuzz 25,0,91,74.394124,7.340889,0
+Fuzz 33,0,127,73.843766,16.975837,0
+Fuzz 35,0,96,72.914435,4.830654,0
+Fuzz 40,1,65,71.920653,2.703747,70.526781
+Fuzz 42,0,114,73.792231,24.650045,0
+Fuzz 43,0,121,71.535724,19.20074,0
+Fuzz 44,0,78,72.023035,19.335219,0
+Fuzz 49,0,86,73.042039,15.531921,0
+Fuzz 2,0,82,71.62517,64.080584,0
+Fuzz 5,0,100,71.512357,1.831627,0
+Fuzz 11,0,84,70.778657,7.110014,0
+Fuzz 16,0,87,76.50993,5.840321,0
+Fuzz 22,0,67,72.536379,7.05251,0
+Fuzz 34,1,75,71.927715,15.66933,96.128873
+Fuzz 35,0,109,73.642935,17.353243,0
+Fuzz 39,0,80,71.830404,3.622274,0
+Fuzz 40,0,66,72.26901,5.665766,0
+Fuzz 42,0,84,72.807525,12.619215,0
+Fuzz 43,0,85,72.32136,2.353768,0
+Fuzz 47,0,129,105.054241,18.997227,0
+Fuzz 49,0,73,74.549113,5.986612,0
+Fuzz 8,0,83,70.595823,4.449537,0
+Fuzz 13,0,103,71.660049,9.14651,0
+Fuzz 23,0,114,74.561544,14.167897,0
+Fuzz 26,0,94,72.406136,5.158976,0
+Fuzz 30,0,113,73.524991,16.017835,0
+Fuzz 33,0,83,70.448123,4.048845,0
+Fuzz 37,0,73,71.425945,10.039138,0
+Fuzz 38,0,107,70.635176,6.24263,0
+Fuzz 45,0,105,71.049216,8.386409,0
+Fuzz 50,0,109,74.488371,7.474576,0
+Fuzz 10,0,93,71.836998,11.28565,0
+Fuzz 13,0,82,70.730548,4.70165,0
+Fuzz 17,0,78,74.16185,13.981987,0
+Fuzz 20,0,65,71.043513,2.484671,0
+Fuzz 21,0,72,74.742125,24.046173,0
+Fuzz 26,0,96,71.176596,13.854139,0
+Fuzz 27,0,92,71.419849,5.750024,0
+Fuzz 31,0,71,71.327422,10.247261,0
+Fuzz 33,0,107,73.105794,4.643584,0
+Fuzz 35,0,95,72.153572,9.96602,0
+Fuzz 37,0,62,73.814316,9.932445,0
+Fuzz 43,0,66,70.227587,2.884122,0
+Fuzz 44,0,76,72.888424,5.760859,0
+Fuzz 48,0,114,75.782195,5.33696,0
+Fuzz 49,0,89,71.808591,7.519881,0
+Fuzz 3,0,92,70.435469,7.224636,0
+Fuzz 4,0,94,71.545023,4.838697,0
+Fuzz 7,0,94,72.690552,8.435568,0
+Fuzz 8,0,67,72.035229,4.271445,0
+Fuzz 9,0,99,73.500943,10.095482,0
+Fuzz 11,0,94,71.903744,7.158865,0
+Fuzz 12,0,86,72.520379,11.233373,0
+Fuzz 19,0,79,71.649227,4.47061,0
+Fuzz 24,0,128,73.72198,18.372566,0
+Fuzz 30,0,86,72.095731,12.355073,0
+Fuzz 34,0,125,74.075261,12.54074,0
+Fuzz 38,0,104,72.552729,6.631698,0
+Fuzz 39,1,111,74.211563,900,0
+Fuzz 41,0,79,71.994754,11.573809,0
+Fuzz 42,0,79,72.534478,11.475823,0
+Fuzz 47,0,107,73.082834,18.529654,0
+Fuzz 5,0,90,70.417229,3.718537,0
+Fuzz 14,0,107,74.49281,11.665055,0
+Fuzz 15,0,105,72.603229,2.707289,0
+Fuzz 18,0,78,72.295696,3.57013,0
+Fuzz 19,0,73,72.925706,3.709207,0
+Fuzz 26,0,51,72.232503,3.586524,0
+Fuzz 35,0,97,73.192928,16.131822,0
+Fuzz 37,0,111,74.176227,33.219905,0
+Fuzz 38,0,63,71.695401,2.486809,0
+Fuzz 44,0,95,72.27142,5.147954,0
+Fuzz 46,0,71,80.798814,2.531688,0
+Fuzz 47,0,78,71.187083,10.317654,0
+Fuzz 7,0,107,74.356919,25.340372,0
+Fuzz 11,0,95,72.941739,43.485413,0
+Fuzz 13,0,71,75.309317,15.669931,0
+Fuzz 14,0,86,71.650659,8.235248,0
+Fuzz 15,0,80,71.548887,3.567798,0
+Fuzz 19,0,96,72.361785,7.821434,0
+Fuzz 22,0,95,73.055838,8.993896,0
+Fuzz 24,0,87,73.049949,11.109253,0
+Fuzz 25,0,83,72.169115,7.703093,0
+Fuzz 26,0,90,71.939479,5.363769,0
+Fuzz 32,0,86,72.027932,5.803427,0
+Fuzz 34,0,78,72.230415,10.653109,0
+Fuzz 35,0,82,72.83754,9.839954,0
+Fuzz 37,0,96,72.036826,3.040048,0
+Fuzz 40,0,107,72.577383,4.169587,0
+Fuzz 43,0,92,72.279731,5.194351,0
+Fuzz 48,0,68,71.788126,11.754325,0
+Fuzz 50,0,95,72.019458,6.095857,0
+Fuzz 3,0,76,74.879266,7.657829,0
+Fuzz 5,0,127,72.430465,14.665413,0
+Fuzz 8,0,115,73.200569,6.054002,0
+Fuzz 10,0,112,71.273442,6.126347,0
+Fuzz 14,1,83,71.453704,3.742496,48.657025
+Fuzz 20,0,81,72.504284,9.286867,0
+Fuzz 37,0,64,71.358978,3.852511,0
+Fuzz 41,0,89,71.751799,11.322972,0
+Fuzz 47,0,101,86.758674,18.671978,0
+Fuzz 4,0,115,72.871543,5.988881,0
+Fuzz 6,0,86,70.946,5.542543,0
+Fuzz 7,0,80,71.933746,2.344226,0
+Fuzz 9,0,76,72.113081,4.794325,0
+Fuzz 13,0,103,72.193001,18.571047,0
+Fuzz 16,0,96,72.30138,6.454318,0
+Fuzz 19,0,79,71.773242,12.346095,0
+Fuzz 24,0,128,71.27873,11.05201,0
+Fuzz 26,0,93,71.37962,11.011294,0
+Fuzz 27,0,94,72.04962,6.9077,0
+Fuzz 29,0,172,73.902152,8.501896,0
+Fuzz 30,0,131,74.220298,11.762584,0
+Fuzz 36,0,77,72.168797,3.656847,0
+Fuzz 44,0,67,71.421673,3.584942,0
+Fuzz 45,0,72,72.547335,3.735932,0
+Fuzz 46,0,105,72.653953,15.61426,0
+Fuzz 2,0,84,70.656397,3.681937,0
+Fuzz 3,0,90,70.936518,7.591465,0
+Fuzz 5,0,78,72.43496,17.236447,0
+Fuzz 10,0,88,75.490018,43.425189,0
+Fuzz 15,0,71,71.444146,2.64744,0
+Fuzz 24,0,108,73.144222,7.834925,0
+Fuzz 29,0,85,72.802048,8.359729,0
+Fuzz 33,0,63,71.955456,2.58709,0
+Fuzz 35,0,112,72.841532,8.767443,0
+Fuzz 38,0,101,70.320533,3.046113,0
+Fuzz 42,0,72,72.830213,7.61609,0
+Fuzz 43,0,100,72.031471,121.242894,0
+Fuzz 46,0,69,70.16802,3.210404,0
+Fuzz 47,0,84,72.737051,6.616322,0
+Fuzz 48,0,80,73.967824,11.499011,0
+Fuzz 49,0,120,73.633981,8.595127,0
+Fuzz 50,0,82,70.801482,4.917556,0
+Fuzz 2,0,104,77.195161,8.017485,0
+Fuzz 4,0,52,72.778411,9.986742,0
+Fuzz 6,0,74,73.155873,12.155001,0
+Fuzz 7,0,81,71.353654,13.248948,0
+Fuzz 8,0,85,72.643462,13.651436,0
+Fuzz 18,0,84,73.067297,16.362548,0
+Fuzz 35,0,91,73.346696,7.412008,0
+Fuzz 49,1,77,72.067452,15.860493,48.678808
+Fuzz 2,0,71,69.778744,5.769099,0
+Fuzz 4,0,104,72.874155,7.764141,0
+Fuzz 7,0,114,72.089256,12.327287,0
+Fuzz 10,0,123,71.062411,7.878658,0
+Fuzz 16,0,83,70.273045,6.156545,0
+Fuzz 17,0,79,70.696342,8.937416,0
+Fuzz 19,0,95,73.610297,8.464382,0
+Fuzz 27,0,94,72.502794,14.004036,0
+Fuzz 29,0,76,72.505111,3.425628,0
+Fuzz 34,0,104,73.064152,13.375332,0
+Fuzz 38,0,93,74.655575,8.534089,0
+Fuzz 40,0,91,72.107945,8.516585,0
+Fuzz 41,0,126,73.198979,21.424231,0
+Fuzz 3,0,64,72.260193,9.165007,0
+Fuzz 13,0,78,70.602942,5.409203,0
+Fuzz 17,0,105,73.708688,17.406649,0
+Fuzz 22,0,87,74.578332,13.480151,0
+Fuzz 27,0,95,72.978696,4.889509,0
+Fuzz 34,0,96,73.088412,11.196184,0
+Fuzz 35,0,113,72.256131,12.343783,0
+Fuzz 37,0,110,72.035321,7.68213,0
+Fuzz 44,0,96,72.906072,9.064228,0
+Fuzz 47,0,73,72.435794,2.643417,0
+Fuzz 7,0,175,73.361043,14.759818,0
+Fuzz 11,0,82,71.86981,5.929778,0
+Fuzz 14,0,114,74.405312,3.079533,0
+Fuzz 17,0,80,73.401538,22.722633,0
+Fuzz 18,0,82,70.759861,8.418741,0
+Fuzz 20,0,118,71.40923,17.524063,0
+Fuzz 22,0,85,72.078696,7.384303,0
+Fuzz 27,0,93,73.806725,4.326515,0
+Fuzz 32,0,97,71.632151,4.555502,0
+Fuzz 36,0,92,71.302906,5.01874,0
+Fuzz 38,0,79,70.457261,6.42126,0
+Fuzz 40,0,91,73.227327,8.68146,0
+Fuzz 44,0,89,72.509415,5.249181,0
+Fuzz 2,0,98,72.403517,2.841816,0
+Fuzz 3,0,76,70.755247,2.78463,0
+Fuzz 12,0,129,73.683708,11.290568,0
+Fuzz 15,0,119,73.124236,8.7805,0
+Fuzz 19,0,72,72.234945,12.441913,0
+Fuzz 23,0,77,71.082715,9.675802,0
+Fuzz 25,0,90,72.650642,8.540383,0
+Fuzz 31,0,90,71.493226,6.808122,0
+Fuzz 37,0,104,72.680847,11.970032,0
+Fuzz 39,0,111,73.708576,23.268865,0
+Fuzz 43,0,68,71.335119,3.05231,0
+Fuzz 48,0,98,71.899125,9.764343,0
+Fuzz 49,0,102,72.473647,4.810138,0
+Fuzz 5,0,83,72.515379,9.31961,0
+Fuzz 10,0,96,69.721961,4.067952,0
+Fuzz 15,0,88,70.959113,4.38592,0
+Fuzz 17,0,115,74.77403,20.442781,0
+Fuzz 18,0,83,71.340445,3.249458,0
+Fuzz 23,0,102,71.862545,11.67508,0
+Fuzz 29,0,98,73.047649,5.824981,0
+Fuzz 30,1,98,72.397244,7.43881,91.64909
+Fuzz 31,0,151,72.626769,14.2442,0
+Fuzz 35,0,103,73.299167,22.038688,0
+Fuzz 36,0,73,71.965237,3.226463,0
+Fuzz 37,0,122,74.465389,79.009403,0
+Fuzz 49,0,75,72.675099,12.29296,0
+Fuzz 2,1,75,70.938928,7.599354,52.873418
+Fuzz 10,0,91,71.805407,11.176555,0
+Fuzz 13,0,114,73.054809,5.358676,0
+Fuzz 17,0,85,73.092186,9.79159,0
+Fuzz 20,0,81,71.477084,4.973815,0
+Fuzz 24,0,73,72.682301,10.58477,0
+Fuzz 26,0,87,73.669719,7.433257,0
+Fuzz 33,1,98,71.339358,10.00328,434.526973
+Fuzz 38,0,109,75.401116,14.227693,0
+Fuzz 39,1,118,72.558277,14.408405,375.610861
+Fuzz 40,0,97,71.283507,4.86373,0
+Fuzz 46,0,105,69.804205,6.263698,0
+Fuzz 47,0,95,73.581675,20.94428,0
+Fuzz 49,0,125,70.697124,10.602546,0
+Fuzz 50,0,107,74.059919,7.153777,0
+Fuzz 2,0,53,71.862491,7.155501,0
+Fuzz 3,0,103,73.174299,7.431448,0
+Fuzz 6,0,74,71.978879,3.021722,0
+Fuzz 13,0,121,72.061511,12.826512,0
+Fuzz 15,0,78,71.196872,1.717829,0
+Fuzz 17,0,120,73.219556,19.992408,0
+Fuzz 22,0,98,71.609177,9.717119,0
+Fuzz 24,0,66,70.948455,8.356043,0
+Fuzz 27,0,98,72.792191,25.824579,0
+Fuzz 29,0,94,71.812335,8.420549,0
+Fuzz 33,0,82,72.179186,14.06877,0
+Fuzz 41,0,83,71.933834,5.076161,0
+Fuzz 47,0,92,70.637763,6.569366,0
+Fuzz 48,0,92,72.680226,9.532664,0
+Fuzz 12,0,93,72.072116,6.075792,0
+Fuzz 14,0,78,71.694823,5.488461,0
+Fuzz 15,0,89,72.382193,3.586367,0
+Fuzz 21,0,93,73.539972,8.412195,0
+Fuzz 22,0,121,71.098429,7.262326,0
+Fuzz 23,0,99,73.889546,15.755086,0
+Fuzz 27,0,67,70.874243,10.557,0
+Fuzz 36,0,107,73.821345,28.869291,0
+Fuzz 38,0,109,72.263774,11.364929,0
+Fuzz 43,0,79,72.953899,4.545158,0
+Fuzz 47,0,57,71.137627,3.542387,0
+Fuzz 14,0,83,71.835361,7.908069,0
+Fuzz 15,0,82,72.538803,2.978648,0
+Fuzz 19,0,72,70.973472,2.830298,0
+Fuzz 20,0,107,70.812129,4.999171,0
+Fuzz 21,0,72,70.087846,12.709412,0
+Fuzz 26,1,63,72.611888,5.847793,86.75346
+Fuzz 31,0,93,74.301806,8.945775,0
+Fuzz 34,0,56,77.171801,5.895089,0
+Fuzz 42,0,114,72.965571,7.914456,0
+Fuzz 45,0,87,71.672456,4.683457,0
+Fuzz 46,0,135,76.946431,6.651863,0
+Fuzz 47,0,90,73.876018,4.151348,0
+Fuzz 5,0,74,71.97855,4.427583,0
+Fuzz 12,1,93,72.452177,11.708915,482.644336
+Fuzz 13,1,53,70.796811,6.051663,543.706196
+Fuzz 14,0,94,73.09951,15.004154,0
+Fuzz 20,1,146,72.182969,9.650052,301.656214
+Fuzz 23,0,91,70.037808,8.057843,0
+Fuzz 25,0,50,71.43204,4.78657,0
+Fuzz 27,0,81,71.443972,9.693852,0
+Fuzz 29,0,103,74.373368,5.417628,0
+Fuzz 31,0,61,70.044003,2.351528,0
+Fuzz 36,0,120,72.620949,20.498165,0
+Fuzz 45,0,88,73.801965,22.711892,0
+Fuzz 50,0,79,71.796189,3.081174,0
+Fuzz 3,0,76,71.343033,3.788274,0
+Fuzz 6,0,103,71.608686,3.129134,0
+Fuzz 11,0,81,71.669655,12.821784,0
+Fuzz 22,0,79,73.648768,8.333553,0
+Fuzz 24,0,106,72.533662,14.582569,0
+Fuzz 25,0,85,71.214027,4.486028,0
+Fuzz 35,0,75,71.863916,5.838487,0
+Fuzz 37,0,66,72.222214,9.863829,0
+Fuzz 41,0,93,71.423455,7.763677,0
+Fuzz 42,0,75,70.926127,3.092272,0
+Fuzz 43,0,109,71.553756,8.319232,0
+Fuzz 45,1,106,70.566689,4.928761,366.18544
+Fuzz 49,0,80,71.949709,9.23509,0
+Fuzz 50,0,83,71.335733,6.050077,0
+Fuzz 3,0,110,74.153929,12.932435,0
+Fuzz 4,0,69,71.670801,7.659443,0
+Fuzz 5,0,124,71.380261,11.620381,0
+Fuzz 9,0,60,72.293142,4.501385,0
+Fuzz 13,1,115,75.149023,15.101528,315.297128
+Fuzz 17,0,97,71.307853,10.224512,0
+Fuzz 25,0,101,71.043269,3.825559,0
+Fuzz 33,0,109,73.604782,11.146543,0
+Fuzz 40,0,98,72.832319,11.427783,0
+Fuzz 46,0,98,72.855647,11.552506,0
+Fuzz 47,0,96,74.159264,6.623749,0
+Fuzz 2,0,81,72.984924,7.639241,0
+Fuzz 6,0,56,72.293418,8.499508,0
+Fuzz 8,0,134,71.072629,5.978906,0
+Fuzz 15,0,159,73.124015,25.054695,0
+Fuzz 16,0,107,71.261597,9.300913,0
+Fuzz 17,0,87,69.608503,3.546056,0
+Fuzz 18,0,103,72.304074,5.871938,0
+Fuzz 21,0,113,72.140203,7.870918,0
+Fuzz 22,0,105,74.496791,11.007274,0
+Fuzz 27,0,75,71.386078,5.372803,0
+Fuzz 30,0,86,72.771072,11.522488,0
+Fuzz 36,0,82,71.614756,6.351396,0
+Fuzz 38,0,88,71.317521,7.987775,0
+Fuzz 46,0,72,71.925024,7.159743,0
+Fuzz 47,0,117,72.745495,6.436,0
+Fuzz 50,0,100,72.148028,6.858705,0
+Fuzz 4,0,179,72.721406,8.461385,0
+Fuzz 5,0,218,74.554143,11.193441,0
+Fuzz 8,0,162,74.373647,24.702146,0
+Fuzz 20,0,171,75.059134,310.106106,0
+Fuzz 22,0,177,73.876906,7.031514,0
+Fuzz 35,0,162,74.038016,20.924982,0
+Fuzz 37,0,165,73.793062,9.598589,0
+Fuzz 38,0,113,73.826216,16.533001,0
+Fuzz 42,1,160,76.466961,900,0
+Fuzz 44,0,187,74.928464,7.444691,0
+Fuzz 45,0,205,78.002971,51.15109,0
+Fuzz 2,0,278,73.898531,8.868335,0
+Fuzz 4,0,253,73.893665,10.330705,0
+Fuzz 5,0,140,73.013514,6.433104,0
+Fuzz 17,0,177,73.459191,5.153703,0
+Fuzz 27,1,141,70.485448,2.546446,60.186696
+Fuzz 32,0,186,78.392525,9.673981,0
+Fuzz 34,0,122,93.037694,5.005319,0
+Fuzz 47,0,209,77.757925,10.814851,0
+Fuzz 48,0,205,71.459071,5.504677,0
+Fuzz 4,0,176,76.955323,51.699411,0
+Fuzz 7,0,210,74.586386,13.708511,0
+Fuzz 11,0,271,74.946203,13.429444,0
+Fuzz 16,0,158,73.810703,6.840702,0
+Fuzz 17,0,172,73.168454,6.879557,0
+Fuzz 18,0,170,73.218673,8.470152,0
+Fuzz 25,0,132,74.429479,17.23673,0
+Fuzz 30,0,116,74.802048,18.31385,0
+Fuzz 32,0,288,82.246143,30.618644,0
+Fuzz 41,0,150,70.942174,3.999495,0
+Fuzz 42,0,157,74.03813,26.961495,0
+Fuzz 43,0,152,74.706114,5.679652,0
+Fuzz 44,0,178,73.701282,6.052929,0
+Fuzz 48,0,195,73.903376,11.351936,0
+Fuzz 13,0,245,74.595653,27.011403,0
+Fuzz 19,0,279,75.47796,15.410371,0
+Fuzz 23,0,120,72.716034,3.195511,0
+Fuzz 31,0,180,75.293584,18.640065,0
+Fuzz 33,0,173,73.493941,2.275378,0
+Fuzz 35,0,201,72.859052,3.607671,0
+Fuzz 36,0,300,76.657169,12.582759,0
+Fuzz 45,1,173,73.981902,14.226491,73.244034
+Fuzz 7,0,170,74.465666,13.308245,0
+Fuzz 8,0,250,78.9623,22.258942,0
+Fuzz 18,0,163,72.904305,11.024566,0
+Fuzz 19,0,166,73.530598,8.93568,0
+Fuzz 21,0,143,73.287265,17.851526,0
+Fuzz 24,0,133,75.691832,32.452323,0
+Fuzz 27,0,158,74.560268,6.979075,0
+Fuzz 29,0,117,80.147975,39.314761,0
+Fuzz 33,0,191,76.87295,32.085279,0
+Fuzz 35,0,195,77.425382,14.695794,0
+Fuzz 36,0,179,73.865881,3.936809,0
+Fuzz 42,1,200,77.372837,509.454904,1066.294463
+Fuzz 43,0,125,72.016868,7.356188,0
+Fuzz 48,0,149,71.432026,11.197116,0
+Fuzz 50,0,188,74.070999,21.500472,0
+Fuzz 2,1,199,73.916473,7.312733,670.975275
+Fuzz 5,0,217,80.595111,36.980906,0
+Fuzz 8,0,196,82.622619,132.603916,0
+Fuzz 15,0,176,77.168018,4.197409,0
+Fuzz 20,0,172,76.546886,118.856262,0
+Fuzz 23,0,209,77.779001,9.584692,0
+Fuzz 25,0,235,78.074124,6.242905,0
+Fuzz 27,0,178,78.811929,51.833841,0
+Fuzz 28,0,150,75.482531,13.336406,0
+Fuzz 48,0,105,75.897486,2.901922,0
+Fuzz 6,0,191,75.507202,7.984765,0
+Fuzz 8,0,151,80.540644,11.917267,0
+Fuzz 14,0,147,75.325661,9.935862,0
+Fuzz 15,0,269,76.713426,6.364275,0
+Fuzz 22,0,351,83.899771,48.227671,0
+Fuzz 24,0,233,79.611531,43.878607,0
+Fuzz 33,0,167,76.912723,9.170018,0
+Fuzz 34,0,321,76.658007,11.925088,0
+Fuzz 35,0,189,77.129576,23.207367,0
+Fuzz 42,0,155,77.546554,19.021545,0
+Fuzz 45,0,115,75.999662,9.349703,0
+Fuzz 2,0,260,78.640051,11.707506,0
+Fuzz 4,0,155,76.813707,9.859639,0
+Fuzz 8,0,187,71.964314,4.560761,0
+Fuzz 13,0,115,71.318916,3.637733,0
+Fuzz 18,0,186,72.969223,4.288749,0
+Fuzz 20,0,195,72.323592,20.852135,0
+Fuzz 23,0,139,77.711662,33.709111,0
+Fuzz 28,0,130,72.948341,11.807231,0
+Fuzz 30,0,178,76.016862,10.17619,0
+Fuzz 34,0,233,73.540496,9.780858,0
+Fuzz 37,0,186,75.556594,9.789641,0
+Fuzz 38,0,140,74.401015,10.96503,0
+Fuzz 47,0,186,74.41107,9.694436,0
+Fuzz 48,0,251,80.682967,32.847231,0
+Fuzz 49,0,210,74.633264,5.070508,0
+Fuzz 2,0,197,77.604609,83.21661,0
+Fuzz 12,0,181,73.034485,15.559222,0
+Fuzz 15,0,174,73.402455,11.829373,0
+Fuzz 18,0,302,76.400916,20.305491,0
+Fuzz 19,0,174,78.023107,58.328818,0
+Fuzz 25,0,173,76.348348,17.986067,0
+Fuzz 27,0,174,73.935154,9.518242,0
+Fuzz 30,0,138,73.632522,9.333461,0
+Fuzz 34,0,170,79.639066,50.294487,0
+Fuzz 37,0,207,74.083314,7.480697,0
+Fuzz 45,0,184,74.727324,6.080887,0
+Fuzz 4,0,145,76.025586,36.456086,0
+Fuzz 6,0,201,76.77082,20.054927,0
+Fuzz 7,0,278,81.851323,41.435457,0
+Fuzz 11,0,294,71.616287,5.135027,0
+Fuzz 13,0,228,75.403968,41.810855,0
+Fuzz 14,0,253,74.331709,15.033138,0
+Fuzz 16,0,221,75.85288,13.158274,0
+Fuzz 17,0,176,92.034741,21.835984,0
+Fuzz 23,0,214,74.211967,7.488584,0
+Fuzz 30,0,126,72.787232,5.547171,0
+Fuzz 34,0,191,73.430703,6.485576,0
+Fuzz 42,1,218,84.930313,162.235643,378.225168
+Fuzz 43,0,121,73.504876,14.19203,0
+Fuzz 44,0,100,73.891841,13.529934,0
+Fuzz 46,0,208,74.340132,8.393548,0
+Fuzz 49,0,191,74.865997,7.927267,0
+Fuzz 50,0,221,75.67694,12.824776,0
+Fuzz 19,0,215,75.898406,26.83168,0
+Fuzz 20,0,186,75.869077,37.024919,0
+Fuzz 21,0,287,76.991188,29.574149,0
+Fuzz 24,0,96,73.586015,7.647468,0
+Fuzz 42,0,92,73.256455,6.463669,0
+Fuzz 4,0,90,73.89469,14.177697,0
+Fuzz 7,0,182,73.479075,6.787529,0
+Fuzz 8,0,146,73.019992,10.422697,0
+Fuzz 11,0,248,76.482407,14.852187,0
+Fuzz 12,0,227,75.500447,13.6817,0
+Fuzz 22,0,147,73.168847,7.368924,0
+Fuzz 28,0,99,72.132657,8.162726,0
+Fuzz 29,0,158,76.034813,32.373629,0
+Fuzz 32,0,199,77.786891,14.912146,0
+Fuzz 34,0,238,85.565188,33.993887,0
+Fuzz 36,0,201,75.232477,26.887115,0
+Fuzz 37,0,151,74.22194,14.618274,0
+Fuzz 38,0,173,74.301024,12.224212,0
+Fuzz 44,0,175,77.233615,15.950629,0
+Fuzz 46,0,192,76.090833,12.24431,0
+Fuzz 4,1,176,74.112822,900,0
+Fuzz 9,0,141,73.176951,12.261425,0
+Fuzz 10,0,201,72.69186,10.248905,0
+Fuzz 14,0,120,73.826539,4.289778,0
+Fuzz 22,0,152,74.038218,8.191265,0
+Fuzz 28,1,228,74.662835,18.320807,127.604375
+Fuzz 30,0,220,73.19505,13.271282,0
+Fuzz 39,0,222,80.935673,35.605096,0
+Fuzz 46,0,406,80.504935,36.62218,0
+Fuzz 49,0,192,74.01412,21.70127,0
+Fuzz 2,0,199,78.159476,60.84428,0
+Fuzz 3,0,164,71.733138,4.997918,0
+Fuzz 4,0,142,73.513171,10.633562,0
+Fuzz 5,0,228,74.916557,25.365581,0
+Fuzz 13,0,243,76.710454,23.223858,0
+Fuzz 15,0,235,74.789363,8.545092,0
+Fuzz 17,0,175,72.943735,21.717228,0
+Fuzz 18,0,193,73.347936,12.849081,0
+Fuzz 19,0,230,75.723206,31.573109,0
+Fuzz 23,0,147,74.097644,7.350485,0
+Fuzz 27,0,259,75.734445,33.254644,0
+Fuzz 28,0,274,72.902863,4.581317,0
+Fuzz 31,0,150,72.315913,5.023206,0
+Fuzz 32,0,259,71.247993,5.522704,0
+Fuzz 37,0,159,76.311373,39.067873,0
+Fuzz 38,0,121,72.434722,5.826199,0
+Fuzz 39,0,120,74.930197,10.955693,0
+Fuzz 43,0,159,72.780352,14.405557,0
+Fuzz 47,0,110,72.914507,7.419282,0
+Fuzz 2,0,156,74.655367,21.88121,0
+Fuzz 5,0,149,72.453657,7.676513,0
+Fuzz 7,0,207,74.283361,12.149437,0
+Fuzz 9,0,192,75.043616,17.167267,0
+Fuzz 10,0,188,77.082526,19.873014,0
+Fuzz 13,0,167,72.531278,8.354838,0
+Fuzz 14,0,119,74.002907,9.332613,0
+Fuzz 21,0,325,78.430469,11.909341,0
+Fuzz 31,0,251,80.209077,28.774251,0
+Fuzz 33,0,237,73.667223,14.738933,0
+Fuzz 35,0,326,76.894973,21.903324,0
+Fuzz 40,0,138,74.689159,15.419881,0
+Fuzz 44,0,117,74.723868,16.141535,0
+Fuzz 47,0,102,74.027534,15.832021,0
+Fuzz 6,0,148,73.138793,11.398565,0
+Fuzz 8,0,109,72.634794,9.836026,0
+Fuzz 10,0,170,73.598013,19.397565,0
+Fuzz 12,0,116,72.960698,13.287108,0
+Fuzz 14,0,207,72.454019,6.243967,0
+Fuzz 15,0,172,77.145634,21.154576,0
+Fuzz 18,0,207,74.530958,10.336311,0
+Fuzz 21,0,176,74.631389,16.580707,0
+Fuzz 24,0,219,76.45595,22.795471,0
+Fuzz 27,1,195,74.023525,12.101289,89.99299
+Fuzz 33,0,163,74.229833,19.395277,0
+Fuzz 35,0,128,73.983679,6.132634,0
+Fuzz 36,0,178,74.202267,16.092711,0
+Fuzz 37,0,84,72.839771,8.703759,0
+Fuzz 45,0,166,77.117257,21.295737,0
+Fuzz 50,0,257,76.238303,9.800249,0
+Fuzz 3,0,174,75.785007,17.910498,0
+Fuzz 5,0,144,74.144572,12.585453,0
+Fuzz 6,0,180,75.933921,38.950495,0
+Fuzz 8,0,218,72.914972,4.56812,0
+Fuzz 11,0,106,70.450779,11.050211,0
+Fuzz 15,0,249,76.231499,19.106048,0
+Fuzz 16,0,190,76.318805,31.182737,0
+Fuzz 21,0,196,72.591063,13.85254,0
+Fuzz 26,0,161,72.820926,16.875857,0
+Fuzz 31,0,280,76.498666,39.616867,0
+Fuzz 34,0,94,73.568316,10.223198,0
+Fuzz 35,0,138,72.203116,7.393571,0
+Fuzz 41,0,104,71.961866,6.669572,0
+Fuzz 42,1,217,74.88498,24.322959,115.73409
+Fuzz 44,0,196,75.90026,28.057348,0
+Fuzz 45,0,197,72.866714,4.71516,0
+Fuzz 10,0,205,73.533952,8.948752,0
+Fuzz 14,0,112,72.360418,5.844156,0
+Fuzz 36,0,131,71.883786,4.336676,0
+Fuzz 38,0,260,76.549267,19.461312,0
+Fuzz 41,0,117,71.78062,10.681071,0
+Fuzz 45,0,148,72.573241,3.750318,0
+Fuzz 46,0,202,76.313582,13.77602,0
+Fuzz 47,0,168,75.021112,12.78384,0
+Fuzz 3,0,198,73.259121,19.525642,0
+Fuzz 5,0,180,74.068634,18.899652,0
+Fuzz 6,0,172,76.733325,44.465452,0
+Fuzz 9,0,175,74.321291,14.424028,0
+Fuzz 10,0,175,75.20759,5.891907,0
+Fuzz 17,0,216,75.251613,12.538166,0
+Fuzz 19,0,162,75.480921,17.088257,0
+Fuzz 20,0,230,75.098264,24.056969,0
+Fuzz 22,0,190,75.128614,195.053864,0
+Fuzz 23,0,195,73.91113,15.272527,0
+Fuzz 29,0,152,71.286686,14.493155,0
+Fuzz 34,0,161,73.766156,41.558105,0
+Fuzz 40,0,159,72.627443,11.852146,0
+Fuzz 44,0,186,73.355483,13.806132,0
+Fuzz 3,0,155,75.024738,26.332211,0
+Fuzz 5,0,247,75.82276,15.742334,0
+Fuzz 6,0,202,73.718212,2.996707,0
+Fuzz 11,0,193,76.089152,18.810219,0
+Fuzz 14,0,297,74.284399,13.093853,0
+Fuzz 17,0,196,74.550045,12.224363,0
+Fuzz 18,0,114,73.991795,5.985393,0
+Fuzz 21,0,162,72.419955,7.966323,0
+Fuzz 27,0,139,71.721852,4.096481,0
+Fuzz 31,0,221,72.792139,8.726549,0
+Fuzz 36,0,257,76.458902,12.35207,0
+Fuzz 39,0,263,80.250566,14.771143,0
+Fuzz 45,0,174,77.529126,13.623412,0
+Fuzz 46,0,152,75.901648,17.24197,0
+Fuzz 47,0,236,74.950432,4.931972,0
+Fuzz 7,0,146,73.449832,6.39756,0
+Fuzz 8,0,207,73.35218,24.39635,0
+Fuzz 11,0,168,74.129811,15.842798,0
+Fuzz 27,0,166,72.226072,6.584762,0
+Fuzz 32,0,256,74.083155,40.866623,0
+Fuzz 33,0,111,72.154507,13.556011,0
+Fuzz 37,0,157,75.778044,25.237258,0
+Fuzz 42,1,108,105.003992,15.316031,129.789175
+Fuzz 43,0,178,76.532022,6.377545,0
+Fuzz 46,0,185,74.270552,5.160719,0
+Fuzz 47,0,180,76.854967,13.033658,0
+Fuzz 48,0,185,74.862444,10.692063,0
+Fuzz 13,0,157,72.953584,9.371478,0
+Fuzz 16,0,211,76.442123,25.002187,0
+Fuzz 17,0,96,71.659804,8.729181,0
+Fuzz 19,0,246,76.642985,28.891776,0
+Fuzz 21,0,123,74.548378,12.062822,0
+Fuzz 25,0,159,72.724411,5.725719,0
+Fuzz 27,0,131,72.745634,22.043163,0
+Fuzz 32,0,187,70.653032,4.476178,0
+Fuzz 36,0,177,72.909936,15.01446,0
+Fuzz 38,0,240,76.000314,12.130518,0
+Fuzz 45,0,274,74.435723,9.005586,0
+Fuzz 2,0,143,72.503397,5.395851,0
+Fuzz 10,0,198,76.562375,113.866345,0
+Fuzz 13,0,187,74.256945,8.308193,0
+Fuzz 16,0,104,73.674805,20.705938,0
+Fuzz 20,0,148,73.896105,17.045429,0
+Fuzz 26,0,158,74.36624,9.367149,0
+Fuzz 35,0,245,73.576935,11.990887,0
+Fuzz 37,0,208,72.547064,7.601166,0
+Fuzz 40,0,156,74.552468,17.273515,0
+Fuzz 41,0,135,76.825108,10.960988,0
+Fuzz 43,0,234,74.11789,9.946829,0
+Fuzz 3,0,162,75.802808,29.095389,0
+Fuzz 4,0,177,75.383784,31.33718,0
+Fuzz 11,0,111,72.132764,8.152926,0
+Fuzz 15,0,242,72.906604,5.629499,0
+Fuzz 19,0,209,74.797354,19.531313,0
+Fuzz 28,0,204,73.146041,7.329988,0
+Fuzz 32,0,264,75.407692,17.298137,0
+Fuzz 36,0,151,73.529079,9.873677,0
+Fuzz 41,0,116,72.340654,6.864651,0
+Fuzz 47,0,212,72.522166,2.810311,0
+Fuzz 48,0,224,75.255117,13.066443,0
+Fuzz 4,0,205,74.736436,9.963209,0
+Fuzz 10,1,123,74.193664,21.10504,166.50202
+Fuzz 14,0,200,73.647409,14.234585,0
+Fuzz 17,0,201,85.962612,54.467462,0
+Fuzz 19,0,115,74.265951,8.065432,0
+Fuzz 21,1,217,76.303636,23.913287,942.985137
+Fuzz 22,0,167,73.186187,5.886523,0
+Fuzz 30,0,198,108.797709,62.741665,0
+Fuzz 31,0,279,94.577615,32.154964,0
+Fuzz 4,0,290,79.436621,26.704406,0
+Fuzz 8,0,266,73.537953,4.352096,0
+Fuzz 10,0,207,74.312469,6.573339,0
+Fuzz 12,0,165,74.33184,19.688853,0
+Fuzz 16,0,252,73.294035,20.80605,0
+Fuzz 20,0,174,76.061244,44.822088,0
+Fuzz 25,0,173,74.861409,40.383973,0
+Fuzz 26,0,215,73.803809,8.1574,0
+Fuzz 35,0,187,78.02001,17.525869,0
+Fuzz 38,0,98,70.880678,8.134035,0
+Fuzz 47,0,176,73.999552,12.800241,0
+Fuzz 2,0,204,74.681062,7.44816,0
+Fuzz 10,0,211,78.522045,64.993755,0
+Fuzz 41,0,180,72.989163,10.569602,0
+Fuzz 42,0,178,73.716961,7.612456,0
+Fuzz 45,0,220,74.352142,6.395555,0
+Fuzz 4,0,178,80.386296,55.769593,0
+Fuzz 6,0,109,71.90188,6.140328,0
+Fuzz 8,0,227,74.470816,20.941744,0
+Fuzz 9,0,126,72.744474,6.0192,0
+Fuzz 10,1,109,73.325695,17.463488,1023.024742
+Fuzz 15,0,111,71.833569,2.603693,0
+Fuzz 18,0,182,74.503196,18.290423,0
+Fuzz 21,0,179,78.23782,46.375011,0
+Fuzz 22,0,202,76.632117,14.249712,0
+Fuzz 23,0,202,72.308701,5.617302,0
+Fuzz 29,0,146,72.575748,19.495241,0
+Fuzz 30,0,170,76.092696,29.585077,0
+Fuzz 37,1,139,67.865587,3.597397,45.669961
+Fuzz 42,0,135,73.573301,8.738991,0
+Fuzz 2,0,165,74.377854,22.126695,0
+Fuzz 5,0,201,73.626662,9.80427,0
+Fuzz 17,0,155,74.528011,10.543969,0
+Fuzz 18,0,195,74.815245,12.029734,0
+Fuzz 22,1,204,73.117199,30.077037,145.830498
+Fuzz 28,0,166,73.39182,7.325053,0
+Fuzz 29,0,206,79.584064,12.696934,0
+Fuzz 33,0,250,77.024606,33.135067,0
+Fuzz 36,0,166,72.564428,18.289645,0
+Fuzz 38,0,168,73.391355,7.399256,0
+Fuzz 39,0,191,75.265061,14.638887,0
+Fuzz 41,0,171,74.793253,9.824577,0
+Fuzz 43,0,165,75.887505,27.232096,0
+Fuzz 48,0,154,72.889942,28.250596,0
+Fuzz 4,0,222,75.174834,13.929838,0
+Fuzz 10,0,205,78.498413,15.362693,0
+Fuzz 16,0,186,74.738937,13.602096,0
+Fuzz 17,0,173,74.99777,531.639584,0
+Fuzz 19,0,216,75.679715,31.297843,0
+Fuzz 26,0,207,76.568207,16.66963,0
+Fuzz 30,0,196,74.75347,21.303351,0
+Fuzz 36,0,231,79.431952,20.236979,0
+Fuzz 37,0,152,72.77828,12.08361,0
+Fuzz 38,0,214,74.26553,4.631097,0
+Fuzz 7,0,118,73.051081,9.750682,0
+Fuzz 9,0,238,75.61573,11.391763,0
+Fuzz 10,0,209,75.440852,22.849249,0
+Fuzz 15,0,244,74.109615,9.728293,0
+Fuzz 18,0,240,78.625265,44.45421,0
+Fuzz 19,0,114,75.028204,15.003958,0
+Fuzz 24,0,198,73.842745,5.827738,0
+Fuzz 38,0,130,72.824797,20.775932,0
+Fuzz 43,0,191,74.343838,15.824786,0
+Fuzz 46,0,152,74.619146,32.074073,0
+Fuzz 50,0,156,73.458229,8.175026,0
+Fuzz 4,0,247,72.286769,6.746371,0
+Fuzz 15,0,212,73.453806,7.605089,0
+Fuzz 16,0,137,72.84468,17.558853,0
+Fuzz 17,0,180,72.07136,9.661364,0
+Fuzz 18,0,209,74.747217,59.145406,0
+Fuzz 19,0,102,73.675695,4.749208,0
+Fuzz 24,0,146,72.26637,11.640595,0
+Fuzz 29,0,220,75.475329,19.831983,0
+Fuzz 35,0,245,78.791862,30.972495,0
+Fuzz 43,0,129,73.507817,9.826372,0
+Fuzz 46,0,193,75.498563,7.742977,0
+Fuzz 50,1,165,72.115306,11.460806,178.539607
+Fuzz 2,1,258,76.178615,12.500946,438.941306
+Fuzz 3,0,258,74.381386,6.676656,0
+Fuzz 12,1,281,75.878497,36.368655,855.924774
+Fuzz 19,1,208,73.804751,10.708694,493.974114
+Fuzz 21,0,174,75.718373,17.904856,0
+Fuzz 23,0,352,74.607365,28.31107,0
+Fuzz 32,0,216,74.793353,27.586265,0
+Fuzz 34,0,247,75.42372,10.901647,0
+Fuzz 42,0,242,75.937578,14.930426,0
+Fuzz 50,0,119,73.397635,18.452982,0
+Fuzz 4,0,231,73.403487,5.312939,0
+Fuzz 20,0,173,74.272095,20.560527,0
+Fuzz 22,0,167,75.78183,25.868034,0
+Fuzz 25,0,136,74.431102,19.633874,0
+Fuzz 27,0,144,74.332643,13.075041,0
+Fuzz 28,0,240,73.717493,16.050874,0
+Fuzz 37,0,177,74.718659,22.70145,0
+Fuzz 38,0,127,73.021785,12.256023,0
+Fuzz 39,0,187,75.622499,26.917461,0
+Fuzz 43,0,130,73.045886,4.1828,0
+Fuzz 47,0,119,72.993655,6.111807,0
+Fuzz 9,0,110,71.947267,5.891895,0
+Fuzz 14,0,196,73.125874,10.986902,0
+Fuzz 17,0,237,71.844676,6.628465,0
+Fuzz 19,0,221,76.089111,40.717759,0
+Fuzz 20,0,166,73.500266,7.014545,0
+Fuzz 31,0,217,74.757258,13.705127,0
+Fuzz 34,0,294,77.798266,16.960259,0
+Fuzz 38,0,226,76.309334,40.209007,0
+Fuzz 39,0,338,78.417231,14.373502,0
+Fuzz 45,0,219,71.761267,2.890033,0
+Fuzz 10,0,224,71.85456,7.027891,0
+Fuzz 24,0,128,74.778739,8.387591,0
+Fuzz 33,0,311,77.452547,19.162948,0
+Fuzz 35,0,146,72.003566,12.858959,0
+Fuzz 37,0,183,75.197824,16.361848,0
+Fuzz 39,0,103,73.57483,12.374391,0
+Fuzz 43,0,121,73.733939,9.145686,0
+Fuzz 47,0,258,74.980211,9.450679,0
+Fuzz 48,1,209,75.758174,45.475198,1476.264161
+Fuzz 50,0,181,72.647062,30.959806,0
+Fuzz 4,0,180,75.919962,33.648708,0
+Fuzz 8,0,175,73.815157,28.812408,0
+Fuzz 12,0,191,70.650064,2.894,0
+Fuzz 14,0,161,71.504435,12.336316,0
+Fuzz 19,0,159,74.327792,22.276526,0
+Fuzz 21,0,240,75.965114,10.808206,0
+Fuzz 22,0,103,72.643681,3.092698,0
+Fuzz 28,0,183,76.321698,13.332384,0
+Fuzz 29,0,195,75.618332,27.372882,0
+Fuzz 36,0,277,78.045074,25.624988,0
+Fuzz 37,0,198,73.064376,5.178267,0
+Fuzz 38,0,179,73.980296,6.603934,0
+Fuzz 41,0,181,78.026585,14.494752,0
+Fuzz 45,0,268,70.680411,5.113025,0
+Fuzz 47,0,193,74.394183,33.503643,0
+Fuzz 7,0,140,73.632198,30.232996,0
+Fuzz 14,0,223,77.250117,18.699052,0
+Fuzz 15,0,151,73.667,26.642818,0
+Fuzz 18,0,194,75.33668,15.421462,0
+Fuzz 22,0,244,76.545324,35.818949,0
+Fuzz 27,0,124,74.806901,14.927815,0
+Fuzz 33,0,216,76.343355,217.517414,0
+Fuzz 35,0,221,74.650314,8.181884,0
+Fuzz 37,0,174,77.264821,25.356065,0
+Fuzz 38,0,231,75.568787,25.571543,0
+Fuzz 46,0,112,74.902662,4.016506,0
+Fuzz 50,0,182,79.955139,14.005913,0
+Fuzz 3,0,191,72.799337,3.454868,0
+Fuzz 16,0,234,75.185704,16.187275,0
+Fuzz 21,0,252,74.978381,17.042703,0
+Fuzz 30,0,307,75.856902,15.370539,0
+Fuzz 33,1,200,74.503753,36.88543,332.805305
+Fuzz 36,0,187,72.878529,4.681752,0
+Fuzz 44,0,212,81.667293,167.227549,0
+Fuzz 45,0,186,73.614425,82.628181,0
+Fuzz 46,0,230,76.702642,16.291798,0
+Fuzz 47,0,114,76.649059,61.410731,0
+Fuzz 5,0,146,72.178618,6.325235,0
+Fuzz 7,0,127,70.897596,7.305622,0
+Fuzz 12,0,231,76.603838,21.486949,0
+Fuzz 18,1,223,75.769172,900,0
+Fuzz 20,0,221,74.638858,12.67879,0
+Fuzz 22,0,134,72.396566,5.134021,0
+Fuzz 29,0,148,73.420371,13.487443,0
+Fuzz 38,0,122,73.471652,14.487158,0
+Fuzz 42,0,123,71.345205,11.681082,0
+Fuzz 48,0,300,81.154883,44.687794,0
+Fuzz 49,0,250,77.693551,20.644213,0
+Fuzz 50,0,152,75.257696,13.739821,0
+Fuzz 4,0,195,78.957791,50.157448,0
+Fuzz 8,0,180,74.789129,18.6199,0
+Fuzz 18,0,239,75.178103,12.627028,0
+Fuzz 23,0,249,76.334444,26.852055,0
+Fuzz 25,0,197,74.449289,10.727246,0
+Fuzz 30,0,277,77.553326,32.599879,0
+Fuzz 31,0,195,72.111127,5.697834,0
+Fuzz 36,0,145,74.732751,9.114962,0
+Fuzz 40,0,269,74.465148,13.776826,0
+Fuzz 43,0,176,72.662219,7.298094,0
+Fuzz 44,0,201,75.853685,20.225746,0
+Fuzz 48,0,152,74.41198,26.422345,0
+Fuzz 50,0,199,71.403116,3.712552,0
+Fuzz 5,0,159,74.457245,24.936334,0
+Fuzz 7,0,111,74.783845,23.565561,0
+Fuzz 8,1,227,75.620741,14.718907,133.326035
+Fuzz 14,0,203,72.529646,5.31711,0
+Fuzz 24,0,297,79.410687,22.000353,0
+Fuzz 25,0,237,76.751187,22.322826,0
+Fuzz 32,0,167,72.762386,15.069874,0
+Fuzz 34,0,157,75.157673,25.498442,0
+Fuzz 35,0,157,73.431824,13.097176,0
+Fuzz 38,0,179,75.233747,46.826,0
+Fuzz 5,0,190,73.860613,20.184963,0
+Fuzz 10,0,169,74.087752,36.28119,0
+Fuzz 18,0,176,72.336976,10.919394,0
+Fuzz 21,0,133,71.671578,5.525723,0
+Fuzz 26,0,144,73.55036,15.569765,0
+Fuzz 35,0,226,72.876541,10.006038,0
+Fuzz 36,0,118,72.174537,4.00969,0
+Fuzz 37,0,214,76.803557,13.307895,0
+Fuzz 5,0,559,98.319679,53.81937,0
+Fuzz 9,0,545,102.996026,30.387704,0
+Fuzz 13,0,634,88.231543,23.341294,0
+Fuzz 15,0,432,91.062966,62.110627,0
+Fuzz 18,0,504,95.247409,29.175269,0
+Fuzz 33,1,441,81.70066,900,0
+Fuzz 44,0,413,72.69428,3.946315,0
+Fuzz 45,0,344,91.121433,28.159196,0
+Fuzz 46,1,441,114.112968,82.577141,386.303511
+Fuzz 48,0,272,82.394943,22.198479,0
+Fuzz 49,0,306,80.401294,15.33462,0
+Fuzz 50,0,363,85.418668,35.841338,0
+Fuzz 6,0,444,87.886978,34.899608,0
+Fuzz 8,0,417,95.263765,66.224897,0
+Fuzz 10,0,532,86.998877,70.922773,0
+Fuzz 13,0,405,81.49084,16.064554,0
+Fuzz 14,0,681,77.019991,11.029678,0
+Fuzz 17,0,459,104.287095,31.671964,0
+Fuzz 21,0,666,101.788857,38.951952,0
+Fuzz 23,0,684,90.719109,54.677672,0
+Fuzz 26,0,398,95.041248,78.703539,0
+Fuzz 28,0,497,86.33564,7.59955,0
+Fuzz 31,0,484,89.401966,31.58525,0
+Fuzz 35,0,423,76.846159,9.353321,0
+Fuzz 40,0,424,89.641707,170.035376,0
+Fuzz 44,0,510,96.184343,108.745662,0
+Fuzz 45,0,484,87.948639,36.2954,0
+Fuzz 47,0,610,107.264021,30.748252,0
+Fuzz 4,0,272,78.118533,22.116889,0
+Fuzz 7,0,618,85.860728,26.274207,0
+Fuzz 10,0,471,82.777546,23.749403,0
+Fuzz 12,0,732,129.177417,105.200176,0
+Fuzz 16,0,310,75.648166,33.827668,0
+Fuzz 18,0,578,84.775456,56.641465,0
+Fuzz 20,0,466,84.275007,38.296969,0
+Fuzz 22,0,306,83.596172,19.004145,0
+Fuzz 23,0,475,93.158706,123.175626,0
+Fuzz 31,0,245,75.342842,10.258337,0
+Fuzz 33,0,520,94.142054,27.881898,0
+Fuzz 35,1,305,86.669638,881.084543,0
+Fuzz 36,0,429,76.459742,23.066712,0
+Fuzz 41,0,478,100.939647,40.701506,0
+Fuzz 43,0,346,83.303643,64.482969,0
+Fuzz 45,0,390,88.631817,44.782611,0
+Fuzz 49,0,560,100.357426,156.618509,0
+Fuzz 7,0,408,79.183761,50.784458,0
+Fuzz 8,0,484,92.52253,36.844021,0
+Fuzz 10,0,297,81.936121,14.843043,0
+Fuzz 15,0,723,98.247705,39.584449,0
+Fuzz 17,0,481,93.822971,44.947012,0
+Fuzz 25,0,424,83.822189,35.58345,0
+Fuzz 26,0,408,88.342606,28.545092,0
+Fuzz 28,0,430,104.741253,35.510226,0
+Fuzz 37,0,433,81.067616,15.787402,0
+Fuzz 38,0,579,116.408588,63.407101,0
+Fuzz 42,0,299,77.044188,41.902848,0
+Fuzz 50,0,720,95.50772,22.352869,0
+Fuzz 3,0,556,101.837231,49.058417,0
+Fuzz 5,0,438,89.868337,29.649125,0
+Fuzz 6,0,615,96.39854,32.839733,0
+Fuzz 7,0,552,94.675631,87.203183,0
+Fuzz 10,0,452,86.149972,46.166498,0
+Fuzz 15,0,384,95.487739,55.640004,0
+Fuzz 17,0,198,74.93614,38.324964,0
+Fuzz 20,0,340,73.445081,5.720192,0
+Fuzz 27,1,418,105.097071,900,0
+Fuzz 29,0,340,81.998035,209.977434,0
+Fuzz 31,0,480,82.905064,30.635664,0
+Fuzz 32,0,481,91.284422,92.197765,0
+Fuzz 33,0,555,99.957514,277.869882,0
+Fuzz 36,0,319,73.771726,5.520813,0
+Fuzz 39,0,581,91.513856,28.136028,0
+Fuzz 40,0,440,82.743204,35.489427,0
+Fuzz 43,0,519,84.488358,14.824607,0
+Fuzz 44,0,448,89.299012,21.389741,0
+Fuzz 45,0,395,86.570786,22.390012,0
+Fuzz 47,0,530,90.426294,55.415295,0
+Fuzz 48,0,400,81.125511,17.310643,0
+Fuzz 49,0,601,93.615046,57.040803,0
+Fuzz 15,0,457,85.851386,21.284507,0
+Fuzz 16,0,389,85.023985,21.939874,0
+Fuzz 18,0,415,84.600588,48.9889,0
+Fuzz 20,0,601,94.353011,32.760257,0
+Fuzz 21,0,343,85.347451,26.705735,0
+Fuzz 28,0,428,80.486805,21.769785,0
+Fuzz 31,1,277,91.887859,215.158272,457.861151
+Fuzz 35,0,542,90.697445,31.382496,0
+Fuzz 36,0,418,90.745093,158.838867,0
+Fuzz 37,0,330,78.267063,35.883778,0
+Fuzz 41,1,611,88.023557,42.801512,626.407479
+Fuzz 43,1,457,83.846677,46.005431,195.61594
+Fuzz 48,1,732,120.340891,72.14862,126.657558
+Fuzz 2,0,283,77.296174,54.616333,0
+Fuzz 8,0,184,78.3657,74.077073,0
+Fuzz 9,0,357,76.574779,13.727679,0
+Fuzz 13,0,524,83.826543,18.811879,0
+Fuzz 14,0,354,88.118092,39.332567,0
+Fuzz 36,0,582,87.624174,37.669916,0
+Fuzz 38,0,561,101.080744,46.829542,0
+Fuzz 39,0,412,84.739434,34.084724,0
+Fuzz 45,0,308,82.567657,76.002403,0
+Fuzz 47,1,370,88.443244,900,0
+Fuzz 50,0,546,96.673584,83.664212,0
+Fuzz 3,0,341,140.426882,76.157187,0
+Fuzz 12,0,504,98.813936,45.808412,0
+Fuzz 13,0,430,78.271144,17.077831,0
+Fuzz 18,0,505,98.313533,35.502332,0
+Fuzz 29,0,618,90.689314,33.942375,0
+Fuzz 31,0,332,81.279983,47.192167,0
+Fuzz 32,0,439,84.730279,16.708343,0
+Fuzz 35,0,378,80.034754,18.239782,0
+Fuzz 38,0,415,88.874074,85.435885,0
+Fuzz 41,0,324,91.648741,125.277983,0
+Fuzz 49,0,499,86.584141,197.487131,0
+Fuzz 2,0,288,78.60876,29.161562,0
+Fuzz 3,0,565,91.443446,35.069764,0
+Fuzz 5,0,516,89.76445,24.724725,0
+Fuzz 7,0,453,80.595528,37.692599,0
+Fuzz 11,0,303,78.812094,17.450291,0
+Fuzz 12,0,434,88.756549,42.273393,0
+Fuzz 13,1,476,31.593771,13.523627,510.852506
+Fuzz 27,0,380,82.377665,93.84474,0
+Fuzz 36,0,332,80.090504,15.613191,0
+Fuzz 42,0,580,112.100478,68.386405,0
+Fuzz 49,1,512,90.853776,112.082954,1206.892431
+Fuzz 50,0,334,82.668091,79.845507,0
+Fuzz 8,0,400,80.263933,50.884717,0
+Fuzz 10,0,396,85.153014,33.109956,0
+Fuzz 14,0,353,91.609396,36.954681,0
+Fuzz 21,1,302,85.320166,900,0
+Fuzz 23,0,310,93.359714,52.075725,0
+Fuzz 25,0,426,84.132438,38.406447,0
+Fuzz 34,0,259,76.419804,11.931403,0
+Fuzz 36,0,559,83.482711,19.388919,0
+Fuzz 37,0,414,78.393299,30.672795,0
+Fuzz 38,0,583,129.371334,66.851601,0
+Fuzz 45,0,521,102.42897,140.776982,0
+Fuzz 48,0,504,97.163209,67.630436,0
+Fuzz 50,0,669,93.268603,33.059939,0
+Fuzz 5,0,417,89.121096,54.407714,0
+Fuzz 7,0,375,94.083819,129.046939,0
+Fuzz 13,0,402,88.809765,48.660198,0
+Fuzz 15,0,455,92.80646,38.95818,0
+Fuzz 17,0,566,92.034447,15.824548,0
+Fuzz 21,0,471,84.040394,16.400575,0
+Fuzz 25,0,576,104.280234,34.953984,0
+Fuzz 39,0,619,99.293428,63.88209,0
+Fuzz 40,0,345,76.102793,3.676995,0
+Fuzz 41,1,468,97.46919,94.906687,828.824747
+Fuzz 42,0,588,94.844177,136.827436,0
+Fuzz 43,0,281,82.270995,47.67285,0
+Fuzz 44,0,508,89.986541,24.326196,0
+Fuzz 49,0,567,83.813405,52.552707,0
+Fuzz 2,0,429,83.632648,25.28869,0
+Fuzz 4,0,416,83.440627,25.356405,0
+Fuzz 7,0,542,84.094164,16.357131,0
+Fuzz 9,0,465,80.180206,13.177596,0
+Fuzz 11,0,411,79.106255,16.813992,0
+Fuzz 12,0,490,144.711721,112.260503,0
+Fuzz 19,0,793,85.83333,28.894318,0
+Fuzz 21,0,172,74.22676,10.336491,0
+Fuzz 22,0,470,90.108725,258.879406,0
+Fuzz 34,0,467,83.131971,17.144343,0
+Fuzz 40,1,438,85.030257,56.337761,184.836209
+Fuzz 47,0,284,96.875106,40.736875,0
+Fuzz 48,1,294,93.543711,900,0
+Fuzz 8,0,267,78.453655,13.536425,0
+Fuzz 10,0,335,77.051865,28.279466,0
+Fuzz 11,0,352,79.007532,12.578564,0
+Fuzz 13,0,444,99.240523,900,0
+Fuzz 15,0,370,81.994025,19.160351,0
+Fuzz 18,0,328,83.190782,50.504499,0
+Fuzz 26,0,362,88.119999,46.622297,0
+Fuzz 29,0,488,81.496242,19.809422,0
+Fuzz 32,0,426,86.851892,33.305859,0
+Fuzz 43,0,232,78.043285,16.857883,0
+Fuzz 46,0,482,86.119595,21.547985,0
+Fuzz 50,0,426,82.505736,22.276417,0
+Fuzz 3,0,428,76.875601,10.716369,0
+Fuzz 7,0,497,86.936786,32.509053,0
+Fuzz 10,0,596,88.118974,63.368429,0
+Fuzz 13,0,446,89.185366,25.953678,0
+Fuzz 15,0,513,102.98871,38.621908,0
+Fuzz 27,1,297,87.382627,900,0
+Fuzz 30,0,307,86.06476,24.267172,0
+Fuzz 33,0,599,110.687838,80.854936,0
+Fuzz 40,0,533,83.222448,37.497162,0
+Fuzz 43,0,405,83.775543,23.465759,0
+Fuzz 45,0,337,79.82849,117.614959,0
+Fuzz 8,0,451,87.042635,20.228383,0
+Fuzz 11,0,523,76.264936,8.743071,0
+Fuzz 13,0,287,87.838436,137.736512,0
+Fuzz 14,0,425,84.986088,18.076475,0
+Fuzz 19,0,296,79.242009,122.943856,0
+Fuzz 22,0,530,76.169361,23.235946,0
+Fuzz 24,0,472,88.275743,390.265234,0
+Fuzz 26,0,389,77.205288,10.861905,0
+Fuzz 32,0,441,108.289997,171.945613,0
+Fuzz 35,0,434,88.050976,65.170148,0
+Fuzz 42,0,503,95.768363,40.979595,0
+Fuzz 46,0,496,86.395102,24.295474,0
+Fuzz 50,0,537,90.856194,85.545432,0
+Fuzz 4,0,387,86.624198,27.944091,0
+Fuzz 10,1,583,114.831864,845.432111,808.511496
+Fuzz 17,0,507,92.910924,52.629338,0
+Fuzz 20,0,309,80.429736,14.105565,0
+Fuzz 25,0,675,112.732549,49.663051,0
+Fuzz 31,0,312,86.677223,36.901147,0
+Fuzz 32,0,332,82.638965,18.58405,0
+Fuzz 33,1,529,108.0694,432.758985,758.679424
+Fuzz 39,0,404,83.35845,31.871457,0
+Fuzz 42,0,474,78.831736,51.042812,0
+Fuzz 43,0,501,88.968532,501.550788,0
+Fuzz 47,0,522,90.064289,68.501978,0
+Fuzz 50,1,460,108.633226,900,0
+Fuzz 4,0,471,89.294018,43.795327,0
+Fuzz 6,0,530,78.75587,15.064307,0
+Fuzz 8,0,461,94.158065,91.547096,0
+Fuzz 10,0,313,84.567882,38.891048,0
+Fuzz 15,0,374,88.399231,192.229524,0
+Fuzz 16,1,587,91.431418,900,0
+Fuzz 24,1,432,108.974319,900,0
+Fuzz 25,0,362,81.732183,41.911819,0
+Fuzz 34,1,354,87.641378,900,0
+Fuzz 35,0,343,83.318477,682.924353,0
+Fuzz 36,0,458,84.590755,20.157044,0
+Fuzz 37,1,459,96.045173,175.615815,489.135213
+Fuzz 46,0,472,84.058722,21.155532,0
+Fuzz 48,1,339,76.527723,24.664619,339.271478
+Fuzz 49,0,386,75.26166,13.804702,0
+Fuzz 2,0,394,89.567426,39.497145,0
+Fuzz 4,0,284,74.049271,7.88775,0
+Fuzz 5,0,682,91.956305,31.929687,0
+Fuzz 10,0,374,100.061021,60.007124,0
+Fuzz 11,0,421,90.885571,54.783636,0
+Fuzz 16,0,518,90.32224,27.024295,0
+Fuzz 19,0,322,82.072216,50.155976,0
+Fuzz 23,0,434,76.096228,10.570362,0
+Fuzz 31,0,506,89.210293,30.109496,0
+Fuzz 34,0,401,80.32592,18.832876,0
+Fuzz 36,1,634,111.583489,57.271376,86.095985
+Fuzz 38,0,436,75.620853,6.904379,0
+Fuzz 39,0,271,81.185246,22.839223,0
+Fuzz 47,0,266,84.7811,46.267034,0
+Fuzz 5,0,572,80.949861,15.287914,0
+Fuzz 7,0,685,113.137343,70.363362,0
+Fuzz 8,0,355,80.131993,37.328875,0
+Fuzz 10,0,491,100.120538,42.494447,0
+Fuzz 20,0,456,93.383113,50.491594,0
+Fuzz 21,0,484,86.278298,20.360117,0
+Fuzz 23,0,468,81.207254,12.075203,0
+Fuzz 24,1,511,80.321293,19.980299,191.383886
+Fuzz 25,0,419,84.637228,34.754672,0
+Fuzz 26,0,349,83.846946,105.870919,0
+Fuzz 33,0,408,80.089555,17.233616,0
+Fuzz 37,0,250,77.123222,17.134804,0
+Fuzz 47,0,361,78.513715,13.310143,0
+Fuzz 49,0,368,85.970074,241.784059,0
+Fuzz 50,0,295,81.843907,54.473416,0
+Fuzz 4,0,434,95.19981,54.192363,0
+Fuzz 6,0,443,83.998871,33.197583,0
+Fuzz 11,0,285,86.154584,24.029737,0
+Fuzz 13,0,441,81.717046,19.899151,0
+Fuzz 19,0,398,78.638651,18.023061,0
+Fuzz 22,0,674,99.528071,63.523692,0
+Fuzz 23,1,609,111.443237,900,0
+Fuzz 28,0,437,93.000006,49.410633,0
+Fuzz 29,0,330,83.772844,21.17702,0
+Fuzz 30,0,604,106.196785,70.894754,0
+Fuzz 34,0,437,93.69612,81.962709,0
+Fuzz 35,0,277,87.228964,19.761526,0
+Fuzz 37,0,379,80.441793,35.544079,0
+Fuzz 38,0,461,160.720457,64.038803,0
+Fuzz 41,0,437,92.022349,19.463731,0
+Fuzz 44,0,485,87.260594,26.925098,0
+Fuzz 45,0,545,117.813366,164.29499,0
+Fuzz 50,0,346,81.274323,14.501032,0
+Fuzz 5,0,416,86.621922,16.506323,0
+Fuzz 6,0,564,110.53136,38.288342,0
+Fuzz 7,0,457,130.458823,41.501156,0
+Fuzz 8,0,422,110.637988,40.803228,0
+Fuzz 10,1,444,108.964733,307.11883,950.631543
+Fuzz 11,0,596,94.979829,28.726994,0
+Fuzz 13,1,369,79.380633,14.498237,79.488403
+Fuzz 14,0,384,85.00541,27.418062,0
+Fuzz 28,0,534,102.522946,78.183629,0
+Fuzz 31,0,416,102.405924,213.217067,0
+Fuzz 41,0,471,91.679468,21.501619,0
+Fuzz 42,1,494,113.197946,900,0
+Fuzz 45,0,469,88.919076,24.081021,0
+Fuzz 5,0,713,115.701591,194.586653,0
+Fuzz 11,1,740,109.549263,857.62944,0
+Fuzz 26,1,573,133.998675,900,0
+Fuzz 27,0,504,81.713858,8.902717,0
+Fuzz 32,0,542,104.163549,49.233522,0
+Fuzz 40,0,463,107.773587,49.579975,0
+Fuzz 44,0,318,90.261844,105.296725,0
+Fuzz 50,0,430,100.881596,87.192238,0
+Fuzz 4,0,367,88.353032,26.99044,0
+Fuzz 9,0,525,80.414574,21.938,0
+Fuzz 14,0,318,82.671224,562.668163,0
+Fuzz 15,0,575,98.93859,36.03412,0
+Fuzz 16,0,768,155.015772,210.811024,0
+Fuzz 18,0,521,136.479845,43.23205,0
+Fuzz 23,0,370,83.195459,26.834378,0
+Fuzz 25,0,266,79.95175,10.922681,0
+Fuzz 27,0,401,100.790634,27.573422,0
+Fuzz 31,1,461,123.896442,712.191341,0
+Fuzz 32,0,480,84.094486,39.605363,0
+Fuzz 34,0,315,81.38235,64.846784,0
+Fuzz 36,0,398,80.439518,11.888927,0
+Fuzz 38,0,609,126.426937,70.574599,0
+Fuzz 43,0,474,78.424548,9.738677,0
+Fuzz 6,0,589,75.964725,9.065128,0
+Fuzz 7,0,662,81.366636,13.451028,0
+Fuzz 16,1,771,127.45367,900,0
+Fuzz 21,0,625,97.722471,92.103472,0
+Fuzz 22,1,781,152.361286,900,0
+Fuzz 27,0,1039,136.894037,77.33804,0
+Fuzz 34,0,867,117.790467,47.611652,0
+Fuzz 36,1,857,135.994534,900,0
+Fuzz 41,0,582,100.853181,33.735579,0
+Fuzz 42,0,616,107.02482,151.317244,0
+Fuzz 43,0,491,99.34891,63.329581,0
+Fuzz 44,0,697,100.425557,47.111617,0
+Fuzz 49,0,827,124.655544,131.364364,0
+Fuzz 4,0,830,121.103922,450.918761,0
+Fuzz 5,0,586,96.550286,47.510911,0
+Fuzz 6,0,770,112.103925,57.222578,0
+Fuzz 9,1,791,133.549025,900,0
+Fuzz 11,0,493,109.680666,100.943276,0
+Fuzz 19,0,687,85.026496,29.033672,0
+Fuzz 21,1,693,114.802524,68.34143,308.655574
+Fuzz 22,0,609,167.037902,630.897635,0
+Fuzz 28,0,531,84.252046,23.64217,0
+Fuzz 33,0,845,110.862896,105.798828,0
+Fuzz 45,0,701,86.641362,37.955433,0
+Fuzz 7,0,1013,98.051158,44.849587,0
+Fuzz 8,0,662,84.810712,53.70643,0
+Fuzz 12,0,1116,130.85271,121.32496,0
+Fuzz 15,1,669,105.937836,900,0
+Fuzz 19,0,1159,134.736476,105.685905,0
+Fuzz 24,0,710,101.258658,59.590686,0
+Fuzz 26,1,685,101.071511,900,0
+Fuzz 29,0,746,91.302436,39.542877,0
+Fuzz 32,1,704,112.470539,764.552674,0
+Fuzz 34,0,847,83.198827,12.013257,0
+Fuzz 35,1,753,96.282867,93.534268,614.754723
+Fuzz 37,0,1038,140.891349,63.576625,0
+Fuzz 38,1,1157,122.471174,900,0
+Fuzz 39,0,784,87.673499,24.287603,0
+Fuzz 45,0,1179,134.013082,107.068542,0
+Fuzz 46,0,1200,132.287818,127.451881,0
+Fuzz 6,0,788,85.915312,17.345828,0
+Fuzz 8,0,733,109.326047,111.995105,0
+Fuzz 11,0,1042,125.661755,72.890144,0
+Fuzz 16,0,834,107.154081,56.376725,0
+Fuzz 17,1,1227,120.650992,163.7775,361.146496
+Fuzz 19,0,664,109.484785,134.854647,0
+Fuzz 33,0,593,109.314608,69.834262,0
+Fuzz 36,0,1151,148.242988,180.690403,0
+Fuzz 37,0,873,114.774158,59.092258,0
+Fuzz 39,0,824,107.943227,615.745832,0
+Fuzz 40,1,885,133.152308,637.701519,815.886218
+Fuzz 41,1,903,143.320558,115.080237,1018.44242
+Fuzz 48,0,548,85.944163,53.061233,0
+Fuzz 50,0,487,100.270657,43.496725,0
+Fuzz 3,0,959,104.037746,52.356305,0
+Fuzz 5,0,699,79.529103,15.118785,0
+Fuzz 10,0,835,90.308582,36.596368,0
+Fuzz 11,1,785,390.773823,40.255808,0
+Fuzz 14,0,949,108.016696,53.287642,0
+Fuzz 16,0,854,92.552726,31.976771,0
+Fuzz 19,0,544,102.357234,29.946302,0
+Fuzz 35,1,896,101.706611,83.009549,132.105382
+Fuzz 37,0,856,99.573928,32.284862,0
+Fuzz 44,0,819,121.225326,117.194288,0
+Fuzz 2,1,1031,124.61428,80.018797,163.706505
+Fuzz 3,0,689,91.219965,27.392966,0
+Fuzz 4,1,977,127.076569,900,0
+Fuzz 9,0,696,88.151026,29.029169,0
+Fuzz 11,0,991,124.833983,226.324196,0
+Fuzz 13,0,409,88.104576,364.826733,0
+Fuzz 14,1,854,110.652111,116.44248,956.072464
+Fuzz 16,0,1101,136.740393,76.931005,0
+Fuzz 17,1,989,138.225725,796.35193,0
+Fuzz 23,0,1124,106.71388,80.676797,0
+Fuzz 25,1,929,121.125268,900,0
+Fuzz 26,1,509,99.519065,113.864887,688.716412
+Fuzz 28,0,965,113.235759,56.03438,0
+Fuzz 29,0,601,101.781478,75.958639,0
+Fuzz 32,1,889,137.884914,900,0
+Fuzz 40,0,1149,151.325289,115.712231,0
+Fuzz 42,0,1020,86.007194,13.690691,0
+Fuzz 44,0,441,81.703662,16.743386,0
+Fuzz 47,0,790,101.75681,89.331631,0
+Fuzz 50,1,612,81.437403,30.364318,494.719862
+Fuzz 5,0,849,121.640542,90.006266,0
+Fuzz 8,1,572,120.915036,900,0
+Fuzz 14,0,796,91.229748,31.923087,0
+Fuzz 16,0,631,94.62769,372.359448,0
+Fuzz 18,1,992,128.396646,201.787269,621.449402
+Fuzz 23,0,651,111.171679,41.701968,0
+Fuzz 25,0,525,90.432836,31.946544,0
+Fuzz 32,0,639,102.334197,69.655772,0
+Fuzz 39,0,833,99.426667,39.377854,0
+Fuzz 40,1,838,121.285495,214.904785,398.55948
+Fuzz 43,0,550,84.745718,20.433855,0
+Fuzz 44,0,660,98.421432,49.922681,0
+Fuzz 47,1,716,118.86452,900,0
+Fuzz 3,0,811,93.878258,64.861521,0
+Fuzz 10,0,985,88.07386,36.428593,0
+Fuzz 12,0,1056,129.970043,104.749327,0
+Fuzz 23,0,662,117.594397,54.220297,0
+Fuzz 24,0,739,100.984106,40.992837,0
+Fuzz 32,1,717,117.364713,900,2067.092291
+Fuzz 44,0,893,136.556011,74.377366,0
+Fuzz 46,1,627,91.975361,900,0
+Fuzz 2,1,975,144.974362,900,0
+Fuzz 3,0,838,124.665081,571.465936,0
+Fuzz 4,0,690,116.585341,200.43599,0
+Fuzz 5,0,743,115.766611,60.531429,0
+Fuzz 6,0,587,110.161455,197.413642,0
+Fuzz 23,0,769,121.832475,68.851881,0
+Fuzz 33,0,801,95.645466,48.537713,0
+Fuzz 34,1,809,122.587427,900,0
+Fuzz 38,0,481,90.565036,24.257246,0
+Fuzz 48,1,472,133.326847,98.521522,858.471127
+Fuzz 2,0,732,123.607567,271.137057,0
+Fuzz 3,0,575,94.826042,33.353731,0
+Fuzz 4,1,525,132.320366,503.244034,438.33517
+Fuzz 9,0,693,117.202073,52.858837,0
+Fuzz 12,0,496,92.319728,16.866141,0
+Fuzz 15,0,943,114.856378,61.723248,0
+Fuzz 19,0,713,102.880823,113.258005,0
+Fuzz 20,1,817,125.878698,715.398438,0
+Fuzz 30,0,840,99.794773,46.642793,0
+Fuzz 31,0,963,136.441181,79.887135,0
+Fuzz 35,0,538,170.791334,33.642392,0
+Fuzz 38,0,1063,130.441036,160.835229,0
+Fuzz 43,0,880,113.828458,159.028716,0
+Fuzz 3,1,1111,133.282712,900,0
+Fuzz 4,0,623,133.761605,84.212359,0
+Fuzz 7,0,886,124.198955,62.251886,0
+Fuzz 9,1,741,127.968345,900,0
+Fuzz 16,0,939,128.292327,40.145655,0
+Fuzz 19,0,1032,131.694598,94.051414,0
+Fuzz 28,0,566,93.063646,101.679287,0
+Fuzz 29,0,577,104.345348,463.651413,0
+Fuzz 33,0,1081,136.317551,67.156588,0
+Fuzz 38,0,822,83.325328,24.5342,0
+Fuzz 39,0,1111,91.316473,35.769129,0
+Fuzz 40,0,1183,118.834363,65.523591,0
+Fuzz 41,0,913,82.36488,14.141847,0
+Fuzz 10,1,1039,132.119776,102.708215,571.025399
+Fuzz 11,0,781,77.428854,8.912969,0
+Fuzz 13,1,902,117.323907,900,0
+Fuzz 16,1,764,137.069159,799.760052,1623.087265
+Fuzz 19,1,561,117.959026,570.278071,0
+Fuzz 27,0,607,103.867157,58.464307,0
+Fuzz 29,0,1184,121.784716,93.812364,0
+Fuzz 30,0,920,139.324632,79.753691,0
+Fuzz 31,0,334,79.564701,36.224608,0
+Fuzz 32,0,841,125.152865,145.316431,0
+Fuzz 33,0,839,114.678615,40.507658,0
+Fuzz 34,0,506,98.475466,139.203807,0
+Fuzz 38,1,875,137.509492,900,0
+Fuzz 43,0,740,77.244829,11.25029,0
+Fuzz 49,0,915,93.09034,48.798759,0
+Fuzz 4,0,512,121.099703,54.408773,0
+Fuzz 5,0,844,121.830861,64.257727,0
+Fuzz 6,0,1024,137.014352,433.025218,0
+Fuzz 8,0,1255,133.472487,80.321801,0
+Fuzz 9,0,740,115.22604,55.724087,0
+Fuzz 10,1,983,148.061588,764.787564,2540.831406
+Fuzz 13,0,845,134.893873,191.19838,0
+Fuzz 20,0,672,107.604496,54.252931,0
+Fuzz 21,0,725,115.087723,88.562136,0
+Fuzz 24,0,789,80.258731,33.257064,0
+Fuzz 25,0,1019,119.695559,62.413956,0
+Fuzz 31,0,813,102.446894,45.189297,0
+Fuzz 34,0,1028,116.319611,56.167105,0
+Fuzz 35,0,744,147.491345,166.637097,0
+Fuzz 36,0,819,121.671461,49.486026,0
+Fuzz 38,0,1266,359.873554,79.847396,0
+Fuzz 41,0,715,109.625132,55.245232,0
+Fuzz 48,0,694,114.751018,461.358049,0
+Fuzz 49,0,1117,103.243506,40.896422,0
+Fuzz 10,0,971,96.237283,26.627281,0
+Fuzz 19,0,853,106.441597,48.990009,0
+Fuzz 26,1,938,34.711747,22.285652,247.39869
+Fuzz 29,0,810,95.964786,38.210091,0
+Fuzz 30,0,325,84.887981,55.812929,0
+Fuzz 34,1,657,96.69269,900,0
+Fuzz 35,1,826,141.429273,900,0
+Fuzz 36,0,654,85.095109,33.789621,0
+Fuzz 37,0,526,117.590541,59.522788,0
+Fuzz 41,0,904,115.145335,65.715761,0
+Fuzz 44,0,701,101.59727,53.977038,0
+Fuzz 48,0,832,120.244709,152.293671,0
+Fuzz 5,0,727,134.485261,81.64789,0
+Fuzz 7,0,895,141.927869,82.073862,0
+Fuzz 9,0,1066,246.093345,83.880599,0
+Fuzz 14,0,966,146.379146,68.820405,0
+Fuzz 20,0,1273,136.203963,214.454027,0
+Fuzz 22,0,913,138.24017,49.164182,0
+Fuzz 28,0,1342,163.207651,217.070153,0
+Fuzz 30,0,1009,99.666275,30.562882,0
+Fuzz 40,0,1432,188.100611,304.111457,0
+Fuzz 45,0,652,139.498888,85.151198,0
+Fuzz 4,0,1074,104.30629,78.485194,0
+Fuzz 5,0,1138,178.153669,723.656154,0
+Fuzz 7,0,663,100.215868,54.101844,0
+Fuzz 8,0,914,134.207194,72.167619,0
+Fuzz 15,0,1499,194.914918,180.811441,0
+Fuzz 16,0,909,113.68439,64.804822,0
+Fuzz 19,0,1070,125.260486,77.923633,0
+Fuzz 23,0,911,129.704283,105.246738,0
+Fuzz 24,0,871,82.000693,18.37236,0
+Fuzz 25,0,872,139.62049,76.245487,0
+Fuzz 28,0,795,81.865212,13.70266,0
+Fuzz 34,1,1603,111.761366,80.97676,255.248763
+Fuzz 44,0,849,125.40682,92.831504,0
+Fuzz 4,0,865,94.779902,28.225736,0
+Fuzz 10,1,1100,78.540715,179.911326,302.809869
+Fuzz 12,0,644,95.993679,15.583652,0
+Fuzz 13,0,980,140.451056,62.273703,0
+Fuzz 15,0,1111,164.037318,89.992467,0
+Fuzz 17,0,912,142.507677,86.375619,0
+Fuzz 18,0,990,123.326337,83.963384,0
+Fuzz 24,0,906,125.829145,61.49457,0
+Fuzz 25,0,1094,116.057172,74.135675,0
+Fuzz 31,0,1466,99.310903,30.525447,0
+Fuzz 34,0,873,95.925888,46.291211,0
+Fuzz 35,0,913,102.415824,55.09079,0
+Fuzz 36,0,889,138.643541,81.1955,0
+Fuzz 41,1,1296,120.820473,879.730593,0
+Fuzz 42,0,529,128.561981,394.095511,0
+Fuzz 2,1,784,129.980457,900,0
+Fuzz 15,1,1260,426.821468,404.388997,1743.377526
+Fuzz 22,0,923,130.937741,70.49093,0
+Fuzz 24,0,867,114.800333,58.835007,0
+Fuzz 28,0,1174,136.922346,78.820901,0
+Fuzz 37,0,649,94.696643,16.436675,0
+Fuzz 47,0,911,98.134154,35.231729,0
+Fuzz 11,0,948,156.696626,95.596221,0
+Fuzz 14,0,940,114.768136,71.097945,0
+Fuzz 16,1,1141,54.992182,61.492425,255.65541
+Fuzz 17,1,926,409.299383,42.375104,0
+Fuzz 18,0,2218,347.149202,331.784385,0
+Fuzz 20,0,968,110.696193,63.496512,0
+Fuzz 32,0,799,114.02666,118.970387,0
+Fuzz 39,0,1004,140.166021,56.964142,0
+Fuzz 40,0,1065,145.463155,102.470962,0
+Fuzz 42,0,1115,134.707124,115.387908,0
+Fuzz 43,0,907,164.038447,97.119557,0
+Fuzz 45,1,1119,157.523215,900,0
+Fuzz 11,0,1492,144.776562,200.689004,0
+Fuzz 14,1,1107,143.53217,900,0
+Fuzz 15,1,923,126.677896,900,0
+Fuzz 23,0,1366,149.4346,83.329667,0
+Fuzz 25,0,618,99.155597,23.40336,0
+Fuzz 30,0,600,120.295135,60.291509,0
+Fuzz 32,0,905,128.131919,64.189432,0
+Fuzz 36,0,1239,141.990831,332.536625,0
+Fuzz 40,0,788,128.555232,62.168664,0
+Fuzz 43,0,1211,124.541218,60.581325,0
+Fuzz 8,1,817,164.621075,900,0
+Fuzz 12,0,395,117.698441,27.924019,0
+Fuzz 13,0,965,143.434384,302.594778,0
+Fuzz 16,0,515,98.534359,26.81683,0
+Fuzz 17,0,1216,135.762452,64.470639,0
+Fuzz 20,0,941,136.92238,64.176748,0
+Fuzz 21,0,875,122.169632,73.232906,0
+Fuzz 24,1,1237,175.089251,900,0
+Fuzz 37,0,972,123.776827,55.51993,0
+Fuzz 42,0,810,135.115239,72.848698,0
+Fuzz 45,0,666,117.823145,761.316309,0
+Fuzz 49,0,900,137.219133,102.957023,0
+Fuzz 3,0,1073,149.505332,94.739961,0
+Fuzz 6,0,1758,193.454078,199.868795,0
+Fuzz 13,0,686,105.464125,38.176121,0
+Fuzz 16,0,903,107.20612,56.637073,0
+Fuzz 18,0,1079,125.41215,69.565621,0
+Fuzz 24,1,958,139.97889,900,0
+Fuzz 30,0,1379,176.368003,77.852364,0
+Fuzz 31,1,1043,151.443824,104.733843,333.323557
+Fuzz 32,0,1527,151.738375,126.789714,0
+Fuzz 33,0,950,179.249334,131.40709,0
+Fuzz 43,0,1361,170.601027,109.966075,0
+Fuzz 3,0,792,140.730288,542.945643,0
+Fuzz 17,1,1129,133.747253,687.719693,0
+Fuzz 22,0,922,159.068952,120.581811,0
+Fuzz 24,0,997,127.760473,67.561543,0
+Fuzz 25,0,741,100.186199,71.245488,0
+Fuzz 28,1,1069,164.620557,900,0
+Fuzz 33,0,1029,148.133097,108.629934,0
+Fuzz 34,0,1103,109.345047,48.298797,0
+Fuzz 36,0,838,95.02383,62.540851,0
+Fuzz 38,0,1235,108.378667,49.245733,0
+Fuzz 40,0,387,86.798554,41.361019,0
+Fuzz 46,0,1049,141.370124,90.629229,0
+Fuzz 47,0,659,102.8481,42.694183,0
+Fuzz 49,0,987,115.004153,28.515279,0
+Fuzz 3,0,788,134.690938,119.906779,0
+Fuzz 9,1,1054,131.435064,147.095631,1503.394977
+Fuzz 10,0,849,132.512345,82.316941,0
+Fuzz 16,1,694,106.181018,900,0
+Fuzz 23,0,1136,90.565297,26.438728,0
+Fuzz 27,0,758,109.630799,53.448729,0
+Fuzz 34,0,698,107.988998,59.016381,0
+Fuzz 38,0,712,118.576606,60.249104,0
+Fuzz 39,0,678,101.564524,47.174786,0
+Fuzz 43,0,743,109.75313,551.783235,0
+Fuzz 5,0,907,106.040538,500.469405,0
+Fuzz 6,0,1141,108.928163,53.459898,0
+Fuzz 14,1,901,128.260786,900,0
+Fuzz 19,0,775,112.900791,66.108496,0
+Fuzz 21,0,886,126.657906,82.928219,0
+Fuzz 22,0,1503,189.008743,130.454333,0
+Fuzz 24,1,1013,162.340229,814.410043,0
+Fuzz 27,0,688,85.688048,20.171571,0
+Fuzz 31,0,711,75.084066,10.979643,0
+Fuzz 36,0,1147,163.91741,102.953713,0
+Fuzz 41,1,620,125.422487,523.754896,699.452926
+Fuzz 42,0,1001,156.520583,84.038728,0
+Fuzz 48,0,1072,109.293844,124.678687,0
+Fuzz 49,0,1018,94.46564,29.520782,0
+Fuzz 50,0,566,99.563005,218.844264,0
+Fuzz 4,0,770,78.843914,9.530247,0
+Fuzz 8,1,1094,152.64349,900,0
+Fuzz 9,1,1633,185.663614,900,0
+Fuzz 10,0,613,115.533921,45.438595,0
+Fuzz 19,1,1603,445.030931,201.290081,0
+Fuzz 21,1,1209,130.611693,900,0
+Fuzz 27,0,872,93.193358,47.412111,0
+Fuzz 28,0,1009,136.722848,180.296198,0
+Fuzz 33,1,527,137.494923,344.366909,760.641245
+Fuzz 38,0,589,75.634147,9.606599,0
+Fuzz 45,0,1200,152.952169,110.619482,0
+Fuzz 47,0,523,105.949679,41.89404,0
+Fuzz 49,0,749,105.195546,53.239062,0
+Fuzz 4,0,706,115.73565,72.418621,0
+Fuzz 6,0,782,152.360251,68.338661,0
+Fuzz 11,0,757,133.156986,253.569589,0
+Fuzz 17,0,700,102.10319,111.472789,0
+Fuzz 19,0,702,106.506462,47.150667,0
+Fuzz 36,0,687,109.285321,46.802885,0
+Fuzz 39,0,929,96.946985,28.597025,0
+Fuzz 48,0,839,78.676596,34.6425,0
+Fuzz 49,1,666,117.31291,900,0
+Fuzz 8,0,1749,122.188427,77.453387,0
+Fuzz 15,0,1363,164.962163,140.096214,0
+Fuzz 16,0,2063,320.477374,251.086386,0
+Fuzz 17,0,1988,207.270003,496.729531,0
+Fuzz 23,0,1642,190.438876,140.333155,0
+Fuzz 25,1,1265,173.256436,900,0
+Fuzz 28,0,2336,242.270435,213.561278,0
+Fuzz 30,1,1699,177.859714,900,0
+Fuzz 31,0,1495,187.144701,202.712429,0
+Fuzz 34,0,1524,175.241172,120.953064,0
+Fuzz 35,1,2374,301.948292,900,0
+Fuzz 42,1,1210,185.347233,900,0
+Fuzz 45,0,1478,180.288029,240.068268,0
+Fuzz 48,0,1260,141.497656,105.513918,0
+Fuzz 3,0,1994,194.85229,204.903283,0
+Fuzz 9,0,2480,175.020696,113.664853,0
+Fuzz 12,1,1402,196.88473,900,0
+Fuzz 25,0,1153,162.514332,130.608026,0
+Fuzz 27,0,1712,207.025175,504.446138,0
+Fuzz 28,1,1507,198.92997,900,0
+Fuzz 33,0,1596,164.786131,110.835066,0
+Fuzz 39,0,1367,150.037143,135.111079,0
+Fuzz 40,0,2008,258.006473,222.106632,0
+Fuzz 42,0,2252,236.965337,207.314386,0
+Fuzz 47,1,1957,268.062382,900,0
+Fuzz 7,1,2123,123.78851,123.968628,355.675366
+Fuzz 9,0,1391,167.094409,104.225008,0
+Fuzz 10,0,2366,296.091427,230.72916,0
+Fuzz 12,0,2246,291.765255,495.057401,0
+Fuzz 13,0,2783,446.953605,478.019383,0
+Fuzz 23,0,1985,304.193525,336.640008,0
+Fuzz 28,1,1551,200.868698,900,0
+Fuzz 29,0,2401,522.083138,357.135111,0
+Fuzz 35,0,1567,168.977874,142.261153,0
+Fuzz 43,0,1702,195.65968,167.734276,0
+Fuzz 47,0,1669,163.521236,109.917072,0
+Fuzz 5,0,1176,128.448828,81.014715,0
+Fuzz 9,0,1393,197.850455,167.437178,0
+Fuzz 10,0,2067,181.897171,90.242717,0
+Fuzz 24,0,1722,219.883621,166.696149,0
+Fuzz 28,0,1370,154.551501,99.735274,0
+Fuzz 29,1,1953,173.659889,900,0
+Fuzz 32,1,3080,537.112596,900,0
+Fuzz 35,0,1459,176.057011,155.71461,0
+Fuzz 36,1,2009,312.932817,900,0
+Fuzz 47,0,1817,199.065457,159.302789,0
+Fuzz 4,1,1549,174.420897,900,0
+Fuzz 6,1,1419,171.533627,900,0
+Fuzz 12,0,2874,482.0362,612.250652,0
+Fuzz 23,1,1722,174.506194,756.920422,1337.510486
+Fuzz 26,1,1838,155.000221,900,0
+Fuzz 29,0,1685,146.799973,101.646438,0
+Fuzz 31,0,1583,196.264672,195.074636,0
+Fuzz 39,0,2116,194.484914,128.677955,0
+Fuzz 47,0,2276,285.773996,229.965859,0
+Fuzz 48,0,1421,181.921524,140.515491,0
+Fuzz 3,1,1641,305.730712,900,0
+Fuzz 6,1,1675,251.514737,843.01811,997.051057
+Fuzz 7,0,1925,243.567257,193.152589,0
+Fuzz 17,0,1383,181.799435,118.307211,0
+Fuzz 21,0,1919,159.536304,51.666443,0
+Fuzz 25,1,2173,314.26735,900,0
+Fuzz 27,0,1596,165.19521,125.055897,0
+Fuzz 35,0,1664,215.059145,197.638815,0
+Fuzz 39,0,2684,375.415648,275.058543,0
+Fuzz 40,0,1818,180.508801,96.184139,0
+Fuzz 42,0,1255,150.486194,122.785894,0
+Fuzz 2,0,1783,201.266659,147.657311,0
+Fuzz 5,0,899,164.206195,83.438398,0
+Fuzz 6,0,1526,182.15909,152.56899,0
+Fuzz 7,1,1985,309.909323,900,0
+Fuzz 11,0,994,109.906375,17.134528,0
+Fuzz 19,0,2279,312.782709,733.002179,0
+Fuzz 23,0,2235,301.004477,219.500659,0
+Fuzz 24,1,1237,167.403682,710.679812,903.131932
+Fuzz 31,0,1809,177.483038,159.317886,0
+Fuzz 34,0,1646,99.797225,29.079297,0
+Fuzz 38,0,1489,248.805174,552.887042,0
+Fuzz 40,1,1599,181.213074,900,0
+Fuzz 41,0,1075,83.330865,14.982108,0
+Fuzz 42,0,1698,131.98919,73.607177,0
+Fuzz 46,1,1545,203.363219,740.759879,0
+Fuzz 3,0,1739,210.050007,275.469835,0
+Fuzz 8,0,694,111.373312,47.4489,0
+Fuzz 9,0,1818,268.290884,196.607991,0
+Fuzz 12,0,1121,81.371525,9.2348,0
+Fuzz 14,1,2155,231.439324,900,0
+Fuzz 18,0,1300,202.03549,397.75617,0
+Fuzz 19,1,1749,296.60789,900,0
+Fuzz 24,0,1301,178.783599,100.124767,0
+Fuzz 25,0,2367,263.195068,367.696575,0
+Fuzz 28,0,1813,198.315439,177.360961,0
+Fuzz 29,0,2050,217.494168,193.397699,0
+Fuzz 30,0,1099,139.486098,127.794593,0
+Fuzz 34,1,1180,161.325163,900,0
+Fuzz 37,0,2097,94.947034,15.32637,0
+Fuzz 38,1,1797,209.637237,900,0
+Fuzz 49,0,1484,161.263309,446.733957,0
+Fuzz 50,0,1690,335.633161,246.171336,0
+Fuzz 3,0,2668,210.515996,102.330689,0
+Fuzz 4,0,1587,199.950141,175.238598,0
+Fuzz 17,0,2088,292.290114,226.516641,0
+Fuzz 23,1,2772,468.815123,900,0
+Fuzz 25,0,1807,284.708528,203.695928,0
+Fuzz 26,0,2317,194.910425,145.223972,0
+Fuzz 30,0,2034,285.929658,663.467915,0
+Fuzz 35,0,2675,204.570135,121.600769,0
+Fuzz 38,1,1589,325.5413,900,0
+Fuzz 43,0,1833,203.528634,182.734271,0
+Fuzz 44,1,1655,199.295682,900,0
+Fuzz 7,0,2332,266.123069,185.375632,0
+Fuzz 12,0,2131,363.260288,356.906326,0
+Fuzz 13,0,1878,212.178221,149.776364,0
+Fuzz 14,0,1685,204.681403,372.95505,0
+Fuzz 16,0,2346,205.112194,34.967972,0
+Fuzz 36,1,1798,325.350996,900,0
+Fuzz 37,0,1265,176.118106,124.244085,0
+Fuzz 39,0,1304,182.301271,274.687081,0
+Fuzz 43,0,1971,93.688107,140.051882,0
+Fuzz 44,0,1449,241.503023,335.574728,0
+Fuzz 45,0,2405,437.109735,331.588706,0
+Fuzz 47,1,2633,111.710268,60.615035,355.92598
+Fuzz 2,0,2284,378.211011,202.180491,0
+Fuzz 3,1,2916,490.657248,900,0
+Fuzz 5,0,2116,218.813704,176.396844,0
+Fuzz 11,0,1556,261.676828,227.153123,0
+Fuzz 19,0,2806,397.793984,296.272472,0
+Fuzz 23,0,2879,426.527358,411.939858,0
+Fuzz 27,0,2350,472.114226,250.321139,0
+Fuzz 28,0,2402,351.217535,346.980655,0
+Fuzz 32,1,1927,234.132243,119.488559,84.609314
+Fuzz 34,0,1830,184.220281,152.537903,0
+Fuzz 36,1,2581,381.987413,883.982755,0
+Fuzz 46,0,2377,133.507022,35.155392,0
+Fuzz 47,0,2632,523.491942,324.210563,0
+Fuzz 3,0,1698,211.023104,186.932684,0
+Fuzz 4,0,1451,270.164427,312.028678,0
+Fuzz 8,0,2030,234.04465,208.692801,0
+Fuzz 13,0,1300,167.284657,126.340544,0
+Fuzz 15,0,2690,322.110668,399.211878,0
+Fuzz 16,0,1593,188.924082,109.027042,0
+Fuzz 22,1,1533,48.938785,30.348852,280.428936
+Fuzz 23,0,1565,290.847942,204.328828,0
+Fuzz 26,1,1509,292.199398,900,0
+Fuzz 27,0,1881,194.144465,107.790361,0
+Fuzz 31,0,1975,306.987652,525.809053,0
+Fuzz 32,1,1750,520.350633,600.292107,0
+Fuzz 39,0,2254,156.902192,71.796672,0
+Fuzz 50,0,1855,287.475251,159.501632,0
+Fuzz 4,1,2305,464.153179,900,0
+Fuzz 14,0,2496,488.759002,347.677519,0
+Fuzz 19,1,1416,179.956034,900,0
+Fuzz 24,0,2397,356.601396,400.620501,0
+Fuzz 25,1,2005,485.910299,166.186296,0
+Fuzz 26,0,1729,185.647342,143.531644,0
+Fuzz 28,0,1394,209.264987,180.988816,0
+Fuzz 29,1,2353,374.121735,342.106115,199.558233
+Fuzz 37,0,3381,299.235724,223.549117,0
+Fuzz 41,1,1810,335.206071,339.295064,323.134795
+Fuzz 2,0,2559,218.974688,111.821811,0
+Fuzz 5,0,2453,314.345173,637.504267,0
+Fuzz 6,0,1622,223.710598,122.36846,0
+Fuzz 7,1,1973,326.072448,900,0
+Fuzz 14,0,2845,457.015434,345.152013,0
+Fuzz 30,0,2629,179.406717,59.802481,0
+Fuzz 32,0,2061,223.175175,576.716838,0
+Fuzz 35,0,2370,324.112583,305.519357,0
+Fuzz 37,1,2150,75.802442,70.730479,276.700399
+Fuzz 41,0,1586,120.227357,44.965894,0
+Fuzz 42,0,2549,454.003385,382.239779,0
+Fuzz 48,0,2099,280.628827,253.3978,0
+Fuzz 50,0,2723,128.991126,46.264931,0
+Fuzz 7,0,1698,171.623915,153.759276,0
+Fuzz 10,0,2140,207.408937,172.235331,0
+Fuzz 11,0,1957,151.344728,109.476513,0
+Fuzz 20,1,1357,177.350265,741.268969,2229.477712
+Fuzz 21,0,1601,183.83824,168.214971,0
+Fuzz 23,0,2459,117.86716,37.573139,0
+Fuzz 25,0,1300,168.03777,52.321369,0
+Fuzz 33,1,2497,161.96121,210.985797,328.319447
+Fuzz 37,0,1781,177.241306,120.673221,0
+Fuzz 43,1,2807,532.324013,900,0
+Fuzz 9,1,5499,900,160.69543,0
+Fuzz 12,1,4023,729.302088,900,0
+Fuzz 16,0,3288,388.199264,219.906858,0
+Fuzz 21,1,4931,900,900,0
+Fuzz 27,0,2623,422.390259,442.599486,0
+Fuzz 34,0,2994,534.157228,435.045605,0
+Fuzz 38,1,4114,900,900,0
+Fuzz 41,0,4030,750.797244,640.708433,0
+Fuzz 46,1,4892,623.056421,900,0
+Fuzz 48,0,3966,864.571745,586.395499,0
+Fuzz 2,1,5502,796.291066,600.706159,457.958948
+Fuzz 3,1,3379,820.958411,900,0
+Fuzz 6,0,3755,900,900,0
+Fuzz 8,1,3835,872.085795,900,0
+Fuzz 9,0,4027,580.531733,268.450207,0
+Fuzz 13,0,2908,549.607479,618.238842,0
+Fuzz 15,1,4909,817.028558,900,0
+Fuzz 21,0,4470,869.453399,655.697603,0
+Fuzz 25,0,3969,848.533596,775.036938,0
+Fuzz 26,1,5099,900,733.426022,0
+Fuzz 27,1,5887,900,568.400129,0
+Fuzz 32,0,4361,845.981078,900,0
+Fuzz 40,1,3536,900,900,0
+Fuzz 5,1,3751,679.473085,292.882048,0
+Fuzz 6,1,3889,553.491527,202.196279,0
+Fuzz 10,1,4803,770.253613,561.443637,0
+Fuzz 12,1,2659,755.049068,600.733815,0
+Fuzz 17,1,3205,577.174074,244.34709,0
+Fuzz 22,1,4192,640.798092,601.10506,0
+Fuzz 23,1,3215,766.41186,600.611128,0
+Fuzz 27,1,4531,797.868967,601.804377,0
+Fuzz 30,1,5158,801.421934,300.664371,0
+Fuzz 34,1,5102,765.98805,600.836135,0
+Fuzz 38,1,2902,367.595105,600.270091,432.412547
+Fuzz 40,1,5243,668.002974,489.388507,0
+Fuzz 42,1,3681,305.380261,173.192793,258.290406
+Fuzz 44,0,6200,603.16796,368.368571,0
+Fuzz 45,1,4504,786.72645,300.63334,0
+Fuzz 46,0,1757,436.983496,382.569324,0
+Fuzz 5,0,3564,497.226688,453.739049,0
+Fuzz 6,1,2943,497.834663,402.797559,887.728226
+Fuzz 10,1,5800,624.531264,271.979051,0
+Fuzz 11,1,4242,551.497176,98.273917,0
+Fuzz 21,0,3154,528.625869,477.564233,0
+Fuzz 28,1,3356,548.94167,76.559213,0
+Fuzz 29,0,4673,489.568013,540.550036,0
+Fuzz 31,1,4437,613.044228,524.783885,0
+Fuzz 37,1,5382,595.110481,217.834652,0
+Fuzz 50,1,4260,404.745532,900,0
diff --git a/paper/fubfst_fpga2020.tex b/paper/fubfst_fpga2020.tex
new file mode 100644
index 0000000..96e3cbd
--- /dev/null
+++ b/paper/fubfst_fpga2020.tex
@@ -0,0 +1,946 @@
+\documentclass[hyphens,prologue,x11names,rgb,sigconf]{acmart}
+
+\def\ymhgistrue{1}\def\ymhgident%
+ {1}
+% ^^^ Set ident to 0 for anonymous, and 1 for personal info
+
+\usepackage[english]{babel}
+\usepackage[nounderscore]{syntax}
+\usepackage{graphicx}
+\usepackage{siunitx}
+\usepackage{minted}
+\usepackage{amsthm}
+\usepackage{pgfplots}
+\usepackage{tikz}
+\usepackage{subcaption}
+\usepackage{booktabs}
+\usepackage{multirow}
+\usepackage{multicol}
+\usepackage{hyperref}
+%\usepackage{balance}
+
+\copyrightyear{2020}
+\acmYear{2020}
+\setcopyright{acmcopyright}
+\acmConference[FPGA '20]{Proceedings of the 2020 ACM/SIGDA International Symposium on Field-Programmable Gate Arrays}{February 23--25, 2020}{Seaside, CA, USA}
+\acmBooktitle{Proceedings of the 2020 ACM/SIGDA International Symposium on Field-Programmable Gate Arrays (FPGA '20), February 23--25, 2020, Seaside, CA, USA}
+\acmPrice{15.00}
+\acmDOI{10.1145/3373087.3375310}
+\acmISBN{978-1-4503-7099-8/20/02}
+
+%%
+%% The majority of ACM publications use numbered citations and
+%% references. The command \citestyle{authoryear} switches to the
+%% "author year" style.
+%%
+%% If you are preparing content for an event
+%% sponsored by ACM SIGGRAPH, you must use the "author year" style of
+%% citations and references.
+%% Uncommenting
+%% the next command will enable that style.
+%% \citestyle{acmauthoryear}
+
+\settopmatter{printacmref=true}
+
+\renewcommand{\syntleft}{\it\/}
+\renewcommand{\syntright}{}
+\renewcommand{\litleft}{\ttfamily}
+\renewcommand{\litright}{}
+
+\theoremstyle{remark}
+\newtheorem*{remark}{Remark}
+
+\setminted{fontsize=\small,baselinestretch=1,frame=lines,linenos,numbersep=5pt}
+
+\pgfplotsset{compat=1.15}
+\usetikzlibrary{calc,arrows.meta}
+\usetikzlibrary{positioning}
+\usepgfplotslibrary{groupplots}
+%\usetikzlibrary{external}
+%\tikzexternalize[prefix=figures_conference/]
+
+\tikzset{
+ small dot/.style={fill=red,circle,scale=1},
+}
+
+\newcommand{\tool}[2][]{%
+ \ifx\hfuzz#1\hfuzz #2%
+ \else #2 #1%
+ \fi}%
+\newcommand{\xilinx}[1][]{\tool[#1]{Xilinx}}%
+\newcommand{\intel}[1][]{\tool[#1]{Intel}}%
+\newcommand{\quartus}[1][]{\tool[#1]{Quartus Prime}}%
+\newcommand{\quartuslite}[1][]{\tool[#1]{Quartus Prime Lite}}%
+\newcommand{\yosys}[1][]{\tool[#1]{Yosys}}%
+\newcommand{\xst}[1][]{\tool[#1]{XST}}%
+\newcommand{\vivado}[1][]{\tool[#1]{Vivado}}%
+\newcommand{\verismith}[1][]{\tool[#1]{Verismith}}%
+\newcommand{\iverilog}[1][]{\tool[#1]{Icarus Verilog}}%
+\newcommand{\bugtracker}[1]{%
+ \ifx\ymhgistrue\ymhgident%
+ \footnote{#1}%
+ \else%
+ \footnote{Bug tracker URL redacted for blind review.}%
+ \fi%
+}
+\newcommand{\personallink}[1]{%
+ \ifx\ymhgistrue\ymhgident%
+ \footnote{#1}%
+ \else%
+ \footnote{URL redacted for blind review.}%
+ \fi%
+}
+
+\pgfplotsset{tiny/.style={width=4.5cm,
+ height=,
+ legend style={font=\tiny},
+ tick label style={font=\tiny},
+ label style={font=\tiny},
+ title style={font=\footnotesize},
+ every axis title shift=0pt,
+ max space between ticks=12,
+ every mark/.append style={mark size=6},
+ major tick length=0.1cm,
+ minor tick length=0.066cm,
+ every legend image post/.append style={scale=0.8},
+ },
+}
+
+%
+\definecolor{bblue}{HTML}{4F81BD}%
+\definecolor{lightbblue}{HTML}{89B1E1}%
+\definecolor{rred}{HTML}{C0504D}%
+\definecolor{lightrred}{HTML}{FA8D8A}%
+\definecolor{ggreen}{HTML}{9BBB59}%
+\definecolor{ppurple}{HTML}{9F4C7C}%
+\definecolor{yyellow}{HTML}{FFA000}
+
+\definecolor{ribbon1}{HTML}{66C2A5}
+\definecolor{ribbon2}{HTML}{FC8D62}
+\definecolor{ribbon3}{HTML}{8DA0CB}
+\definecolor{ribbon4}{HTML}{E78AC3}
+\definecolor{ribbon5}{HTML}{A6D854}
+\definecolor{ribbon6}{HTML}{FFD92F}
+
+\definecolor{mscol1}{HTML}{E66101}
+\definecolor{mscol2}{HTML}{5E3C99}
+\definecolor{ccol1}{HTML}{FDB863}
+\definecolor{ccol2}{HTML}{B2ABD2}
+
+\definecolor{verireduce}{HTML}{E66101}
+\definecolor{creduce}{HTML}{5E3C99}
+
+\pgfplotsset{
+ verismith missynth/.style={verireduce, draw=verireduce, mark=*},
+ creduce missynth/.style={creduce, draw=creduce, mark=triangle*},
+ verismith crash/.style={verireduce, draw=verireduce, mark=o},
+ creduce crash/.style={creduce, draw=creduce, mark=triangle}
+}
+
+\definecolor{diag1}{HTML}{CCEBC5}
+\definecolor{diag2}{HTML}{B3CDE3}
+\definecolor{diagerr}{HTML}{FBB4AE}
+
+\definecolor{distr1}{HTML}{1B9E77}
+\definecolor{distr2}{HTML}{D95F02}
+\definecolor{distr3}{HTML}{7570B3}
+\definecolor{distr4}{HTML}{E7298A}
+\definecolor{distr5}{HTML}{66A61E}
+\definecolor{distr6}{HTML}{E6AB02}
+\definecolor{distr7}{HTML}{A6761D}
+\definecolor{distr8}{HTML}{666666}
+
+\definecolor{combined}{HTML}{008080}
+\definecolor{uncombined}{HTML}{008080}
+
+%%
+%% end of the preamble, start of the body of the document source.
+\begin{document}
+
+\fancyhead{}
+
+%%
+%% The "title" command has an optional parameter,
+%% allowing the author to define a "short title" to be used in page headers.
+\title{Finding and Understanding Bugs in FPGA Synthesis Tools}
+
+%%
+%% The "author" command and its associated commands are used to define
+%% the authors and their affiliations.
+%% Of note is the shared affiliation of the first two authors, and the
+%% "authornote" and "authornotemark" commands
+%% used to denote shared contribution to the research.
+\author{Yann Herklotz}
+\email{yann.herklotz15@imperial.ac.uk}
+\affiliation{%
+ \institution{Imperial College London}
+ \streetaddress{South Kensington Campus}
+ \city{London}
+ \country{UK}
+ \postcode{SW7 2AZ}
+}
+
+\author{John Wickerson}
+\email{j.wickerson@imperial.ac.uk}
+\affiliation{%
+ \institution{Imperial College London}
+ \streetaddress{South Kensington Campus}
+ \city{London}
+ \country{UK}
+ \postcode{SW7 2AZ}
+}
+
+%%
+%% By default, the full list of authors will be used in the page
+%% headers. Often, this list is too long, and will overlap
+%% other information printed in the page headers. This command allows
+%% the author to define a more concise list
+%% of authors' names for this purpose.
+\renewcommand{\shortauthors}{Yann Herklotz and John Wickerson}
+
+%%
+%% The abstract is a short summary of the work to be presented in the
+%% article.
+\begin{abstract}
+ All software ultimately relies on hardware functioning correctly. Hardware correctness is becoming increasingly important due to the growing use of custom accelerators using FPGAs to speed up applications on servers. Furthermore, the increasing complexity of hardware also leads to ever more reliance on automation, meaning that the correctness of synthesis tools is vital for the reliability of the hardware.
+
+ This paper aims to improve the quality of FPGA synthesis tools by introducing a method to test them automatically using randomly generated, correct Verilog, and checking that the synthesised netlist is always equivalent to the original design. The main contributions of this work are twofold: firstly a method for generating random behavioural Verilog free of undefined values, and secondly a Verilog test case reducer used to locate the cause of the bug that was found. These are implemented in a tool called \verismith{}. This paper also provides a qualitative and quantitative analysis of the bugs found in \yosys{}, \vivado{}, \xst{} and \quartus{}. Every synthesis tool except \quartus{} was found to introduce discrepancies between the netlist and the design. In addition to that, \vivado{} and a development version of \yosys{} were found to crash when given valid input. Using \verismith{}, eleven bugs were reported to tool vendors, of which six have already been fixed.
+\end{abstract}
+
+%%
+%% The code below is generated by the tool at http://dl.acm.org/ccs.cfm.
+%% Please copy and paste the code instead of the example below.
+%%
+
+\begin{CCSXML}
+<ccs2012>
+<concept>
+<concept_id>10010583.10010682</concept_id>
+<concept_desc>Hardware~Electronic design automation</concept_desc>
+<concept_significance>500</concept_significance>
+</concept>
+<concept>
+<concept_id>10010583.10010682.10010689</concept_id>
+<concept_desc>Hardware~Hardware description languages and compilation</concept_desc>
+<concept_significance>500</concept_significance>
+</concept>
+<concept>
+<concept_id>10011007.10011074.10011099</concept_id>
+<concept_desc>Software and its engineering~Software verification and validation</concept_desc>
+<concept_significance>500</concept_significance>
+</concept>
+</ccs2012>
+\end{CCSXML}
+
+\ccsdesc[500]{Hardware~Electronic design automation}
+\ccsdesc[500]{Hardware~Hardware description languages and compilation}
+\ccsdesc[500]{Software and its engineering~Software verification and validation}
+
+%%
+%% Keywords. The author(s) should pick words that accurately describe
+%% the work being presented. Separate the keywords with commas.
+\keywords{fuzzing, logic synthesis, Verilog, test case reduction}
+
+%%
+%% This command processes the author and affiliation and title
+%% information and builds the first part of the formatted document.
+\maketitle
+
+\section{Introduction}
+
+Almost all digital computation performed in the world today relies, in one way or another, on a logic synthesis tool. Computation specified in RTL passes through a logic synthesis tool before being implemented on an FPGA or an ASIC.\@ Even designs that are expressed in higher-level languages eventually get synthesised down to RTL.\@ Computation that is executed in software is carried out on a processor whose design has also, at some point, passed through a logic synthesis tool.
+
+These tools are not only \emph{pervasive}: they are \emph{trusted}. That is, any bugs they contain undermine efforts to ensure the correctness of hardware designs. For instance, the Silver processor has been formally proven to implement its ISA correctly~\cite{loow19_verif_compil_verif_proces}, and the Kami platform enables hardware designs to be formally verified using Coq~\cite{choi17_kami}. Yet in both cases, the final hardware is only as reliable as the logic synthesis tool that produces it. That these tools are trusted is explicitly acknowledged -- Silver's correctness proof assumes that the ``toolchain taking Verilog to FPGA bitstreams is bug-free'', while Kami's guarantees hold only ``if we trust [the] compiler to preserve the semantics.'' We ask in this paper whether this trust is well placed.
+
+\begin{figure}
+\begin{minted}{verilog}
+module top (y, clk, w1);
+ output y;
+ input clk;
+ input signed [1:0] w1;
+ reg r1 = 1'b0;
+ assign y = r1;
+ always @(posedge clk)
+ if ({-1'b1 == w1}) r1 <= 1'b1;
+endmodule
+\end{minted}
+ \caption[Synthesis bug in \vivado{}.]{\vivado{} bug found automatically by \verismith{}. \vivado{} incorrectly expands \texttt{-1'b1} to \texttt{-2'b11} instead of \texttt{-2'b01}. The bug was reported and confirmed by \xilinx{}.\footnotemark{}}\label{fig:synth_bug}
+\end{figure}
+\footnotetext{\url{https://forums.xilinx.com/t5/Synthesis/Vivado-2019-1-Unsigned-bit-extension-in-if-statement/td-p/981789}}
+
+Logic synthesis tools are prone to bugs because of the complexity involved in performing the aggressive optimisations that are required to meet power consumption and timing demands. Moreover, these bugs are likely to be particularly egregious because they can be hard to detect. This is especially the case when synthesising large designs, because post-synthesis simulation or verification is often skipped, or is only performed towards the end of the development cycle, due to time constraints. Even when these bugs \emph{are} detected during post-synthesis testing, the root cause can be extremely challenging to isolate and work around~\cite{mcdonald06_logic_equiv_check_arriv_fpga_devel}. With hardware designs growing ever larger and increasingly being created by software engineers operating HLS tools, this inability to debug is becoming ever more troublesome.
+
+In this paper, we describe the design and implementation of a tool called \verismith{}~\cite{herklotz_verismith} for finding and understanding bugs in logic synthesis tools that target FPGAs. \verismith{} generates pseudo-random, valid, deterministic Verilog designs, feeds each to a synthesis tool, and uses an SMT solver or the ABC~\cite{brayton10_abc} circuit verification tool to check that the output is logically equivalent to the input. If they are not equivalent, it has found a bug. \verismith{} then iteratively reduces the Verilog design with the aim of finding the smallest (and hence most understandable) program that still triggers a bug. An example of such a bug that was found by \verismith{} is shown in Figure~\ref{fig:synth_bug}. The test case has been tweaked manually for readability, but it was found and reduced automatically by \verismith{}.
+
+\begin{table}
+ \renewcommand\tabcolsep{1mm}
+ \centering
+ \begin{tabular}{lllp{2cm}} \toprule
+ \textbf{Tool} & \textbf{Vendor} & \textbf{License} & \textbf{Versions} \\
+ \midrule
+ \xst{}~\cite{xilinx_xst_synth_overv} & \xilinx{} & Commercial & 14.7 \\
+ \vivado{}~\cite{xilinx_vivad_desig_suite} & \xilinx{} & Commercial & 2016.1, 2016.2, 2017.4, 2018.2, 2019.1
+ \\
+ \quartus{}~\cite{intel_intel_quart} & \intel{} & Commercial & 19.2 \\
+ \quartuslite{}~\cite{intel_intel_quart} & \intel{} & Commercial & 19.1 \\
+ \yosys{}~\cite{wolf_yosys_open_synth_suite} & \yosys{} & ISC License & 0.8, 0.9, 3333e00, 70d0f38 \\
+ \bottomrule
+ \end{tabular}
+ \caption{Versions of the synthesis tools that were tested.}\label{table:tool_version}
+\end{table}
+
+We ran \verismith{} on five major synthesis tools for FPGAs for a total of 18000 CPU hours, as can be seen in Table~\ref{table:tool_version}. We found two classes of bugs: Verilog designs that cause the synthesis tool to produce incorrect output, and Verilog designs that cause the synthesis tool to crash. We reported a total of 7 unique test cases that are mis-synthesised: 4 in \yosys{}, 3 in \vivado{}. We also reported 3 unique crash bugs: 1 in \yosys{} and 2 in \vivado{}. In addition, a bug was also found in \iverilog{}~\cite{williams_icarus_veril}, which is a simulator used in \verismith{} to check counterexamples returned by the equivalence check. All 11 test cases have been reported to the manufacturers; the \yosys{} and \iverilog{} bugs have all been confirmed and fixed, whereas the \vivado{} bugs have been confirmed and are awaiting a fix. Testing \quartus{} proved difficult, however, once it worked, we did not find any failing test cases, meaning it was quite stable. Failing test cases found in \xst{} were not reported, as it is no longer being actively maintained.
+
+The three main contributions of this paper are the following:
+
+\begin{itemize}
+\item We present an algorithm for generating random, valid, deterministic Verilog designs that employ a variety of combinational and behavioural constructs, shown in Section~\ref{sec:generation}.
+\item We explain how to check whether a given Verilog design triggers a bug in a synthesis tool under test in Section~\ref{sec:equivalence} and then present an algorithm for reducing Verilog designs to find the smallest program that triggers the bug in Section~\ref{sec:reducer}.
+\item Finally, in Section~\ref{sec:results}, we report the results of synthesising our generated programs using three logic synthesis tools and evaluate how our design decisions affect the ability of \verismith{} to find bugs in these tools.
+\end{itemize}
+
+%% TODO: Think about what to do with the artifacts
+\verismith{} is fully open source and can be found on GitHub.\personallink{\url{https://github.com/ymherklotz/verismith}} %All the runs that were performed are also hosted on AWS\personallink{\url{http://verifuzz-data.s3.amazonaws.com}}.
+
+\section{Overview of Verismith}\label{sec:verismith}
+
+\verismith{} is the implementation of the Verilog generation and test case reduction algorithm with the goal of finding bugs in synthesis tools. Figure~\ref{fig:diff_testing} shows the main workflow in \verismith{}. First, a random design is generated and passed to the synthesis tool, which should produce an equivalent netlist. If the synthesis tool crashes, a bug has been found and the initial design would therefore be reduced to a minimal test case that still triggers the crash. This is shown by the red dashed arrow which shortcuts an error occurring in synthesis to the reduction step. However, if synthesis completes successfully, the netlist is compared to the initial design. If they differ, the resultant design needs to be reduced as well, which is depicted by the other red dashed arrow.
+
+\verismith{} generates semantically correct and deterministic Verilog, meaning that it should always pass synthesis and the values of output wires should be uniquely determined by values of the input wires. An equivalence check can therefore be performed between the generated design and the synthesised netlist to determine if the synthesis was correct. If the netlist is shown not to be equivalent to the design, it must mean that there is a synthesis bug, as false negatives and false positives are not possible. However, there is the possibility that the SMT solver does not give an answer in time, in which case it cannot be determined if the design is equivalent to the netlist.
+
+\begin{figure}
+ \centering
+ \begin{tikzpicture}
+ \node[draw,fill=diag1,text width=2cm,align=center] (verilog) at (0,0)
+ {Verilog generation};
+ \node[draw,fill=diag2,circle,text width=1.5cm,align=center,inner sep=-3pt]
+ (verdes) at (2.5,0) {Verilog design};
+ \node[draw,fill=diag2,circle,text width=1.5cm,align=center,inner sep=-3pt]
+ (vernet) at (6.5,0) {Verilog netlist};
+ \node[draw,fill=diag2,circle,text width=1.5cm,align=center,inner sep=-3pt]
+ (vertest) at (0,-2) {Reduced test case};
+ \node[draw,fill=diag1,minimum height=1cm] (synth) at (4.5,0) {Synthesis};
+ \node[draw,fill=diag1,minimum height=1cm,text width=2cm,align=center]
+ (equiv) at (6,-2) {Equivalence check};
+ \node[draw,fill=diag1,minimum height=1cm,text width=2cm,align=center]
+ (reduce) at (2.5,-2) {Reduction};
+ \node at (4.3,-2.4) {{\color{rred} \small fail}};
+ \node at (3.8,-1.2) {{\color{rred} \small crash}};
+ \draw[thick,->] (verilog) -- (verdes);
+ \draw[thick,->] (verdes) -- (synth);
+ \draw[thick,->] (synth) -- (vernet);
+ \draw[thick,->] (verdes) -- ($ (equiv.north) + (-0.5,0) $);
+ \draw[thick,->] (vernet) -- ($ (equiv.north) + (0.5,0) $);
+ \draw[rred,thick,dashed,->] (synth.south) to [out=270,in=0] ($ (reduce.east) + (0,0.25) $);
+ \draw[thick,->] (verdes) -- ($ (reduce.north) $);
+ \draw[rred,thick,dashed,->] (equiv) to [out=180,in=0] ($ (reduce.east) + (0,-0.25) $);
+ \draw[thick,->] (reduce) -- (vertest);
+ \end{tikzpicture}
+ \caption{Overview of the testing approach used in \verismith{} by generating random Verilog. If the synthesis tool crashes or the equivalence check fails, the test case is reduced into a minimal representation, shown by the red dashed arrows.}\label{fig:diff_testing}
+\end{figure}
+
+\verismith{} was implemented in Haskell because its algebraic data types are well-suited for capturing the syntax of a language like Verilog, and its pure functions make it easier to reason about and test functions.
+
+\section{Generating Verilog}\label{sec:generation}
+
+To test the synthesis tools, valid random Verilog needs to be generated so that the synthesis tool successfully produces a netlist that can be compared to the original design.
+
+\subsection{Target language}
+
+The synthesisable subset of Verilog 2005~\cite{05_veril_regis_trans_level_synth} was chosen as the target HDL as it is widely supported. Every generated Verilog file contains a list of module definitions with an arbitrary number of inputs and parameters, and one output. The module body consists of a list of module items, which can be any of the following constructs:
+
+\begin{itemize}
+\item continuous assignment,
+\item local parameter declaration,
+\item module instantiation,
+\item always and initial block, and
+\item wire and variable declaration.
+\end{itemize}
+
+Inside always blocks and initial blocks, behavioural Verilog can then be generated, which supports the following constructs:
+
+\begin{itemize}
+\item blocking and nonblocking assignments,
+\item conditional statements, and
+\item for loops.
+\end{itemize}
+
+Finally, many different expressions are supported, such as:
+
+\begin{itemize}
+\item all synthesisable unary and binary operators,
+\item bit selection,
+\item function calls,
+\item concatenation, and
+\item ternary conditional operators.
+\end{itemize}
+
+The most notable features that are missing from this grammar subset are function and task definitions, but we expect adding them to be straightforward. In addition to that, the synthesisable subset of Verilog specifies many constructs that should be ignored by synthesis tools, so these are also not generated by \verismith{}. These are constructs that do not have a direct hardware equivalent and include delays, specify blocks or system task calls. Although initial blocks and variable initialisation are supposed to be ignored by the synthesis tool, except when modelling ROMs~\cite[section 7.7.9.1]{05_veril_regis_trans_level_synth}, both of these features are supported in all the synthesis tools that were tested for FPGAs, as these can be powered up into a known state. These are therefore used by \verismith{} to set the design in a known state at the start.
+
+\subsection{Properties of generated programs}
+
+The data types specifying the syntax strictly follow the grammar, with the result that only syntactically valid programs can be represented. However, this cannot guarantee that the programs are semantically valid as well.
+
+We define semantically valid programs as ones that should be accepted by simulators and synthesis tools without producing any errors or critical warnings. Even though random programs following the grammar will pass the parsing stage of these tools, they will most likely error out when they are processed. To ensure semantic validity, several rules have to be followed, including:
+
+\begin{itemize}
+\item module inputs have to be nets,
+\item no continuous assignments to variables or blocking/non\-blocking assignments to nets occur, and
+\item every variable that is used has to be declared.
+\end{itemize}
+% Change to what it says about determinism
+
+Moreover, the generated Verilog should be deterministic. This simplifies the equivalence checking stage, as there cannot be any false positives or false negatives. Therefore the equivalence check indicates if there is a bug or not. In addition, we argue that bugs found using purely deterministic Verilog are more severe than bugs that include undefined values, as most Verilog in production is deterministic and it is generally bad practice to write Verilog that depends on undefined values. Furthermore, undefined values might mask bugs in the synthesis tool by allowing it to optimise away large sections of the design. Therefore, other Verilog patterns have to be avoided even though they are semantically and syntactically correct. For example, some constructs that lead to nondeterministic behaviour are the following:
+
+\begin{itemize}
+\item driving a wire from two different sources,
+\item dividing by zero,
+\item passing fewer bits to a module than it expects,
+\item selecting bits that are out of range, and
+\item using a net that has not been declared previously.
+\end{itemize}
+
+\subsection{Generation algorithm}\label{sec:generation_algorithm}
+
+\begin{figure}
+ \centering
+\begin{minted}{js}
+[probability]
+ expr.binary = 5
+ expr.concatenation = 3
+ expr.number = 1
+ expr.rangeselect = 5
+ expr.signed = 5
+ expr.string = 0
+ expr.ternary = 5
+ expr.unary = 5
+ expr.unsigned = 5
+ expr.variable = 5
+ moditem.assign = 5
+ moditem.combinational = 1
+ moditem.instantiation = 1
+ moditem.sequential = 1
+ statement.blocking = 0
+ statement.conditional = 1
+ statement.forloop = 1
+ statement.nonblocking = 3
+
+[property]
+ module.depth = 2
+ module.max = 5
+ output.combine = false
+ sample.method = "random"
+ sample.size = 10
+ size = 20
+ statement.depth = 3
+\end{minted}
+ \caption{Configuration file used to tweak properties of the generated program including frequencies of constructs.}\label{fig:config}
+\end{figure}
+
+To generate Verilog that avoids these constructs, the syntax tree is built sequentially, line by line, using a context to keep track of important facts about previously generated code. This inherently prohibits combinational loops, as all the values being assigned to the current wire will already have been assigned beforehand. The context contains: (1) a list of nets and variables that are declared and assigned in the current context, (2) a list of modules that can safely be instantiated and (3) a list of parameters that are available in the module. These are used to safely create module items and make sure that they do not introduce undefined values or race conditions. When creating a new variable assignment, the nets can be safely taken from the context as these are guaranteed to have been assigned previously.
+
+The context also contains relative frequencies which are attached to each construct that can be generated. These determine how often a construct will appear in the output. We tweaked these manually using a configuration file, shown in Figure~\ref{fig:config}, to obtain a good coverage of all the features, while keeping the synthesis and equivalence checking time to a minimum. In particular, maximum statement list length and depth were heavily tweaked to reduce the nesting depth of statements, as that would increase the synthesis time and equivalence checking time exponentially. Operations like divide and modulo were removed for most of the testing, because with nets or variables containing a large number of bits, the circuits generated by the synthesis tools were too large to be efficiently optimised and checked for equivalence.
+
+The output of the Verilog generation is a Verilog file containing multiple modules. The entry point is a top-level module. For every module, a random number of inputs with random sizes are chosen and added to the context. A clock for sequential blocks and an output port are also added. Random parameters are also declared and added to the context so that they are available in any expressions inside the module. Finally a list of module items are generated.
+
+To ensure that expressions remain deterministic, extra checks are performed to ascertain that no undefined values are added to an expression. Checks can either be performed statically at generation or dynamically at runtime. For example, if bits are selected from a net, the size of the net is checked against the range of the selection statically. However, runtime checks need to be added to operations like division to check against division by zero. This is similar to the safe math wrappers that are used in an existing C fuzzer called Csmith~\cite{yang11_findin_under_bugs_c_compil} to avoid undefined behaviour like signed overflow.
+
+% \begin{enumerate}
+% \item A construct is selected using a frequency distribution from all valid constructs that could be inserted at that point. The frequencies are defined in a configuration file passed to \verismith{} when it is invoked. If needed, checks are performed to ensure that the chosen construct is valid at the current position. For example, a conditional statement cannot be generated if the maximum statement depth has been reached. Another example is that nonblocking assignment cannot be generated in a combinational block.
+% \item If a new net or variable is being defined in the construct, for example in an assignment or in a for loop, it is added to the context and declared properly at the start of the module. If the construct requires existing variables or nets to be used in an expression or as arguments to a module instantiation, they are taken from the current context.
+% \item To ensure that expressions remain deterministic, extra checks are performed to ascertain that no undefined values are added to an expression. Checks can either be performed statically at generation or dynamically at runtime. For example, if bits are selected from a variable or net, the size of the net is checked against the range of the selection statically. However, runtime checks need to be added to operations like division to check against division by zero. This is similar to the safe math wrappers that are used in an existing C fuzzer called Csmith~\cite{yang11_findin_under_bugs_c_compil} to avoid undefined behaviour like signed overflow.
+% \end{enumerate}
+
+\begin{figure}
+ \inputminted[breaklines]{verilog}{./data/example_gen.v}
+ \caption{Example module generated by \verismith{} showing the distinct sections that are produced.}\label{fig:gen_module}
+\end{figure}
+
+Once the module items have finished generating, all the internally declared variables and nets are concatenated and assigned to the output, so that any discrepancies in the internals of the module are detected by the formal verification step. An example of a generated module is shown in Figure~\ref{fig:gen_module}, which declares many variables and concatenates them to the output \texttt{y}. Figure~\ref{fig:gen_module} also shows the different sections that are created by \verismith{}. First come all the declarations of the nets and variables that are used and assigned to somewhere in the body of the module. Then follows the assignment of the internal state of the module to the output wire \texttt{y}, so that any errors in any of the assignments will be detected in the output. Finally, the main body of the module contains a list of random constructs, which were generated according to the configuration file that was passed to \verismith{}.
+
+\begin{remark}
+If the number of IO ports is limited, because the design first needs to fit onto an actual FPGA such as in \quartuslite{}, the output can be reduced to one bit by applying the XOR reduction operator. For example, the concatenation
+
+\begin{minted}[linenos=false]{verilog}
+assign y = {reg3,reg4,reg5,wire6,wire7,reg8,wire9};
+\end{minted}
+
+\noindent can be changed to
+
+\begin{minted}[linenos=false]{verilog}
+assign y = ^{reg3,reg4,reg5,wire6,wire7,reg8,wire9};
+\end{minted}
+
+\noindent This continues to hold all the necessary information to detect a single bitflip in the internal state of the module, however, synthesis and verification are much slower because of the larger circuit. We demonstrate this empirically in Section~\ref{sec:results}.
+\end{remark}
+
+% Finally, state-based Verilog generation was chosen over a simpler directed acyclic graph (DAG) generation method. The DAG method generates a random DAG which is interpreted as a circuit with random gates at every node and wires at every edge. More complicated constructs such as flip-flops could be represented by adding cycles to the graph where one of the edges would be clocked, which preserves the determinism. However, the main problem with this method is that representing behavioural Verilog constructs is not possible and it would therefore only be able to generate random netlists. The state-based Verilog generation, on the other hand, directly generates the abstract syntax tree (AST) and can therefore generate any constructs that are present in the grammar.
+
+\section{Equivalence checking}\label{sec:equivalence}
+
+The equivalence check is a crucial step in verifying that the synthesis tool behaved properly by proving that the synthesised netlist is equivalent to the original design. The equivalence check itself is performed using \yosys{}~\cite{wolf_yosys_open_synth_suite} and the ABC~\cite{brayton10_abc} back end. However, an SMT solver such as Z3~\cite{moura08_z3} can also be used as a back end to perform the equivalence check. As only deterministic Verilog is being tested, which does not contain any undefined values, the equivalence check proves that the design is equivalent to the netlist over all possible inputs.
+
+The equivalence is checked using the following property: the output wires of the randomly generated Verilog design and the synthesised netlist should always be equal at the clock edge given the same inputs. This is expressed in Verilog by instantiating both modules and asserting that the outputs are equal:
+
+\begin{minted}{systemverilog}
+module equiv( input clk, input [6:0] w0, input [10:0] w1
+ , input signed [10:0] w2, input [11:0] w3 );
+ wire [49:0] y1, y2;
+ top t1(y1, clk, w0, w1, w2, w3);
+ top_synth_netlist t2(y2, clk, w0, w1, w2, w3);
+ always @(posedge clk) assert(y1 == y2);
+endmodule
+\end{minted}
+
+\noindent where \texttt{y1} and \texttt{y2} are the outputs of the design and the netlist respectively. The Verilog is passed through \yosys{} synthesis to obtain either SMT-LIBv2~\cite{barrett17_smt_lib_stand} for an SMT solver, or a netlist for ABC.\@
+
+As this process is performed by \yosys{} itself, when testing \yosys{} synthesis there might be bugs that are not found by the equivalence check, as the same bug will be present when design is passed to the SMT solver or to ABC.\@ However, bugs can still be found in optimisations that \yosys{} only applies when it is properly synthesising the design instead of passing it to an external solver. In addition to that, if \yosys{} is tested with multiple other synthesis tools, the synthesised netlist produced by \yosys{} can be compared to the other synthesised netlist instead of the original design. Therefore, the bug in \yosys{} should not trigger anymore as it is only synthesising two netlists. Finally, a test bench can also be created for the generated design and the netlist by passing random test vectors to both top-level modules and checking that the output remains the same.
+
+After the equivalence check is performed, the checker returns a counterexample which can be added to a testbench and hence simulated, to make sure that it does indeed expose a difference between the design and the netlist.
+
+\section{Test case reduction}\label{sec:reducer}
+
+% - describe the reason it is needed
+% - describe specialised reduction algorithm
+
+Reducing an HDL is different from reducing programming languages. The time it takes to discover the presence of an error is much higher with synthesis and equivalence checking than with compilation and execution. Existing reduction methods such as delta debugging~\cite{zeller02_simpl_isolat_failur_induc_input} or hierarchical delta debugging~\cite{misherghi06_hdd} are effective at reducing failing test cases for programming languages, but rely on a quick feedback loop which tells the reducer if the current version of the test case still triggers a bug, i.e.\ that it is still interesting.
+
+\setlength{\tabcolsep}{3pt}
+
+\begin{table*}
+ \centering
+ \begin{tabular}{lrp{5mm}r@{~}rrr}
+ \toprule
+ \textbf{Tool} & \textbf{Total test cases} & \multicolumn{3}{r}{\textbf{Failing test cases}} & \textbf{Distinct failing test cases} & \textbf{Bug reports} \\
+ \midrule
+ \yosys{ 0.8} & 26400 & & 7164 & (27.1\%) & $\ge 1$ & 0 \\
+ \yosys{ 3333e00} & 51000 & & 7224 & (14.2\%) & $\ge 4$ & 3 \\
+ \yosys{ 70d0f38} (crash) & 11 & & 1 & (9.09\%) & $\ge 1$ & 1 \\
+ \yosys{ 0.9} & 26400 & & 611 & (2.31\%) & $\ge 1$ & 1 \\
+ \vivado{ 18.2} & 47992 & & 1134 & (2.36\%) & $\ge 5$ & 3 \\
+ \vivado{ 18.2} (crash) & 47992 & & 566 & (1.18\%) & 5 & 2 \\
+ \xst{ 14.7} & 47992 & & 539 & (1.12\%) & $\ge 2$ & 0 \\
+ \quartus{ 19.2} & 80300 & & 0 & (0\%) & 0 & 0 \\
+ \quartuslite{ 19.1} & 43 & & 17 & (39.5\%) & 1 & 0 \\
+ \quartuslite{ 19.1} (No \texttt{\$signed}) & 137 & & 0 & (0\%) & 0 & 0 \\
+ \midrule
+ \iverilog{ 10.3} & 26400 & & 616 & (2.33\%) & $\ge 1$ & 1 \\
+ \bottomrule
+ \end{tabular}
+ \caption{Summary of failing test cases found in each tool that was tested.}\label{table:unique_bugs}
+\end{table*}
+
+Therefore, we developed a general reduction approach similar to hierarchical delta debugging to speed up the reduction of an arbitrary Verilog design. Then, due to the structure of the random test cases, an optimisation can be added to improve the efficiency when dealing with those test cases. As the reducer is tightly coupled with the generator, the original AST can be used to analyse the source and reduce it further. However, the reducer still works in a standalone manner for the supported subset of Verilog.
+
+The main goal of the reduction algorithm is to quickly reduce the size of the program, so that it can be analysed as soon as possible and testing can be resumed. As synthesis and verification are time consuming, even for small designs, it is crucial to minimise the number of steps needed by the reduction algorithm. To achieve this, a depth-first binary search is performed on the syntax tree, with different levels of granularity. At every node, the current program is checked against the synthesis tool to check that the bug is still present.
+
+The steps of the general reduction are detailed below. Each of the steps will result in a binary choice which is explored in a greedy fashion, meaning that the first option is taken until the bug is not present anymore. The second option is only explored if the first option would eliminate the bug from the design. If the bug is not present there either, the reduction algorithm backtracks to the last version that still contains the failing test case and terminates. Each of the following steps is repeated until it cannot be applied anymore without eliminating the bug.
+
+\begin{enumerate}
+\item Half the modules, excluding the top-level module, are removed from the current Verilog file. All instantiations of modules that were removed and that are present in the leftover modules are eliminated as well. Any wires that were connected to the output ports in the module instantiations are also pruned and any references to those modules in any expressions are also removed so that no extra undefined values are added.
+\item Half of the module items are removed. For all the assignments that are removed, the declaration of the variable or net that was being assigned is also removed together with any uses of the variable or net in any expressions in that module.
+\item The same is done for all the statements inside the always blocks. Half of the assignments in each always block are removed. If a conditional statement is encountered, it is reduced by picking one of the branches, and choosing the other if the bug is not present anymore.
+\item Finally, expressions are simplified and reduced to narrow down on the bug. Concatenations are split into two, and binary operators are removed and replaced by their LHS and RHS.\@
+\end{enumerate}
+
+By reducing the Verilog at different levels of granularity, as much code as possible is removed at every step. As a binary choice is made at every step, the reduction will converge to a result, which may, however, not be optimal.
+
+An optimisation can be carried out if the test case was generated using \verismith{}, because all the internal variables and nets are concatenated and added to the only output. The binary search can then be performed only on the concatenation, while deleting all references to variables or nets that are removed from the concatenation. Once the wire in question is found, the standard reduction algorithm can attempt to reduce it further. However, normally only one assignment is left which can consequently be identified manually.
+
+This optimisation only helps if the test case is processed sensibly by the synthesis tool, where the netlist is produced but is not equivalent to the input. It may fail to reduce the test cases properly when the synthesis tool crashes, as it only operates on the output of the module, which may not be the cause of the crash.
+
+\begin{remark}
+Another optimisation that could be performed to increase the speed of the reduction is to use the counterexample provided by the equivalence checker in iterations of the reducer using simulation, instead of rerunning the equivalence check at every iteration.
+\end{remark}
+
+\section{Evaluation}\label{sec:results}
+
+\verismith{} was run for 18000 CPU hours, testing the following synthesis tools: \vivado{}~\cite{xilinx_vivad_desig_suite}, \xst{}~\cite{xilinx_xst_synth_overv}, \quartus{}~\cite{intel_intel_quart}, \quartuslite{}~\cite{intel_intel_quart}, and \yosys{}~\cite{wolf_yosys_open_synth_suite}. Our experiments were designed to answer five questions. First, how many bugs can we detect in various synthesis tools? Second, how does increasing the size of the generated Verilog designs affect the efficiency of our testing approach? Third, what is the effect of XOR-ing all the outputs of a design into a single wire? Fourth, how does the stability of synthesis tools change with each new release? Finally, how does our custom Verilog test case reducer fare against an existing delta-debugging tool called C-Reduce~\cite{regehr12_test_reduc_c_compil_bugs}?
+
+\begin{remark}
+ Many problems were encountered when testing \quartus{}. The lack of documentation about the d-flip-flop used by \quartus{} required a lot of trial and error to get it working properly. In addition to that, optimisations in \quartus{}, such as multiply-accumulate, had to be disabled as these would use hardware of the specific FPGA that was targeted, therefore using encrypted modules. Finally, to be able to generate a Verilog netlist using \quartuslite{}, the design had to be first fitted on a real FPGA, which meant that virtual pins had to be used to fit all the IO ports, or the output had to be combined into one bit.
+\end{remark}
+
+\subsection{How many bugs were found?}
+
+Table~\ref{table:unique_bugs} presents the breakdown of all the bugs found in the synthesis tools. These tools were tested separately and were therefore given different test cases. The only tools where we observed any crashes were \vivado{} and \yosys{}. Crashes in \vivado{} are therefore shown in a separate row. The crash found in \yosys{} was found when briefly testing a different development version of \yosys{ (commit hash 70d0f38)}. All the other rows of the table refer only to test cases that mis-synthesise. The only tool where all test cases succeeded was \quartus{}, even after ramping up the number of test cases to over 80,000. In a surprising contrast, we found the highest percentage of failures in its sister tool, \quartuslite{}. We only ran a small number of test cases many were failing. Upon inspection, we found that these failures could all be traced back to the \texttt{\$signed} function, which converts an expression to signed and sign extends it if necessary. When we disabled this construction in our random generator, we found no further failures. Alongside the various Verilog synthesis tools, we also tested a Verilog simulator called \iverilog{}, which was used to check the counter examples returned by the equivalence checker. This revealed one bug in the simulator, which was reported and fixed.
+
+A test case failure was identified as being unique if one minimal test case could not be reduced into a different minimal test case. This often required manual intervention to go from the automatically reduced test case to the minimal test case that could be compared to the bugs that had already been identified. One caveat regarding identifying unique mis-synthesis bugs has to be noted, because there may be one bug in the synthesis tool that is identified multiple times with different unique minimal test cases. For the open source synthesis tools, this can be verified by following the bug report, however, for commercial synthesis tools, this cannot be checked. Unique crashes were easier to identify, as the tools dump a stack trace that shows the exact position where the crash occurred. Therefore, crashes at different positions could be identified as being unique.
+
+Only the failing test cases in \yosys{} can be analysed properly, as the other failing test cases have either not been fixed, or the fix itself has not been disclosed. \yosys{} was tested using three different versions, the stable version of \yosys{ 0.8} before any of our bug fixes were integrated, the master branch of \yosys{ (commit hash 3333e00)} as it was being developed, just before our bug fixes were introduced and finally the most recent stable release which is \yosys{ 0.9}. The master branch of \yosys{} was tested to assist the current development of Yosys and be able to report bugs before they affect users.
+
+All the bugs mentioned were reported and confirmed by the tool maintainers and vendors. Most of the \yosys{} bugs were fixed within the day, whereas \xilinx{} confirmed the bug and intend to ``fix this issue in future releases''.\bugtracker{https://forums.xilinx.com/t5/Synthesis/Vivado-2019-1-Bit-selection-synthesis-mismatch/m-p/982632\#M31484} The following subsections show examples of bugs that were found.
+
+\subsubsection[\yosys{} peephole
+ optimisation]{\yosys{} peephole
+ optimisation.\bugtracker{\url{https://github.com/YosysHQ/yosys/issues/1047}}}
+
+An example of a bug in \yosys{} is in the peephole optimisation pass as shown below. A peephole optimisation is the replacement of a specific sequence of instructions with a more efficient but equivalent sequence of instructions.
+
+\begin{minted}[]{verilog}
+module top (y, w);
+ output y;
+ input [2:0] w;
+ assign y = 1'b1 >> (w * (3'b110));
+endmodule
+\end{minted}
+
+The piece of code above was identified for a peephole optimisation which optimised the multiply and shift operations where one of the operands in the multiply is constant. However, the code above was optimised in a way that did not truncate the result of the multiplication, meaning that if the input is \texttt{w = 3'b100}, \texttt{y} would be set to 0 because the shift amount would be set to \texttt{6'b011000} instead of the correct value \texttt{3'b000}. Therefore, the correct output of the module should be 1 when \texttt{w} is set to \texttt{3'b100}.
+
+\subsubsection[\yosys{} peephole crash]{\yosys{} peephole crash.\bugtracker{\url{https://github.com/YosysHQ/yosys/issues/993}}}
+
+A crash was also found in the peephole optimisation, which is shown in the code below.
+
+\begin{minted}[]{verilog}
+module top(y, clk, wire1);
+ output [1:0] y;
+ input clk;
+ input [1:0] wire1;
+ reg [1:0] reg1 = 0, reg2 = 0;
+ assign y = reg2;
+ always @(posedge clk) reg1 <= wire1 == 1;
+ always @(posedge clk) reg2 <= 1 >> reg1[1:1];
+endmodule
+\end{minted}
+
+It will shift 1 to the right by one bit if the second bit in \texttt{reg1} is set. However, the code performing the optimisation did not check the vector’s length before attempting to access the last element in the vector. This therefore led to the code crashing because it tried to index an element outside of the vector.
+
+\subsubsection[\vivado{} bug]{\vivado{}
+ bug.\bugtracker{\url{https://forums.xilinx.com/t5/Synthesis/Vivado-2019-1-Bit-selection-synthesis-mismatch/m-p/982632\#M31484}}}
+
+Another bug was found which ignored the bit selection. The code sample for that bug is slightly more complex.
+\vspace{1.5em}
+
+\begin{minted}{verilog}
+module top (y, clk, w0);
+ output [1:0] y;
+ input clk;
+ input [1:0] w0;
+ reg [2:0] r1 = 3'b0;
+ reg [1:0] r0 = 2'b0;
+ assign y = r1;
+ always @(posedge clk) begin
+ r0 <= 1'b1;
+ if (r0) r1 <= r0 ? w0[0:0] : 1'b0;
+ else r1 <= 3'b1;
+ end
+endmodule
+\end{minted}
+
+For an input of \texttt{w0 = 2b'10} for two clock cycles, the final output should be \texttt{2'd0}, because the if statement is entered on the second clock cycle and the LSB of \texttt{w0} is assigned to \texttt{r1}, which is \texttt{1'b0}. However, with \vivado{} the output is \texttt{2'10} instead, meaning \vivado{} does not truncate the value of the input to the LSB in \texttt{w0[0:0]}.
+
+\subsection{How does program size affect efficiency?}
+
+\begin{figure*}
+ \centering
+ \begin{subfigure}{0.45\textwidth}
+ \begin{tikzpicture}
+ \begin{semilogxaxis}[width=\linewidth,
+ major x tick style=transparent,
+ xlabel=Average lines of code in generated programs,
+ legend style={at={(0.5,-0.15)},anchor=north,legend columns=-1},
+ ylabel=Number of test cases,
+ legend pos=north east,
+ legend style={font=\scriptsize},
+ xmin=50,
+ xmax=8800,
+ ybar=-3.6pt,
+ bar width=3.6pt,
+ ymin=0
+ % nodes near coords,
+ % nodes near coords align={vertical}
+ ]
+ \addplot[style={distr1,fill=distr1,mark=none,fill opacity=0.5,draw opacity=0}] coordinates {
+ (50.0,36) (55.2273245010972,42) (61.0011474309897,113) (67.3786032822108,210) (74.422799757947,341) (82.2034422502463,458) (90.7975236052311,501) (100.290086000843,507) (110.77506247623,353) (122.356206440081,241) (135.148118355792,115) (149.27737976296,39) (164.88380585685,11) (182.121829020643,3) (201.162027001128,0) (222.192810849795,0) (245.422289332251,0) (271.080328255088,0) (299.420825088154,0) (330.724221390595,0) (365.300277902221,0) (403.491139760939,0) (445.674722177899,0) (492.268450073103,0) (543.733388676789,0) (600.578805970684,0) (663.36721211649,0) (732.71992573891,0) (809.323222144053,0) (893.935124312463,0) (987.392903866661,0) (1090.6213662385,0) (1204.64200202167,0) (1330.58309506604,0) (1469.69088733773,0) (1623.34191102612,0) (1793.05660992942,0) (1980.51438490818,0) (2187.5702122883,0) (2416.2729996596,0) (2668.88586070881,0) (2947.90850971511,0) (3256.10199731164,0) (3596.51603228401,0) (3972.51915976695,0) (4387.83209446551,0) (4846.56453874751,0) (5353.25584993839,0) (5912.91995923888,0) (6531.09498675799,0) (7213.89804362345,0) (7968.08576346046,0) (8801.12116222408,0)
+ };
+ \addplot[style={distr2,fill=distr2,mark=none,fill opacity=0.5,draw opacity=0}] coordinates {
+ (50.0,0) (55.2273245010972,0) (61.0011474309897,1) (67.3786032822108,2) (74.422799757947,1) (82.2034422502463,6) (90.7975236052311,12) (100.290086000843,29) (110.77506247623,52) (122.356206440081,99) (135.148118355792,128) (149.27737976296,191) (164.88380585685,219) (182.121829020643,323) (201.162027001128,355) (222.192810849795,294) (245.422289332251,209) (271.080328255088,137) (299.420825088154,71) (330.724221390595,28) (365.300277902221,14) (403.491139760939,2) (445.674722177899,1) (492.268450073103,0) (543.733388676789,0) (600.578805970684,0) (663.36721211649,0) (732.71992573891,0) (809.323222144053,0) (893.935124312463,0) (987.392903866661,0) (1090.6213662385,0) (1204.64200202167,0) (1330.58309506604,0) (1469.69088733773,0) (1623.34191102612,0) (1793.05660992942,0) (1980.51438490818,0) (2187.5702122883,0) (2416.2729996596,0) (2668.88586070881,0) (2947.90850971511,0) (3256.10199731164,0) (3596.51603228401,0) (3972.51915976695,0) (4387.83209446551,0) (4846.56453874751,0) (5353.25584993839,0) (5912.91995923888,0) (6531.09498675799,0) (7213.89804362345,0) (7968.08576346046,0) (8801.12116222408,0)
+ };
+ \addplot[style={distr3,fill=distr3,mark=none,fill opacity=0.5,draw opacity=0}] coordinates {
+ (50.0,0) (55.2273245010972,0) (61.0011474309897,0) (67.3786032822108,0) (74.422799757947,0) (82.2034422502463,0) (90.7975236052311,0) (100.290086000843,0) (110.77506247623,0) (122.356206440081,0) (135.148118355792,0) (149.27737976296,0) (164.88380585685,0) (182.121829020643,0) (201.162027001128,0) (222.192810849795,1) (245.422289332251,0) (271.080328255088,3) (299.420825088154,7) (330.724221390595,9) (365.300277902221,12) (403.491139760939,32) (445.674722177899,46) (492.268450073103,74) (543.733388676789,93) (600.578805970684,129) (663.36721211649,166) (732.71992573891,186) (809.323222144053,171) (893.935124312463,116) (987.392903866661,58) (1090.6213662385,43) (1204.64200202167,16) (1330.58309506604,2) (1469.69088733773,1) (1623.34191102612,0) (1793.05660992942,0) (1980.51438490818,0) (2187.5702122883,0) (2416.2729996596,0) (2668.88586070881,0) (2947.90850971511,0) (3256.10199731164,0) (3596.51603228401,0) (3972.51915976695,0) (4387.83209446551,0) (4846.56453874751,0) (5353.25584993839,0) (5912.91995923888,0) (6531.09498675799,0) (7213.89804362345,0) (7968.08576346046,0) (8801.12116222408,0)
+ };
+ \addplot[style={distr4,fill=distr4,mark=none,fill opacity=0.5,draw opacity=0}] coordinates {
+ (50.0,0) (55.2273245010972,0) (61.0011474309897,0) (67.3786032822108,0) (74.422799757947,0) (82.2034422502463,0) (90.7975236052311,0) (100.290086000843,0) (110.77506247623,0) (122.356206440081,0) (135.148118355792,0) (149.27737976296,0) (164.88380585685,0) (182.121829020643,0) (201.162027001128,0) (222.192810849795,0) (245.422289332251,0) (271.080328255088,0) (299.420825088154,0) (330.724221390595,0) (365.300277902221,0) (403.491139760939,0) (445.674722177899,0) (492.268450073103,2) (543.733388676789,2) (600.578805970684,6) (663.36721211649,12) (732.71992573891,14) (809.323222144053,30) (893.935124312463,56) (987.392903866661,65) (1090.6213662385,84) (1204.64200202167,103) (1330.58309506604,123) (1469.69088733773,109) (1623.34191102612,66) (1793.05660992942,45) (1980.51438490818,18) (2187.5702122883,10) (2416.2729996596,1) (2668.88586070881,0) (2947.90850971511,0) (3256.10199731164,0) (3596.51603228401,0) (3972.51915976695,0) (4387.83209446551,0) (4846.56453874751,0) (5353.25584993839,0) (5912.91995923888,0) (6531.09498675799,0) (7213.89804362345,0) (7968.08576346046,0) (8801.12116222408,0)
+ };
+ \addplot[style={distr5,fill=distr5,mark=none,fill opacity=0.5,draw opacity=0}] coordinates {
+ (50.0,0) (55.2273245010972,0) (61.0011474309897,0) (67.3786032822108,0) (74.422799757947,0) (82.2034422502463,0) (90.7975236052311,0) (100.290086000843,0) (110.77506247623,0) (122.356206440081,0) (135.148118355792,0) (149.27737976296,0) (164.88380585685,0) (182.121829020643,0) (201.162027001128,0) (222.192810849795,0) (245.422289332251,0) (271.080328255088,0) (299.420825088154,0) (330.724221390595,0) (365.300277902221,0) (403.491139760939,0) (445.674722177899,0) (492.268450073103,0) (543.733388676789,0) (600.578805970684,0) (663.36721211649,2) (732.71992573891,0) (809.323222144053,2) (893.935124312463,14) (987.392903866661,16) (1090.6213662385,29) (1204.64200202167,50) (1330.58309506604,76) (1469.69088733773,83) (1623.34191102612,99) (1793.05660992942,99) (1980.51438490818,81) (2187.5702122883,49) (2416.2729996596,35) (2668.88586070881,16) (2947.90850971511,3) (3256.10199731164,2) (3596.51603228401,1) (3972.51915976695,1) (4387.83209446551,0) (4846.56453874751,0) (5353.25584993839,0) (5912.91995923888,0) (6531.09498675799,0) (7213.89804362345,0) (7968.08576346046,0) (8801.12116222408,0)
+ };
+ \addplot[style={distr6,fill=distr6,mark=none,fill opacity=0.5,draw opacity=0}] coordinates {
+ (50.0,0) (55.2273245010972,0) (61.0011474309897,0) (67.3786032822108,0) (74.422799757947,0) (82.2034422502463,0) (90.7975236052311,0) (100.290086000843,0) (110.77506247623,0) (122.356206440081,0) (135.148118355792,0) (149.27737976296,0) (164.88380585685,0) (182.121829020643,0) (201.162027001128,0) (222.192810849795,0) (245.422289332251,0) (271.080328255088,0) (299.420825088154,0) (330.724221390595,0) (365.300277902221,0) (403.491139760939,0) (445.674722177899,0) (492.268450073103,0) (543.733388676789,0) (600.578805970684,0) (663.36721211649,0) (732.71992573891,0) (809.323222144053,0) (893.935124312463,0) (987.392903866661,0) (1090.6213662385,2) (1204.64200202167,2) (1330.58309506604,1) (1469.69088733773,2) (1623.34191102612,4) (1793.05660992942,15) (1980.51438490818,16) (2187.5702122883,28) (2416.2729996596,49) (2668.88586070881,58) (2947.90850971511,66) (3256.10199731164,50) (3596.51603228401,59) (3972.51915976695,37) (4387.83209446551,15) (4846.56453874751,7) (5353.25584993839,1) (5912.91995923888,0) (6531.09498675799,0) (7213.89804362345,0) (7968.08576346046,0) (8801.12116222408,0)
+ };
+ \addplot[style={distr7,fill=distr7,mark=none,fill opacity=0.5,draw opacity=0}] coordinates {
+ (50.0,0) (55.2273245010972,0) (61.0011474309897,0) (67.3786032822108,0) (74.422799757947,0) (82.2034422502463,0) (90.7975236052311,0) (100.290086000843,0) (110.77506247623,0) (122.356206440081,0) (135.148118355792,0) (149.27737976296,0) (164.88380585685,0) (182.121829020643,0) (201.162027001128,0) (222.192810849795,0) (245.422289332251,0) (271.080328255088,0) (299.420825088154,0) (330.724221390595,0) (365.300277902221,0) (403.491139760939,0) (445.674722177899,0) (492.268450073103,0) (543.733388676789,0) (600.578805970684,0) (663.36721211649,0) (732.71992573891,0) (809.323222144053,0) (893.935124312463,0) (987.392903866661,1) (1090.6213662385,0) (1204.64200202167,0) (1330.58309506604,0) (1469.69088733773,0) (1623.34191102612,4) (1793.05660992942,4) (1980.51438490818,7) (2187.5702122883,12) (2416.2729996596,23) (2668.88586070881,41) (2947.90850971511,36) (3256.10199731164,51) (3596.51603228401,65) (3972.51915976695,43) (4387.83209446551,37) (4846.56453874751,24) (5353.25584993839,10) (5912.91995923888,3) (6531.09498675799,0) (7213.89804362345,0) (7968.08576346046,0) (8801.12116222408,0)
+ };
+ \addplot[style={distr8,fill=distr8,mark=none,fill opacity=0.5,draw opacity=0}] coordinates {
+ (50.0,0) (55.2273245010972,0) (61.0011474309897,0) (67.3786032822108,0) (74.422799757947,0) (82.2034422502463,0) (90.7975236052311,0) (100.290086000843,0) (110.77506247623,0) (122.356206440081,0) (135.148118355792,0) (149.27737976296,0) (164.88380585685,0) (182.121829020643,0) (201.162027001128,0) (222.192810849795,0) (245.422289332251,0) (271.080328255088,0) (299.420825088154,0) (330.724221390595,0) (365.300277902221,0) (403.491139760939,0) (445.674722177899,0) (492.268450073103,0) (543.733388676789,0) (600.578805970684,0) (663.36721211649,0) (732.71992573891,0) (809.323222144053,0) (893.935124312463,0) (987.392903866661,0) (1090.6213662385,0) (1204.64200202167,0) (1330.58309506604,0) (1469.69088733773,0) (1623.34191102612,0) (1793.05660992942,1) (1980.51438490818,4) (2187.5702122883,0) (2416.2729996596,2) (2668.88586070881,5) (2947.90850971511,8) (3256.10199731164,16) (3596.51603228401,24) (3972.51915976695,24) (4387.83209446551,28) (4846.56453874751,32) (5353.25584993839,25) (5912.91995923888,24) (6531.09498675799,8) (7213.89804362345,2) (7968.08576346046,1) (8801.12116222408,0)
+ };
+ \node at (axis cs: 100,530) {10};
+ \node at (axis cs: 200,380) {15};
+ \node at (axis cs: 750,210) {20};
+ \node at (axis cs:1300,150) {21};
+ \node at (axis cs:2000,125) {26};
+ \node at (axis cs:3000, 90) {27};
+ \node at (axis cs:4000, 90) {30};
+ \node at (axis cs:6000, 50) {35};
+ \end{semilogxaxis}
+ \end{tikzpicture}
+ \caption{Distribution of test case sizes in each experiment.}\label{fig:size_bugs_distr}
+ \end{subfigure}%
+ \hfill
+ \begin{subfigure}{0.45\textwidth}
+ \centering
+ \begin{tikzpicture}
+ \begin{axis}[width=\linewidth,
+ major x tick style=transparent,
+ symbolic x coords={91,181,438,792,929,1700,2110,4230},
+ xlabel=Average lines of code in generated programs,
+ ylabel=Number of test cases,
+ clip=false,
+ legend pos=north east,
+ legend style={font=\scriptsize},
+ xtick=data,
+ every axis x label/.style={at={($(ticklabel cs:0.6) + (0,-0.02)$)},anchor=near ticklabel,},
+ ybar=0,
+ bar width=9pt,
+ ymin=0,
+ % nodes near coords,
+ % nodes near coords align={vertical}
+ ]
+ \fill[distr1!50] (axis cs:91,-15) circle (3pt);
+ \fill[distr2!50] (axis cs:181,-15) circle (3pt);
+ \fill[distr3!50] (axis cs:438,-15) circle (3pt);
+ \fill[distr4!50] (axis cs:792,-15) circle (3pt);
+ \fill[distr5!50] (axis cs:929,-15) circle (3pt);
+ \fill[distr6!50] (axis cs:1700,-15) circle (3pt);
+ \fill[distr7!50] (axis cs:2110,-15) circle (3pt);
+ \fill[distr8!50] (axis cs:4230,-15) circle (3pt);
+ \addplot[style={black,fill=black!70,mark=none}] coordinates {
+ (91,122) (181,87) (438,63) (792,56) (929,43)
+ (1700,14) (2110,10) (4230,7)
+ };
+ \addplot[style={black,fill=white,mark=none}] coordinates {
+ (91,0) (181,2) (438,4) (792,12) (929,10)
+ (1700,8) (2110,12) (4230,17)
+ };
+ \legend{Bugs found,Crashes found};
+ \end{axis}
+ \end{tikzpicture}
+ \caption{Efficiency of various sizes at finding failing test cases.}\label{fig:size_bugs_found}
+ \end{subfigure}
+ \caption{How the bug-finding efficiency varies with generated program size.}
+\end{figure*}
+
+The efficiency of generating different sizes of Verilog code was also analysed to identify the optimal size that finds the most failing test cases. This was measured by conducting eight separate experiments, each with Verismith configured to generate programs of a different size, and each experiment given 48 hours to find as many bugs as possible.
+
+Figure~\ref{fig:size_bugs_distr} shows how the distribution of test case sizes is affected by the {\tt size} parameter given to Verismith. Each of the eight distributions in the figure is labelled with the value of the {\tt size} parameter that generated it. As the {\tt size} parameter becomes larger, we observe that it becomes harder to control the test case size (hence the more spread out distributions) -- this is because of the inherent randomness in the generation algorithm.
+
+Figure 5b compares the eight experiments by how many test case failures they found. The average test case size in each experiment is displayed along the x-axis. We see that shorter programs are more effective at triggering mis-synthesis bugs, and longer programs are more effective at triggering crash bugs. Therefore, generating programs that have a size of around 700 lines of code might be optimal to find the largest variety of bugs.
+
+Larger inputs should find more failing test cases, as more combinations are tried that might trigger a bug in the synthesis tool. The designs also become much more complex as the size of the Verilog increases. However, it is more efficient to run multiple small random Verilog modules instead of large ones, because in the same amount of time, many more failings test cases are found. The run time of the synthesis and the equivalence checking is the limiting factor, as both of these increase exponentially with the size of the input. On the other hand, the number of crashes still increases with the size of the input. This is because a crash normally occurs at the start of the synthesis process, which means that the complexity of the input does not affect the time taken to discover the crash. Larger inputs will therefore have a greater chance of crashing the synthesis tool.
+
+Thus, it seems that it is more useful to generate small Verilog modules which will synthesise and pass equivalence checking as fast as possible. However, solely generating programs of the smallest size might only result in finding the same bug repeatedly. Instead, it is better to generate Verilog designs at around 700 lines of code so that a larger variety of inputs can be created.
+
+\subsection{What is the effect of XOR-ing the outputs?}
+
+\begin{figure}
+ \centering
+ \begin{tikzpicture}
+ \begin{groupplot}[%
+ group style = {group size = 2 by 1, horizontal sep=3mm, ylabels at=edge left, yticklabels at=edge left},
+ width=50mm,
+ height=40mm,
+ ylabel=Time taken (\si{\second}),
+ xmin=0,
+ ymin=0,
+ xmax=3500,
+ xtick distance=1000,
+ ymax=1000,
+ ]
+ \nextgroupplot
+ \addplot[only marks,uncombined,draw=uncombined,fill opacity=0.3,draw opacity=0,mark=*]
+ table[x=Size,y=Equivalence check time,col sep=comma]
+ {data/length_no_combine_out_downscale.csv};
+ \nextgroupplot[xlabel={Lines of code in the test case}, xlabel style={xshift=-20mm}]
+ \addplot[only marks,combined,draw=combined,fill opacity=0.3,draw opacity=0,mark=*]
+ table[x=Size,y=Equivalence check time,col sep=comma] {data/length.csv};
+ \end{groupplot}
+ \end{tikzpicture}
+\caption{Synthesis and equivalence checking time as program size increases for test cases. Left: output combined using concatenation. Right: output combined to one bit using unary XOR operator.}\label{fig:synth_ec_time_all}
+\end{figure}
+
+Figure~\ref{fig:synth_ec_time_all} compares concatenating the output to combining the output into one bit, as was mentioned in Section~\ref{sec:generation_algorithm}, by comparing the time taken to perform the equivalence check. Synthesis time is not displayed, because it did not change when the output was combined into one bit or not, and scaled exponentially with size in both cases. Equivalence checking is the limiting factor when performing the random testing, because it scales exponentially but can also take much longer depending on the test case. The horizontal line of points at the very top are the test cases that timed out at 900 seconds. The graph on the left shows that equivalence checking time mostly scales exponentially with the size of the test case, with around 5\% of test cases failing. However, when the output is combined into one bit, which is shown by the graph on the right, the equivalence checking time scales much worse as the lines of code of the test cases increase, with around 29\% of test cases failing overall. The time taken increases in a nearly vertical line, meaning even small test cases timeout most of the time. The reason for this is that the circuit generated by the unary XOR operator takes a long time to verify, as all possible paths are explored.
+
+Reducing the output to one bit increases the time to perform the equivalence check dramatically, making it impossible to generate programs of more than 500 lines and check for bugs that were introduced. Therefore, the output should not be combined unless it is absolutely necessary.
+
+\subsection{How stable are synthesis tools?}
+
+By fuzzing different versions of synthesis tools, the general stability of the tools can be observed. One might expect newer versions of the tool either to have fewer bugs, as they are reported and fixed, or to have more bugs, as new features are added. In total, 837 test cases were run through the four different versions of \vivado{}, however, 134 test cases timed out and were therefore disregarded. Figure~\ref{fig:vivado_over_time} shows how many test cases produced failures in each version of \vivado{}. Each horizontal ribbon represents a group of test cases that produced failures in the same tools and the larger the ribbon, the more test cases followed the same trajectory.
+
+Figure~\ref{fig:vivado_over_time} shows that \vivado{} 2016.1 and 2016.2 have exactly the same test case failures. From 2016.2 to 2017.4, the bugs originating from one group of test cases were fixed, but two different groups of test cases starts to fail. The total number of failing test cases is also higher in 2017.4 than in previous versions. Finally, two groups of test cases are fixed for version 2018.2, but another group of test cases start to fail, which is the largest proportion of test cases in the diagram. There is one group that stays constant in all the versions of \vivado{} comprising 15 test cases, which are likely due to failures that have not been found or reported yet.
+
+\begin{figure}
+ \centering
+ \resizebox{0.45\textwidth}{!}{
+ \begin{tikzpicture}
+ \fill[fill=ribbon1] (-0.5,4.2) -- (7,4.2) -- (7.5,3.6) -- (7,3) -- (-0.5,3) --
+ (-0.2,3.6) -- cycle;
+ \fill[fill=ribbon2] (-0.5,2.2) -- (2.4,2.2) to [out=0,in=180] (4.4,2.9) --
+ (4.6,2.9) to [out=0,in=180] (6.6,3) -- (7,3) -- (7.4,2.55) -- (7,2.1) --
+ (6.6,2.1) to [out=180,in=0] (4.6,2) -- (4.4,2) to [out=180,in=0] (2.4,1.3) --
+ (-0.5,1.3) -- (-0.2,1.75) -- cycle;
+ \fill[fill=ribbon3] (-0.5,2.9) -- (2.4,2.9) to [out=0,in=180] (6.6,0.4) --
+ (7,0.4) -- (7.3,0.2) -- (7,0) -- (6.6,0) to [out=180,in=0] (2.4,2.5) --
+ (-0.5,2.5) -- (-0.2,2.7) -- cycle;
+ \fill[fill=ribbon4] (-0.5,1.2) -- (3,1.2) to [out=0,in=180] (6.6,2.1)
+ -- (7,2.1) -- (7.5,1.5) -- (7,0.9)
+ -- (6.6,0.9) to [out=180,in=0] (3,0) -- (-0.5,0) -- (-0.1,0.6) -- cycle;
+ \fill[fill=ribbon5] (-0.5,3) -- (4.6,3) to [out=0,in=180] (6.6,0.5) --
+ (7,0.5) -- (7.1,0.45) -- (7,0.4) -- (6.6,0.4) to [out=180,in=0] (4.6,2.9) --
+ (-0.5,2.9) -- (-0.4,2.95) -- cycle;
+ \fill[fill=ribbon6] (-0.5,1.3) -- (2.4,1.3) to [out=0,in=180] (4.4,2) -- (4.6,2) to
+ [out=0,in=180] (6.6,0) -- (7,0) -- (7.1,-0.05) -- (7,-0.1) -- (6.6,-0.1) to
+ [out=180,in=0] (4.6,1.9) -- (4.4,1.9) to [out=180,in=0] (2.4,1.2) --
+ (-0.5,1.2) -- (-0.5,1.25) -- cycle;
+ \filldraw[fill=white] (-0.1,2.5) rectangle (0.3,4.2);
+ \filldraw[fill=white] (2.1,2.5) rectangle (2.5,4.2);
+ \filldraw[fill=white] (4.3,1.9) rectangle (4.7,4.2);
+ \filldraw[fill=white] (6.5,0.9) rectangle (6.9,4.2);
+ \node at (0.1,4.6) {2016.1};
+ \node at (2.3,4.6) {2016.2};
+ \node at (4.5,4.6) {2017.4};
+ \node at (6.7,4.6) {2018.2};
+ \node at (1.1,0.6) {17};
+ \node at (1.1,3.6) {15};
+ \node at (1.1,1.75) {11};
+ \node at (1.1,2.7) {6};
+ \node at (0.1,2.7) {22};
+ \node at (2.3,2.7) {22};
+ \node at (4.5,2.1) {28};
+ \node at (6.7,1.1) {43};
+ \node at (3.4,5) {Vivado version};
+ \end{tikzpicture}}
+ \caption{Tracking the same set of test cases across four versions of Vivado. The white rectangles indicate the total number of failing test cases per version. Test cases that fail in the same versions are grouped into a ribbon, and each ribbon is labelled with the number of test cases it contains. The interleaving of ribbons shows how bugs may have been introduced or fixed in each version.}\label{fig:vivado_over_time}
+\end{figure}
+
+\subsection{How effective is our reducer?}
+
+To test the efficiency of the test case reducer that was implemented in \verismith{}, it was compared against an existing test case reducer for C/C++, called C-Reduce~\cite{regehr12_test_reduc_c_compil_bugs}. C-Reduce is a general reducer containing various passes that perform different reduction algorithms. As it is tailored to reduce C-like languages, C-Reduce is much less effective at reducing unknown languages, because it cannot analyse and perform reductions on the AST.\@ However, it can still apply other passes which are independent of the input language.
+
+C-Reduce has a notion of test case validity and checks for undefined and unspecified behaviour when reducing C so that it can be avoided. This is necessary, as the reducer might otherwise discard the original bug and reduce the undefined behaviour instead. To be able to compare C-Reduce to \verismith{}, it requires a similar notion of how to avoid undefined behaviour when reducing Verilog. We added a few context-free heuristics to the script that check if the test case is still \emph{interesting}, i.e.\ that the bug is still present. The heuristics are the following:
+
+\begin{enumerate}
+\item Check that it can be parsed by \verismith{}, to guarantee that the test case is still in the supported subset of Verilog and is syntactically valid.
+\item Apply context-free heuristics, such as requiring all registers to be initialised.
+\item Check that the synthesis tool does not output any warning to catch any other errors that may have been introduced.
+\end{enumerate}
+
+C-Reduce was tested against our implementation of the reduction algorithm using 30 randomly selected test cases that fail in Yosys. C-Reduce was run with a default configuration and all the C/C++ passes turned off. As per the default, C-Reduce was run in parallel on four cores. Verismith, being a single-threaded design, ran on only one core. Figure~\ref{fig:reducer_comparison} shows the results of the comparison, differentiating between crashes and mis-synthesis bugs. Six out of the 30 test cases were reduced to contain only undefined behaviour using C-Reduce and discarded the original cause of the discrepancy between the netlist and the design. This was often because inputs to module instantiations were removed, which led to undefined values in those inputs. To mitigate this, context-sensitive heuristics would be needed, to make sure the right amount of inputs is present in a module instantiation. In addition to that, because C-Reduce does not know the Verilog syntax, most of the minimal test cases were unreadable and were therefore passed through Verismith to compare the final sizes properly. Figure~\ref{fig:reducer_comparison} allows us to draw the following conclusions:
+
+\begin{figure}
+ \centering
+ \begin{tikzpicture}
+ \begin{loglogaxis}[
+ width=0.95\linewidth,
+ legend style={nodes={scale=0.7, transform shape}},
+ legend pos=south east,
+ xlabel=Final size of reduced test case (lines of code),
+ ylabel=Time taken for reduction (s),
+ xticklabel style={
+ /pgf/number format/fixed,
+ /pgf/number format/precision=2
+ },
+ scaled x ticks=false,
+ grid=major,
+ major grid style={line width=.2pt,draw=black!20},
+ legend columns=2,
+ legend cell align=left,
+ ymin=0.4
+ ]
+ \addplot[only marks, verismith missynth]
+ coordinates {
+ (8,24.228676396) (12,48.020800025) (9,239.19471845) (19,78.85903502) (11,73.373059156) (265,396.931663908) (9,28.596337771) (9,121.520180855) (56,392.16407163) (12,9.194543707) (443,1106.024588047) (9,88.786871352) (9,166.899571358) (120,142.222511227) (9,73.07548465) (9,71.661578111) (26,47.691798645) (87,153.32273806) (9,89.500623124)
+ };
+ \addplot[only marks, creduce missynth]
+ coordinates {
+ (23,546.138) (40,549.916) (63,2954.062) (66,2565.887) (65,4355.297) (59,1695.4) (32,2355.947) (60,5091.577) (64,1611.466) (15,89.294) (137,6825.607) (74,13896.513) (64,9126.388) (90,4550.126) (43,5553.653) (27,1096.045) (16,340.533) (68,2814.821) (85,10592.831)
+ };
+ \addplot[only marks, verismith crash]
+ coordinates {
+ (462,31.025951033) (405,32.882851417) (75,49.630976912) (49,4.096207305) (234,10.081659552) (191,23.921349163) (99,10.894472949) (115,16.908927877) (32,18.313146602) (12,1.4856776) (230,30.366253517)
+ };
+ \addplot[only marks, creduce crash]
+ coordinates {
+ (30,225.177) (69,289.044) (33,136.239) (33,194.167) (52,352.996) (60,313.808) (54,285.255) (63,221.02) (60,137.885) (34,223.37) (54,213.942)
+ };
+ \legend{\verismith{}: mis-synthesis,C-Reduce: mis-synthesis,\verismith{}: crash,C-Reduce: crash}
+ \end{loglogaxis}
+ \end{tikzpicture}
+ \caption{Comparing the effectiveness of test case reduction by Verismith and by C-Reduce using 30 randomly selected test cases that fail in Yosys. Only 24 test cases were successfully reduced by C-Reduce, whereas Verismith reduced all 30. Both axes use a logarithmic scale. Points towards the bottom left are favoured.}\label{fig:reducer_comparison}
+\end{figure}
+
+\paragraph{Verismith is much faster than C-Reduce}
+
+The average time taken by Verismith is 119\si{\second}, while the average time taken by C-Reduce is 2640\si{\second} (note that the logarithmic scale on the y-axis de-emphasises this discrepancy). This is expected, as Verismith performs a strict binary choice at every pass, and does not consider additional alternatives, so that the number of synthesis runs is minimised. Additionally, Verismith has access to the original AST and performs semantically valid reductions that will not introduce undefined behaviour.
+
+\paragraph{Verismith reduces mis-synthesis bugs further than C-Reduce}
+
+The median size of the reduced test case for Verismith is 11 lines, whereas for C-Reduce this is 61 lines. This can be explained by the fact that Verismith has access to the AST and can therefore perform more semantically valid transformations. However, the average number of lines reduced is about the same for both tools, as there are cases where Verismith does not find the optimal reduction.
+
+\paragraph{C-Reduce reduces crash bugs further than Verismith}
+
+Even though Verismith is faster than C-Reduce in most cases, C-Reduce seems to be better at reducing crashes, taking only slightly longer than Verismith but achieving a smaller reduced test case in general. This is because Verismith always tries to perform semantically valid transformations, which is not relevant when reducing crashes. Checking that the Verilog is valid is not important as long as the tool still crashes with the original error message.
+
+\section{Related work}
+
+\paragraph{Random Verilog generation}
+
+VlogHammer~\cite{wolf_vlogh} is also a Verilog fuzzer that targets the major commercial synthesis tools, as well as several simulators. It has found around 75 bugs to date which have been reported to the tool vendors. In contrast to our tool, VLogHammer does not generate programs with multiple modules and it does not support behavioural Verilog (e.g. always blocks). Whereas our tool only generates deterministic Verilog (which we have argued is the most important part of the language), VLogHammer generates nondeterministic Verilog, and requires an additional simulation step to avoid false positives. Finally, VLogHammer does not perform test case reduction, instead only generating small modules that can be analysed manually if they fail.
+
+Another random Verilog generator is VERGEN~\cite{ratchev03_verif_correc_fpga_logic_synth_algor}, which generates behavioural Verilog by randomly combining high-level logic blocks such as state machines, MUXes and shift registers. However, because it generates these predefined constructs, it produces well-behaved code which is unlikely to test many different combinations of Verilog constructs.
+
+American Fuzzy Lop (AFL)~\cite{zalewski15_americ} is a general-purpose fuzzer for binaries and uses instrumentation to guide the mutation of existing test cases. However, given that synthesis tools are highly complex programs with a large number of different states, it can be difficult to identify the correct set of inputs to enable the fuzzer to find a bug. In addition to that, the fuzzer has no notion of correct behaviour, and can therefore only detect crashes. We ran AFL on Yosys for 144 CPU hours and did not find a crash.
+
+Random generation and differential testing has also successfully been applied to fuzz various OpenCL implementations~\cite{lidbury15_many_compil_fuzzin}, including the Intel FPGA SDK for OpenCL~\cite{intel_intel_fpga_sdk_openc}.
+
+\paragraph{Equivalence checking}
+
+Differential testing~\cite{mckeeman98_differ_testin_softw} is the standard method for checking compiler correctness, by passing the input to two or more different compilers for the same language and checking if the output behaves in the same way. If one achieves a different result, then it is assumed that there must be a bug. Csmith~\cite{yang11_findin_under_bugs_c_compil} uses this technique to check if the output of different C compilers is correct. However, as the output of synthesis tools is Verilog, it can be checked formally for equivalence with the initial design to ensure that no bugs were present in the synthesis tool.
+
+Modern commercial logical equivalence checkers, such as Conformal~\cite{cadence_confor_equiv_check} could also solve the problem of comparing netlists to the original design, as they are often built with that use case in mind.
+
+\paragraph{Test case reduction}
+
+Test case reduction is usually performed by a process called delta-debugging~\cite{zeller02_simpl_isolat_failur_induc_input} which splits the source code into parts using simple lexer rules and tries to remove as many parts as possible. C-Reduce~\cite{regehr12_test_reduc_c_compil_bugs} is an example of an advanced reduction algorithm for C-like languages that makes use of parallel executions of different subsets of the test case to identify one that is still interesting, which is reduced further.
+
+\paragraph{Verified synthesis}
+
+There has also been work on verified synthesis, such as PBS~\cite{aagaard91}, written in ML and verified mechanically using Nuprl~\cite{constable86_implem_mathem_nuprl_proof_devel_system}, or $\Pi$-ware~\cite{flor18_pi_ware}, which is a high level HDL in Agda where the synthesis process to gates is formally proven. Such systems should, in theory, withstand our random testing. However, it is an enormous effort to build a fully verified synthesis tool that offers comparable performance to state-of-the-art tools. Moreover, there could still be bugs in the non-verified parts of these tools -- as was found to be the case with the CompCert~\cite{leroy06_formal_certif_compil_back} verified C compiler when tested using Csmith~\cite{yang11_findin_under_bugs_c_compil}.
+
+\section{Conclusion and further work}
+
+This paper introduced a method for behavioural Verilog generation and Verilog reduction, which was implemented in an open-source tool called \verismith{}. This tool successfully found and reported a total of eleven bugs in \yosys{}, \vivado{} and \iverilog{}, which are now either fixed or confirmed and scheduled to be fixed in upcoming releases.
+
+The main limitation of \verismith{} is that it cannot produce a design that contains undefined values, meaning no bugs can be found that are caused by them. Another limitation is that implementations for all the FPGA primitives are needed for the different tools that are used. Finally, only synthesis tools that can output Verilog are supported, which may limit which synthesis tools can be tested.
+
+Further work could be done on supporting a larger subset of Verilog, which improves the testing of the synthesis tools. In addition to that, undefined values could also be supported, which would further increase the variety of test cases that could be generated. Undefined values could be introduced in a controlled manner to support this, as \verismith{} already has a notion of determinism. This would allow for control over how much of the output should be undefined, which would reduce the risk of undefined values masking possible bugs and affecting a large proportion of the output.
+
+It is worth asking whether the bugs we have found using Verismith really matter, or whether they would only be triggered by code patterns that are unlikely to appear in production code. This is hard to answer definitively, but it is worth noting that one member of the \xilinx{} user community remarked that the bug we found in \vivado{} ``looks to me to be a rather critical bug''.\bugtracker{https://forums.xilinx.com/t5/Synthesis/Vivado-2019-1-Bit-selection-synthesis-mismatch/m-p/982632\#M31484} In general it does seem like these tools cannot be completely trusted, because they can generate a netlist that is not equivalent to the original or even crash given correct and deterministic Verilog.
+
+It is our hope that tools like \verismith{} can not only be valuable to designers of logic synthesis tools as a way to catch more bugs, but can also provide designers with a safety net that gives them the confidence to implement ever more ambitious optimisations.
+
+\begin{acks}
+We acknowledge financial support of a PhD studentship from the Research Institute on Verified Trustworthy Software Systems (VeTSS), which is funded by the National Cyber Security Centre (NCSC), and the EPSRC IRIS programme grant (EP/R006865/1). We thank Alastair Donaldson, Eric Eide, Martin Ferianc, Brent Nelson, and the FPGA '20 reviewers for valuable suggestions.
+\end{acks}
+
+\bibliographystyle{ACM-Reference-Format}
+\addtolength{\textheight}{-310pt}
+% \balance
+\bibliography{conference.bib}
+
+\end{document}
+\endinput
+
+%%% Local Variables:
+%%% mode: latex
+%%% TeX-master: t
+%%% End:
diff --git a/presentation/ExampleRun/output2/fuzz_1/actual_correct.v b/presentation/ExampleRun/output2/fuzz_1/actual_correct.v
new file mode 100644
index 0000000..b82d0ac
--- /dev/null
+++ b/presentation/ExampleRun/output2/fuzz_1/actual_correct.v
@@ -0,0 +1,12 @@
+module top_1(y, clk, wire1);
+ input clk;
+ wire [1:0] reg4;
+ input wire1;
+ output [1:0] y;
+ reg reg4_reg[0] = 1'b0;
+ always @(posedge clk)
+ reg4_reg[0] <= wire1;
+ assign reg4[0] = reg4_reg[0] ;
+ assign reg4[1] = reg4[0];
+ assign y = { reg4[0], reg4[0] };
+endmodule
diff --git a/presentation/ExampleRun/output2/fuzz_1/actual_wrong.v b/presentation/ExampleRun/output2/fuzz_1/actual_wrong.v
new file mode 100644
index 0000000..31508e2
--- /dev/null
+++ b/presentation/ExampleRun/output2/fuzz_1/actual_wrong.v
@@ -0,0 +1,12 @@
+module top_1(y, clk, wire1);
+ input clk;
+ wire [1:0] reg4;
+ input wire1;
+ output [1:0] y;
+ reg reg4_reg[0] = 1'hx;
+ always @(posedge clk)
+ reg4_reg[0] <= wire1;
+ assign reg4[0] = reg4_reg[0] ;
+ assign reg4[1] = reg4[0];
+ assign y = { reg4[0], reg4[0] };
+endmodule
diff --git a/presentation/ExampleRun/output2/fuzz_1/equiv_identity_yosys/top.v b/presentation/ExampleRun/output2/fuzz_1/equiv_identity_yosys/top.v
new file mode 100644
index 0000000..0700c08
--- /dev/null
+++ b/presentation/ExampleRun/output2/fuzz_1/equiv_identity_yosys/top.v
@@ -0,0 +1,8 @@
+module top (y_1, y_2, clk, wire0, wire1, wire2, wire3);
+ top_gen top_gen (.y(y_1), .clk(clk), .wire0(wire0), .wire1(wire1), .wire2(wire2), .wire3(wire3));
+ top_syn top_syn (.y(y_2), .clk(clk), .wire0(wire0), .wire1(wire1), .wire2(wire2), .wire3(wire3));
+ always
+ @(posedge clk) begin
+ assert ((y_1 == y_2));
+ end
+endmodule
diff --git a/presentation/ExampleRun/output2/fuzz_1/identity/syn_identity.v b/presentation/ExampleRun/output2/fuzz_1/identity/syn_identity.v
new file mode 100644
index 0000000..47c9bd6
--- /dev/null
+++ b/presentation/ExampleRun/output2/fuzz_1/identity/syn_identity.v
@@ -0,0 +1,77 @@
+// -*- mode: verilog -*-
+module top #(parameter param30 = (8'hbb)) (y, clk, wire0, wire1, wire2, wire3);
+ output [(32'hb7):(32'h0)] y;
+ input [(1'h0):(1'h0)] clk;
+ input signed [(5'h11):(1'h0)] wire0;
+ input signed [(4'ha):(1'h0)] wire1;
+ input [(4'hd):(1'h0)] wire2;
+ input [(4'h8):(1'h0)] wire3;
+ wire signed [(4'hb):(1'h0)] wire27;
+ wire [(5'h15):(1'h0)] wire26;
+ wire [(5'h10):(1'h0)] wire25;
+ wire [(5'h13):(1'h0)] wire24;
+ reg signed [(4'he):(1'h0)] reg4 = (1'h0);
+ reg [(2'h3):(1'h0)] reg5 = (1'h0);
+ reg [(5'h14):(1'h0)] reg6 = (1'h0);
+ reg signed [(5'h12):(1'h0)] reg7 = (1'h0);
+ reg [(4'hd):(1'h0)] reg8 = (1'h0);
+ wire [(4'hd):(1'h0)] wire9;
+ wire [(4'he):(1'h0)] wire10;
+ wire signed [(2'h2):(1'h0)] wire22;
+ assign y = {wire27, wire26, wire25, wire24, reg4,
+ reg5, reg6, reg7, reg8, wire9, wire10, wire22};
+ always
+ @(posedge clk) begin
+ reg4 <= wire1;
+ if ($unsigned((~&(8'hb2))))
+ begin
+ reg5 <= reg4;
+ reg6 <= wire1;
+ end
+ else
+ begin
+ reg5 <= ($signed(reg7) ? wire2 : reg8[(4'h8):(2'h2)]);
+ reg6 <= reg6;
+ end
+ end
+ always @* begin
+ reg7 = ((~|((wire0 & {wire3, reg4}) | $unsigned((reg4 != (8'h9d))))) <<< ((wire1[(2'h2):(2'h2)] + ((~(8'ha7)) ?
+ wire3 : $signed(wire1))) ? $unsigned(((^wire0) + $unsigned(wire3))) : (((reg5 * wire3) ?
+ wire1 : $unsigned(reg6)) ? {{reg4, wire2}} : (reg5[(1'h0):(1'h0)] ? $signed(reg4) : (~wire3)))));
+ reg8 = (~^$unsigned(reg6));
+ end
+ assign wire9 = (((8'ha2) ?
+ wire3 : reg8[(4'h9):(4'h8)]) + $signed($signed(wire1)));
+ assign wire10 = $signed($signed($unsigned((~|(wire2 ? wire0 : wire0)))));
+ module11 modinst23 (.wire15(wire9), .wire16(wire3), .wire13(wire10), .wire12(wire1), .y(wire22), .wire14(wire0), .clk(clk));
+ assign wire24 = $signed((wire1 ?
+ ((wire1 ? $unsigned(reg5) : ((8'hae) ? reg7 : wire9)) ?
+ ($unsigned(wire0) && $signed(wire22)) : $unsigned(reg4[(2'h3):(2'h2)])) : $unsigned(wire0)));
+ assign wire25 = $unsigned($signed((~(|reg5))));
+ assign wire26 = reg4[(3'h5):(1'h0)];
+ assign wire27 = {(-wire0[(4'hd):(2'h2)]),
+ $signed($signed(($signed(reg4) != $unsigned((7'h41)))))};
+endmodule
+
+module module11 (y, clk, wire16, wire15, wire14, wire13, wire12);
+ output wire [(32'h40):(32'h0)] y;
+ input wire [(1'h0):(1'h0)] clk;
+ input wire [(2'h2):(1'h0)] wire16;
+ input wire signed [(3'h4):(1'h0)] wire15;
+ input wire signed [(5'h11):(1'h0)] wire14;
+ input wire signed [(4'he):(1'h0)] wire13;
+ input wire signed [(4'ha):(1'h0)] wire12;
+ wire signed [(4'hf):(1'h0)] wire21;
+ wire [(4'hc):(1'h0)] wire20;
+ wire [(3'h7):(1'h0)] wire19;
+ wire signed [(5'h11):(1'h0)] wire18;
+ wire signed [(4'hc):(1'h0)] wire17;
+ assign y = {wire21, wire20, wire19, wire18, wire17, (1'h0)};
+ assign wire17 = $unsigned(wire14[(1'h1):(1'h0)]);
+ assign wire18 = $unsigned(wire17);
+ assign wire19 = ($signed(((^wire18[(4'hb):(2'h3)]) ^ ((8'hb9) ?
+ {(8'ha6), wire17} : $signed(wire16)))) ?
+ wire12[(2'h3):(1'h0)] : (+(+wire15[(2'h3):(2'h2)])));
+ assign wire20 = (~|$signed(wire12));
+ assign wire21 = (|$unsigned($signed(((-wire19) | wire15))));
+endmodule
diff --git a/presentation/ExampleRun/output2/fuzz_1/identity/syn_identity_colour.v b/presentation/ExampleRun/output2/fuzz_1/identity/syn_identity_colour.v
new file mode 100644
index 0000000..b2dcb5d
--- /dev/null
+++ b/presentation/ExampleRun/output2/fuzz_1/identity/syn_identity_colour.v
@@ -0,0 +1,77 @@
+// -*- mode: verilog -*-
+module top #(parameter param30 = (8'hbb)) (y, clk, wire0, wire1, wire2, wire3);
+ output [(32'hb7):(32'h0)] y;
+ input [(1'h0):(1'h0)] clk;
+ input signed [(5'h11):(1'h0)] wire0;
+ input signed [(4'ha):(1'h0)] wire1;
+ input [(4'hd):(1'h0)] wire2;
+ input [(4'h8):(1'h0)] wire3;
+ wire signed [(4'hb):(1'h0)] wire27;
+ wire [(5'h15):(1'h0)] wire26;
+ wire [(5'h10):(1'h0)] wire25;
+ wire [(5'h13):(1'h0)] wire24;
+ reg signed [(4'he):(1'h0)] reg4 = (1'h0);
+ reg [(2'h3):(1'h0)] reg5 = (1'h0);
+ reg [(5'h14):(1'h0)] reg6 = (1'h0);
+ reg signed [(5'h12):(1'h0)] reg7 = (1'h0);
+ reg [(4'hd):(1'h0)] reg8 = (1'h0);
+ wire [(4'hd):(1'h0)] wire9;
+ wire [(4'he):(1'h0)] wire10;
+ wire signed [(2'h2):(1'h0)] wire22;
+ assign y = {wire27, wire26, wire25, wire24, reg4,
+ reg5, reg6, reg7, reg8, wire9, wire10, ¬\colorbox{red!30}{wire22}¬};
+ always
+ @(posedge clk) begin
+ reg4 <= wire1;
+ if ($unsigned((~&(8'hb2))))
+ begin
+ reg5 <= reg4;
+ reg6 <= wire1;
+ end
+ else
+ begin
+ reg5 <= ($signed(reg7) ? wire2 : reg8[(4'h8):(2'h2)]);
+ reg6 <= reg6;
+ end
+ end
+ always @* begin
+ reg7 = ((~|((wire0 & {wire3, reg4}) | $unsigned((reg4 != (8'h9d))))) <<< ((wire1[(2'h2):(2'h2)] + ((~(8'ha7)) ?
+ wire3 : $signed(wire1))) ? $unsigned(((^wire0) + $unsigned(wire3))) : (((reg5 * wire3) ?
+ wire1 : $unsigned(reg6)) ? {{reg4, wire2}} : (reg5[(1'h0):(1'h0)] ? $signed(reg4) : (~wire3)))));
+ reg8 = (~^$unsigned(reg6));
+ end
+ assign wire9 = (((8'ha2) ?
+ wire3 : reg8[(4'h9):(4'h8)]) + $signed($signed(wire1)));
+ assign wire10 = $signed($signed($unsigned((~|(wire2 ? wire0 : wire0)))));
+ module11 modinst23 (.wire15(wire9), .wire16(wire3), .wire13(wire10), .wire12(wire1), .y(wire22), .wire14(wire0), .clk(clk));
+ assign wire24 = $signed((wire1 ?
+ ((wire1 ? $unsigned(reg5) : ((8'hae) ? reg7 : wire9)) ?
+ ($unsigned(wire0) && $signed(¬\colorbox{red!30}{wire22}¬)) : $unsigned(reg4[(2'h3):(2'h2)])) : $unsigned(wire0)));
+ assign wire25 = $unsigned($signed((~(|reg5))));
+ assign wire26 = reg4[(3'h5):(1'h0)];
+ assign wire27 = {(-wire0[(4'hd):(2'h2)]),
+ $signed($signed(($signed(reg4) != $unsigned((7'h41)))))};
+endmodule
+
+module module11 (y, clk, wire16, wire15, wire14, wire13, wire12);
+ output wire [(32'h40):(32'h0)] y;
+ input wire [(1'h0):(1'h0)] clk;
+ input wire [(2'h2):(1'h0)] wire16;
+ input wire signed [(3'h4):(1'h0)] wire15;
+ input wire signed [(5'h11):(1'h0)] wire14;
+ input wire signed [(4'he):(1'h0)] wire13;
+ input wire signed [(4'ha):(1'h0)] wire12;
+ wire signed [(4'hf):(1'h0)] wire21;
+ wire [(4'hc):(1'h0)] wire20;
+ wire [(3'h7):(1'h0)] wire19;
+ wire signed [(5'h11):(1'h0)] wire18;
+ wire signed [(4'hc):(1'h0)] wire17;
+ assign y = {wire21, wire20, wire19, wire18, wire17, (1'h0)};
+ assign wire17 = $unsigned(wire14[(1'h1):(1'h0)]);
+ assign wire18 = $unsigned(wire17);
+ assign wire19 = ($signed(((^wire18[(4'hb):(2'h3)]) ^ ((8'hb9) ?
+ {(8'ha6), wire17} : $signed(wire16)))) ?
+ wire12[(2'h3):(1'h0)] : (+(+wire15[(2'h3):(2'h2)])));
+ assign wire20 = (~|$signed(wire12));
+ assign wire21 = (|$unsigned($signed(((-wire19) | wire15))));
+endmodule
diff --git a/presentation/ExampleRun/output2/fuzz_1/identity/syn_identity_red1.v b/presentation/ExampleRun/output2/fuzz_1/identity/syn_identity_red1.v
new file mode 100644
index 0000000..784ae4d
--- /dev/null
+++ b/presentation/ExampleRun/output2/fuzz_1/identity/syn_identity_red1.v
@@ -0,0 +1,52 @@
+// -*- mode: verilog -*-
+module top #(parameter param30 = (8'hbb)) (y, clk, wire0, wire1, wire2, wire3);
+ output [(32'hb7):(32'h0)] y;
+ input [(1'h0):(1'h0)] clk;
+ input signed [(5'h11):(1'h0)] wire0;
+ input signed [(4'ha):(1'h0)] wire1;
+ input [(4'hd):(1'h0)] wire2;
+ input [(4'h8):(1'h0)] wire3;
+ wire signed [(4'hb):(1'h0)] wire27;
+ wire [(5'h15):(1'h0)] wire26;
+ wire [(5'h10):(1'h0)] wire25;
+ wire [(5'h13):(1'h0)] wire24;
+ reg signed [(4'he):(1'h0)] reg4 = (1'h0);
+ reg [(2'h3):(1'h0)] reg5 = (1'h0);
+ reg [(5'h14):(1'h0)] reg6 = (1'h0);
+ reg signed [(5'h12):(1'h0)] reg7 = (1'h0);
+ reg [(4'hd):(1'h0)] reg8 = (1'h0);
+ wire [(4'hd):(1'h0)] wire9;
+ wire [(4'he):(1'h0)] wire10;
+ assign y = {wire27, wire26, wire25, wire24, reg4,
+ reg5, reg6, reg7, reg8, wire9, wire10};
+ always
+ @(posedge clk) begin
+ reg4 <= wire1;
+ if ($unsigned((~&(8'hb2))))
+ begin
+ reg5 <= reg4;
+ reg6 <= wire1;
+ end
+ else
+ begin
+ reg5 <= ($signed(reg7) ? wire2 : reg8[(4'h8):(2'h2)]);
+ reg6 <= reg6;
+ end
+ end
+ always @* begin
+ reg7 = ((~|((wire0 & {wire3, reg4}) | $unsigned((reg4 != (8'h9d))))) <<< ((wire1[(2'h2):(2'h2)] + ((~(8'ha7)) ?
+ wire3 : $signed(wire1))) ? $unsigned(((^wire0) + $unsigned(wire3))) : (((reg5 * wire3) ?
+ wire1 : $unsigned(reg6)) ? {{reg4, wire2}} : (reg5[(1'h0):(1'h0)] ? $signed(reg4) : (~wire3)))));
+ reg8 = (~^$unsigned(reg6));
+ end
+ assign wire9 = (((8'ha2) ?
+ wire3 : reg8[(4'h9):(4'h8)]) + $signed($signed(wire1)));
+ assign wire10 = $signed($signed($unsigned((~|(wire2 ? wire0 : wire0)))));
+ assign wire24 = $signed((wire1 ?
+ ((wire1 ? $unsigned(reg5) : ((8'hae) ? reg7 : wire9)) ?
+ ($unsigned(wire0) && 1'b0) : $unsigned(reg4[(2'h3):(2'h2)])) : $unsigned(wire0)));
+ assign wire25 = $unsigned($signed((~(|reg5))));
+ assign wire26 = reg4[(3'h5):(1'h0)];
+ assign wire27 = {(-wire0[(4'hd):(2'h2)]),
+ $signed($signed(($signed(reg4) != $unsigned((7'h41)))))};
+endmodule
diff --git a/presentation/ExampleRun/output2/fuzz_1/identity/syn_identity_red1_colour.v b/presentation/ExampleRun/output2/fuzz_1/identity/syn_identity_red1_colour.v
new file mode 100644
index 0000000..5750a54
--- /dev/null
+++ b/presentation/ExampleRun/output2/fuzz_1/identity/syn_identity_red1_colour.v
@@ -0,0 +1,52 @@
+// -*- mode: verilog -*-
+module top #(parameter param30 = (8'hbb)) (y, clk, wire0, wire1, wire2, wire3);
+ output [(32'hb7):(32'h0)] y;
+ input [(1'h0):(1'h0)] clk;
+ input signed [(5'h11):(1'h0)] wire0;
+ input signed [(4'ha):(1'h0)] wire1;
+ input [(4'hd):(1'h0)] wire2;
+ input [(4'h8):(1'h0)] wire3;
+ wire signed [(4'hb):(1'h0)] wire27;
+ wire [(5'h15):(1'h0)] wire26;
+ wire [(5'h10):(1'h0)] wire25;
+ wire [(5'h13):(1'h0)] wire24;
+ reg signed [(4'he):(1'h0)] reg4 = (1'h0);
+ reg [(2'h3):(1'h0)] reg5 = (1'h0);
+ reg [(5'h14):(1'h0)] reg6 = (1'h0);
+ reg signed [(5'h12):(1'h0)] reg7 = (1'h0);
+ reg [(4'hd):(1'h0)] reg8 = (1'h0);
+ wire [(4'hd):(1'h0)] wire9;
+ wire [(4'he):(1'h0)] wire10;
+ assign y = {¬\colorbox{red!30}{wire27, wire26, wire25, wire24}¬, reg4,
+ reg5, reg6, reg7, reg8, wire9, wire10};
+ always
+ @(posedge clk) begin
+ reg4 <= wire1;
+ if ($unsigned((~&(8'hb2))))
+ begin
+ reg5 <= reg4;
+ reg6 <= wire1;
+ end
+ else
+ begin
+ reg5 <= ($signed(reg7) ? wire2 : reg8[(4'h8):(2'h2)]);
+ reg6 <= reg6;
+ end
+ end
+ always @* begin
+ reg7 = ((~|((wire0 & {wire3, reg4}) | $unsigned((reg4 != (8'h9d))))) <<< ((wire1[(2'h2):(2'h2)] + ((~(8'ha7)) ?
+ wire3 : $signed(wire1))) ? $unsigned(((^wire0) + $unsigned(wire3))) : (((reg5 * wire3) ?
+ wire1 : $unsigned(reg6)) ? {{reg4, wire2}} : (reg5[(1'h0):(1'h0)] ? $signed(reg4) : (~wire3)))));
+ reg8 = (~^$unsigned(reg6));
+ end
+ assign wire9 = (((8'ha2) ?
+ wire3 : reg8[(4'h9):(4'h8)]) + $signed($signed(wire1)));
+ assign wire10 = $signed($signed($unsigned((~|(wire2 ? wire0 : wire0)))));
+ assign wire24 = $signed((wire1 ?
+ ((wire1 ? $unsigned(reg5) : ((8'hae) ? reg7 : wire9)) ?
+ ($unsigned(wire0) && 1'b0) : $unsigned(reg4[(2'h3):(2'h2)])) : $unsigned(wire0)));
+ assign wire25 = $unsigned($signed((~(|reg5))));
+ assign wire26 = reg4[(3'h5):(1'h0)];
+ assign wire27 = {(-wire0[(4'hd):(2'h2)]),
+ $signed($signed(($signed(reg4) != $unsigned((7'h41)))))};
+endmodule
diff --git a/presentation/ExampleRun/output2/fuzz_1/identity/syn_identity_red2.v b/presentation/ExampleRun/output2/fuzz_1/identity/syn_identity_red2.v
new file mode 100644
index 0000000..7cffea0
--- /dev/null
+++ b/presentation/ExampleRun/output2/fuzz_1/identity/syn_identity_red2.v
@@ -0,0 +1,40 @@
+// -*- mode: verilog -*-
+module top #(parameter param30 = (8'hbb)) (y, clk, wire0, wire1, wire2, wire3);
+ output [(32'hb7):(32'h0)] y;
+ input [(1'h0):(1'h0)] clk;
+ input signed [(5'h11):(1'h0)] wire0;
+ input signed [(4'ha):(1'h0)] wire1;
+ input [(4'hd):(1'h0)] wire2;
+ input [(4'h8):(1'h0)] wire3;
+ reg signed [(4'he):(1'h0)] reg4 = (1'h0);
+ reg [(2'h3):(1'h0)] reg5 = (1'h0);
+ reg [(5'h14):(1'h0)] reg6 = (1'h0);
+ reg signed [(5'h12):(1'h0)] reg7 = (1'h0);
+ reg [(4'hd):(1'h0)] reg8 = (1'h0);
+ wire [(4'hd):(1'h0)] wire9;
+ wire [(4'he):(1'h0)] wire10;
+ assign y = {reg4, reg5, reg6, reg7, reg8, wire9, wire10};
+ always
+ @(posedge clk) begin
+ reg4 <= wire1;
+ if ($unsigned((~&(8'hb2))))
+ begin
+ reg5 <= reg4;
+ reg6 <= wire1;
+ end
+ else
+ begin
+ reg5 <= ($signed(reg7) ? wire2 : reg8[(4'h8):(2'h2)]);
+ reg6 <= reg6;
+ end
+ end
+ always @* begin
+ reg7 = ((~|((wire0 & {wire3, reg4}) | $unsigned((reg4 != (8'h9d))))) <<< ((wire1[(2'h2):(2'h2)] + ((~(8'ha7)) ?
+ wire3 : $signed(wire1))) ? $unsigned(((^wire0) + $unsigned(wire3))) : (((reg5 * wire3) ?
+ wire1 : $unsigned(reg6)) ? {{reg4, wire2}} : (reg5[(1'h0):(1'h0)] ? $signed(reg4) : (~wire3)))));
+ reg8 = (~^$unsigned(reg6));
+ end
+ assign wire9 = (((8'ha2) ?
+ wire3 : reg8[(4'h9):(4'h8)]) + $signed($signed(wire1)));
+ assign wire10 = $signed($signed($unsigned((~|(wire2 ? wire0 : wire0)))));
+endmodule
diff --git a/presentation/ExampleRun/output2/fuzz_1/identity/syn_identity_red2_colour.v b/presentation/ExampleRun/output2/fuzz_1/identity/syn_identity_red2_colour.v
new file mode 100644
index 0000000..f3904b4
--- /dev/null
+++ b/presentation/ExampleRun/output2/fuzz_1/identity/syn_identity_red2_colour.v
@@ -0,0 +1,40 @@
+// -*- mode: verilog -*-
+module top #(parameter param30 = (8'hbb)) (y, clk, wire0, wire1, wire2, wire3);
+ output [(32'hb7):(32'h0)] y;
+ input [(1'h0):(1'h0)] clk;
+ input signed [(5'h11):(1'h0)] wire0;
+ input signed [(4'ha):(1'h0)] wire1;
+ input [(4'hd):(1'h0)] wire2;
+ input [(4'h8):(1'h0)] wire3;
+ reg signed [(4'he):(1'h0)] reg4 = (1'h0);
+ reg [(2'h3):(1'h0)] reg5 = (1'h0);
+ reg [(5'h14):(1'h0)] reg6 = (1'h0);
+ reg signed [(5'h12):(1'h0)] reg7 = (1'h0);
+ reg [(4'hd):(1'h0)] reg8 = (1'h0);
+ wire [(4'hd):(1'h0)] wire9;
+ wire [(4'he):(1'h0)] wire10;
+ assign y = {¬\colorbox{green!30}{reg4, reg5, reg6, reg7, reg8}¬, wire9, wire10};
+ always
+ @(posedge clk) begin
+ reg4 <= wire1;
+ if ($unsigned((~&(8'hb2))))
+ begin
+ reg5 <= reg4;
+ reg6 <= wire1;
+ end
+ else
+ begin
+ reg5 <= ($signed(reg7) ? wire2 : reg8[(4'h8):(2'h2)]);
+ reg6 <= reg6;
+ end
+ end
+ always @* begin
+ reg7 = ((~|((wire0 & {wire3, reg4}) | $unsigned((reg4 != (8'h9d))))) <<< ((wire1[(2'h2):(2'h2)] + ((~(8'ha7)) ?
+ wire3 : $signed(wire1))) ? $unsigned(((^wire0) + $unsigned(wire3))) : (((reg5 * wire3) ?
+ wire1 : $unsigned(reg6)) ? {{reg4, wire2}} : (reg5[(1'h0):(1'h0)] ? $signed(reg4) : (~wire3)))));
+ reg8 = (~^$unsigned(reg6));
+ end
+ assign wire9 = (((8'ha2) ?
+ wire3 : ¬\colorbox{green!30}{reg8[(4'h9):(4'h8)]}¬) + $signed($signed(wire1)));
+ assign wire10 = $signed($signed($unsigned((~|(wire2 ? wire0 : wire0)))));
+endmodule
diff --git a/presentation/ExampleRun/output2/fuzz_1/identity/syn_identity_red2_colour2.v b/presentation/ExampleRun/output2/fuzz_1/identity/syn_identity_red2_colour2.v
new file mode 100644
index 0000000..be8b21b
--- /dev/null
+++ b/presentation/ExampleRun/output2/fuzz_1/identity/syn_identity_red2_colour2.v
@@ -0,0 +1,40 @@
+// -*- mode: verilog -*-
+module top #(parameter param30 = (8'hbb)) (y, clk, wire0, wire1, wire2, wire3);
+ output [(32'hb7):(32'h0)] y;
+ input [(1'h0):(1'h0)] clk;
+ input signed [(5'h11):(1'h0)] wire0;
+ input signed [(4'ha):(1'h0)] wire1;
+ input [(4'hd):(1'h0)] wire2;
+ input [(4'h8):(1'h0)] wire3;
+ reg signed [(4'he):(1'h0)] reg4 = (1'h0);
+ reg [(2'h3):(1'h0)] reg5 = (1'h0);
+ reg [(5'h14):(1'h0)] reg6 = (1'h0);
+ reg signed [(5'h12):(1'h0)] reg7 = (1'h0);
+ reg [(4'hd):(1'h0)] reg8 = (1'h0);
+ wire [(4'hd):(1'h0)] wire9;
+ wire [(4'he):(1'h0)] wire10;
+ assign y = {reg4, reg5, reg6, reg7, reg8, ¬\colorbox{red!30}{wire9, wire10}¬};
+ always
+ @(posedge clk) begin
+ reg4 <= wire1;
+ if ($unsigned((~&(8'hb2))))
+ begin
+ reg5 <= reg4;
+ reg6 <= wire1;
+ end
+ else
+ begin
+ reg5 <= ($signed(reg7) ? wire2 : reg8[(4'h8):(2'h2)]);
+ reg6 <= reg6;
+ end
+ end
+ always @* begin
+ reg7 = ((~|((wire0 & {wire3, reg4}) | $unsigned((reg4 != (8'h9d))))) <<< ((wire1[(2'h2):(2'h2)] + ((~(8'ha7)) ?
+ wire3 : $signed(wire1))) ? $unsigned(((^wire0) + $unsigned(wire3))) : (((reg5 * wire3) ?
+ wire1 : $unsigned(reg6)) ? {{reg4, wire2}} : (reg5[(1'h0):(1'h0)] ? $signed(reg4) : (~wire3)))));
+ reg8 = (~^$unsigned(reg6));
+ end
+ assign wire9 = (((8'ha2) ?
+ wire3 : reg8[(4'h9):(4'h8)]) + $signed($signed(wire1)));
+ assign wire10 = $signed($signed($unsigned((~|(wire2 ? wire0 : wire0)))));
+endmodule
diff --git a/presentation/ExampleRun/output2/fuzz_1/identity/syn_identity_red3.v b/presentation/ExampleRun/output2/fuzz_1/identity/syn_identity_red3.v
new file mode 100644
index 0000000..81b030d
--- /dev/null
+++ b/presentation/ExampleRun/output2/fuzz_1/identity/syn_identity_red3.v
@@ -0,0 +1,35 @@
+// -*- mode: verilog -*-
+module top #(parameter param30 = (8'hbb)) (y, clk, wire0, wire1, wire2, wire3);
+ output [(32'hb7):(32'h0)] y;
+ input [(1'h0):(1'h0)] clk;
+ input signed [(5'h11):(1'h0)] wire0;
+ input signed [(4'ha):(1'h0)] wire1;
+ input [(4'hd):(1'h0)] wire2;
+ input [(4'h8):(1'h0)] wire3;
+ reg signed [(4'he):(1'h0)] reg4 = (1'h0);
+ reg [(2'h3):(1'h0)] reg5 = (1'h0);
+ reg [(5'h14):(1'h0)] reg6 = (1'h0);
+ reg signed [(5'h12):(1'h0)] reg7 = (1'h0);
+ reg [(4'hd):(1'h0)] reg8 = (1'h0);
+ assign y = {reg4, reg5, reg6, reg7, reg8};
+ always
+ @(posedge clk) begin
+ reg4 <= wire1;
+ if ($unsigned((~&(8'hb2))))
+ begin
+ reg5 <= reg4;
+ reg6 <= wire1;
+ end
+ else
+ begin
+ reg5 <= ($signed(reg7) ? wire2 : reg8[(4'h8):(2'h2)]);
+ reg6 <= reg6;
+ end
+ end
+ always @* begin
+ reg7 = ((~|((wire0 & {wire3, reg4}) | $unsigned((reg4 != (8'h9d))))) <<< ((wire1[(2'h2):(2'h2)] + ((~(8'ha7)) ?
+ wire3 : $signed(wire1))) ? $unsigned(((^wire0) + $unsigned(wire3))) : (((reg5 * wire3) ?
+ wire1 : $unsigned(reg6)) ? {{reg4, wire2}} : (reg5[(1'h0):(1'h0)] ? $signed(reg4) : (~wire3)))));
+ reg8 = (~^$unsigned(reg6));
+ end
+endmodule
diff --git a/presentation/ExampleRun/output2/fuzz_1/identity/syn_identity_red4.v b/presentation/ExampleRun/output2/fuzz_1/identity/syn_identity_red4.v
new file mode 100644
index 0000000..fd3fd3c
--- /dev/null
+++ b/presentation/ExampleRun/output2/fuzz_1/identity/syn_identity_red4.v
@@ -0,0 +1,27 @@
+// -*- mode: verilog -*-
+module top #(parameter param30 = (8'hbb)) (y, clk, wire0, wire1, wire2, wire3);
+ output [(32'hb7):(32'h0)] y;
+ input [(1'h0):(1'h0)] clk;
+ input signed [(5'h11):(1'h0)] wire0;
+ input signed [(4'ha):(1'h0)] wire1;
+ input [(4'hd):(1'h0)] wire2;
+ input [(4'h8):(1'h0)] wire3;
+ reg signed [(4'he):(1'h0)] reg4 = (1'h0);
+ reg [(2'h3):(1'h0)] reg5 = (1'h0);
+ reg [(5'h14):(1'h0)] reg6 = (1'h0);
+ assign y = {reg4, reg5, reg6};
+ always
+ @(posedge clk) begin
+ reg4 <= wire1;
+ if ($unsigned((~&(8'hb2))))
+ begin
+ reg5 <= reg4;
+ reg6 <= wire1;
+ end
+ else
+ begin
+ reg5 <= ((1'b0) ? wire2 : (1'b0));
+ reg6 <= reg6;
+ end
+ end
+endmodule
diff --git a/presentation/ExampleRun/output2/fuzz_1/identity/syn_identity_red5.v b/presentation/ExampleRun/output2/fuzz_1/identity/syn_identity_red5.v
new file mode 100644
index 0000000..7f046e7
--- /dev/null
+++ b/presentation/ExampleRun/output2/fuzz_1/identity/syn_identity_red5.v
@@ -0,0 +1,15 @@
+// -*- mode: verilog -*-
+module top #(parameter param30 = (8'hbb)) (y, clk, wire0, wire1, wire2, wire3);
+ output [(32'hb7):(32'h0)] y;
+ input [(1'h0):(1'h0)] clk;
+ input signed [(5'h11):(1'h0)] wire0;
+ input signed [(4'ha):(1'h0)] wire1;
+ input [(4'hd):(1'h0)] wire2;
+ input [(4'h8):(1'h0)] wire3;
+ reg signed [(4'he):(1'h0)] reg4 = (1'h0);
+ assign y = {reg4};
+ always
+ @(posedge clk) begin
+ reg4 <= wire1;
+ end
+endmodule
diff --git a/presentation/ExampleRun/output2/fuzz_1/reduce_identity_yosys.v b/presentation/ExampleRun/output2/fuzz_1/reduce_identity_yosys.v
new file mode 100644
index 0000000..3d5af91
--- /dev/null
+++ b/presentation/ExampleRun/output2/fuzz_1/reduce_identity_yosys.v
@@ -0,0 +1,9 @@
+module top (y, clk, wire1);
+ output wire [(32'hb7):(32'h0)] y;
+ input wire [(1'h0):(1'h0)] clk;
+ input wire signed [(4'ha):(1'h0)] wire1;
+ reg signed [(4'he):(1'h0)] reg4 = (1'h0);
+ assign y = {reg4};
+ always
+ @(posedge clk) reg4 <= wire1;
+endmodule
diff --git a/presentation/ExampleRun/output2/fuzz_1/reduce_sim_yosys.v b/presentation/ExampleRun/output2/fuzz_1/reduce_sim_yosys.v
new file mode 100644
index 0000000..ea01016
--- /dev/null
+++ b/presentation/ExampleRun/output2/fuzz_1/reduce_sim_yosys.v
@@ -0,0 +1,27 @@
+// -*- mode: verilog -*-
+module top (y, clk, wire0, wire1, wire2, wire3);
+ output wire [(32'hb7):(32'h0)] y ;
+ input wire [(1'h0):(1'h0)] clk ;
+ input wire signed [(5'h11):(1'h0)] wire0 ;
+ input wire signed [(4'ha):(1'h0)] wire1 ;
+ input wire [(4'hd):(1'h0)] wire2 ;
+ input wire [(4'h8):(1'h0)] wire3 ;
+ reg [(2'h3):(1'h0)] reg5 = (1'h0) ;
+ reg [(5'h14):(1'h0)] reg6 = (1'h0) ;
+ reg signed [(5'h12):(1'h0)] reg7 = (1'h0) ;
+ reg [(4'hd):(1'h0)] reg8 = (1'h0) ;
+ assign y = {reg5, reg6, reg7, reg8} ;
+ always
+ @(posedge clk) begin
+ reg5 <= (1'h0);
+ reg6 <= wire1;
+ reg7 <= ((~|((wire0 & {wire3,
+ (1'h0)}) | $unsigned(((1'h0) != (8'h9d))))) <<< ((wire1[(2'h2):(2'h2)] + ((~(8'ha7)) ?
+ wire3 : $signed(wire1))) ?
+ $unsigned(((^wire0) + $unsigned(wire3))) : (((reg5 * wire3) ?
+ wire1 : $unsigned(reg6)) ?
+ {{(1'h0), wire2}} : (reg5[(1'h0):(1'h0)] ?
+ $signed((1'h0)) : (~wire3)))));
+ reg8 <= (~^$unsigned(reg6));
+ end
+endmodule \ No newline at end of file
diff --git a/presentation/ExampleRun/output2/fuzz_1/yosys/syn_yosys.v b/presentation/ExampleRun/output2/fuzz_1/yosys/syn_yosys.v
new file mode 100644
index 0000000..d7ba555
--- /dev/null
+++ b/presentation/ExampleRun/output2/fuzz_1/yosys/syn_yosys.v
@@ -0,0 +1,1441 @@
+/* Generated by Yosys 0.8+415 (git sha1 3333e002, clang 9.0.0 -fPIC -Os) */
+
+module module11(y, clk, wire16, wire15, wire14, wire13, wire12);
+ wire _00_;
+ wire _01_;
+ wire _02_;
+ wire _03_;
+ wire _04_;
+ wire _05_;
+ wire _06_;
+ wire _07_;
+ wire _08_;
+ wire _09_;
+ wire _10_;
+ wire _11_;
+ wire _12_;
+ wire _13_;
+ wire _14_;
+ wire _15_;
+ wire _16_;
+ wire _17_;
+ wire _18_;
+ wire _19_;
+ wire _20_;
+ wire _21_;
+ wire _22_;
+ wire _23_;
+ wire _24_;
+ wire _25_;
+ input clk;
+ input [10:0] wire12;
+ input [14:0] wire13;
+ input [17:0] wire14;
+ input [4:0] wire15;
+ input [2:0] wire16;
+ wire [1:0] wire17;
+ wire [1:0] wire18;
+ wire [3:0] wire19;
+ wire wire20;
+ wire wire21;
+ output [64:0] y;
+ assign _00_ = wire12[2] | wire12[3];
+ assign _01_ = wire12[0] | wire12[1];
+ assign _02_ = _01_ | _00_;
+ assign _03_ = _02_ | wire15[4];
+ assign _04_ = _01_ | wire12[2];
+ assign _05_ = _04_ ^ wire12[3];
+ assign _06_ = _05_ | wire15[3];
+ assign _07_ = _01_ ^ wire12[2];
+ assign _08_ = _07_ | wire15[2];
+ assign _09_ = _08_ | _06_;
+ assign _10_ = wire12[0] ^ wire12[1];
+ assign _11_ = _10_ | wire15[1];
+ assign _12_ = wire15[0] | wire12[0];
+ assign _13_ = _12_ | _11_;
+ assign _14_ = _13_ | _09_;
+ assign wire21 = _14_ | _03_;
+ assign _15_ = ~(wire12[9] | wire12[10]);
+ assign _16_ = wire12[7] | wire12[8];
+ assign _17_ = _15_ & ~(_16_);
+ assign _18_ = wire12[5] | wire12[6];
+ assign _19_ = wire12[3] | wire12[4];
+ assign _20_ = _19_ | _18_;
+ assign _21_ = _17_ & ~(_20_);
+ assign _22_ = wire12[1] | wire12[2];
+ assign _23_ = _22_ | wire12[0];
+ assign wire20 = _21_ & ~(_23_);
+ assign _25_ = wire21;
+ assign _24_ = wire20;
+ assign wire17 = wire14[1:0];
+ assign wire18 = wire14[1:0];
+ assign wire19 = wire12[3:0];
+ assign y = { 11'h000, wire21, 12'h000, wire20, 4'h0, wire12[3:0], 16'h0000, wire14[1:0], 11'h000, wire14[1:0], 1'h0 };
+endmodule
+
+module top(y, clk, wire0, wire1, wire2, wire3);
+ wire [18:0] _0000_;
+ wire _0001_;
+ wire _0002_;
+ wire _0003_;
+ wire _0004_;
+ wire _0005_;
+ wire _0006_;
+ wire _0007_;
+ wire _0008_;
+ wire _0009_;
+ wire _0010_;
+ wire _0011_;
+ wire _0012_;
+ wire _0013_;
+ wire _0014_;
+ wire _0015_;
+ wire _0016_;
+ wire _0017_;
+ wire _0018_;
+ wire _0019_;
+ wire _0020_;
+ wire _0021_;
+ wire _0022_;
+ wire _0023_;
+ wire _0024_;
+ wire _0025_;
+ wire _0026_;
+ wire _0027_;
+ wire _0028_;
+ wire _0029_;
+ wire _0030_;
+ wire _0031_;
+ wire _0032_;
+ wire _0033_;
+ wire _0034_;
+ wire _0035_;
+ wire _0036_;
+ wire _0037_;
+ wire _0038_;
+ wire _0039_;
+ wire _0040_;
+ wire _0041_;
+ wire _0042_;
+ wire _0043_;
+ wire _0044_;
+ wire _0045_;
+ wire _0046_;
+ wire _0047_;
+ wire _0048_;
+ wire _0049_;
+ wire _0050_;
+ wire _0051_;
+ wire _0052_;
+ wire _0053_;
+ wire _0054_;
+ wire _0055_;
+ wire _0056_;
+ wire _0057_;
+ wire _0058_;
+ wire _0059_;
+ wire _0060_;
+ wire _0061_;
+ wire _0062_;
+ wire _0063_;
+ wire _0064_;
+ wire _0065_;
+ wire _0066_;
+ wire _0067_;
+ wire _0068_;
+ wire _0069_;
+ wire _0070_;
+ wire _0071_;
+ wire _0072_;
+ wire _0073_;
+ wire _0074_;
+ wire _0075_;
+ wire _0076_;
+ wire _0077_;
+ wire _0078_;
+ wire _0079_;
+ wire _0080_;
+ wire _0081_;
+ wire _0082_;
+ wire _0083_;
+ wire _0084_;
+ wire _0085_;
+ wire _0086_;
+ wire _0087_;
+ wire _0088_;
+ wire _0089_;
+ wire _0090_;
+ wire _0091_;
+ wire _0092_;
+ wire _0093_;
+ wire _0094_;
+ wire _0095_;
+ wire _0096_;
+ wire _0097_;
+ wire _0098_;
+ wire _0099_;
+ wire _0100_;
+ wire _0101_;
+ wire _0102_;
+ wire _0103_;
+ wire _0104_;
+ wire _0105_;
+ wire _0106_;
+ wire _0107_;
+ wire _0108_;
+ wire _0109_;
+ wire _0110_;
+ wire _0111_;
+ wire _0112_;
+ wire _0113_;
+ wire _0114_;
+ wire _0115_;
+ wire _0116_;
+ wire _0117_;
+ wire _0118_;
+ wire _0119_;
+ wire _0120_;
+ wire _0121_;
+ wire _0122_;
+ wire _0123_;
+ wire _0124_;
+ wire _0125_;
+ wire _0126_;
+ wire _0127_;
+ wire _0128_;
+ wire _0129_;
+ wire _0130_;
+ wire _0131_;
+ wire _0132_;
+ wire _0133_;
+ wire _0134_;
+ wire _0135_;
+ wire _0136_;
+ wire _0137_;
+ wire _0138_;
+ wire _0139_;
+ wire _0140_;
+ wire _0141_;
+ wire _0142_;
+ wire _0143_;
+ wire _0144_;
+ wire _0145_;
+ wire _0146_;
+ wire _0147_;
+ wire _0148_;
+ wire _0149_;
+ wire _0150_;
+ wire _0151_;
+ wire _0152_;
+ wire _0153_;
+ wire _0154_;
+ wire _0155_;
+ wire _0156_;
+ wire _0157_;
+ wire _0158_;
+ wire _0159_;
+ wire _0160_;
+ wire _0161_;
+ wire _0162_;
+ wire _0163_;
+ wire _0164_;
+ wire _0165_;
+ wire _0166_;
+ wire _0167_;
+ wire _0168_;
+ wire _0169_;
+ wire _0170_;
+ wire _0171_;
+ wire _0172_;
+ wire _0173_;
+ wire _0174_;
+ wire _0175_;
+ wire _0176_;
+ wire _0177_;
+ wire _0178_;
+ wire _0179_;
+ wire _0180_;
+ wire _0181_;
+ wire _0182_;
+ wire _0183_;
+ wire _0184_;
+ wire _0185_;
+ wire _0186_;
+ wire _0187_;
+ wire _0188_;
+ wire _0189_;
+ wire _0190_;
+ wire _0191_;
+ wire _0192_;
+ wire _0193_;
+ wire _0194_;
+ wire _0195_;
+ wire _0196_;
+ wire _0197_;
+ wire _0198_;
+ wire _0199_;
+ wire _0200_;
+ wire _0201_;
+ wire _0202_;
+ wire _0203_;
+ wire _0204_;
+ wire _0205_;
+ wire _0206_;
+ wire _0207_;
+ wire _0208_;
+ wire _0209_;
+ wire _0210_;
+ wire _0211_;
+ wire _0212_;
+ wire _0213_;
+ wire _0214_;
+ wire _0215_;
+ wire _0216_;
+ wire _0217_;
+ wire _0218_;
+ wire _0219_;
+ wire _0220_;
+ wire _0221_;
+ wire _0222_;
+ wire _0223_;
+ wire _0224_;
+ wire _0225_;
+ wire _0226_;
+ wire _0227_;
+ wire _0228_;
+ wire _0229_;
+ wire _0230_;
+ wire _0231_;
+ wire _0232_;
+ wire _0233_;
+ wire _0234_;
+ wire _0235_;
+ wire _0236_;
+ wire _0237_;
+ wire _0238_;
+ wire _0239_;
+ wire _0240_;
+ wire _0241_;
+ wire _0242_;
+ wire _0243_;
+ wire _0244_;
+ wire _0245_;
+ wire _0246_;
+ wire _0247_;
+ wire _0248_;
+ wire _0249_;
+ wire _0250_;
+ wire _0251_;
+ wire _0252_;
+ wire _0253_;
+ wire _0254_;
+ wire _0255_;
+ wire _0256_;
+ wire _0257_;
+ wire _0258_;
+ wire _0259_;
+ wire _0260_;
+ wire _0261_;
+ wire _0262_;
+ wire _0263_;
+ wire _0264_;
+ wire _0265_;
+ wire _0266_;
+ wire _0267_;
+ wire _0268_;
+ wire _0269_;
+ wire _0270_;
+ wire _0271_;
+ wire _0272_;
+ wire _0273_;
+ wire _0274_;
+ wire _0275_;
+ wire _0276_;
+ wire _0277_;
+ wire _0278_;
+ wire _0279_;
+ wire _0280_;
+ wire _0281_;
+ wire _0282_;
+ wire _0283_;
+ wire _0284_;
+ wire _0285_;
+ wire _0286_;
+ wire _0287_;
+ wire _0288_;
+ wire _0289_;
+ wire _0290_;
+ wire _0291_;
+ wire _0292_;
+ wire _0293_;
+ wire _0294_;
+ wire _0295_;
+ wire _0296_;
+ wire _0297_;
+ wire _0298_;
+ wire _0299_;
+ wire _0300_;
+ wire _0301_;
+ wire _0302_;
+ wire _0303_;
+ wire _0304_;
+ wire _0305_;
+ wire _0306_;
+ wire _0307_;
+ wire _0308_;
+ wire _0309_;
+ wire _0310_;
+ wire _0311_;
+ wire _0312_;
+ wire _0313_;
+ wire _0314_;
+ wire _0315_;
+ wire _0316_;
+ wire _0317_;
+ wire _0318_;
+ wire _0319_;
+ wire _0320_;
+ wire _0321_;
+ wire _0322_;
+ wire _0323_;
+ wire _0324_;
+ wire _0325_;
+ wire _0326_;
+ wire _0327_;
+ wire _0328_;
+ wire _0329_;
+ wire _0330_;
+ wire _0331_;
+ wire _0332_;
+ wire _0333_;
+ wire _0334_;
+ wire _0335_;
+ wire _0336_;
+ wire _0337_;
+ wire _0338_;
+ wire _0339_;
+ wire _0340_;
+ wire _0341_;
+ wire _0342_;
+ wire _0343_;
+ wire _0344_;
+ wire _0345_;
+ wire _0346_;
+ wire _0347_;
+ wire _0348_;
+ wire _0349_;
+ wire _0350_;
+ wire _0351_;
+ wire _0352_;
+ wire _0353_;
+ wire _0354_;
+ wire _0355_;
+ wire _0356_;
+ wire _0357_;
+ wire _0358_;
+ wire _0359_;
+ wire _0360_;
+ wire _0361_;
+ wire _0362_;
+ wire _0363_;
+ wire _0364_;
+ wire _0365_;
+ wire _0366_;
+ wire _0367_;
+ wire _0368_;
+ wire _0369_;
+ wire _0370_;
+ wire _0371_;
+ wire _0372_;
+ wire _0373_;
+ wire _0374_;
+ wire _0375_;
+ wire _0376_;
+ wire _0377_;
+ wire _0378_;
+ wire _0379_;
+ wire _0380_;
+ wire _0381_;
+ wire _0382_;
+ wire _0383_;
+ wire _0384_;
+ wire _0385_;
+ wire _0386_;
+ wire _0387_;
+ wire _0388_;
+ wire _0389_;
+ wire _0390_;
+ wire _0391_;
+ wire _0392_;
+ wire _0393_;
+ wire _0394_;
+ wire _0395_;
+ wire _0396_;
+ wire _0397_;
+ wire _0398_;
+ wire _0399_;
+ wire _0400_;
+ wire _0401_;
+ wire _0402_;
+ wire _0403_;
+ wire _0404_;
+ wire _0405_;
+ wire _0406_;
+ wire _0407_;
+ wire _0408_;
+ wire _0409_;
+ wire _0410_;
+ wire _0411_;
+ wire _0412_;
+ wire _0413_;
+ wire _0414_;
+ wire _0415_;
+ wire _0416_;
+ wire _0417_;
+ wire _0418_;
+ wire _0419_;
+ wire _0420_;
+ wire _0421_;
+ wire _0422_;
+ wire _0423_;
+ wire _0424_;
+ wire _0425_;
+ wire _0426_;
+ wire _0427_;
+ wire _0428_;
+ wire _0429_;
+ wire _0430_;
+ wire _0431_;
+ wire _0432_;
+ wire _0433_;
+ wire _0434_;
+ wire _0435_;
+ wire _0436_;
+ wire _0437_;
+ wire _0438_;
+ wire _0439_;
+ wire _0440_;
+ wire _0441_;
+ wire _0442_;
+ wire _0443_;
+ wire _0444_;
+ wire _0445_;
+ wire _0446_;
+ wire _0447_;
+ wire _0448_;
+ wire _0449_;
+ wire _0450_;
+ wire _0451_;
+ wire _0452_;
+ wire _0453_;
+ wire _0454_;
+ wire _0455_;
+ wire _0456_;
+ wire _0457_;
+ wire _0458_;
+ wire _0459_;
+ wire _0460_;
+ wire _0461_;
+ wire _0462_;
+ wire _0463_;
+ wire _0464_;
+ wire _0465_;
+ wire _0466_;
+ wire _0467_;
+ wire _0468_;
+ wire _0469_;
+ wire _0470_;
+ wire _0471_;
+ wire _0472_;
+ wire _0473_;
+ wire _0474_;
+ wire _0475_;
+ wire _0476_;
+ wire _0477_;
+ wire _0478_;
+ wire _0479_;
+ wire _0480_;
+ wire _0481_;
+ wire _0482_;
+ wire _0483_;
+ wire _0484_;
+ wire _0485_;
+ wire _0486_;
+ wire _0487_;
+ wire _0488_;
+ wire _0489_;
+ wire _0490_;
+ wire _0491_;
+ wire _0492_;
+ wire _0493_;
+ wire _0494_;
+ wire _0495_;
+ wire _0496_;
+ wire _0497_;
+ wire _0498_;
+ wire _0499_;
+ wire _0500_;
+ wire _0501_;
+ wire _0502_;
+ wire _0503_;
+ wire _0504_;
+ wire _0505_;
+ wire _0506_;
+ wire _0507_;
+ wire _0508_;
+ wire _0509_;
+ wire _0510_;
+ wire _0511_;
+ wire _0512_;
+ wire _0513_;
+ wire _0514_;
+ wire _0515_;
+ wire _0516_;
+ wire _0517_;
+ wire _0518_;
+ wire _0519_;
+ wire _0520_;
+ wire _0521_;
+ wire _0522_;
+ wire _0523_;
+ wire _0524_;
+ wire _0525_;
+ wire _0526_;
+ wire _0527_;
+ wire _0528_;
+ wire _0529_;
+ wire _0530_;
+ wire _0531_;
+ wire _0532_;
+ wire _0533_;
+ wire _0534_;
+ wire _0535_;
+ wire _0536_;
+ wire _0537_;
+ wire _0538_;
+ wire _0539_;
+ wire _0540_;
+ wire _0541_;
+ wire _0542_;
+ wire _0543_;
+ wire _0544_;
+ wire _0545_;
+ wire _0546_;
+ wire _0547_;
+ wire _0548_;
+ wire _0549_;
+ wire _0550_;
+ wire _0551_;
+ wire _0552_;
+ wire _0553_;
+ wire _0554_;
+ wire _0555_;
+ wire _0556_;
+ wire _0557_;
+ wire _0558_;
+ wire _0559_;
+ wire _0560_;
+ wire _0561_;
+ wire _0562_;
+ wire _0563_;
+ wire _0564_;
+ wire _0565_;
+ wire _0566_;
+ wire _0567_;
+ wire _0568_;
+ wire _0569_;
+ wire _0570_;
+ wire _0571_;
+ wire _0572_;
+ wire _0573_;
+ wire _0574_;
+ wire _0575_;
+ wire _0576_;
+ wire _0577_;
+ wire _0578_;
+ wire _0579_;
+ wire _0580_;
+ wire [11:0] _0581_;
+ wire [11:0] _0582_;
+ wire [61:0] _0583_;
+ wire [10:0] _0584_;
+ input clk;
+ wire [14:0] reg4;
+ reg [3:0] reg5 = 4'h0;
+ wire [20:0] reg6;
+ reg [18:0] reg7 = 19'h00000;
+ wire [13:0] reg8;
+ input [17:0] wire0;
+ input [10:0] wire1;
+ wire [14:0] wire10;
+ input [13:0] wire2;
+ wire [2:0] wire22;
+ wire [19:0] wire24;
+ wire wire25;
+ wire [5:0] wire26;
+ wire [11:0] wire27;
+ wire wire28;
+ wire [9:0] wire29;
+ input [8:0] wire3;
+ wire [11:0] wire9;
+ output [183:0] y;
+ assign _0022_ = reg4[1] | ~(reg4[0]);
+ assign _0023_ = reg4[3] | reg4[2];
+ assign _0024_ = _0023_ | _0022_;
+ assign _0025_ = reg4[5] | reg4[4];
+ assign _0026_ = reg4[7] | ~(reg4[6]);
+ assign _0027_ = _0026_ | _0025_;
+ assign _0028_ = _0027_ | _0024_;
+ assign _0029_ = reg4[9] | reg4[8];
+ assign _0030_ = _0029_ | reg4[10];
+ assign y[165] = _0030_ | _0028_;
+ assign _0031_ = reg5[1] ^ reg5[0];
+ assign _0032_ = ~(reg5[3] ^ reg5[2]);
+ assign wire28 = _0032_ ^ _0031_;
+ assign _0033_ = reg4[0] ^ reg4[1];
+ assign _0034_ = ~(reg4[3] ^ reg4[2]);
+ assign _0035_ = _0034_ ^ _0033_;
+ assign _0036_ = reg4[5] ^ reg4[4];
+ assign _0037_ = reg4[6] | ~(reg4[7]);
+ assign _0038_ = _0037_ & _0026_;
+ assign _0039_ = _0038_ ^ _0036_;
+ assign _0040_ = _0039_ ^ _0035_;
+ assign _0041_ = ~(reg4[9] ^ reg4[8]);
+ assign _0042_ = _0041_ ^ _0040_;
+ assign _0001_ = _0042_ ^ reg4[10];
+ assign _0043_ = ~(wire0[17] | wire0[16]);
+ assign _0044_ = wire0[15] | wire0[14];
+ assign _0045_ = _0043_ & ~(_0044_);
+ assign _0046_ = wire0[13] | wire0[12];
+ assign _0047_ = ~(wire0[11] | wire0[10]);
+ assign _0048_ = _0046_ | ~(_0047_);
+ assign _0049_ = _0048_ | ~(_0045_);
+ assign _0050_ = wire0[9] | wire0[8];
+ assign _0051_ = wire0[7] | wire0[6];
+ assign _0052_ = ~(_0051_ | _0050_);
+ assign _0053_ = ~(wire0[5] | wire0[4]);
+ assign _0054_ = ~(wire0[3] | wire0[2]);
+ assign _0055_ = _0054_ & _0053_;
+ assign _0056_ = _0055_ & _0052_;
+ assign _0057_ = _0056_ & ~(_0049_);
+ assign _0058_ = wire0[1] | wire0[0];
+ assign wire10[14] = _0057_ & ~(_0058_);
+ assign _0059_ = ~(wire1[1] | wire1[0]);
+ assign _0060_ = wire1[3] | wire1[2];
+ assign _0061_ = _0059_ & ~(_0060_);
+ assign _0062_ = wire1[5] | wire1[4];
+ assign _0063_ = wire1[7] | wire1[6];
+ assign _0064_ = _0063_ | _0062_;
+ assign _0065_ = _0061_ & ~(_0064_);
+ assign _0066_ = wire1[9] | wire1[8];
+ assign _0067_ = _0066_ | wire1[10];
+ assign _0068_ = _0065_ & ~(_0067_);
+ assign _0069_ = _0068_ ? reg7[0] : reg5[0];
+ assign _0070_ = _0068_ ? reg7[1] : reg5[1];
+ assign _0071_ = ~(_0070_ | _0069_);
+ assign _0072_ = _0068_ ? reg7[2] : reg5[2];
+ assign _0073_ = _0068_ ? reg7[3] : reg5[3];
+ assign _0074_ = _0073_ | _0072_;
+ assign _0075_ = _0071_ & ~(_0074_);
+ assign _0076_ = ~((reg7[5] | reg7[4]) & _0068_);
+ assign _0077_ = ~((reg7[7] | reg7[6]) & _0068_);
+ assign _0078_ = ~(_0077_ & _0076_);
+ assign _0079_ = _0075_ & ~(_0078_);
+ assign _0080_ = ~((reg7[9] | reg7[8]) & _0068_);
+ assign _0081_ = ~((reg7[11] | reg7[10]) & _0068_);
+ assign _0082_ = ~(_0081_ & _0080_);
+ assign _0083_ = ~((reg7[13] | reg7[12]) & _0068_);
+ assign _0084_ = ~((reg7[15] | reg7[14]) & _0068_);
+ assign _0085_ = ~(_0084_ & _0083_);
+ assign _0086_ = _0085_ | _0082_;
+ assign _0087_ = _0079_ & ~(_0086_);
+ assign _0088_ = ~((reg7[17] | reg7[16]) & _0068_);
+ assign _0089_ = ~(_0068_ & reg7[18]);
+ assign _0090_ = ~(_0089_ & _0088_);
+ assign _0091_ = _0087_ & ~(_0090_);
+ assign _0092_ = _0054_ & ~(_0058_);
+ assign _0093_ = _0051_ | ~(_0053_);
+ assign _0094_ = _0092_ & ~(_0093_);
+ assign _0095_ = _0050_ | ~(_0047_);
+ assign _0096_ = _0046_ | _0044_;
+ assign _0097_ = _0096_ | _0095_;
+ assign _0098_ = _0094_ & ~(_0097_);
+ assign _0099_ = ~(wire22[1] | wire22[0]);
+ assign _0100_ = _0099_ & ~(wire22[2]);
+ assign _0101_ = ~((_0098_ & _0043_) | _0100_);
+ assign _0102_ = _0091_ ? reg4[2] : _0101_;
+ assign y[106] = _0068_ ? wire0[0] : _0102_;
+ assign _0103_ = ~reg4[3];
+ assign _0104_ = _0091_ & ~(_0103_);
+ assign y[107] = _0068_ ? wire0[1] : _0104_;
+ assign y[108] = _0068_ & wire0[2];
+ assign y[109] = _0068_ & wire0[3];
+ assign _0105_ = ~wire0[4];
+ assign y[110] = _0068_ & ~(_0105_);
+ assign _0106_ = ~wire0[5];
+ assign y[111] = _0068_ & ~(_0106_);
+ assign _0107_ = ~wire0[6];
+ assign y[112] = _0068_ & ~(_0107_);
+ assign _0108_ = ~wire0[7];
+ assign y[113] = _0068_ & ~(_0108_);
+ assign _0109_ = ~wire0[8];
+ assign y[114] = _0068_ & ~(_0109_);
+ assign _0110_ = ~wire0[9];
+ assign y[115] = _0068_ & ~(_0110_);
+ assign _0111_ = ~wire0[10];
+ assign y[116] = _0068_ & ~(_0111_);
+ assign _0112_ = ~wire0[11];
+ assign y[117] = _0068_ & ~(_0112_);
+ assign _0113_ = ~wire0[12];
+ assign y[118] = _0068_ & ~(_0113_);
+ assign y[119] = _0068_ & wire0[13];
+ assign y[120] = _0068_ & wire0[14];
+ assign y[121] = _0068_ & wire0[15];
+ assign y[122] = _0068_ & wire0[16];
+ assign y[125] = _0068_ & wire0[17];
+ assign _0114_ = ~(reg5[3] | reg5[2]);
+ assign _0115_ = reg5[1] | reg5[0];
+ assign wire25 = _0114_ & ~(_0115_);
+ assign _0116_ = ~(wire0[3] ^ wire0[2]);
+ assign y[167] = ~_0116_;
+ assign y[168] = _0054_ ^ _0105_;
+ assign _0117_ = _0054_ & ~(wire0[4]);
+ assign y[169] = _0117_ ^ _0106_;
+ assign y[170] = _0055_ ^ _0107_;
+ assign _0118_ = _0055_ & ~(wire0[6]);
+ assign y[171] = _0118_ ^ _0108_;
+ assign _0119_ = _0055_ & ~(_0051_);
+ assign y[172] = _0119_ ^ _0109_;
+ assign _0120_ = _0119_ & ~(wire0[8]);
+ assign y[173] = _0120_ ^ _0110_;
+ assign y[174] = _0056_ ^ _0111_;
+ assign _0121_ = _0056_ & ~(wire0[10]);
+ assign y[175] = _0121_ ^ _0112_;
+ assign _0122_ = _0056_ & _0047_;
+ assign y[176] = _0122_ ^ _0113_;
+ assign _0123_ = ~(wire3[1] ^ wire1[1]);
+ assign _0124_ = wire3[0] & wire1[0];
+ assign wire9[1] = ~(_0124_ ^ _0123_);
+ assign _0125_ = ~(wire3[2] ^ wire1[2]);
+ assign _0126_ = _0124_ & ~(_0123_);
+ assign _0127_ = ~((wire3[1] & wire1[1]) | _0126_);
+ assign wire9[2] = _0127_ ^ _0125_;
+ assign _0128_ = ~(wire3[3] ^ wire1[3]);
+ assign _0129_ = wire3[2] & wire1[2];
+ assign _0130_ = ~_0129_;
+ assign _0131_ = ~((_0127_ | _0125_) & _0130_);
+ assign wire9[3] = ~(_0131_ ^ _0128_);
+ assign _0132_ = ~(wire3[4] ^ wire1[4]);
+ assign _0133_ = _0129_ & ~(_0128_);
+ assign _0134_ = ~((wire3[3] & wire1[3]) | _0133_);
+ assign _0135_ = ~(_0128_ | _0125_);
+ assign _0136_ = _0135_ & ~(_0127_);
+ assign _0137_ = _0134_ & ~(_0136_);
+ assign wire9[4] = _0137_ ^ _0132_;
+ assign _0138_ = ~(wire3[5] ^ wire1[5]);
+ assign _0139_ = wire3[4] & wire1[4];
+ assign _0140_ = ~_0139_;
+ assign _0141_ = ~((_0137_ | _0132_) & _0140_);
+ assign y[24] = ~(_0141_ ^ _0138_);
+ assign _0142_ = ~(wire3[6] ^ wire1[6]);
+ assign _0143_ = wire3[5] & wire1[5];
+ assign _0144_ = _0139_ & ~(_0138_);
+ assign _0145_ = ~(_0144_ | _0143_);
+ assign _0146_ = ~(_0138_ | _0132_);
+ assign _0147_ = _0146_ & ~(_0137_);
+ assign _0148_ = _0145_ & ~(_0147_);
+ assign y[25] = _0148_ ^ _0142_;
+ assign _0149_ = ~(wire3[7] ^ wire1[7]);
+ assign _0150_ = wire3[6] & wire1[6];
+ assign _0151_ = ~_0150_;
+ assign _0152_ = ~((_0148_ | _0142_) & _0151_);
+ assign y[26] = ~(_0152_ ^ _0149_);
+ assign _0153_ = ~(wire3[8] ^ wire1[8]);
+ assign _0154_ = _0150_ & ~(_0149_);
+ assign _0155_ = ~((wire3[7] & wire1[7]) | _0154_);
+ assign _0156_ = ~(_0149_ | _0142_);
+ assign _0157_ = ~_0156_;
+ assign _0158_ = ~((_0157_ | _0145_) & _0155_);
+ assign _0159_ = _0156_ & _0146_;
+ assign _0160_ = _0159_ & ~(_0137_);
+ assign _0161_ = ~(_0160_ | _0158_);
+ assign y[27] = _0161_ ^ _0153_;
+ assign _0162_ = wire3[8] & wire1[8];
+ assign _0163_ = _0161_ | _0153_;
+ assign _0164_ = _0163_ & ~(_0162_);
+ assign y[28] = ~(_0164_ ^ wire1[9]);
+ assign _0165_ = wire1[9] & ~(_0153_);
+ assign _0166_ = _0165_ & ~(_0161_);
+ assign _0167_ = ~((_0162_ & wire1[9]) | _0166_);
+ assign y[29] = ~(_0167_ ^ wire1[10]);
+ assign wire9[0] = wire3[0] ^ wire1[0];
+ assign y[30] = wire1[10] & ~(_0167_);
+ assign _0168_ = ~((wire3[2] & wire0[17]) | (wire3[1] & wire0[16]));
+ assign _0169_ = ~((wire3[0] & wire0[15]) | (wire0[14] & reg4[10]));
+ assign _0170_ = ~(_0169_ & _0168_);
+ assign _0171_ = ~((wire0[13] | wire0[12]) & reg4[10]);
+ assign _0172_ = ~((wire0[11] | wire0[10]) & reg4[10]);
+ assign _0173_ = ~(_0172_ & _0171_);
+ assign _0174_ = _0173_ | _0170_;
+ assign _0175_ = ~((wire0[9] & reg4[9]) | (wire0[8] & reg4[8]));
+ assign _0176_ = ~((wire0[7] & reg4[7]) | (wire0[6] & reg4[6]));
+ assign _0177_ = ~(_0176_ & _0175_);
+ assign _0178_ = ~((wire0[5] & reg4[5]) | (wire0[4] & reg4[4]));
+ assign _0179_ = ~((wire0[3] & reg4[3]) | (wire0[2] & reg4[2]));
+ assign _0180_ = ~(_0179_ & _0178_);
+ assign _0181_ = _0180_ | _0177_;
+ assign _0182_ = _0181_ | _0174_;
+ assign _0183_ = ~(wire0[1] & reg4[1]);
+ assign _0184_ = ~(reg4[3] & reg4[2]);
+ assign _0185_ = _0184_ | _0022_;
+ assign _0186_ = reg4[5] | ~(reg4[4]);
+ assign _0187_ = _0037_ | _0186_;
+ assign _0188_ = _0187_ | _0185_;
+ assign _0189_ = _0188_ | _0030_;
+ assign _0190_ = ~((reg4[0] & wire0[0]) | _0189_);
+ assign _0191_ = ~(_0190_ & _0183_);
+ assign _0192_ = _0191_ | _0182_;
+ assign _0193_ = ~wire3[6];
+ assign _0194_ = reg5[0] ? reg4[6] : _0193_;
+ assign _0195_ = ~reg4[10];
+ assign _0196_ = ~(wire3[1] & reg5[0]);
+ assign _0197_ = ~(wire3[0] & reg5[1]);
+ assign _0198_ = _0197_ ^ _0196_;
+ assign _0199_ = ~((wire3[0] & reg5[0]) | _0198_);
+ assign _0200_ = ~(wire3[2] & reg5[0]);
+ assign _0201_ = ~(wire3[1] & reg5[1]);
+ assign _0202_ = _0201_ ^ _0200_;
+ assign _0203_ = _0197_ | _0196_;
+ assign _0204_ = ~(_0203_ ^ _0202_);
+ assign _0205_ = wire3[0] & reg5[2];
+ assign _0206_ = _0205_ ^ _0204_;
+ assign _0207_ = wire3[0] & reg5[3];
+ assign _0208_ = wire3[3] & reg5[0];
+ assign _0209_ = _0208_ ^ _0207_;
+ assign _0210_ = wire3[2] & reg5[1];
+ assign _0211_ = _0210_ ^ _0209_;
+ assign _0212_ = ~(_0201_ | _0200_);
+ assign _0213_ = _0212_ ^ _0211_;
+ assign _0214_ = wire3[1] & reg5[2];
+ assign _0215_ = ~(_0214_ ^ _0213_);
+ assign _0216_ = _0202_ & ~(_0203_);
+ assign _0217_ = ~((_0205_ & _0204_) | _0216_);
+ assign _0218_ = _0217_ ^ _0215_;
+ assign _0219_ = _0218_ | _0206_;
+ assign _0220_ = _0199_ & ~(_0219_);
+ assign _0221_ = wire3[1] & reg5[3];
+ assign _0222_ = wire3[4] & reg5[0];
+ assign _0223_ = _0222_ ^ _0221_;
+ assign _0224_ = wire3[3] & reg5[1];
+ assign _0225_ = _0224_ ^ _0223_;
+ assign _0226_ = _0208_ & _0207_;
+ assign _0227_ = ~((_0210_ & _0209_) | _0226_);
+ assign _0228_ = ~(_0227_ ^ _0225_);
+ assign _0229_ = wire3[2] & reg5[2];
+ assign _0230_ = _0229_ ^ _0228_;
+ assign _0231_ = _0212_ & _0211_;
+ assign _0232_ = ~((_0214_ & _0213_) | _0231_);
+ assign _0233_ = ~(_0232_ ^ _0230_);
+ assign _0234_ = _0217_ | _0215_;
+ assign _0235_ = ~(_0234_ ^ _0233_);
+ assign _0236_ = wire3[2] & reg5[3];
+ assign _0237_ = wire3[5] & reg5[0];
+ assign _0238_ = _0237_ ^ _0236_;
+ assign _0239_ = wire3[4] & reg5[1];
+ assign _0240_ = _0239_ ^ _0238_;
+ assign _0241_ = _0222_ & _0221_;
+ assign _0242_ = ~((_0224_ & _0223_) | _0241_);
+ assign _0243_ = ~(_0242_ ^ _0240_);
+ assign _0244_ = wire3[3] & reg5[2];
+ assign _0245_ = _0244_ ^ _0243_;
+ assign _0246_ = _0225_ & ~(_0227_);
+ assign _0247_ = ~((_0229_ & _0228_) | _0246_);
+ assign _0248_ = ~(_0247_ ^ _0245_);
+ assign _0249_ = ~_0234_;
+ assign _0250_ = _0230_ & ~(_0232_);
+ assign _0251_ = ~((_0249_ & _0233_) | _0250_);
+ assign _0252_ = ~(_0251_ ^ _0248_);
+ assign _0253_ = _0252_ | _0235_;
+ assign _0254_ = wire3[3] & reg5[3];
+ assign _0255_ = wire3[6] & reg5[0];
+ assign _0256_ = _0255_ ^ _0254_;
+ assign _0257_ = wire3[5] & reg5[1];
+ assign _0258_ = _0257_ ^ _0256_;
+ assign _0259_ = _0237_ & _0236_;
+ assign _0260_ = ~((_0239_ & _0238_) | _0259_);
+ assign _0261_ = ~(_0260_ ^ _0258_);
+ assign _0262_ = wire3[4] & reg5[2];
+ assign _0263_ = _0262_ ^ _0261_;
+ assign _0264_ = _0240_ & ~(_0242_);
+ assign _0265_ = ~((_0244_ & _0243_) | _0264_);
+ assign _0266_ = ~(_0265_ ^ _0263_);
+ assign _0267_ = _0245_ & ~(_0247_);
+ assign _0268_ = ~((_0250_ & _0248_) | _0267_);
+ assign _0269_ = ~(_0248_ & _0233_);
+ assign _0270_ = ~((_0269_ | _0234_) & _0268_);
+ assign _0271_ = _0270_ ^ _0266_;
+ assign _0272_ = wire3[4] & reg5[3];
+ assign _0273_ = wire3[7] & reg5[0];
+ assign _0274_ = _0273_ ^ _0272_;
+ assign _0275_ = wire3[6] & reg5[1];
+ assign _0276_ = _0275_ ^ _0274_;
+ assign _0277_ = _0255_ & _0254_;
+ assign _0278_ = ~((_0257_ & _0256_) | _0277_);
+ assign _0279_ = ~(_0278_ ^ _0276_);
+ assign _0280_ = wire3[5] & reg5[2];
+ assign _0281_ = _0280_ ^ _0279_;
+ assign _0282_ = _0258_ & ~(_0260_);
+ assign _0283_ = ~((_0262_ & _0261_) | _0282_);
+ assign _0284_ = _0283_ ^ _0281_;
+ assign _0285_ = _0263_ & ~(_0265_);
+ assign _0286_ = ~((_0270_ & _0266_) | _0285_);
+ assign _0287_ = _0286_ ^ _0284_;
+ assign _0288_ = _0287_ | _0271_;
+ assign _0289_ = _0288_ | _0253_;
+ assign _0290_ = _0220_ & ~(_0289_);
+ assign _0291_ = ~(wire3[5] & reg5[3]);
+ assign _0292_ = wire3[8] & reg5[0];
+ assign _0293_ = _0292_ ^ _0291_;
+ assign _0294_ = wire3[7] & reg5[1];
+ assign _0295_ = _0294_ ^ _0293_;
+ assign _0296_ = _0273_ & _0272_;
+ assign _0297_ = ~((_0275_ & _0274_) | _0296_);
+ assign _0298_ = _0297_ ^ _0295_;
+ assign _0299_ = wire3[6] & reg5[2];
+ assign _0300_ = _0299_ ^ _0298_;
+ assign _0301_ = _0276_ & ~(_0278_);
+ assign _0302_ = ~((_0280_ & _0279_) | _0301_);
+ assign _0303_ = _0302_ ^ _0300_;
+ assign _0304_ = _0283_ | ~(_0281_);
+ assign _0305_ = _0285_ & ~(_0284_);
+ assign _0306_ = _0304_ & ~(_0305_);
+ assign _0307_ = _0284_ | ~(_0266_);
+ assign _0308_ = ~((_0307_ | _0268_) & _0306_);
+ assign _0309_ = ~(_0307_ | _0269_);
+ assign _0310_ = ~((_0309_ & _0249_) | _0308_);
+ assign _0311_ = _0310_ ^ _0303_;
+ assign _0312_ = _0290_ & ~(_0311_);
+ assign _0313_ = _0312_ & ~(_0195_);
+ assign _0314_ = _0312_ ? reg4[0] : wire1[0];
+ assign _0315_ = _0312_ ? reg4[1] : wire1[1];
+ assign _0316_ = _0315_ | _0314_;
+ assign _0317_ = _0312_ ? reg4[2] : wire1[2];
+ assign _0318_ = _0312_ ? reg4[3] : wire1[3];
+ assign _0319_ = _0318_ | _0317_;
+ assign _0320_ = _0319_ | _0316_;
+ assign _0321_ = _0312_ ? reg4[4] : wire1[4];
+ assign _0322_ = _0312_ ? reg4[5] : wire1[5];
+ assign _0323_ = _0322_ | _0321_;
+ assign _0324_ = _0312_ ? reg4[6] : wire1[6];
+ assign _0325_ = _0312_ ? reg4[7] : wire1[7];
+ assign _0326_ = _0325_ | _0324_;
+ assign _0327_ = _0326_ | _0323_;
+ assign _0328_ = _0327_ | _0320_;
+ assign _0329_ = _0312_ ? reg4[8] : wire1[8];
+ assign _0330_ = _0312_ ? reg4[9] : wire1[9];
+ assign _0331_ = _0330_ | _0329_;
+ assign _0332_ = _0312_ ? reg4[10] : wire1[10];
+ assign _0333_ = _0332_ | _0331_;
+ assign _0334_ = _0333_ | _0313_;
+ assign _0335_ = _0334_ | _0328_;
+ assign _0336_ = _0335_ | _0313_;
+ assign _0337_ = _0336_ ? wire2[6] : _0194_;
+ assign _0338_ = ~(wire3[0] ^ wire1[2]);
+ assign _0339_ = wire3[0] & wire1[2];
+ assign _0340_ = _0339_ ^ wire3[1];
+ assign _0341_ = _0338_ & ~(_0340_);
+ assign _0342_ = ~wire3[1];
+ assign _0343_ = _0339_ & ~(_0342_);
+ assign _0344_ = _0343_ ^ wire3[2];
+ assign _0345_ = ~wire3[2];
+ assign _0346_ = _0343_ & ~(_0345_);
+ assign _0347_ = _0346_ ^ wire3[3];
+ assign _0348_ = _0347_ | _0344_;
+ assign _0349_ = _0341_ & ~(_0348_);
+ assign _0350_ = ~(wire3[3] & wire3[2]);
+ assign _0351_ = _0343_ & ~(_0350_);
+ assign _0352_ = _0351_ ^ wire3[4];
+ assign _0353_ = ~wire3[4];
+ assign _0354_ = _0351_ & ~(_0353_);
+ assign _0355_ = _0354_ ^ wire3[5];
+ assign _0356_ = _0355_ | _0352_;
+ assign _0357_ = ~(wire3[5] & wire3[4]);
+ assign _0358_ = _0351_ & ~(_0357_);
+ assign _0359_ = _0358_ ^ wire3[6];
+ assign _0360_ = _0358_ & ~(_0193_);
+ assign _0361_ = _0360_ ^ wire3[7];
+ assign _0362_ = _0361_ | _0359_;
+ assign _0363_ = _0362_ | _0356_;
+ assign _0364_ = _0349_ & ~(_0363_);
+ assign _0365_ = ~(wire3[7] & wire3[6]);
+ assign _0366_ = ~(_0365_ | _0357_);
+ assign _0367_ = _0366_ & _0351_;
+ assign _0368_ = _0367_ | wire3[8];
+ assign _0369_ = _0364_ & ~(_0368_);
+ assign _0370_ = ~(wire0[1] ^ wire0[0]);
+ assign _0371_ = _0370_ ^ _0116_;
+ assign _0372_ = wire0[5] ^ wire0[4];
+ assign _0373_ = ~(wire0[7] ^ wire0[6]);
+ assign _0374_ = _0373_ ^ _0372_;
+ assign _0375_ = _0374_ ^ _0371_;
+ assign _0376_ = ~(wire0[9] ^ wire0[8]);
+ assign _0377_ = ~(wire0[11] ^ wire0[10]);
+ assign _0378_ = _0377_ ^ _0376_;
+ assign _0379_ = wire0[13] ^ wire0[12];
+ assign _0380_ = ~(wire0[15] ^ wire0[14]);
+ assign _0381_ = _0380_ ^ _0379_;
+ assign _0382_ = _0381_ ^ _0378_;
+ assign _0383_ = _0382_ ^ _0375_;
+ assign _0384_ = ~(wire0[17] ^ wire0[16]);
+ assign _0385_ = _0384_ ^ _0383_;
+ assign _0386_ = wire3[0] & ~(_0385_);
+ assign _0387_ = _0386_ & ~(_0342_);
+ assign _0388_ = _0387_ & ~(_0350_);
+ assign _0389_ = _0388_ & ~(_0357_);
+ assign _0390_ = _0389_ ^ wire3[6];
+ assign _0391_ = _0369_ ? _0337_ : _0390_;
+ assign _0392_ = ~wire3[7];
+ assign _0393_ = reg5[0] ? reg4[7] : _0392_;
+ assign _0394_ = _0336_ ? wire2[7] : _0393_;
+ assign _0395_ = _0389_ & ~(_0193_);
+ assign _0396_ = _0395_ ^ wire3[7];
+ assign _0397_ = _0369_ ? _0394_ : _0396_;
+ assign _0398_ = _0397_ | _0391_;
+ assign _0399_ = ~_0369_;
+ assign _0400_ = ~wire2[8];
+ assign _0401_ = ~reg4[8];
+ assign _0402_ = reg5[0] ? _0401_ : wire3[8];
+ assign _0403_ = _0336_ ? _0400_ : _0402_;
+ assign _0404_ = ~(_0388_ & _0366_);
+ assign _0405_ = _0404_ ^ wire3[8];
+ assign _0406_ = _0369_ ? _0403_ : _0405_;
+ assign _0407_ = ~wire2[9];
+ assign _0408_ = reg5[0] & ~(reg4[9]);
+ assign _0409_ = _0336_ ? _0407_ : _0408_;
+ assign _0410_ = ~((_0409_ | _0399_) & _0406_);
+ assign _0411_ = _0410_ | _0398_;
+ assign _0412_ = ~wire2[10];
+ assign _0413_ = reg5[0] & ~(reg4[10]);
+ assign _0414_ = _0336_ ? _0412_ : _0413_;
+ assign _0415_ = ~wire2[11];
+ assign _0416_ = _0336_ ? _0415_ : _0413_;
+ assign _0417_ = ~((_0416_ & _0414_) | _0399_);
+ assign _0418_ = ~wire2[12];
+ assign _0419_ = _0336_ ? _0418_ : _0413_;
+ assign _0420_ = ~wire2[13];
+ assign _0421_ = _0336_ ? _0420_ : _0413_;
+ assign _0422_ = ~((_0421_ & _0419_) | _0399_);
+ assign _0423_ = _0422_ | _0417_;
+ assign _0424_ = _0423_ | _0411_;
+ assign _0425_ = ~reg4[0];
+ assign _0426_ = _0336_ ? _0425_ : _0413_;
+ assign _0427_ = ~reg4[1];
+ assign _0428_ = _0336_ ? _0427_ : reg5[0];
+ assign _0429_ = ~((_0428_ & _0426_) | _0399_);
+ assign _0430_ = ~reg4[2];
+ assign _0431_ = _0336_ ? _0430_ : reg5[0];
+ assign _0432_ = _0336_ ? _0103_ : reg5[0];
+ assign _0433_ = ~((_0432_ & _0431_) | _0399_);
+ assign _0434_ = _0433_ | _0429_;
+ assign _0435_ = ~reg4[4];
+ assign _0436_ = _0336_ ? _0435_ : reg5[0];
+ assign _0437_ = ~reg4[5];
+ assign _0438_ = _0336_ ? _0437_ : reg5[0];
+ assign _0439_ = ~((_0438_ & _0436_) | _0399_);
+ assign _0440_ = ~reg4[6];
+ assign _0441_ = _0336_ ? _0440_ : reg5[0];
+ assign _0442_ = ~reg4[7];
+ assign _0443_ = _0336_ ? _0442_ : reg5[0];
+ assign _0444_ = ~((_0443_ & _0441_) | _0399_);
+ assign _0445_ = _0444_ | _0439_;
+ assign _0446_ = _0445_ | _0434_;
+ assign _0447_ = _0446_ | _0424_;
+ assign _0448_ = _0336_ ? _0195_ : reg5[0];
+ assign _0449_ = _0369_ & ~(_0448_);
+ assign _0450_ = _0336_ ? _0401_ : reg5[0];
+ assign _0451_ = ~reg4[9];
+ assign _0452_ = _0336_ ? _0451_ : reg5[0];
+ assign _0453_ = ~((_0452_ & _0450_) | _0399_);
+ assign _0454_ = _0453_ | _0449_;
+ assign _0455_ = _0454_ | _0447_;
+ assign _0456_ = _0455_ | _0192_;
+ assign _0457_ = ~wire3[0];
+ assign _0458_ = reg5[0] ? reg4[0] : _0457_;
+ assign _0459_ = _0336_ ? wire2[0] : _0458_;
+ assign _0460_ = _0385_ ^ _0457_;
+ assign _0461_ = _0369_ ? _0459_ : _0460_;
+ assign _0462_ = _0461_ | _0456_;
+ assign _0463_ = reg5[0] ? reg4[1] : _0342_;
+ assign _0464_ = _0336_ ? wire2[1] : _0463_;
+ assign _0465_ = _0386_ ^ wire3[1];
+ assign _0466_ = _0369_ ? _0464_ : _0465_;
+ assign _0467_ = _0466_ | _0462_;
+ assign _0468_ = reg5[0] ? reg4[2] : _0345_;
+ assign _0469_ = _0336_ ? wire2[2] : _0468_;
+ assign _0470_ = _0387_ ^ wire3[2];
+ assign _0471_ = _0369_ ? _0469_ : _0470_;
+ assign _0472_ = _0471_ | _0467_;
+ assign _0473_ = ~wire3[3];
+ assign _0474_ = reg5[0] ? reg4[3] : _0473_;
+ assign _0475_ = _0336_ ? wire2[3] : _0474_;
+ assign _0476_ = _0387_ & ~(_0345_);
+ assign _0477_ = _0476_ ^ wire3[3];
+ assign _0478_ = _0369_ ? _0475_ : _0477_;
+ assign _0479_ = ~(_0478_ | _0472_);
+ assign _0480_ = reg5[0] ? reg4[4] : _0353_;
+ assign _0481_ = _0336_ ? wire2[4] : _0480_;
+ assign _0482_ = _0388_ ^ wire3[4];
+ assign _0483_ = _0369_ ? _0481_ : _0482_;
+ assign _0484_ = _0479_ & ~(_0483_);
+ assign _0485_ = ~wire2[5];
+ assign _0486_ = reg5[0] ? _0437_ : wire3[5];
+ assign _0487_ = _0336_ ? _0485_ : _0486_;
+ assign _0488_ = ~(_0388_ & wire3[4]);
+ assign _0489_ = _0488_ ^ wire3[5];
+ assign _0490_ = _0369_ ? _0487_ : _0489_;
+ assign _0000_[0] = _0490_ & _0484_;
+ assign _0491_ = _0456_ | ~(_0461_);
+ assign _0492_ = _0491_ | _0466_;
+ assign _0493_ = _0492_ | _0471_;
+ assign _0494_ = _0493_ | _0478_;
+ assign _0495_ = _0494_ | _0483_;
+ assign _0000_[1] = _0490_ & ~(_0495_);
+ assign _0496_ = _0462_ | ~(_0466_);
+ assign _0497_ = _0496_ | _0471_;
+ assign _0498_ = _0497_ | _0478_;
+ assign _0499_ = _0498_ | _0483_;
+ assign _0000_[2] = _0490_ & ~(_0499_);
+ assign _0500_ = _0491_ | ~(_0466_);
+ assign _0501_ = _0500_ | _0471_;
+ assign _0502_ = _0501_ | _0478_;
+ assign _0503_ = _0502_ | _0483_;
+ assign _0000_[3] = _0490_ & ~(_0503_);
+ assign _0504_ = _0467_ | ~(_0471_);
+ assign _0505_ = _0504_ | _0478_;
+ assign _0506_ = _0505_ | _0483_;
+ assign _0000_[4] = _0490_ & ~(_0506_);
+ assign _0507_ = _0492_ | ~(_0471_);
+ assign _0508_ = _0507_ | _0478_;
+ assign _0509_ = _0508_ | _0483_;
+ assign _0000_[5] = _0490_ & ~(_0509_);
+ assign _0510_ = _0496_ | ~(_0471_);
+ assign _0511_ = _0510_ | _0478_;
+ assign _0512_ = _0511_ | _0483_;
+ assign _0000_[6] = _0490_ & ~(_0512_);
+ assign _0513_ = _0500_ | ~(_0471_);
+ assign _0514_ = _0513_ | _0478_;
+ assign _0515_ = _0514_ | _0483_;
+ assign _0000_[7] = _0490_ & ~(_0515_);
+ assign _0516_ = _0472_ | ~(_0478_);
+ assign _0517_ = _0516_ | _0483_;
+ assign _0000_[8] = _0490_ & ~(_0517_);
+ assign _0518_ = _0493_ | ~(_0478_);
+ assign _0519_ = _0518_ | _0483_;
+ assign _0000_[9] = _0490_ & ~(_0519_);
+ assign _0520_ = _0497_ | ~(_0478_);
+ assign _0521_ = _0520_ | _0483_;
+ assign _0000_[10] = _0490_ & ~(_0521_);
+ assign _0522_ = _0501_ | ~(_0478_);
+ assign _0523_ = _0522_ | _0483_;
+ assign _0000_[11] = _0490_ & ~(_0523_);
+ assign _0524_ = _0504_ | ~(_0478_);
+ assign _0525_ = _0524_ | _0483_;
+ assign _0000_[12] = _0490_ & ~(_0525_);
+ assign _0526_ = _0507_ | ~(_0478_);
+ assign _0527_ = _0526_ | _0483_;
+ assign _0000_[13] = _0490_ & ~(_0527_);
+ assign _0528_ = _0510_ | ~(_0478_);
+ assign _0529_ = _0528_ | _0483_;
+ assign _0000_[14] = _0490_ & ~(_0529_);
+ assign _0530_ = _0513_ | ~(_0478_);
+ assign _0531_ = _0530_ | _0483_;
+ assign _0000_[15] = _0490_ & ~(_0531_);
+ assign _0532_ = ~(_0483_ & _0479_);
+ assign _0000_[16] = _0490_ & ~(_0532_);
+ assign _0533_ = _0494_ | ~(_0483_);
+ assign _0000_[17] = _0490_ & ~(_0533_);
+ assign _0534_ = _0498_ | ~(_0483_);
+ assign _0000_[18] = _0490_ & ~(_0534_);
+ reg \reg4_reg[0] = 1'h0;
+ always @(posedge clk)
+ \reg4_reg[0] <= wire1[0];
+ assign reg4[0] = \reg4_reg[0] ;
+ reg \reg4_reg[1] = 1'h0;
+ always @(posedge clk)
+ \reg4_reg[1] <= wire1[1];
+ assign reg4[1] = \reg4_reg[1] ;
+ reg \reg4_reg[2] = 1'h0;
+ always @(posedge clk)
+ \reg4_reg[2] <= wire1[2];
+ assign reg4[2] = \reg4_reg[2] ;
+ reg \reg4_reg[3] = 1'h0;
+ always @(posedge clk)
+ \reg4_reg[3] <= wire1[3];
+ assign reg4[3] = \reg4_reg[3] ;
+ reg \reg4_reg[4] = 1'h0;
+ always @(posedge clk)
+ \reg4_reg[4] <= wire1[4];
+ assign reg4[4] = \reg4_reg[4] ;
+ reg \reg4_reg[5] = 1'h0;
+ always @(posedge clk)
+ \reg4_reg[5] <= wire1[5];
+ assign reg4[5] = \reg4_reg[5] ;
+ reg \reg4_reg[6] = 1'h0;
+ always @(posedge clk)
+ \reg4_reg[6] <= wire1[6];
+ assign reg4[6] = \reg4_reg[6] ;
+ reg \reg4_reg[7] = 1'h0;
+ always @(posedge clk)
+ \reg4_reg[7] <= wire1[7];
+ assign reg4[7] = \reg4_reg[7] ;
+ reg \reg4_reg[8] = 1'h0;
+ always @(posedge clk)
+ \reg4_reg[8] <= wire1[8];
+ assign reg4[8] = \reg4_reg[8] ;
+ reg \reg4_reg[9] = 1'h0;
+ always @(posedge clk)
+ \reg4_reg[9] <= wire1[9];
+ assign reg4[9] = \reg4_reg[9] ;
+ reg \reg4_reg[10] = 1'hx;
+ always @(posedge clk)
+ \reg4_reg[10] <= wire1[10];
+ assign reg4[10] = \reg4_reg[10] ;
+ reg \reg8_reg[0] = 1'h0;
+ always @(posedge clk)
+ \reg8_reg[0] <= _0001_;
+ assign reg8[0] = \reg8_reg[0] ;
+ always @(posedge clk)
+ reg7[0] <= _0000_[0];
+ always @(posedge clk)
+ reg7[1] <= _0000_[1];
+ always @(posedge clk)
+ reg7[2] <= _0000_[2];
+ always @(posedge clk)
+ reg7[3] <= _0000_[3];
+ always @(posedge clk)
+ reg7[4] <= _0000_[4];
+ always @(posedge clk)
+ reg7[5] <= _0000_[5];
+ always @(posedge clk)
+ reg7[6] <= _0000_[6];
+ always @(posedge clk)
+ reg7[7] <= _0000_[7];
+ always @(posedge clk)
+ reg7[8] <= _0000_[8];
+ always @(posedge clk)
+ reg7[9] <= _0000_[9];
+ always @(posedge clk)
+ reg7[10] <= _0000_[10];
+ always @(posedge clk)
+ reg7[11] <= _0000_[11];
+ always @(posedge clk)
+ reg7[12] <= _0000_[12];
+ always @(posedge clk)
+ reg7[13] <= _0000_[13];
+ always @(posedge clk)
+ reg7[14] <= _0000_[14];
+ always @(posedge clk)
+ reg7[15] <= _0000_[15];
+ always @(posedge clk)
+ reg7[16] <= _0000_[16];
+ always @(posedge clk)
+ reg7[17] <= _0000_[17];
+ always @(posedge clk)
+ reg7[18] <= _0000_[18];
+ always @(posedge clk)
+ reg5[0] <= reg4[0];
+ always @(posedge clk)
+ reg5[1] <= reg4[1];
+ always @(posedge clk)
+ reg5[2] <= reg4[2];
+ always @(posedge clk)
+ reg5[3] <= reg4[3];
+ module11 modinst23 (
+ .clk(clk),
+ .wire12(wire1),
+ .wire13({ wire10[14], wire10[14], wire10[14], wire10[14], wire10[14], wire10[14], wire10[14], wire10[14], wire10[14], wire10[14], wire10[14], wire10[14], wire10[14], wire10[14], wire10[14] }),
+ .wire14(wire0),
+ .wire15(wire9[4:0]),
+ .wire16(wire3[2:0]),
+ .y({ _0583_, wire22 })
+ );
+ assign _0535_ = wire0[2];
+ assign _0562_ = y[165];
+ assign _0538_ = wire28;
+ assign _0021_ = _0001_;
+ assign _0536_ = wire10[14];
+ assign _0544_ = y[106];
+ assign _0545_ = y[107];
+ assign _0546_ = y[108];
+ assign _0547_ = y[109];
+ assign _0548_ = y[110];
+ assign _0549_ = y[111];
+ assign _0550_ = y[112];
+ assign _0551_ = y[113];
+ assign _0552_ = y[114];
+ assign _0553_ = y[115];
+ assign _0554_ = y[116];
+ assign _0555_ = y[117];
+ assign _0556_ = y[118];
+ assign _0557_ = y[119];
+ assign _0558_ = y[120];
+ assign _0559_ = y[121];
+ assign _0560_ = y[122];
+ assign _0561_ = y[125];
+ assign _0537_ = wire25;
+ assign _0563_ = wire0[2];
+ assign _0564_ = y[167];
+ assign _0565_ = y[168];
+ assign _0566_ = y[169];
+ assign _0567_ = y[170];
+ assign _0568_ = y[171];
+ assign _0569_ = y[172];
+ assign _0570_ = y[173];
+ assign _0571_ = y[174];
+ assign _0572_ = y[175];
+ assign _0573_ = y[176];
+ assign _0540_ = wire9[1];
+ assign _0541_ = wire9[2];
+ assign _0542_ = wire9[3];
+ assign _0543_ = wire9[4];
+ assign _0574_ = y[24];
+ assign _0575_ = y[25];
+ assign _0576_ = y[26];
+ assign _0577_ = y[27];
+ assign _0578_ = y[28];
+ assign _0579_ = y[29];
+ assign _0539_ = wire9[0];
+ assign _0580_ = y[30];
+ assign _0002_ = _0000_[0];
+ assign _0012_ = _0000_[1];
+ assign _0013_ = _0000_[2];
+ assign _0014_ = _0000_[3];
+ assign _0015_ = _0000_[4];
+ assign _0016_ = _0000_[5];
+ assign _0017_ = _0000_[6];
+ assign _0018_ = _0000_[7];
+ assign _0019_ = _0000_[8];
+ assign _0020_ = _0000_[9];
+ assign _0003_ = _0000_[10];
+ assign _0004_ = _0000_[11];
+ assign _0005_ = _0000_[12];
+ assign _0006_ = _0000_[13];
+ assign _0007_ = _0000_[14];
+ assign _0008_ = _0000_[15];
+ assign _0009_ = _0000_[16];
+ assign _0010_ = _0000_[17];
+ assign _0011_ = _0000_[18];
+ assign _0581_[11:10] = { 1'h0, y[30] };
+ assign { _0582_[11:9], _0582_[0] } = { 1'h0, wire1[10:9], wire9[0] };
+ assign { _0584_[10:8], _0584_[6:5], _0584_[1] } = { reg4[10:8], reg4[6:5], reg4[1] };
+ assign reg4[14:11] = { reg4[10], reg4[10], reg4[10], reg4[10] };
+ assign reg6 = { reg4[10], reg4[10], reg4[10], reg4[10], reg4[10], reg4[10], reg4[10], reg4[10], reg4[10], reg4[10], reg4[10:0] };
+ assign reg8[13:1] = 13'h0000;
+ assign wire10[13:0] = { wire10[14], wire10[14], wire10[14], wire10[14], wire10[14], wire10[14], wire10[14], wire10[14], wire10[14], wire10[14], wire10[14], wire10[14], wire10[14], wire10[14] };
+ assign wire24 = { y[125], y[125], y[125], y[122:106] };
+ assign wire26 = reg4[5:0];
+ assign wire27 = { y[176:167], wire0[2], y[165] };
+ assign wire29 = 10'b0000000xxx;
+ assign wire9[11:5] = y[30:24];
+ assign { y[183:177], y[166], y[164:126], y[124:123], y[105:31], y[23:0] } = { 6'h00, wire28, wire0[2], 16'h0000, reg4[5:0], 16'h0000, wire25, y[125], y[125], reg4[10], reg4[10], reg4[10], reg4[10], reg4[10:0], reg5, reg4[10], reg4[10], reg4[10], reg4[10], reg4[10], reg4[10], reg4[10], reg4[10], reg4[10], reg4[10], reg4[10:0], reg7, 13'h0000, reg8[0], 2'h0, wire9[4:0], wire10[14], wire10[14], wire10[14], wire10[14], wire10[14], wire10[14], wire10[14], wire10[14], wire10[14], wire10[14], wire10[14], wire10[14], wire10[14], wire10[14], wire10[14], wire22, 1'h0 };
+endmodule
diff --git a/presentation/Makefile b/presentation/Makefile
new file mode 100644
index 0000000..7ac8ecc
--- /dev/null
+++ b/presentation/Makefile
@@ -0,0 +1,4 @@
+all: presentation.pdf
+
+%.pdf: %.tex
+ latexmk -pdf -pdflatex="lualatex -shell-escape" $< </dev/null
diff --git a/presentation/beamercolorthememetropolis-highcontrast.sty b/presentation/beamercolorthememetropolis-highcontrast.sty
new file mode 100644
index 0000000..85665dc
--- /dev/null
+++ b/presentation/beamercolorthememetropolis-highcontrast.sty
@@ -0,0 +1,39 @@
+%%
+%% This is file `beamercolorthememetropolis-highcontrast.sty',
+%% generated with the docstrip utility.
+%%
+%% The original source files were:
+%%
+%% beamercolorthememetropolis-highcontrast.dtx (with options: `package')
+%% ---------------------------------------------------------------------------
+%% Copyright 2015 Matthias Vogelgesang and the LaTeX community. A full list of
+%% contributors can be found at
+%%
+%% https://github.com/matze/mtheme/graphs/contributors
+%%
+%% and the original template was based on the HSRM theme by Benjamin Weiss.
+%%
+%% This work is licensed under a Creative Commons Attribution-ShareAlike 4.0
+%% International License (https://creativecommons.org/licenses/by-sa/4.0/).
+%% ---------------------------------------------------------------------------
+\NeedsTeXFormat{LaTeX2e}
+\ProvidesPackage{beamercolorthememetropolis-highcontrast}[2017/01/23 Metropolis color theme]
+\usecolortheme{metropolis}
+
+\definecolor{mAlert}{HTML}{AD003D}
+\definecolor{mExample}{HTML}{005580}
+
+\setbeamercolor{normal text}{%
+ fg=black,
+ bg=white
+}
+\setbeamercolor{alerted text}{%
+ fg=mAlert,
+}
+\setbeamercolor{example text}{%
+ fg=mExample,
+}
+\mode<all>
+\endinput
+%%
+%% End of file `beamercolorthememetropolis-highcontrast.sty'.
diff --git a/presentation/beamercolorthememetropolis.sty b/presentation/beamercolorthememetropolis.sty
new file mode 100644
index 0000000..cdc497a
--- /dev/null
+++ b/presentation/beamercolorthememetropolis.sty
@@ -0,0 +1,138 @@
+%%
+%% This is file `beamercolorthememetropolis.sty',
+%% generated with the docstrip utility.
+%%
+%% The original source files were:
+%%
+%% beamercolorthememetropolis.dtx (with options: `package')
+%% ---------------------------------------------------------------------------
+%% Copyright 2015 Matthias Vogelgesang and the LaTeX community. A full list of
+%% contributors can be found at
+%%
+%% https://github.com/matze/mtheme/graphs/contributors
+%%
+%% and the original template was based on the HSRM theme by Benjamin Weiss.
+%%
+%% This work is licensed under a Creative Commons Attribution-ShareAlike 4.0
+%% International License (https://creativecommons.org/licenses/by-sa/4.0/).
+%% ---------------------------------------------------------------------------
+\NeedsTeXFormat{LaTeX2e}
+\ProvidesPackage{beamercolorthememetropolis}[2017/01/23 Metropolis color theme]
+\RequirePackage{pgfopts}
+\pgfkeys{
+ /metropolis/color/block/.cd,
+ .is choice,
+ transparent/.code=\metropolis@block@transparent,
+ fill/.code=\metropolis@block@fill,
+}
+\pgfkeys{
+ /metropolis/color/background/.cd,
+ .is choice,
+ dark/.code=\metropolis@colors@dark,
+ light/.code=\metropolis@colors@light,
+}
+\newcommand{\metropolis@color@setdefaults}{
+ \pgfkeys{/metropolis/color/.cd,
+ background=light,
+ block=transparent,
+ }
+}
+\definecolor{mDarkBrown}{HTML}{604c38}
+\definecolor{mDarkTeal}{HTML}{23373b}
+\definecolor{mLightBrown}{HTML}{EB811B}
+\definecolor{mLightGreen}{HTML}{14B03D}
+\newcommand{\metropolis@colors@dark}{
+ \setbeamercolor{normal text}{%
+ fg=black!2,
+ bg=mDarkTeal
+ }
+ \usebeamercolor[fg]{normal text}
+}
+\newcommand{\metropolis@colors@light}{
+ \setbeamercolor{normal text}{%
+ fg=mDarkTeal,
+ bg=black!2
+ }
+}
+\setbeamercolor{alerted text}{%
+ fg=mLightBrown
+}
+\setbeamercolor{example text}{%
+ fg=mLightGreen
+}
+\setbeamercolor{titlelike}{use=normal text, parent=normal text}
+\setbeamercolor{author}{use=normal text, parent=normal text}
+\setbeamercolor{date}{use=normal text, parent=normal text}
+\setbeamercolor{institute}{use=normal text, parent=normal text}
+\setbeamercolor{structure}{use=normal text, fg=normal text.fg}
+\setbeamercolor{palette primary}{%
+ use=normal text,
+ fg=normal text.bg,
+ bg=normal text.fg
+}
+\setbeamercolor{frametitle}{%
+ use=palette primary,
+ parent=palette primary
+}
+\setbeamercolor{progress bar}{%
+ use=alerted text,
+ fg=alerted text.fg,
+ bg=alerted text.fg!50!black!30
+}
+\setbeamercolor{title separator}{
+ use=progress bar,
+ parent=progress bar
+}
+\setbeamercolor{progress bar in head/foot}{%
+ use=progress bar,
+ parent=progress bar
+}
+\setbeamercolor{progress bar in section page}{
+ use=progress bar,
+ parent=progress bar
+}
+\newcommand{\metropolis@block@transparent}{
+ \setbeamercolor{block title}{%
+ use=normal text,
+ fg=normal text.fg,
+ bg=
+ }
+ \setbeamercolor{block body}{
+ bg=
+ }
+}
+\newcommand{\metropolis@block@fill}{
+ \setbeamercolor{block title}{%
+ use=normal text,
+ fg=normal text.fg,
+ bg=normal text.bg!80!fg
+ }
+ \setbeamercolor{block body}{
+ use={block title, normal text},
+ bg=block title.bg!50!normal text.bg
+ }
+}
+\setbeamercolor{block title alerted}{%
+ use={block title, alerted text},
+ bg=block title.bg,
+ fg=alerted text.fg
+}
+\setbeamercolor{block title example}{%
+ use={block title, example text},
+ bg=block title.bg,
+ fg=example text.fg
+}
+\setbeamercolor{block body alerted}{use=block body, parent=block body}
+\setbeamercolor{block body example}{use=block body, parent=block body}
+\setbeamercolor{footnote}{fg=normal text.fg!90}
+\setbeamercolor{footnote mark}{fg=.}
+\setbeamercolor{bibliography entry author}{fg=, bg=}
+\setbeamercolor{bibliography entry title}{fg=, bg=}
+\setbeamercolor{bibliography entry location}{fg=, bg=}
+\setbeamercolor{bibliography entry note}{fg=, bg=}
+\metropolis@color@setdefaults
+\ProcessPgfPackageOptions{/metropolis/color}
+\mode<all>
+\endinput
+%%
+%% End of file `beamercolorthememetropolis.sty'.
diff --git a/presentation/beamerfontthememetropolis.sty b/presentation/beamerfontthememetropolis.sty
new file mode 100644
index 0000000..15cced3
--- /dev/null
+++ b/presentation/beamerfontthememetropolis.sty
@@ -0,0 +1,325 @@
+%%
+%% This is file `beamerfontthememetropolis.sty',
+%% generated with the docstrip utility.
+%%
+%% The original source files were:
+%%
+%% beamerfontthememetropolis.dtx (with options: `package')
+%% ---------------------------------------------------------------------------
+%% Copyright 2015 Matthias Vogelgesang and the LaTeX community. A full list of
+%% contributors can be found at
+%%
+%% https://github.com/matze/mtheme/graphs/contributors
+%%
+%% and the original template was based on the HSRM theme by Benjamin Weiss.
+%%
+%% This work is licensed under a Creative Commons Attribution-ShareAlike 4.0
+%% International License (https://creativecommons.org/licenses/by-sa/4.0/).
+%% ---------------------------------------------------------------------------
+\NeedsTeXFormat{LaTeX2e}
+\ProvidesPackage{beamerfontthememetropolis}[2017/01/23 Metropolis font theme]
+\RequirePackage{etoolbox}
+\RequirePackage{ifxetex}
+\RequirePackage{ifluatex}
+\RequirePackage{pgfopts}
+\ifboolexpr{bool {xetex} or bool {luatex}}{
+ \@ifpackageloaded{fontspec}{
+ \PassOptionsToPackage{no-math}{fontspec}
+ }{
+ \RequirePackage[no-math]{fontspec}
+ }
+ \newcounter{fontsnotfound}
+ \newcommand{\checkfont}[1]{%
+ \suppressfontnotfounderror=1%
+ \font\x = "#1" at 10pt
+ \selectfont
+ \ifx\x\nullfont%
+ \stepcounter{fontsnotfound}%
+ \fi%
+ \suppressfontnotfounderror=0%
+ }
+
+ \newcommand{\iffontsavailable}[3]{%
+ \setcounter{fontsnotfound}{0}%
+ \expandafter\forcsvlist\expandafter%
+ \checkfont\expandafter{#1}%
+ \ifnum\value{fontsnotfound}=0%
+ #2%
+ \else%
+ #3%
+ \fi%
+ }
+ \iffontsavailable{Fira Sans Light,%
+ Fira Sans Light Italic,%
+ Fira Sans,%
+ Fira Sans Italic}%
+ {%
+ \setsansfont[ItalicFont={Fira Sans Light Italic},%
+ BoldFont={Fira Sans},%
+ BoldItalicFont={Fira Sans Italic}]%
+ {Fira Sans Light}%
+ }{%
+ \iffontsavailable{Fira Sans Light OT,%
+ Fira Sans Light Italic OT,%
+ Fira Sans OT,%
+ Fira Sans Italic OT}%
+ {%
+ \setsansfont[ItalicFont={Fira Sans Light Italic OT},%
+ BoldFont={Fira Sans OT},%
+ BoldItalicFont={Fira Sans Italic OT}]%
+ {Fira Sans Light OT}%
+ }{%
+ \PackageWarning{beamerthememetropolis}{%
+ Could not find Fira Sans fonts%
+ }
+ }
+ }
+ \iffontsavailable{Fira Mono, Fira Mono Bold}{%
+ \setmonofont[BoldFont={Fira Mono Medium}]{Fira Mono}%
+ }{%
+ \iffontsavailable{Fira Mono OT, Fira Mono Bold OT}{%
+ \setmonofont[BoldFont={Fira Mono Medium OT}]{Fira Mono OT}%
+ }{%
+ \PackageWarning{beamerthememetropolis}{%
+ Could not find Fira Mono fonts%
+ }
+ }
+ }
+ \AtBeginEnvironment{tabular}{%
+ \addfontfeature{Numbers={Monospaced}}%
+ }
+}{%
+ \PackageWarning{beamerthememetropolis}{%
+ You need to compile with XeLaTeX or LuaLaTeX to use the Fira fonts%
+ }
+}
+\setbeamerfont{title}{size=\Large,%
+ series=\bfseries}
+\setbeamerfont{author}{size=\small}
+\setbeamerfont{date}{size=\small}
+\setbeamerfont{section title}{size=\Large,%
+ series=\bfseries}
+\setbeamerfont{block title}{size=\normalsize,%
+ series=\bfseries}
+\setbeamerfont{block title alerted}{size=\normalsize,%
+ series=\bfseries}
+\setbeamerfont*{subtitle}{size=\large}
+\setbeamerfont{frametitle}{size=\large,%
+ series=\bfseries}
+\setbeamerfont{caption}{size=\small}
+\setbeamerfont{caption name}{series=\bfseries}
+\setbeamerfont{description item}{series=\bfseries}
+\setbeamerfont{page number in head/foot}{size=\scriptsize}
+\setbeamerfont{bibliography entry author}{size=\normalsize,%
+ series=\normalfont}
+\setbeamerfont{bibliography entry title}{size=\normalsize,%
+ series=\bfseries}
+\setbeamerfont{bibliography entry location}{size=\normalsize,%
+ series=\normalfont}
+\setbeamerfont{bibliography entry note}{size=\small,%
+ series=\normalfont}
+\setbeamerfont{standout}{size=\Large,%
+ series=\bfseries}
+\pgfkeys{
+ /metropolis/font/titleformat title/.cd,
+ .is choice,
+ regular/.code={%
+ \let\metropolis@titleformat\@empty%
+ \setbeamerfont{title}{shape=\normalfont}%
+ },
+ smallcaps/.code={%
+ \let\metropolis@titleformat\@empty%
+ \setbeamerfont{title}{shape=\scshape}%
+ },
+ allsmallcaps/.code={%
+ \let\metropolis@titleformat\lowercase%
+ \setbeamerfont{title}{shape=\scshape}%
+ \PackageWarning{beamerthememetropolis}{%
+ Be aware that titleformat title=allsmallcaps can lead to problems%
+ }
+ },
+ allcaps/.code={%
+ \let\metropolis@titleformat\uppercase%
+ \setbeamerfont{title}{shape=\normalfont}
+ \PackageWarning{beamerthememetropolis}{%
+ Be aware that titleformat title=allcaps can lead to problems%
+ }
+ },
+}
+\pgfkeys{
+ /metropolis/font/titleformat subtitle/.cd,
+ .is choice,
+ regular/.code={%
+ \let\metropolis@subtitleformat\@empty%
+ \setbeamerfont{subtitle}{shape=\normalfont}%
+ },
+ smallcaps/.code={%
+ \let\metropolis@subtitleformat\@empty%
+ \setbeamerfont{subtitle}{shape=\scshape}%
+ },
+ allsmallcaps/.code={%
+ \let\metropolis@subtitleformat\lowercase%
+ \setbeamerfont{subtitle}{shape=\scshape}%
+ \PackageWarning{beamerthememetropolis}{%
+ Be aware that titleformat subtitle=allsmallcaps can lead to problems%
+ }
+ },
+ allcaps/.code={%
+ \let\metropolis@subtitleformat\uppercase%
+ \setbeamerfont{subtitle}{shape=\normalfont}%
+ \PackageWarning{beamerthememetropolis}{%
+ Be aware that titleformat subtitle=allcaps can lead to problems%
+ }
+ },
+}
+\pgfkeys{
+ /metropolis/font/titleformat section/.cd,
+ .is choice,
+ regular/.code={%
+ \let\metropolis@sectiontitleformat\@empty%
+ \setbeamerfont{section title}{shape=\normalfont}%
+ },
+ smallcaps/.code={%
+ \let\metropolis@sectiontitleformat\@empty%
+ \setbeamerfont{section title}{shape=\scshape}%
+ },
+ allsmallcaps/.code={%
+ \let\metropolis@sectiontitleformat\MakeLowercase%
+ \setbeamerfont{section title}{shape=\scshape}%
+ \PackageWarning{beamerthememetropolis}{%
+ Be aware that titleformat section=allsmallcaps can lead to problems%
+ }
+ },
+ allcaps/.code={%
+ \let\metropolis@sectiontitleformat\MakeUppercase%
+ \setbeamerfont{section title}{shape=\normalfont}%
+ \PackageWarning{beamerthememetropolis}{%
+ Be aware that titleformat section=allcaps can lead to problems%
+ }
+ },
+}
+\pgfkeys{
+ /metropolis/font/titleformat frame/.cd,
+ .is choice,
+ regular/.code={%
+ \let\metropolis@frametitleformat\@empty%
+ \setbeamerfont{frametitle}{shape=\normalfont}%
+ },
+ smallcaps/.code={%
+ \let\metropolis@frametitleformat\@empty%
+ \setbeamerfont{frametitle}{shape=\scshape}%
+ },
+ allsmallcaps/.code={%
+ \let\metropolis@frametitleformat\MakeLowercase%
+ \setbeamerfont{frametitle}{shape=\scshape}%
+ \PackageWarning{beamerthememetropolis}{%
+ Be aware that titleformat frame=allsmallcaps can lead to problems%
+ }
+ },
+ allcaps/.code={%
+ \let\metropolis@frametitleformat\MakeUppercase%
+ \setbeamerfont{frametitle}{shape=\normalfont}
+ \PackageWarning{beamerthememetropolis}{%
+ Be aware that titleformat frame=allcaps can lead to problems%
+ }
+ },
+}
+\pgfkeys{
+ /metropolis/font/.cd,
+ titleformattitle/.code=\pgfkeysalso{titleformat title=#1},
+ titleformatsubtitle/.code=\pgfkeysalso{titleformat subtitle=#1},
+ titleformatsection/.code=\pgfkeysalso{titleformat section=#1},
+ titleformatframe/.code=\pgfkeysalso{titleformat frame=#1},
+}
+\newcommand{\metropolis@font@setdefaults}{
+ \pgfkeys{/metropolis/font/.cd,
+ titleformat title=regular,
+ titleformat subtitle=regular,
+ titleformat section=regular,
+ titleformat frame=regular,
+ }
+}
+\def\metropolis@titleformat#1{#1}
+\def\metropolis@subtitleformat#1{#1}
+\def\metropolis@sectiontitleformat#1{#1}
+\def\metropolis@frametitleformat#1{#1}
+\patchcmd{\beamer@title}%
+ {\def\inserttitle{#2}}%
+ {\def\inserttitle{\metropolis@titleformat{#2}}}%
+ {}%
+ {\PackageError{beamerfontthememetropolis}{Patching title failed}\@ehc}
+\patchcmd{\beamer@subtitle}%
+ {\def\insertsubtitle{#2}}%
+ {\def\insertsubtitle{\metropolis@subtitleformat{#2}}}%
+ {}%
+ {\PackageError{beamerfontthememetropolis}{Patching subtitle failed}\@ehc}
+\patchcmd{\sectionentry}
+ {\def\insertsectionhead{#2}}
+ {\def\insertsectionhead{\metropolis@sectiontitleformat{#2}}}
+ {}
+ {\PackageError{beamerfontthememetropolis}{Patching section title failed}\@ehc}
+\@tempswafalse
+\patchcmd{\beamer@section}
+ {\edef\insertsectionhead{\noexpand\hyperlink{Navigation\the\c@page}{\unexpanded{#1}}}}
+ {\edef\insertsectionhead{\noexpand\hyperlink{Navigation\the\c@page}{%
+ \noexpand\metropolis@sectiontitleformat{\unexpanded{#1}}}}}
+ {\@tempswatrue}
+ {}
+\patchcmd{\beamer@section}
+ {\def\insertsectionhead{\hyperlink{Navigation\the\c@page}{#1}}}
+ {\def\insertsectionhead{\hyperlink{Navigation\the\c@page}{%
+ \metropolis@sectiontitleformat{#1}}}}
+ {\@tempswatrue}
+ {}
+\patchcmd{\beamer@section}
+ {\protected@edef\insertsectionhead{\noexpand\hyperlink{Navigation\the\c@page}{#1}}}
+ {\protected@edef\insertsectionhead{\noexpand\hyperlink{Navigation\the\c@page}{%
+ \noexpand\metropolis@sectiontitleformat{#1}}}}
+ {\@tempswatrue}
+ {}
+\if@tempswa\else
+ \PackageError{beamerfontthememetropolis}{Patching section title failed}\@ehc
+\fi
+\@tempswafalse
+\patchcmd{\beamer@subsection}
+ {\edef\insertsubsectionhead{\noexpand\hyperlink{Navigation\the\c@page}{\unexpanded{#1}}}}
+ {\edef\insertsubsectionhead{\noexpand\hyperlink{Navigation\the\c@page}{%
+ \noexpand\metropolis@sectiontitleformat{\unexpanded{#1}}}}}
+ {\@tempswatrue}
+ {}
+\patchcmd{\beamer@subsection}
+ {\def\insertsubsectionhead{\hyperlink{Navigation\the\c@page}{#1}}}
+ {\def\insertsubsectionhead{\hyperlink{Navigation\the\c@page}{%
+ \metropolis@sectiontitleformat{#1}}}}
+ {\@tempswatrue}
+ {}
+\patchcmd{\beamer@subsection}
+ {\protected@edef\insertsubsectionhead{\noexpand\hyperlink{Navigation\the\c@page}{#1}}}
+ {\protected@edef\insertsubsectionhead{\noexpand\hyperlink{Navigation\the\c@page}{%
+ \noexpand\metropolis@sectiontitleformat{#1}}}}
+ {\@tempswatrue}
+ {}
+\if@tempswa\else
+ \PackageError{beamerfontthememetropolis}{Patching section title failed}\@ehc
+\fi
+\patchcmd{\beamer@@frametitle}
+ {{%
+ \gdef\insertframetitle{{#2\ifnum\beamer@autobreakcount>0\relax{}\space%
+ \usebeamertemplate*{frametitle continuation}\fi}}%
+ \gdef\beamer@frametitle{#2}%
+ \gdef\beamer@shortframetitle{#1}%
+ }}
+ {{%
+ \gdef\insertframetitle{{\metropolis@frametitleformat{#2}\ifnum%
+ \beamer@autobreakcount>0\relax{}\space%
+ \usebeamertemplate*{frametitle continuation}\fi}}%
+ \gdef\beamer@frametitle{#2}%
+ \gdef\beamer@shortframetitle{#1}%
+ }}
+ {}
+ {\PackageError{beamerfontthememetropolis}{Patching frame title failed}\@ehc}
+\metropolis@font@setdefaults
+\ProcessPgfPackageOptions{/metropolis/font}
+\endinput
+%%
+%% End of file `beamerfontthememetropolis.sty'.
diff --git a/presentation/beamerinnerthememetropolis.sty b/presentation/beamerinnerthememetropolis.sty
new file mode 100644
index 0000000..415b46f
--- /dev/null
+++ b/presentation/beamerinnerthememetropolis.sty
@@ -0,0 +1,297 @@
+%%
+%% This is file `beamerinnerthememetropolis.sty',
+%% generated with the docstrip utility.
+%%
+%% The original source files were:
+%%
+%% beamerinnerthememetropolis.dtx (with options: `package')
+%% ---------------------------------------------------------------------------
+%% Copyright 2015 Matthias Vogelgesang and the LaTeX community. A full list of
+%% contributors can be found at
+%%
+%% https://github.com/matze/mtheme/graphs/contributors
+%%
+%% and the original template was based on the HSRM theme by Benjamin Weiss.
+%%
+%% This work is licensed under a Creative Commons Attribution-ShareAlike 4.0
+%% International License (https://creativecommons.org/licenses/by-sa/4.0/).
+%% ---------------------------------------------------------------------------
+\NeedsTeXFormat{LaTeX2e}
+\ProvidesPackage{beamerinnerthememetropolis}[2017/01/23 Metropolis inner theme]
+\RequirePackage{etoolbox}
+\RequirePackage{keyval}
+\RequirePackage{calc}
+\RequirePackage{pgfopts}
+\RequirePackage{tikz}
+\pgfkeys{
+ /metropolis/inner/sectionpage/.cd,
+ .is choice,
+ none/.code=\metropolis@disablesectionpage,
+ simple/.code={\metropolis@enablesectionpage
+ \setbeamertemplate{section page}[simple]},
+ progressbar/.code={\metropolis@enablesectionpage
+ \setbeamertemplate{section page}[progressbar]},
+}
+\pgfkeys{
+ /metropolis/inner/subsectionpage/.cd,
+ .is choice,
+ none/.code=\metropolis@disablesubsectionpage,
+ simple/.code={\metropolis@enablesubsectionpage
+ \setbeamertemplate{section page}[simple]},
+ progressbar/.code={\metropolis@enablesubsectionpage
+ \setbeamertemplate{section page}[progressbar]},
+}
+\newcommand{\metropolis@inner@setdefaults}{
+ \pgfkeys{/metropolis/inner/.cd,
+ sectionpage=progressbar,
+ subsectionpage=none
+ }
+}
+\setbeamertemplate{title page}{
+ \begin{minipage}[b][\paperheight]{\textwidth}
+ \ifx\inserttitlegraphic\@empty\else\usebeamertemplate*{title graphic}\fi
+ \vfill%
+ \ifx\inserttitle\@empty\else\usebeamertemplate*{title}\fi
+ \ifx\insertsubtitle\@empty\else\usebeamertemplate*{subtitle}\fi
+ \usebeamertemplate*{title separator}
+ \ifx\beamer@shortauthor\@empty\else\usebeamertemplate*{author}\fi
+ \ifx\insertdate\@empty\else\usebeamertemplate*{date}\fi
+ \ifx\insertinstitute\@empty\else\usebeamertemplate*{institute}\fi
+ \vfill
+ \vspace*{1mm}
+ \end{minipage}
+}
+\def\maketitle{%
+ \ifbeamer@inframe
+ \titlepage
+ \else
+ \frame[plain,noframenumbering]{\titlepage}
+ \fi
+}
+\def\titlepage{%
+ \usebeamertemplate{title page}
+}
+\setbeamertemplate{title graphic}{
+ \vbox to 0pt {
+ \vspace*{2em}
+ \inserttitlegraphic%
+ }%
+ \nointerlineskip%
+}
+\setbeamertemplate{title}{
+ \raggedright%
+ \linespread{1.0}%
+ \inserttitle%
+ \par%
+ \vspace*{0.5em}
+}
+\setbeamertemplate{subtitle}{
+ \raggedright%
+ \insertsubtitle%
+ \par%
+ \vspace*{0.5em}
+}
+\newlength{\metropolis@titleseparator@linewidth}
+\setlength{\metropolis@titleseparator@linewidth}{0.4pt}
+\setbeamertemplate{title separator}{
+ \tikzexternaldisable%
+ \begin{tikzpicture}
+ \fill[fg] (0,0) rectangle (\textwidth, \metropolis@titleseparator@linewidth);
+ \end{tikzpicture}%
+ \tikzexternalenable%
+ \par%
+}
+\setbeamertemplate{author}{
+ \vspace*{2em}
+ \insertauthor%
+ \par%
+ \vspace*{0.25em}
+}
+\setbeamertemplate{date}{
+ \insertdate%
+ \par%
+}
+\setbeamertemplate{institute}{
+ \vspace*{3mm}
+ \insertinstitute%
+ \par%
+}
+\defbeamertemplate{section page}{simple}{
+ \begin{center}
+ \usebeamercolor[fg]{section title}
+ \usebeamerfont{section title}
+ \insertsectionhead\par
+ \ifx\insertsubsectionhead\@empty\else
+ \usebeamercolor[fg]{subsection title}
+ \usebeamerfont{subsection title}
+ \insertsubsectionhead
+ \fi
+ \end{center}
+}
+\defbeamertemplate{section page}{progressbar}{
+ \centering
+ \begin{minipage}{22em}
+ \raggedright
+ \usebeamercolor[fg]{section title}
+ \usebeamerfont{section title}
+ \insertsectionhead\\[-1ex]
+ \usebeamertemplate*{progress bar in section page}
+ \par
+ \ifx\insertsubsectionhead\@empty\else%
+ \usebeamercolor[fg]{subsection title}%
+ \usebeamerfont{subsection title}%
+ \insertsubsectionhead
+ \fi
+ \end{minipage}
+ \par
+ \vspace{\baselineskip}
+}
+\newcommand{\metropolis@disablesectionpage}{
+ \AtBeginSection{
+ % intentionally empty
+ }
+}
+\newcommand{\metropolis@enablesectionpage}{
+ \AtBeginSection{
+ \ifbeamer@inframe
+ \sectionpage
+ \else
+ \frame[plain,c,noframenumbering]{\sectionpage}
+ \fi
+ }
+}
+\setbeamertemplate{subsection page}{%
+ \usebeamertemplate*{section page}
+}
+\newcommand{\metropolis@disablesubsectionpage}{
+ \AtBeginSubsection{
+ % intentionally empty
+ }
+}
+\newcommand{\metropolis@enablesubsectionpage}{
+ \AtBeginSubsection{
+ \ifbeamer@inframe
+ \subsectionpage
+ \else
+ \frame[plain,c,noframenumbering]{\subsectionpage}
+ \fi
+ }
+}
+\newlength{\metropolis@progressonsectionpage}
+\newlength{\metropolis@progressonsectionpage@linewidth}
+\setlength{\metropolis@progressonsectionpage@linewidth}{0.4pt}
+\setbeamertemplate{progress bar in section page}{
+ \setlength{\metropolis@progressonsectionpage}{%
+ \textwidth * \ratio{\insertframenumber pt}{\inserttotalframenumber pt}%
+ }%
+ \tikzexternaldisable%
+ \begin{tikzpicture}
+ \fill[bg] (0,0) rectangle (\textwidth, \metropolis@progressonsectionpage@linewidth);
+ \fill[fg] (0,0) rectangle (\metropolis@progressonsectionpage, \metropolis@progressonsectionpage@linewidth);
+ \end{tikzpicture}%
+ \tikzexternalenable%
+}
+\def\inserttotalframenumber{100}
+\newlength{\metropolis@blocksep}
+\newlength{\metropolis@blockadjust}
+\setlength{\metropolis@blocksep}{0.75ex}
+\setlength{\metropolis@blockadjust}{0.25ex}
+\providecommand{\metropolis@strut}{%
+ \vphantom{ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz()}%
+}
+\newcommand{\metropolis@block}[1]{
+ \par\vskip\medskipamount%
+ \setlength{\parskip}{0pt}
+ \ifbeamercolorempty[bg]{block title#1}{%
+ \begin{beamercolorbox}[rightskip=0pt plus 4em]{block title#1}}{%
+ \ifbeamercolorempty[bg]{block title}{%
+ \begin{beamercolorbox}[rightskip=0pt plus 4em]{block title#1}%
+ }%
+ {%
+ \begin{beamercolorbox}[
+ sep=\dimexpr\metropolis@blocksep-\metropolis@blockadjust\relax,
+ leftskip=\metropolis@blockadjust,
+ rightskip=\dimexpr\metropolis@blockadjust plus 4em\relax
+ ]{block title#1}%
+ }}%
+ \usebeamerfont*{block title#1}%
+ \metropolis@strut%
+ \insertblocktitle%
+ \metropolis@strut%
+ \end{beamercolorbox}%
+ \nointerlineskip%
+ \ifbeamercolorempty[bg]{block body#1}{%
+ \begin{beamercolorbox}[vmode]{block body#1}}{
+ \ifbeamercolorempty[bg]{block body}{%
+ \begin{beamercolorbox}[vmode]{block body#1}%
+ }{%
+ \begin{beamercolorbox}[sep=\metropolis@blocksep, vmode]{block body#1}%
+ \vspace{-\metropolis@parskip}
+ }}%
+ \usebeamerfont{block body#1}%
+ \setlength{\parskip}{\metropolis@parskip}%
+}
+\setbeamertemplate{block begin}{\metropolis@block{}}
+\setbeamertemplate{block alerted begin}{\metropolis@block{ alerted}}
+\setbeamertemplate{block example begin}{\metropolis@block{ example}}
+\setbeamertemplate{block end}{\end{beamercolorbox}\vspace*{0.2ex}}
+\setbeamertemplate{block alerted end}{\end{beamercolorbox}\vspace*{0.2ex}}
+\setbeamertemplate{block example end}{\end{beamercolorbox}\vspace*{0.2ex}}
+\setbeamertemplate{itemize items}{\textbullet}
+\setbeamertemplate{caption label separator}{: }
+\setbeamertemplate{caption}[numbered]
+\setbeamertemplate{footnote}{%
+ \parindent 0em\noindent%
+ \raggedright
+ \usebeamercolor{footnote}\hbox to 0.8em{\hfil\insertfootnotemark}\insertfootnotetext\par%
+}
+\newlength{\metropolis@parskip}
+\setlength{\metropolis@parskip}{0.5em}
+\setlength{\parskip}{\metropolis@parskip}
+\linespread{1.15}
+\define@key{beamerframe}{c}[true]{% centered
+ \beamer@frametopskip=0pt plus 1fill\relax%
+ \beamer@framebottomskip=0pt plus 1fill\relax%
+ \beamer@frametopskipautobreak=0pt plus .4\paperheight\relax%
+ \beamer@framebottomskipautobreak=0pt plus .6\paperheight\relax%
+ \def\beamer@initfirstlineunskip{}%
+}
+\providebool{metropolis@standout}
+\define@key{beamerframe}{standout}[true]{%
+ \booltrue{metropolis@standout}
+ \begingroup
+ \setkeys{beamerframe}{c}
+ \setkeys{beamerframe}{noframenumbering}
+ \ifbeamercolorempty[bg]{palette primary}{
+ \setbeamercolor{background canvas}{
+ use=palette primary,
+ bg=-palette primary.fg
+ }
+ }{
+ \setbeamercolor{background canvas}{
+ use=palette primary,
+ bg=palette primary.bg
+ }
+ }
+ \setbeamercolor{local structure}{
+ fg=palette primary.fg
+ }
+ \usebeamercolor[fg]{palette primary}
+}
+ \pretocmd{\beamer@reseteecodes}{%
+ \ifbool{metropolis@standout}{
+ \endgroup
+ \boolfalse{metropolis@standout}
+ }{}
+ }{}{}
+ \AtBeginEnvironment{beamer@frameslide}{
+ \ifbool{metropolis@standout}{
+ \centering
+ \usebeamerfont{standout}
+ }{}
+ }
+\metropolis@inner@setdefaults
+\ProcessPgfPackageOptions{/metropolis/inner}
+\endinput
+%%
+%% End of file `beamerinnerthememetropolis.sty'.
diff --git a/presentation/beamerouterthememetropolis.sty b/presentation/beamerouterthememetropolis.sty
new file mode 100644
index 0000000..928a122
--- /dev/null
+++ b/presentation/beamerouterthememetropolis.sty
@@ -0,0 +1,137 @@
+%%
+%% This is file `beamerouterthememetropolis.sty',
+%% generated with the docstrip utility.
+%%
+%% The original source files were:
+%%
+%% beamerouterthememetropolis.dtx (with options: `package')
+%% ---------------------------------------------------------------------------
+%% Copyright 2015 Matthias Vogelgesang and the LaTeX community. A full list of
+%% contributors can be found at
+%%
+%% https://github.com/matze/mtheme/graphs/contributors
+%%
+%% and the original template was based on the HSRM theme by Benjamin Weiss.
+%%
+%% This work is licensed under a Creative Commons Attribution-ShareAlike 4.0
+%% International License (https://creativecommons.org/licenses/by-sa/4.0/).
+%% ---------------------------------------------------------------------------
+\NeedsTeXFormat{LaTeX2e}
+\ProvidesPackage{beamerouterthememetropolis}[2017/01/23 Metropolis outer theme]
+\RequirePackage{etoolbox}
+\RequirePackage{calc}
+\RequirePackage{pgfopts}
+\pgfkeys{
+ /metropolis/outer/numbering/.cd,
+ .is choice,
+ none/.code=\setbeamertemplate{frame numbering}[none],
+ counter/.code=\setbeamertemplate{frame numbering}[counter],
+ fraction/.code=\setbeamertemplate{frame numbering}[fraction],
+}
+\pgfkeys{
+ /metropolis/outer/progressbar/.cd,
+ .is choice,
+ none/.code={%
+ \setbeamertemplate{headline}[plain]
+ \setbeamertemplate{frametitle}[plain]
+ \setbeamertemplate{footline}[plain]
+ },
+ head/.code={\pgfkeys{/metropolis/outer/progressbar=none}
+ \addtobeamertemplate{headline}{}{%
+ \usebeamertemplate*{progress bar in head/foot}
+ }
+ },
+ frametitle/.code={\pgfkeys{/metropolis/outer/progressbar=none}
+ \addtobeamertemplate{frametitle}{}{%
+ \usebeamertemplate*{progress bar in head/foot}
+ }
+ },
+ foot/.code={\pgfkeys{/metropolis/outer/progressbar=none}
+ \addtobeamertemplate{footline}{}{%
+ \usebeamertemplate*{progress bar in head/foot}%
+ }
+ },
+}
+\newcommand{\metropolis@outer@setdefaults}{
+ \pgfkeys{/metropolis/outer/.cd,
+ numbering=counter,
+ progressbar=none,
+ }
+}
+\setbeamertemplate{navigation symbols}{}
+\defbeamertemplate{frame footer}{none}{}
+\defbeamertemplate{frame footer}{custom}[1]{ #1 }
+\defbeamertemplate{frame numbering}{none}{}
+\defbeamertemplate{frame numbering}{counter}{\insertframenumber}
+\defbeamertemplate{frame numbering}{fraction}{
+ \insertframenumber/\inserttotalframenumber
+}
+\defbeamertemplate{headline}{plain}{}
+\defbeamertemplate{footline}{plain}{%
+ \begin{beamercolorbox}[wd=\textwidth, sep=3ex]{footline}%
+ \usebeamerfont{page number in head/foot}%
+ \usebeamertemplate*{frame footer}
+ \hfill%
+ \usebeamertemplate*{frame numbering}
+ \end{beamercolorbox}%
+}
+\newlength{\metropolis@frametitle@padding}
+\setlength{\metropolis@frametitle@padding}{2.2ex}
+\newcommand{\metropolis@frametitlestrut@start}{
+ \rule{0pt}{\metropolis@frametitle@padding +%
+ \totalheightof{%
+ \ifcsdef{metropolis@frametitleformat}{\metropolis@frametitleformat X}{X}%
+ }%
+ }%
+}
+\newcommand{\metropolis@frametitlestrut@end}{
+ \rule[-\metropolis@frametitle@padding]{0pt}{\metropolis@frametitle@padding}
+}
+\defbeamertemplate{frametitle}{plain}{%
+ \nointerlineskip%
+ \begin{beamercolorbox}[%
+ wd=\paperwidth,%
+ sep=0pt,%
+ leftskip=\metropolis@frametitle@padding,%
+ rightskip=\metropolis@frametitle@padding,%
+ ]{frametitle}%
+ \metropolis@frametitlestrut@start%
+ \insertframetitle%
+ \nolinebreak%
+ \metropolis@frametitlestrut@end%
+ \end{beamercolorbox}%
+}
+\setbeamertemplate{frametitle continuation}{%
+ \usebeamerfont{frametitle}
+ \romannumeral \insertcontinuationcount
+}
+\newlength{\metropolis@progressinheadfoot}
+\newlength{\metropolis@progressinheadfoot@linewidth}
+\setlength{\metropolis@progressinheadfoot@linewidth}{0.4pt}
+\setbeamertemplate{progress bar in head/foot}{
+ \nointerlineskip
+ \setlength{\metropolis@progressinheadfoot}{%
+ \paperwidth * \ratio{\insertframenumber pt}{\inserttotalframenumber pt}%
+ }%
+ \begin{beamercolorbox}[wd=\paperwidth]{progress bar in head/foot}
+ \tikzexternaldisable%
+ \begin{tikzpicture}
+ \fill[bg] (0,0) rectangle (\paperwidth, \metropolis@progressinheadfoot@linewidth);
+ \fill[fg] (0,0) rectangle (\metropolis@progressinheadfoot, \metropolis@progressinheadfoot@linewidth);
+ \end{tikzpicture}%
+ \tikzexternalenable%
+ \end{beamercolorbox}
+}
+\AtBeginDocument{%
+ \apptocmd{\appendix}{%
+ \pgfkeys{%
+ /metropolis/outer/.cd,
+ numbering=none,
+ progressbar=none}
+ }{}{}
+}
+\metropolis@outer@setdefaults
+\ProcessPgfPackageOptions{/metropolis/outer}
+\endinput
+%%
+%% End of file `beamerouterthememetropolis.sty'.
diff --git a/presentation/beamerthememetropolis.sty b/presentation/beamerthememetropolis.sty
new file mode 100644
index 0000000..9fbe86e
--- /dev/null
+++ b/presentation/beamerthememetropolis.sty
@@ -0,0 +1,107 @@
+%%
+%% This is file `beamerthememetropolis.sty',
+%% generated with the docstrip utility.
+%%
+%% The original source files were:
+%%
+%% beamerthememetropolis.dtx (with options: `package')
+%% ---------------------------------------------------------------------------
+%% Copyright 2015 Matthias Vogelgesang and the LaTeX community. A full list of
+%% contributors can be found at
+%%
+%% https://github.com/matze/mtheme/graphs/contributors
+%%
+%% and the original template was based on the HSRM theme by Benjamin Weiss.
+%%
+%% This work is licensed under a Creative Commons Attribution-ShareAlike 4.0
+%% International License (https://creativecommons.org/licenses/by-sa/4.0/).
+%% ---------------------------------------------------------------------------
+\NeedsTeXFormat{LaTeX2e}
+\ProvidesPackage{beamerthememetropolis}
+ [2017/01/23 v1.2 Metropolis Beamer theme]
+\RequirePackage{etoolbox}
+\RequirePackage{pgfopts}
+\pgfkeys{/metropolis/.cd,
+ .search also={
+ /metropolis/inner,
+ /metropolis/outer,
+ /metropolis/color,
+ /metropolis/font,
+ }
+}
+\pgfkeys{
+ /metropolis/titleformat plain/.cd,
+ .is choice,
+ regular/.code={%
+ \let\metropolis@plaintitleformat\@empty%
+ \setbeamerfont{standout}{shape=\normalfont}%
+ },
+ smallcaps/.code={%
+ \let\metropolis@plaintitleformat\@empty%
+ \setbeamerfont{standout}{shape=\scshape}%
+ },
+ allsmallcaps/.code={%
+ \let\metropolis@plaintitleformat\MakeLowercase%
+ \setbeamerfont{standout}{shape=\scshape}%
+ \PackageWarning{beamerthememetropolis}{%
+ Be aware that titleformat plain=allsmallcaps can lead to problems%
+ }
+ },
+ allcaps/.code={%
+ \let\metropolis@plaintitleformat\MakeUppercase%
+ \setbeamerfont{standout}{shape=\normalfont}%
+ \PackageWarning{beamerthememetropolis}{%
+ Be aware that titleformat plain=allcaps can lead to problems%
+ }
+ },
+}
+\pgfkeys{
+ /metropolis/titleformat/.code=\pgfkeysalso{
+ font/titleformat title=#1,
+ font/titleformat subtitle=#1,
+ font/titleformat section=#1,
+ font/titleformat frame=#1,
+ titleformat plain=#1,
+ }
+}
+\pgfkeys{/metropolis/.cd,
+ usetitleprogressbar/.code=\pgfkeysalso{outer/progressbar=frametitle},
+ noslidenumbers/.code=\pgfkeysalso{outer/numbering=none},
+ usetotalslideindicator/.code=\pgfkeysalso{outer/numbering=fraction},
+ nosectionslide/.code=\pgfkeysalso{inner/sectionpage=none},
+ darkcolors/.code=\pgfkeysalso{color/background=dark},
+ blockbg/.code=\pgfkeysalso{color/block=fill, inner/block=fill},
+}
+\newcommand{\metropolis@setdefaults}{
+ \pgfkeys{/metropolis/.cd,
+ titleformat plain=regular,
+ }
+}
+\providecommand{\tikzexternalenable}{}
+\providecommand{\tikzexternaldisable}{}
+\useinnertheme{metropolis}
+\useoutertheme{metropolis}
+\usecolortheme{metropolis}
+\usefonttheme{metropolis}
+\AtEndPreamble{%
+ \@ifpackageloaded{pgfplots}{%
+ \RequirePackage{pgfplotsthemetol}
+ }{}
+}
+\newcommand{\metroset}[1]{\pgfkeys{/metropolis/.cd,#1}}
+\def\metropolis@plaintitleformat#1{#1}
+\newcommand{\plain}[2][]{%
+ \PackageWarning{beamerthememetropolis}{%
+ The syntax `\plain' may be deprecated in a future version of Metropolis.
+ Please use a frame with [standout] instead.
+ }
+ \begin{frame}[standout]{#1}
+ \metropolis@plaintitleformat{#2}
+ \end{frame}
+}
+\newcommand{\mreducelistspacing}{\vspace{-\topsep}}
+\metropolis@setdefaults
+\ProcessPgfOptions{/metropolis}
+\endinput
+%%
+%% End of file `beamerthememetropolis.sty'.
diff --git a/presentation/paper-code.pdf b/presentation/paper-code.pdf
new file mode 100644
index 0000000..0deb974
--- /dev/null
+++ b/presentation/paper-code.pdf
Binary files differ
diff --git a/presentation/presentation.tex b/presentation/presentation.tex
new file mode 100644
index 0000000..e1500e0
--- /dev/null
+++ b/presentation/presentation.tex
@@ -0,0 +1,1309 @@
+\documentclass[10pt,aspectratio=169,table]{beamer}
+
+\def\ymhgistrue{1}
+\def\ymhgextended{0}
+
+\usepackage{minted}
+\usepackage{tikz}
+\usepackage{pgfplots}
+\usepackage{booktabs}
+\usepackage{multicol}
+\usepackage{multirow}
+\usepackage{graphicx}
+
+% \usepackage{pgfpages}
+% \setbeameroption{show notes}
+% \setbeameroption{show notes on second screen=right}
+
+% Ideas for xilinx
+% - Explain XORed circuit
+% - Go over difficulties that were encountered when fuzzing tools
+% - Explain SMT in detail and how the equivalence check is done
+% -
+
+\usetheme{metropolis}
+
+\usetikzlibrary{calc,arrows.meta}
+\usetikzlibrary{decorations,patterns,arrows,decorations.pathmorphing}
+\usetikzlibrary{circuits.logic.US,calc}
+% \usetikzlibrary{external}
+% \usepgfplotslibrary{external}
+
+\pgfplotsset{every x tick label/.append style={font=\footnotesize, yshift=0.5ex}}
+
+% \definecolor{imperialbg}{HTML}{002147}
+
+% \setbeamercolor{palette primary}{bg=imperialbg,fg=black!2}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%% Declarations %%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\newsavebox{\codebox}
+\newsavebox{\codeboxbody}
+\newsavebox{\codeboxassign}
+\newsavebox{\codeboxinit}
+\newsavebox{\codeboxtoplevel}
+\newsavebox{\codeboxextra}
+\newsavebox{\codeboxsynthesised}
+\newsavebox{\codeboxreduction}
+\newsavebox{\background}
+\newsavebox{\codeboxresult}
+\newsavebox{\motivationa}
+\newsavebox{\motivationb}
+\newsavebox{\motivationc}
+\newsavebox{\motivationd}
+\newsavebox{\motivatione}
+\newsavebox{\motivationf}
+
+\definecolor{palette1}{HTML}{f5793a}
+\definecolor{palette2}{HTML}{a95aa1}
+\definecolor{palette3}{HTML}{85c0f9}
+\definecolor{palette4}{HTML}{0f2080}
+
+\definecolor{ribbon1}{HTML}{66c2a5}
+\definecolor{ribbon2}{HTML}{fc8d62}
+\definecolor{ribbon3}{HTML}{8da0cb}
+\definecolor{ribbon4}{HTML}{e78ac3}
+\definecolor{ribbon5}{HTML}{a6d854}
+\definecolor{ribbon6}{HTML}{ffd92f}
+
+\definecolor{diag1}{HTML}{ccebc5}
+\definecolor{diag2}{HTML}{b3cde3}
+\definecolor{diagerr}{HTML}{fbb4ae}
+\definecolor{rred}{HTML}{c0504d}
+
+\definecolor{distr1}{HTML}{1b9e77}
+\definecolor{distr2}{HTML}{d95f02}
+\definecolor{distr3}{HTML}{7570b3}
+\definecolor{distr4}{HTML}{e7298a}
+\definecolor{distr5}{HTML}{66a61e}
+\definecolor{distr6}{HTML}{e6ab02}
+\definecolor{distr7}{HTML}{a6761d}
+\definecolor{distr8}{HTML}{666666}
+
+\definecolor{pltblue}{HTML}{1f77b4}
+
+\colorlet{mintedhlcolor}{palette4!20}
+\colorlet{presentationbg}{black!2}
+
+\definecolor{verireduce}{HTML}{e66101}
+\definecolor{creduce}{HTML}{5e3c99}
+
+\pgfplotsset{
+ verismith missynth/.style={verireduce, draw=verireduce, mark=*},
+ creduce missynth/.style={creduce, draw=creduce, mark=triangle*},
+ verismith crash/.style={verireduce, draw=verireduce, mark=o},
+ creduce crash/.style={creduce, draw=creduce, mark=triangle}
+}
+
+\setminted{fontsize=\small,breaklines,highlightcolor=mintedhlcolor}
+
+\setlength{\fboxsep}{2pt}
+
+\newcommand{\tool}[2][]{%
+ \ifx\hfuzz#1\hfuzz #2%
+ \else #2 #1%
+ \fi}%
+\newcommand{\xilinx}[1][]{\tool[#1]{Xilinx}}%
+\newcommand{\intel}[1][]{\tool[#1]{Intel}}%
+\newcommand{\quartus}[1][]{\tool[#1]{Quartus Prime}}%
+\newcommand{\quartuslite}[1][]{\tool[#1]{Quartus Prime Lite}}%
+\newcommand{\yosys}[1][]{\tool[#1]{Yosys}}%
+\newcommand{\xst}[1][]{\tool[#1]{XST}}%
+\newcommand{\vivado}[1][]{\tool[#1]{Vivado}}%
+\newcommand{\verismith}[1][]{\tool[#1]{Verismith}}%
+\newcommand{\iverilog}[1][]{\tool[#1]{Icarus Verilog}}%
+
+\newcommand{\ymhgifextend}{\ifx\ymhgistrue\ymhgextended}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%% TIKZ EXTERNALIZE %%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% \makeatletter
+% \newcommand*{\overlaynumber}{\number\beamer@slideinframe}
+% \tikzset{
+% beamer externalizing/.style={%
+% execute at end picture={%
+% \tikzifexternalizing{%
+% \ifbeamer@anotherslide
+% \pgfexternalstorecommand{\string\global\string\beamer@anotherslidetrue}%
+% \fi
+% }{}%
+% }%
+% },
+% external/optimize=false
+% }
+% \let\orig@tikzsetnextfilename=\tikzsetnextfilename
+% \renewcommand\tikzsetnextfilename[1]{\orig@tikzsetnextfilename{#1-\overlaynumber}}
+% \makeatother
+%
+% \tikzset{every picture/.style={beamer externalizing}}
+%
+% \tikzexternalize
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%% Row colours %%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\makeatletter
+\def\rowcolor{\noalign{\ifnum0=`}\fi\bmr@rowcolor}
+\newcommand<>{\bmr@rowcolor}{%
+ \alt#1%
+ {\global\let\CT@do@color\CT@@do@color\@ifnextchar[\CT@rowa\CT@rowb}%
+ {\ifnum0=`{\fi}\@gooble@rowcolor}%
+}
+
+\newcommand{\@gooble@rowcolor}[2][]{\@gooble@rowcolor@}
+\newcommand{\@gooble@rowcolor@}[1][]{\@gooble@rowcolor@@}
+\newcommand{\@gooble@rowcolor@@}[1][]{\ignorespaces}
+\makeatother
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%% Content %%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\title{Finding and Understanding Bugs in FPGA Synthesis Tools}
+\subtitle{Verismith: FPGA Synthesis Tool Fuzzer}
+
+\author{\underline{Yann Herklotz}, John Wickerson}
+\institute{Imperial College London}
+
+\begin{document}
+
+\maketitle
+
+\note{Trust synthesis tool (Can we and should we?). They have a privileged position and we have to trust them. There is an effective bug finding method that can be used (fuzzing), which is effective at finding bugs.}
+
+\begin{frame}
+ \frametitle{Why find bugs?}
+ \large
+ \visible<1->{
+ \begin{itemize}
+ \item Designers have to trust the synthesis tool to do the right job
+ \item Bugs that generate wrong code can be hard to debug
+ \item Bugs that crash the tool can affect tool flows
+ \end{itemize}
+ }
+ \visible<2>{
+ \vspace{2em}
+
+ \begin{itemize}
+ \item Use \textbf{Verismith} to improve reliability of synthesis tools
+ \end{itemize}
+ }
+\end{frame}
+
+\note[itemize]{%
+\item We often assume correctness of Synthesis tools
+\item If our netlist does not work correctly, we assume there must be a mistake in the design.
+\item Find bugs in C programs, fuzzing was effective.
+}
+
+\begin{frame}
+ \frametitle{Verismith}
+ \begin{center}
+ \begin{tikzpicture}
+ \only<1>{\node[draw,fill=palette3!50,text width=2cm,align=center] (verilog) at (0,0)
+ {Verilog generation};}
+ \only<2->{\node[draw,fill=palette1!50,text width=2cm,align=center] (verilog) at (0,0)
+ {Verilog generation};}
+ \node[draw,fill=palette2!50,circle,text width=1.5cm,align=center,inner sep=-3pt]
+ (verdes) at (2.5,0) {\small Verilog design};
+ \node[draw,fill=palette2!50,circle,text width=1.5cm,align=center,inner sep=-3pt]
+ (vernet) at (6.5,0) {\small Verilog netlist};
+ \node[draw,fill=palette2!50,circle,text width=1.5cm,align=center,inner sep=-3pt]
+ (vertest) at (0,-2) {\footnotesize Reduced test case};
+ \node[draw,fill=palette3!50,minimum height=1cm] (synth) at (4.5,0) {Synthesis};
+ \node[draw,fill=palette3!50,minimum height=1cm,text width=2cm,align=center]
+ (equiv) at (6,-2) {Equivalence check};
+ \only<1>{\node[draw,fill=palette3!50,minimum height=1cm,text width=2cm,align=center]
+ (reduce) at (2.5,-2) {Reduction};}
+ \only<2->{\node[draw,fill=palette1!50,minimum height=1cm,text width=2cm,align=center]
+ (reduce) at (2.5,-2) {Reduction};}
+ \node at (4.3,-2.4) {{\color{rred} \small fail}};
+ \node at (3.8,-1.2) {{\color{rred} \small crash}};
+ \draw[very thick,->] (verilog) -- (verdes);
+ \draw[very thick,->] (verdes) -- (synth);
+ \draw[very thick,->] (synth) -- (vernet);
+ \draw[->] (verdes) -- ($ (equiv.north) + (-0.5,0) $);
+ \draw[very thick,->] (vernet) -- ($ (equiv.north) + (0.5,0) $);
+ \draw[rred,very thick,dashed,->] (synth.south) to [out=270,in=0] ($ (reduce.east) + (0,0.25) $);
+ \draw[->] (verdes) -- ($ (reduce.north) $);
+ \draw[rred,very thick,dashed,->] (equiv) to [out=180,in=0] ($ (reduce.east) + (0,-0.25) $);
+ \draw[very thick,->] (reduce) -- (vertest);
+ \end{tikzpicture}
+ \end{center}
+
+ \vspace{1em}
+ \large
+ \begin{columns}
+ \begin{column}{0.6\textwidth}
+ \textbf{Main contributions}
+ \begin{itemize}
+ \item Synthesis tool fuzzing framework
+ \item<2-> Behavioural and deterministic Verilog generation
+ \item<2-> Efficient Verilog Reduction
+ \end{itemize}
+ \end{column}
+ \begin{column}{0.4\textwidth}
+ \visible<3>{%
+ \textbf{Synthesis tools tested}
+ \begin{itemize}
+ \item[] Quartus \hspace{2em} Vivado
+ \item[] XST \hspace{4em} Yosys
+ \end{itemize}
+ \vspace{2.5em}
+ }
+ \end{column}
+ \end{columns}
+\end{frame}
+
+\begin{lrbox}{\background}
+ \begin{tikzpicture}
+ \node (chosen) at (0,1) {\textbf{Chosen}};
+ \node (subset) at (0,0.6) {\textbf{subset}};
+ \node (deterministic) at (3,1) {\textbf{Deterministic}};
+ \node (synthesisable) at (-3,1) {\textbf{Synthesisable}};
+ \node (semantic) at (0,3.5) {\textbf{Semantically correct}};
+ \node (syntactic) at (0,2) [draw,very thick,minimum width=12cm,minimum height=7.5cm] {};
+ \node (text) at (-3,5) {\textbf{Syntactically correct}};
+ \draw[very thick]
+ (0,0.8) ellipse (1cm and 0.7cm)
+ (-1.5,1) ellipse (3cm and 2cm)
+ (1.5,1) ellipse (3cm and 2cm)
+ (0,1.5) ellipse (5cm and 3cm)
+ ;
+ \end{tikzpicture}
+\end{lrbox}
+
+\begin{frame}
+ \frametitle{Background}
+ \large
+ \begin{columns}
+ \begin{column}{0.3\textwidth}
+ \textbf{Verilog 2005 standards}
+
+ \begin{itemize}
+ \item Verilog for simulation
+ \item Synthesisable Verilog
+ \end{itemize}
+
+ \end{column}%
+ \begin{column}{0.7\textwidth}
+ \scalebox{0.8}{\usebox{\background}}
+ \end{column}
+ \end{columns}
+\end{frame}
+
+\begin{frame}
+ \frametitle{Background}
+ \large
+
+
+ \textbf{What is deterministic Verilog?}
+ \begin{itemize}
+ \item Only one interpretation of the design
+ \item Nondeterminism example:
+
+ Any undefined values can be 1 or 0
+ \end{itemize}
+
+ \vspace{2em}
+
+ \visible<2>{%
+ \textbf{What is a bug?}
+ \begin{itemize}
+ \item Synthesis tool crashes
+ \item Synthesis tool outputs the wrong netlist
+ \end{itemize}
+ }
+\end{frame}
+
+\note[itemize]{%
+\item Determinism in terms of the spec
+\item Code will only be generated that does not give any ambiguity about its value
+}
+
+\begin{frame}[fragile]
+ \frametitle{Motivating Bug: Yosys}
+ \large
+ \begin{lrbox}{\motivationa}
+ \begin{minipage}{.8\textwidth}
+\begin{minted}[fontsize=\large]{verilog}
+module top (output y, input [2:0] w);
+ assign y = 1'b1 >> (w * (3'b110));
+endmodule
+\end{minted}
+ \end{minipage}
+ \end{lrbox}
+ \begin{lrbox}{\motivationb}
+ \begin{minipage}{.8\textwidth}
+\begin{minted}[fontsize=\large]{verilog}
+module top (output y, input [2:0] w);
+ assign y = 1'b1 >> (3'b100 * (3'b110));
+endmodule
+\end{minted}
+ \end{minipage}
+ \end{lrbox}
+ \begin{lrbox}{\motivationc}
+ \begin{minipage}{.8\textwidth}
+\begin{minted}[escapeinside=||,fontsize=\large]{verilog}
+module top (output y, input [2:0] w);
+ assign y = 1'b1 >> |\colorbox{red!20}{6'b110000}|;
+endmodule
+\end{minted}
+ \end{minipage}
+ \end{lrbox}
+ \begin{lrbox}{\motivationd}
+ \begin{minipage}{.8\textwidth}
+\begin{minted}[escapeinside=||,fontsize=\large]{verilog}
+module top (output y, input [2:0] w);
+ assign y = |\colorbox{red!20}{1'b0}|;
+endmodule
+\end{minted}
+ \end{minipage}
+ \end{lrbox}
+ \begin{lrbox}{\motivatione}
+ \begin{minipage}{.8\textwidth}
+\begin{minted}[fontsize=\large]{verilog}
+module top (output y, input [2:0] w);
+ assign y = 1'b1 >> 3'b000;
+endmodule
+\end{minted}
+ \end{minipage}
+ \end{lrbox}
+ \begin{lrbox}{\motivationf}
+ \begin{minipage}{.8\textwidth}
+\begin{minted}[fontsize=\large]{verilog}
+module top (output y, input [2:0] w);
+ assign y = 1'b1;
+endmodule
+\end{minted}
+ \end{minipage}
+ \end{lrbox}
+ \begin{center}%
+ \only<1>{\usebox{\motivationa}}%
+ \only<2>{\usebox{\motivationb}}%
+ \only<3>{\usebox{\motivationc}}%
+ \only<4>{\usebox{\motivationd}}%
+ \only<5>{\usebox{\motivatione}}%
+ \only<6>{\usebox{\motivationf}}%
+ \end{center}
+
+ \vspace{3em}
+
+ \begin{itemize}
+ \item Bug in a development version of Yosys\footnotemark
+ \item Result not truncated properly, which results in an unwanted shift
+ \end{itemize}
+ \footnotetext{\url{https://github.com/YosysHQ/yosys/issues/1047}}
+\end{frame}
+
+\note[itemize]{%
+\item Bug found in dev version of Yosys between 0.8 and 0.9.
+\item Multiplication not truncated which results in shifts that should not occur.
+}
+
+\section{Example Verismith Run}
+
+\begin{frame}
+ \frametitle{Run Outline: Verilog Generation}
+ \begin{center}
+ \scalebox{1.3}{
+ \begin{tikzpicture}
+ \draw[palette1,fill=palette1,draw opacity=0,fill opacity=0.3,very thick] (0.9,0) ellipse (2.5cm and 1.2cm);
+ \node[draw,fill=palette1!50,text width=2cm,align=center] (verilog) at (0,0)
+ {Verilog generation};
+ \node[draw,fill=palette1!50,circle,text width=1.5cm,align=center,inner sep=-3pt]
+ (verdes) at (2.5,0) {\small Verilog design};
+ \node[draw,fill=palette2!50,circle,text width=1.5cm,align=center,inner sep=-3pt]
+ (vernet) at (6.5,0) {\small Verilog netlist};
+ \node[draw,fill=palette2!50,circle,text width=1.5cm,align=center,inner sep=-3pt]
+ (vertest) at (0,-2) {\footnotesize Reduced test case};
+ \node[draw,fill=palette3!50,minimum height=1cm] (synth) at (4.5,0) {Synthesis};
+ \node[draw,fill=palette3!50,minimum height=1cm,text width=2cm,align=center]
+ (equiv) at (6,-2) {Equivalence check};
+ \node[draw,fill=palette3!50,minimum height=1cm,text width=2cm,align=center]
+ (reduce) at (2.5,-2) {Reduction};
+ \node at (4.3,-2.4) {{\color{rred} \small fail}};
+ \node at (3.8,-1.2) {{\color{rred} \small crash}};
+ \draw[palette1,very thick,->] (verilog) -- (verdes);
+ \draw[very thick,->] (verdes) -- (synth);
+ \draw[very thick,->] (synth) -- (vernet);
+ \draw[->] (verdes) -- ($ (equiv.north) + (-0.5,0) $);
+ \draw[very thick,->] (vernet) -- ($ (equiv.north) + (0.5,0) $);
+ \draw[rred,very thick,dashed,->] (synth.south) to [out=270,in=0] ($ (reduce.east) + (0,0.25) $);
+ \draw[->] (verdes) -- ($ (reduce.north) $);
+ \draw[rred,very thick,dashed,->] (equiv) to [out=180,in=0] ($ (reduce.east) + (0,-0.25) $);
+ \draw[very thick,->] (reduce) -- (vertest);
+ \end{tikzpicture}
+ }
+ \end{center}
+\end{frame}
+
+\begin{lrbox}{\codebox}
+ \begin{minipage}{2\textwidth}
+ \vspace{4em}
+ \inputminted{verilog}{ExampleRun/output2/fuzz_1/identity/syn_identity.v}
+ \end{minipage}
+\end{lrbox}
+
+\begin{frame}[fragile]
+ \frametitle{Verilog generation}
+ \large
+ \begin{columns}
+ \begin{column}{0.4\textwidth}
+ \scalebox{0.2}{\usebox{\codebox}}
+ % \tikzset{external/export next=false}
+ \begin{tikzpicture}[overlay]
+ \begin{scope}[shift={(0,0.05)}]
+ \only<4->{%
+ \draw[fill=palette1,fill opacity=0.5,thick] (0,5.05) rectangle (5,6.65);
+ \draw[fill=palette1,fill opacity=0.5,thick] (0,0.8) rectangle (5,1.85);
+ }
+ \only<3->{%
+ \draw[fill=palette2,fill opacity=0.5,thick] (0,4.85) rectangle (5,5.05);
+ \draw[fill=palette2,fill opacity=0.5,thick] (0,0.7) rectangle (5,0.8);
+ }
+ \only<2->{%
+ \draw[fill=palette3,fill opacity=0.5,thick] (0,2.1) rectangle (5,4.85);
+ \draw[fill=palette3,fill opacity=0.5,thick] (0,0.05) rectangle (5,0.7);
+ }
+ \end{scope}
+ \end{tikzpicture}
+ \end{column}%
+ \begin{column}{0.6\textwidth}
+ Example of generated Verilog by Verismith
+ \begin{itemize}
+ \item Bug of uninitialised variable in Yosys 0.8
+ \end{itemize}
+
+ \vspace{2em}
+
+ \begin{itemize}
+ \item<2-> Random module items in the body
+ \item<3-> Assignment of the internal state to the output
+ \item<4-> Definition of nets and initialisation of variables
+ \end{itemize}
+ \end{column}
+ \end{columns}
+\end{frame}
+
+\note[itemize]{%
+\item Bug found in Yosys 0.8.
+\item There are 3 main sections in the Verilog code: initialisation, assignment to output and random Verilog section.
+\item There can also be multiple modules in the Verilog code.
+}
+
+\begin{lrbox}{\codeboxbody}%
+ \begin{minipage}{0.9\textwidth}%
+ \vspace{2em}%
+ \inputminted[firstline=23,lastline=42]{verilog}{ExampleRun/output2/fuzz_1/identity/syn_identity.v}
+ \end{minipage}%
+\end{lrbox}%
+
+{
+ \setbeamercolor{frametitle}{%
+ fg=black!90,
+ bg=palette3!80%
+ }
+ \begin{frame}
+ \frametitle{Generation of the body}
+ \large
+ \begin{columns}
+ \begin{column}{0.6\textwidth}
+ \scalebox{0.6}{\usebox{\codeboxbody}}
+ \end{column}%
+ \begin{column}{0.4\textwidth}
+ \only<1>{%
+ Generate Verilog node-by-node to:
+
+ \begin{itemize}
+ \item Ensure determinism
+ \item Generate behavioural constructs
+ \item Avoid logic loops
+ \end{itemize}
+ }%
+ \only<2>{%
+ Unsupported constructs:
+ \begin{itemize}
+ \item function definitions
+ \item alternate ranges (\texttt{+:}, \texttt{-:})
+ \end{itemize}
+ }
+ \end{column}
+ \end{columns}
+ \end{frame}
+}
+
+{
+ \setbeamercolor{frametitle}{%
+ fg=black!90,
+ bg=palette2!80%
+ }
+ \begin{frame}
+ \frametitle{Internal State Assignment}
+ \inputminted[firstline=21,lastline=22]{verilog}{ExampleRun/output2/fuzz_1/identity/syn_identity.v}
+ \vspace{2em}
+ Need to assign all the internal state to the output \texttt{y}.
+
+ \begin{itemize}
+ \item As all the wires and variables are assigned a value, this concatenation can never be undefined.
+ \item Any changes in the internal state are reflected in \texttt{y}.
+ \end{itemize}
+ \end{frame}
+}
+
+{
+ \setbeamercolor{frametitle}{%
+ fg=black!90,
+ bg=palette1!80%
+ }
+ \begin{frame}
+ \frametitle{Initialisation}
+ \large
+ \only<2>{
+ \setminted{highlightlines={3-8}}
+ }
+ \only<3>{
+ \setminted{highlightlines={9-12,18-20}}
+ }
+ \only<4>{
+ \setminted{highlightlines={13-17}}
+ }
+ \begin{lrbox}{\codeboxinit}
+ \begin{minipage}{0.6\textwidth}
+ \vspace{2em}
+ \inputminted[firstline=3,lastline=20]{verilog}{ExampleRun/output2/fuzz_1/identity/syn_identity.v}
+ \end{minipage}
+ \end{lrbox}
+ \begin{columns}
+ \begin{column}{0.45\textwidth}
+ \scalebox{0.8}{\usebox{\codeboxinit}}
+ \end{column}
+ \begin{column}{0.55\textwidth}
+ \begin{itemize}
+ \item<2-> Define the inputs and outputs of the module with random sizes.
+ \item<3-> Define nets that get assigned in the module.
+ \item<4-> Define and initialise variables to 0.
+ \end{itemize}
+ \end{column}
+ \end{columns}
+ \end{frame}
+
+ \note[itemize]{%
+ \item The verilog has to be correct meaning we have to correctly initialise the inputs and outputs.
+ \item We also declare the wires with random sizes.
+ }
+}
+
+\begin{frame}
+ \frametitle{Run Outline: Synthesis}
+ \begin{center}
+ \scalebox{1.3}{
+ \begin{tikzpicture}
+ \draw[palette1,fill=palette1,draw opacity=0,fill opacity=0.3,very thick] (4.5,0) ellipse (3cm and 1.2cm);
+ \node[draw,fill=palette3!50,text width=2cm,align=center] (verilog) at (0,0)
+ {Verilog generation};
+ \node[draw,fill=palette1!50,circle,text width=1.5cm,align=center,inner sep=-3pt]
+ (verdes) at (2.5,0) {\small Verilog design};
+ \node[draw,fill=palette1!50,circle,text width=1.5cm,align=center,inner sep=-3pt]
+ (vernet) at (6.5,0) {\small Verilog netlist};
+ \node[draw,fill=palette2!50,circle,text width=1.5cm,align=center,inner sep=-3pt]
+ (vertest) at (0,-2) {\footnotesize Reduced test case};
+ \node[draw,fill=palette1!50,minimum height=1cm] (synth) at (4.5,0) {Synthesis};
+ \node[draw,fill=palette3!50,minimum height=1cm,text width=2cm,align=center]
+ (equiv) at (6,-2) {Equivalence check};
+ \node[draw,fill=palette3!50,minimum height=1cm,text width=2cm,align=center]
+ (reduce) at (2.5,-2) {Reduction};
+ \node at (4.3,-2.4) {{\color{rred} \small fail}};
+ \node at (3.8,-1.2) {{\color{rred} \small crash}};
+ \draw[very thick,->] (verilog) -- (verdes);
+ \draw[palette1,very thick,->] (verdes) -- (synth);
+ \draw[palette1,very thick,->] (synth) -- (vernet);
+ \draw[->] (verdes) -- ($ (equiv.north) + (-0.5,0) $);
+ \draw[very thick,->] (vernet) -- ($ (equiv.north) + (0.5,0) $);
+ \draw[rred,very thick,dashed,->] (synth.south) to [out=270,in=0] ($ (reduce.east) + (0,0.25) $);
+ \draw[->] (verdes) -- ($ (reduce.north) $);
+ \draw[rred,very thick,dashed,->] (equiv) to [out=180,in=0] ($ (reduce.east) + (0,-0.25) $);
+ \draw[very thick,->] (reduce) -- (vertest);
+ \end{tikzpicture}
+ }
+ \end{center}
+\end{frame}
+
+\begin{lrbox}{\codeboxsynthesised}
+ \begin{minipage}{\textwidth}
+ \vspace{3em}
+ \inputminted[firstline=800,lastline=820]{verilog}{ExampleRun/output2/fuzz_1/yosys/syn_yosys.v}
+ \end{minipage}
+\end{lrbox}
+
+\begin{frame}
+ \frametitle{Yosys Synthesis}
+ \large
+ \begin{columns}
+ \begin{column}{0.65\textwidth}
+ \scalebox{0.6}{\usebox{\codeboxbody}}
+ \end{column}
+ \begin{column}{0.35\textwidth}
+ \begin{center}
+ \scalebox{0.6}{\usebox{\codeboxsynthesised}}
+ \end{center}
+ \end{column}
+ \end{columns}
+ \scalebox{0.7}{
+ % \tikzset{external/export next=false}
+ \begin{tikzpicture}[overlay]
+ \begin{scope}[shift={(10,4.5)}]
+ \draw[draw,rounded corners,very thick] (0,0) -- (2,0) -- (3,0.5) -- (2,1) -- (0,1) -- (0.5,0.5) -- cycle;
+ \node at (1.5,0.5) {Synthesis};
+ \end{scope}
+ \end{tikzpicture}
+ }
+\end{frame}
+
+\begin{frame}
+ \frametitle{Run Outline: Equivalence Check}
+ \begin{center}
+ \scalebox{1.3}{
+ \begin{tikzpicture}
+ \draw[palette1,fill=palette1,draw opacity=0,fill opacity=0.3,very thick] (6,-2) ellipse (1.5cm and 1cm);
+ \node[draw,fill=palette3!50,text width=2cm,align=center] (verilog) at (0,0)
+ {Verilog generation};
+ \node[draw,fill=palette1!50,circle,text width=1.5cm,align=center,inner sep=-3pt]
+ (verdes) at (2.5,0) {\small Verilog design};
+ \node[draw,fill=palette1!50,circle,text width=1.5cm,align=center,inner sep=-3pt]
+ (vernet) at (6.5,0) {\small Verilog netlist};
+ \node[draw,fill=palette2!50,circle,text width=1.5cm,align=center,inner sep=-3pt]
+ (vertest) at (0,-2) {\footnotesize Reduced test case};
+ \node[draw,fill=palette3!50,minimum height=1cm] (synth) at (4.5,0) {Synthesis};
+ \node[draw,fill=palette1!50,minimum height=1cm,text width=2cm,align=center]
+ (equiv) at (6,-2) {Equivalence check};
+ \node[draw,fill=palette3!50,minimum height=1cm,text width=2cm,align=center]
+ (reduce) at (2.5,-2) {Reduction};
+ \node at (4.3,-2.4) {{\color{rred} \small fail}};
+ \node at (3.8,-1.2) {{\color{rred} \small crash}};
+ \draw[very thick,->] (verilog) -- (verdes);
+ \draw[very thick,->] (verdes) -- (synth);
+ \draw[very thick,->] (synth) -- (vernet);
+ \draw[palette1,->] (verdes) -- ($ (equiv.north) + (-0.5,0) $);
+ \draw[palette1,very thick,->] (vernet) -- ($ (equiv.north) + (0.5,0) $);
+ \draw[rred,very thick,dashed,->] (synth.south) to [out=270,in=0] ($ (reduce.east) + (0,0.25) $);
+ \draw[->] (verdes) -- ($ (reduce.north) $);
+ \draw[rred,very thick,dashed,->] (equiv) to [out=180,in=0] ($ (reduce.east) + (0,-0.25) $);
+ \draw[very thick,->] (reduce) -- (vertest);
+ \end{tikzpicture}
+ }
+ \end{center}
+\end{frame}
+
+\ymhgifextend%
+\begin{frame}
+ \frametitle{Equivalence check: What is an SMT solver?}
+ \large
+
+\end{frame}
+
+\begin{frame}
+ \frametitle{Equivalence check: What is ABC?}
+ \large
+\end{frame}
+\fi
+
+\begin{frame}
+ \frametitle{Equivalence check}
+ \large
+ \begin{lrbox}{\codeboxtoplevel}
+ \begin{minipage}{0.8\textwidth}
+ \vspace{2em}
+ \only<1>{\inputminted{verilog}{ExampleRun/output2/fuzz_1/equiv_identity_yosys/top.v}}
+ \only<2>{\inputminted[highlightlines={2}]{verilog}{ExampleRun/output2/fuzz_1/equiv_identity_yosys/top.v}}
+ \only<3>{\inputminted[highlightlines={3}]{verilog}{ExampleRun/output2/fuzz_1/equiv_identity_yosys/top.v}}
+ \only<4>{\inputminted[highlightlines={6}]{verilog}{ExampleRun/output2/fuzz_1/equiv_identity_yosys/top.v}}
+ \end{minipage}
+ \end{lrbox}
+ \begin{columns}
+ \begin{column}{0.6\textwidth}
+ \begin{tikzpicture}[circuit logic US]
+ \node[xor gate,scale=2] (comp) at (4.7,-0.5) {};
+ \node[or gate] (comb) at (6.5,-0.5) {};
+
+ \draw (0,0) rectangle (3,2);
+ \node at (1.5,1) {Design};
+ \foreach \i in {0,...,3} {
+ \node at (0.4,0.8+0.3*\i) {\tiny wire\i};}
+ \draw (0,0.2) -- (0.1,0.3) -- (0,0.4);
+ \node at (2.8,0.3) {\tiny y};
+
+ \draw (0,-3) rectangle (3,-1);
+ \node at (1.5,-2) {Netlist};
+ \foreach \i in {0,...,3} {
+ \node at (0.4,0.8+0.3*\i-3) {\tiny wire\i};}
+ \draw (0,0.2-3) -- (0.1,0.3-3) -- (0,0.4-3);
+ \node at (2.8,-1.3) {\tiny y};
+
+ \draw[very thick] (3,-1.3) -- (3.5,-1.3) |- (comp.input 2);
+ \draw (3.2,-1.5) -- (3.3,-1.1);
+ \node at (3.25,-0.9) {\footnotesize N};
+ \draw[very thick] (3,0.3) -- (3.5,0.3) |- (comp.input 1);
+ \draw (3.2,0.1) -- (3.3,0.5);
+ \node at (3.25,0.7) {\footnotesize N};
+ \draw[very thick] (comp.output) -- (comb.west);
+ \draw (comb.output) -- ($(comb.output) + (0.2,0)$);
+ \draw ($(comp.output) + (0.3,0.2)$) -- ($(comp.output) + (0.2,-0.2)$);
+ \node at ($(comp.output) + (0.25,0.4)$) {\footnotesize N};
+
+ \foreach \i in {0,...,3} {
+ \draw[very thick] (-1,-1+\i*0.3) -| (-0.5+0.1*\i,-1+\i*0.3) |- (0,0.8+0.3*\i);
+ \draw[very thick] (-0.5+0.1*\i,-1+\i*0.3) |- (0,0.8+0.3*\i-3);
+ \draw (-0.9,-1+\i*0.3-0.2) -- (-0.8,-1+\i*0.3+0.2);
+ \node at (-1.5,-1+\i*0.3) {\tiny wire\i};}
+
+ \draw (-1,-1.3) -| (-0.6,-1.3) |- (0,0.3);
+ \draw (-0.6,-1.3) |- (0,0.3-3);
+ \node at (-1.4,-1.3) {\tiny clk};
+ \end{tikzpicture}
+ \end{column}%
+ \begin{column}{0.4\textwidth}
+ Equivalence check done using an SMT solver (Z3) through Yosys
+ \begin{itemize}
+ \item<2-> Instantiate generated design with output \texttt{y\_1}
+ \item<3-> Instantiate synthesised netlist with output \texttt{y\_2}
+ \item<4-> Should be equal at every clock edge
+ \end{itemize}
+ \end{column}
+ \end{columns}
+\end{frame}
+
+\begin{frame}
+ \frametitle{Run Outline: Reduction}
+ \begin{center}
+ \scalebox{1.3}{
+ \begin{tikzpicture}
+ \draw[palette1,fill=palette1,draw opacity=0,fill opacity=0.3,very thick] (1.5,-2) ellipse (2.7cm and 1.2cm);
+ \node[draw,fill=palette3!50,text width=2cm,align=center] (verilog) at (0,0)
+ {Verilog generation};
+ \node[draw,fill=palette1!50,circle,text width=1.5cm,align=center,inner sep=-3pt]
+ (verdes) at (2.5,0) {\small Verilog design};
+ \node[draw,fill=palette2!50,circle,text width=1.5cm,align=center,inner sep=-3pt]
+ (vernet) at (6.5,0) {\small Verilog netlist};
+ \node[draw,fill=palette1!50,circle,text width=1.5cm,align=center,inner sep=-3pt]
+ (vertest) at (0,-2) {\footnotesize Reduced test case};
+ \node[draw,fill=palette3!50,minimum height=1cm] (synth) at (4.5,0) {Synthesis};
+ \node[draw,fill=palette3!50,minimum height=1cm,text width=2cm,align=center]
+ (equiv) at (6,-2) {Equivalence check};
+ \node[draw,fill=palette1!50,minimum height=1cm,text width=2cm,align=center]
+ (reduce) at (2.5,-2) {Reduction};
+ \node at (4.3,-2.4) {{\color{rred} \small fail}};
+ \node at (3.8,-1.2) {{\color{rred} \small crash}};
+ \draw[very thick,->] (verilog) -- (verdes);
+ \draw[very thick,->] (verdes) -- (synth);
+ \draw[very thick,->] (synth) -- (vernet);
+ \draw[->] (verdes) -- ($ (equiv.north) + (-0.5,0) $);
+ \draw[very thick,->] (vernet) -- ($ (equiv.north) + (0.5,0) $);
+ \draw[rred,very thick,dashed,->] (synth.south) to [out=270,in=0] ($ (reduce.east) + (0,0.25) $);
+ \draw[palette1,->] (verdes) -- ($ (reduce.north) $);
+ \draw[rred,very thick,dashed,->] (equiv) to [out=180,in=0] ($ (reduce.east) + (0,-0.25) $);
+ \draw[palette1,very thick,->] (reduce) -- (vertest);
+ \end{tikzpicture}
+ }
+ \end{center}
+\end{frame}
+
+\begin{frame}
+ \frametitle{Reduction}
+ \large
+ \begin{lrbox}{\codeboxreduction}
+ \begin{minipage}{1.2\textwidth}
+ \vspace{2em}
+ \only<1>{\inputminted{verilog}{ExampleRun/output2/fuzz_1/identity/syn_identity.v}}
+ \only<2>{\inputminted[escapeinside=¬¬,highlightlines={20,46,56-77},highlightcolor=red!30]{verilog}{ExampleRun/output2/fuzz_1/identity/syn_identity_colour.v}}
+ \only<3>{\inputminted{verilog}{ExampleRun/output2/fuzz_1/identity/syn_identity_red1.v}}
+ \only<4>{\inputminted[escapeinside=¬¬,highlightlines={9-12,45-51},highlightcolor=red!30]{verilog}{ExampleRun/output2/fuzz_1/identity/syn_identity_red1_colour.v}}
+ % \only<5>{\inputminted{verilog}{ExampleRun/output2/fuzz_1/identity/syn_identity_red2.v}}
+ % \only<6>{\inputminted[escapeinside=¬¬,highlightlines={9-12,17-36},highlightcolor=green!30]{verilog}{ExampleRun/output2/fuzz_1/identity/syn_identity_red2_colour.v}}
+ % \only<7>{\inputminted[escapeinside=¬¬,highlightlines={14-15,37-39},highlightcolor=red!30]{verilog}{ExampleRun/output2/fuzz_1/identity/syn_identity_red2_colour2.v}}
+ % \only<8>{\inputminted{verilog}{ExampleRun/output2/fuzz_1/identity/syn_identity_red3.v}}
+ % \only<9>{\inputminted{verilog}{ExampleRun/output2/fuzz_1/identity/syn_identity_red4.v}}
+ % \only<10>{\inputminted{verilog}{ExampleRun/output2/fuzz_1/identity/syn_identity_red5.v}}
+ \only<5->{\inputminted{verilog}{ExampleRun/output2/fuzz_1/reduce_identity_yosys.v}}
+ \end{minipage}
+ \end{lrbox}
+ \begin{lrbox}{\codeboxresult}
+ \begin{minipage}{0.55\textwidth}
+ \vspace{3em}
+ \only<6>{\inputminted[highlightcolor=red!30,highlightlines={6}]{verilog}{ExampleRun/output2/fuzz_1/actual_wrong.v}}
+ \only<7>{\inputminted{verilog}{ExampleRun/output2/fuzz_1/actual_correct.v}}
+ \end{minipage}
+ \end{lrbox}
+ \only<1-5>{
+ \begin{columns}
+ \begin{column}{0.35\textwidth}
+ \only<1-2>{\scalebox{0.2}{\usebox{\codeboxreduction}}}
+ \only<3-4>{\scalebox{0.3}{\usebox{\codeboxreduction}}}
+ \only<5>{\scalebox{0.8}{\usebox{\codeboxreduction}}}
+ % \only<9-10>{\scalebox{0.4}{\usebox{\codeboxreduction}}}
+ \end{column}%
+ \begin{column}{0.65\textwidth}
+ \only<1-2>{%
+ \begin{itemize}
+ \item Verilog has to be reduced to a minimal representation to identify the bug.
+ \item Perform binary search on \textbf{syntax tree}.
+ \item Traditional methods perform search on source code.
+ \end{itemize}%
+ }%
+ \only<3-4>{%
+ Search is performed on different levels of granularity:
+ \begin{itemize}
+ \item Modules
+ \item Module items
+ \item Statements inside always blocks
+ \item Expressions
+ \end{itemize}
+ }%
+ \only<5>{%
+ \hspace{5em} We then get a minimal testcase
+ }
+ \end{column}
+ \end{columns}
+ }
+ \only<6->{
+ \begin{columns}
+ \begin{column}{0.5\textwidth}
+ \begin{center}
+ \textbf{\Large Input design}
+ \end{center}
+ \end{column}
+ \begin{column}{0.5\textwidth}
+ \begin{center}
+ \textbf{\Large Yosys netlist}
+ \end{center}
+ \end{column}
+ \end{columns}
+ \begin{columns}
+ \begin{column}{0.5\textwidth}
+ \begin{center}
+ \scalebox{0.8}{\usebox{\codeboxreduction}}
+ \end{center}
+ \end{column}
+ \begin{column}{0.5\textwidth}
+ \begin{center}
+ \scalebox{0.8}{\usebox{\codeboxresult}}
+ \end{center}
+ \end{column}
+ \end{columns}
+ }
+\end{frame}
+
+\section{Experiments and Results}
+
+\begin{frame}
+ \frametitle{Bugs found}
+ \large
+ \scalebox{0.7}{
+ \rowcolors{1}{}{lightgray!20}
+ \begin{tabular}{lrp{5mm}rrrr}
+ \toprule
+ \textbf{Tool} & \multicolumn{1}{p{2cm}}{\centering \textbf{Total test cases}} & \multicolumn{3}{r}{\textbf{Failing test cases}} & \multicolumn{1}{p{3cm}}{\centering \textbf{Distinct failing test cases}} & \multicolumn{1}{p{2cm}}{\centering \textbf{Bug reports}} \\
+ \midrule
+ \rowcolor<4>{palette1!30} \yosys{ 0.8} & 26400 & & 7164 & (27.1\%) & $\ge 1$ & 0 \\
+ \rowcolor<5>{palette1!30} \yosys{ 3333e00} & 51000 & & 7224 & (14.2\%) & $\ge 4$ & 3 \\
+ \rowcolor<5>{palette2!30} \yosys{ 70d0f38} (crash) & 11 & & 1 & (9.09\%) & 1 & 1 \\
+ \rowcolor<4>{palette1!30} \yosys{ 0.9} & 26400 & & 611 & (2.31\%) & $\ge 1$ & 1 \\
+ \rowcolor<3>{palette1!30} \vivado{ 2018.2} & 47992 & & 1134 & (2.36\%) & $\ge 5$ & 3 \\
+ \rowcolor<3>{palette2!30} \vivado{ 2018.2} (crash) & 47992 & & 566 & (1.18\%) & 5 & 2 \\
+ \rowcolor<3>{palette1!30} \xst{ 14.7} & 47992 & & 539 & (1.12\%) & $\ge 2$ & 0 \\
+ \rowcolor<2>{palette1!30} \quartus{ 19.2} & 80300 & & 0 & (0\%) & 0 & 0 \\
+ \rowcolor<2>{palette1!30} \quartuslite{ 19.1} & 43 & & 17 & (39.5\%) & 1 & 0 \\
+ \rowcolor<2>{palette1!30} \quartuslite{ 19.1} (No \texttt{\$signed}) & 137 & & 0 & (0\%) & 0 & 0 \\
+ \midrule
+ \rowcolor<6>{palette1!30} \iverilog{ 10.3} & 26400 & & 616 & (2.33\%) & $\ge 1$ & 1 \\
+ \bottomrule
+ \end{tabular}
+ }
+
+ \vspace{1em}
+
+ \only<1>{%
+ \begin{itemize}
+ \item Summary of all the tests run over 18000 CPU hours
+ \end{itemize}
+ \vspace{1.5em}
+ }
+ \only<2>{%
+ \begin{itemize}
+ \item Quartus Prime Light failing because of the handling of \texttt{\$signed}
+ \item No crashes or failures found in Quartus Prime
+ \end{itemize}
+ }
+ \only<3>{%
+ \begin{itemize}
+ \item Vivado was the only stable tool that crashed
+ \end{itemize}
+ \vspace{1.5em}
+ }
+ \only<4>{%
+ \begin{itemize}
+ \item Yosys improved quite a lot between versions
+ \item Yosys 0.9 contains all the bug fixes that were submitted
+ \end{itemize}
+ }
+ \only<5>{%
+ \begin{itemize}
+ \item Yosys development versions also tested to aid development
+ \end{itemize}
+ \vspace{1.5em}
+ }
+ \only<6>{%
+ \begin{itemize}
+ \item Truncation bug in Icarus Verilog found while checking SMT counter examples
+ \end{itemize}
+ \vspace{1.5em}
+ }
+\end{frame}
+
+\begin{frame}
+ \frametitle{Efficiency at different Verilog sizes}
+ \begin{columns}
+ \begin{column}{0.5\textwidth}
+ \begin{tikzpicture}
+ \begin{semilogxaxis}[width=\linewidth,
+ major x tick style=transparent,
+ xlabel=Lines of code in generated programs,
+ legend style={at={(0.5,-0.15)},anchor=north,legend columns=-1},
+ ylabel=Number of test cases,
+ legend pos=north east,
+ legend style={font=\scriptsize},
+ xmin=50,
+ xmax=8800,
+ ybar=-3.6pt,
+ bar width=3.6pt,
+ ymin=0
+ % nodes near coords,
+ % nodes near coords align={vertical}
+ ]
+ \addplot[style={distr1,fill=distr1,mark=none,fill opacity=0.5,draw opacity=0}] coordinates {
+ (50.0,36) (55.2273245010972,42) (61.0011474309897,113) (67.3786032822108,210) (74.422799757947,341) (82.2034422502463,458) (90.7975236052311,501) (100.290086000843,507) (110.77506247623,353) (122.356206440081,241) (135.148118355792,115) (149.27737976296,39) (164.88380585685,11) (182.121829020643,3) (201.162027001128,0) (222.192810849795,0) (245.422289332251,0) (271.080328255088,0) (299.420825088154,0) (330.724221390595,0) (365.300277902221,0) (403.491139760939,0) (445.674722177899,0) (492.268450073103,0) (543.733388676789,0) (600.578805970684,0) (663.36721211649,0) (732.71992573891,0) (809.323222144053,0) (893.935124312463,0) (987.392903866661,0) (1090.6213662385,0) (1204.64200202167,0) (1330.58309506604,0) (1469.69088733773,0) (1623.34191102612,0) (1793.05660992942,0) (1980.51438490818,0) (2187.5702122883,0) (2416.2729996596,0) (2668.88586070881,0) (2947.90850971511,0) (3256.10199731164,0) (3596.51603228401,0) (3972.51915976695,0) (4387.83209446551,0) (4846.56453874751,0) (5353.25584993839,0) (5912.91995923888,0) (6531.09498675799,0) (7213.89804362345,0) (7968.08576346046,0) (8801.12116222408,0)
+ };
+ \addplot[style={distr2,fill=distr2,mark=none,fill opacity=0.5,draw opacity=0}] coordinates {
+ (50.0,0) (55.2273245010972,0) (61.0011474309897,1) (67.3786032822108,2) (74.422799757947,1) (82.2034422502463,6) (90.7975236052311,12) (100.290086000843,29) (110.77506247623,52) (122.356206440081,99) (135.148118355792,128) (149.27737976296,191) (164.88380585685,219) (182.121829020643,323) (201.162027001128,355) (222.192810849795,294) (245.422289332251,209) (271.080328255088,137) (299.420825088154,71) (330.724221390595,28) (365.300277902221,14) (403.491139760939,2) (445.674722177899,1) (492.268450073103,0) (543.733388676789,0) (600.578805970684,0) (663.36721211649,0) (732.71992573891,0) (809.323222144053,0) (893.935124312463,0) (987.392903866661,0) (1090.6213662385,0) (1204.64200202167,0) (1330.58309506604,0) (1469.69088733773,0) (1623.34191102612,0) (1793.05660992942,0) (1980.51438490818,0) (2187.5702122883,0) (2416.2729996596,0) (2668.88586070881,0) (2947.90850971511,0) (3256.10199731164,0) (3596.51603228401,0) (3972.51915976695,0) (4387.83209446551,0) (4846.56453874751,0) (5353.25584993839,0) (5912.91995923888,0) (6531.09498675799,0) (7213.89804362345,0) (7968.08576346046,0) (8801.12116222408,0)
+ };
+ \addplot[style={distr3,fill=distr3,mark=none,fill opacity=0.5,draw opacity=0}] coordinates {
+ (50.0,0) (55.2273245010972,0) (61.0011474309897,0) (67.3786032822108,0) (74.422799757947,0) (82.2034422502463,0) (90.7975236052311,0) (100.290086000843,0) (110.77506247623,0) (122.356206440081,0) (135.148118355792,0) (149.27737976296,0) (164.88380585685,0) (182.121829020643,0) (201.162027001128,0) (222.192810849795,1) (245.422289332251,0) (271.080328255088,3) (299.420825088154,7) (330.724221390595,9) (365.300277902221,12) (403.491139760939,32) (445.674722177899,46) (492.268450073103,74) (543.733388676789,93) (600.578805970684,129) (663.36721211649,166) (732.71992573891,186) (809.323222144053,171) (893.935124312463,116) (987.392903866661,58) (1090.6213662385,43) (1204.64200202167,16) (1330.58309506604,2) (1469.69088733773,1) (1623.34191102612,0) (1793.05660992942,0) (1980.51438490818,0) (2187.5702122883,0) (2416.2729996596,0) (2668.88586070881,0) (2947.90850971511,0) (3256.10199731164,0) (3596.51603228401,0) (3972.51915976695,0) (4387.83209446551,0) (4846.56453874751,0) (5353.25584993839,0) (5912.91995923888,0) (6531.09498675799,0) (7213.89804362345,0) (7968.08576346046,0) (8801.12116222408,0)
+ };
+ \addplot[style={distr4,fill=distr4,mark=none,fill opacity=0.5,draw opacity=0}] coordinates {
+ (50.0,0) (55.2273245010972,0) (61.0011474309897,0) (67.3786032822108,0) (74.422799757947,0) (82.2034422502463,0) (90.7975236052311,0) (100.290086000843,0) (110.77506247623,0) (122.356206440081,0) (135.148118355792,0) (149.27737976296,0) (164.88380585685,0) (182.121829020643,0) (201.162027001128,0) (222.192810849795,0) (245.422289332251,0) (271.080328255088,0) (299.420825088154,0) (330.724221390595,0) (365.300277902221,0) (403.491139760939,0) (445.674722177899,0) (492.268450073103,2) (543.733388676789,2) (600.578805970684,6) (663.36721211649,12) (732.71992573891,14) (809.323222144053,30) (893.935124312463,56) (987.392903866661,65) (1090.6213662385,84) (1204.64200202167,103) (1330.58309506604,123) (1469.69088733773,109) (1623.34191102612,66) (1793.05660992942,45) (1980.51438490818,18) (2187.5702122883,10) (2416.2729996596,1) (2668.88586070881,0) (2947.90850971511,0) (3256.10199731164,0) (3596.51603228401,0) (3972.51915976695,0) (4387.83209446551,0) (4846.56453874751,0) (5353.25584993839,0) (5912.91995923888,0) (6531.09498675799,0) (7213.89804362345,0) (7968.08576346046,0) (8801.12116222408,0)
+ };
+ \addplot[style={distr5,fill=distr5,mark=none,fill opacity=0.5,draw opacity=0}] coordinates {
+ (50.0,0) (55.2273245010972,0) (61.0011474309897,0) (67.3786032822108,0) (74.422799757947,0) (82.2034422502463,0) (90.7975236052311,0) (100.290086000843,0) (110.77506247623,0) (122.356206440081,0) (135.148118355792,0) (149.27737976296,0) (164.88380585685,0) (182.121829020643,0) (201.162027001128,0) (222.192810849795,0) (245.422289332251,0) (271.080328255088,0) (299.420825088154,0) (330.724221390595,0) (365.300277902221,0) (403.491139760939,0) (445.674722177899,0) (492.268450073103,0) (543.733388676789,0) (600.578805970684,0) (663.36721211649,2) (732.71992573891,0) (809.323222144053,2) (893.935124312463,14) (987.392903866661,16) (1090.6213662385,29) (1204.64200202167,50) (1330.58309506604,76) (1469.69088733773,83) (1623.34191102612,99) (1793.05660992942,99) (1980.51438490818,81) (2187.5702122883,49) (2416.2729996596,35) (2668.88586070881,16) (2947.90850971511,3) (3256.10199731164,2) (3596.51603228401,1) (3972.51915976695,1) (4387.83209446551,0) (4846.56453874751,0) (5353.25584993839,0) (5912.91995923888,0) (6531.09498675799,0) (7213.89804362345,0) (7968.08576346046,0) (8801.12116222408,0)
+ };
+ \addplot[style={distr6,fill=distr6,mark=none,fill opacity=0.5,draw opacity=0}] coordinates {
+ (50.0,0) (55.2273245010972,0) (61.0011474309897,0) (67.3786032822108,0) (74.422799757947,0) (82.2034422502463,0) (90.7975236052311,0) (100.290086000843,0) (110.77506247623,0) (122.356206440081,0) (135.148118355792,0) (149.27737976296,0) (164.88380585685,0) (182.121829020643,0) (201.162027001128,0) (222.192810849795,0) (245.422289332251,0) (271.080328255088,0) (299.420825088154,0) (330.724221390595,0) (365.300277902221,0) (403.491139760939,0) (445.674722177899,0) (492.268450073103,0) (543.733388676789,0) (600.578805970684,0) (663.36721211649,0) (732.71992573891,0) (809.323222144053,0) (893.935124312463,0) (987.392903866661,0) (1090.6213662385,2) (1204.64200202167,2) (1330.58309506604,1) (1469.69088733773,2) (1623.34191102612,4) (1793.05660992942,15) (1980.51438490818,16) (2187.5702122883,28) (2416.2729996596,49) (2668.88586070881,58) (2947.90850971511,66) (3256.10199731164,50) (3596.51603228401,59) (3972.51915976695,37) (4387.83209446551,15) (4846.56453874751,7) (5353.25584993839,1) (5912.91995923888,0) (6531.09498675799,0) (7213.89804362345,0) (7968.08576346046,0) (8801.12116222408,0)
+ };
+ \addplot[style={distr7,fill=distr7,mark=none,fill opacity=0.5,draw opacity=0}] coordinates {
+ (50.0,0) (55.2273245010972,0) (61.0011474309897,0) (67.3786032822108,0) (74.422799757947,0) (82.2034422502463,0) (90.7975236052311,0) (100.290086000843,0) (110.77506247623,0) (122.356206440081,0) (135.148118355792,0) (149.27737976296,0) (164.88380585685,0) (182.121829020643,0) (201.162027001128,0) (222.192810849795,0) (245.422289332251,0) (271.080328255088,0) (299.420825088154,0) (330.724221390595,0) (365.300277902221,0) (403.491139760939,0) (445.674722177899,0) (492.268450073103,0) (543.733388676789,0) (600.578805970684,0) (663.36721211649,0) (732.71992573891,0) (809.323222144053,0) (893.935124312463,0) (987.392903866661,1) (1090.6213662385,0) (1204.64200202167,0) (1330.58309506604,0) (1469.69088733773,0) (1623.34191102612,4) (1793.05660992942,4) (1980.51438490818,7) (2187.5702122883,12) (2416.2729996596,23) (2668.88586070881,41) (2947.90850971511,36) (3256.10199731164,51) (3596.51603228401,65) (3972.51915976695,43) (4387.83209446551,37) (4846.56453874751,24) (5353.25584993839,10) (5912.91995923888,3) (6531.09498675799,0) (7213.89804362345,0) (7968.08576346046,0) (8801.12116222408,0)
+ };
+ \addplot[style={distr8,fill=distr8,mark=none,fill opacity=0.5,draw opacity=0}] coordinates {
+ (50.0,0) (55.2273245010972,0) (61.0011474309897,0) (67.3786032822108,0) (74.422799757947,0) (82.2034422502463,0) (90.7975236052311,0) (100.290086000843,0) (110.77506247623,0) (122.356206440081,0) (135.148118355792,0) (149.27737976296,0) (164.88380585685,0) (182.121829020643,0) (201.162027001128,0) (222.192810849795,0) (245.422289332251,0) (271.080328255088,0) (299.420825088154,0) (330.724221390595,0) (365.300277902221,0) (403.491139760939,0) (445.674722177899,0) (492.268450073103,0) (543.733388676789,0) (600.578805970684,0) (663.36721211649,0) (732.71992573891,0) (809.323222144053,0) (893.935124312463,0) (987.392903866661,0) (1090.6213662385,0) (1204.64200202167,0) (1330.58309506604,0) (1469.69088733773,0) (1623.34191102612,0) (1793.05660992942,1) (1980.51438490818,4) (2187.5702122883,0) (2416.2729996596,2) (2668.88586070881,5) (2947.90850971511,8) (3256.10199731164,16) (3596.51603228401,24) (3972.51915976695,24) (4387.83209446551,28) (4846.56453874751,32) (5353.25584993839,25) (5912.91995923888,24) (6531.09498675799,8) (7213.89804362345,2) (7968.08576346046,1) (8801.12116222408,0)
+ };
+ \node at (axis cs: 100,530) {\footnotesize 10};
+ \node at (axis cs: 200,380) {\footnotesize 15};
+ \node at (axis cs: 750,210) {\footnotesize 20};
+ \node at (axis cs:1300,150) {\footnotesize 21};
+ \node at (axis cs:2000,125) {\footnotesize 26};
+ \node at (axis cs:2800, 90) {\footnotesize 27};
+ \node at (axis cs:4300, 85) {\footnotesize 30};
+ \node at (axis cs:6000, 50) {\footnotesize 35};
+ \end{semilogxaxis}
+ \end{tikzpicture}
+ \end{column}
+ \begin{column}{0.5\textwidth}
+ \visible<2>{%
+ \begin{tikzpicture}
+ \begin{axis}[width=\linewidth,
+ major x tick style=transparent,
+ symbolic x coords={91,181,438,792,929,1700,2110,4230},
+ xlabel=Average lines of code in generated programs,
+ ylabel=Number of test cases,
+ clip=false,
+ legend pos=north east,
+ legend style={font=\scriptsize},
+ xtick=data,
+ every axis x label/.style={at={($(ticklabel cs:0.6) + (0,-0.02)$)},anchor=near ticklabel,},
+ ybar=0,
+ bar width=8pt,
+ ymin=0,
+ % nodes near coords,
+ % nodes near coords align={vertical}
+ ]
+ \fill[distr1!50] (axis cs:91,-15) circle (3pt);
+ \fill[distr2!50] (axis cs:181,-15) circle (3pt);
+ \fill[distr3!50] (axis cs:438,-15) circle (3pt);
+ \fill[distr4!50] (axis cs:792,-15) circle (3pt);
+ \fill[distr5!50] (axis cs:929,-15) circle (3pt);
+ \fill[distr6!50] (axis cs:1700,-15) circle (3pt);
+ \fill[distr7!50] (axis cs:2110,-15) circle (3pt);
+ \fill[distr8!50] (axis cs:4230,-15) circle (3pt);
+ \addplot[style={black,fill=black!70,mark=none}] coordinates {
+ (91,122) (181,87) (438,63) (792,56) (929,43)
+ (1700,14) (2110,10) (4230,7)
+ };
+ \addplot[style={red!50,fill=red!50,mark=none}] coordinates {
+ (91,0) (181,2) (438,4) (792,12) (929,10)
+ (1700,8) (2110,12) (4230,17)
+ };
+ \legend{Bugs found,Crashes found};
+ \end{axis}
+ \end{tikzpicture}}
+ \end{column}
+ \end{columns}
+
+ \vspace{1em}
+ \large
+ \begin{itemize}
+ \item Each experiment was run over 3 days with Yosys, Vivado and XST
+ \end{itemize}
+\end{frame}
+
+\begin{frame}
+ \frametitle{Bugs found in Vivado over different versions}
+ \large
+ \begin{columns}
+ \begin{column}{0.65\textwidth}
+ \begin{tikzpicture}
+ \foreach \i in {-1,...,5}
+ {
+ \draw (-1,0.767441860465*\i+0.37) -- (8,0.767441860465*\i+0.37);
+ }
+ \only<2->{
+ \fill[fill=ribbon1] (-0.5,4.2) -- (7,4.2) -- (7.5,3.6) -- (7,3) -- (-0.5,3) --
+ (-0.2,3.6) -- cycle;
+ \node at (1.1,3.6) {15};
+ \fill[fill=ribbon5] (-0.5,3) -- (4.6,3) to [out=0,in=180] (6.6,0.5) --
+ (7,0.5) -- (7.1,0.45) -- (7,0.4) -- (6.6,0.4) to [out=180,in=0] (4.6,2.9) --
+ (-0.5,2.9) -- (-0.4,2.95) -- cycle;
+ \fill[fill=ribbon3] (-0.5,2.9) -- (2.4,2.9) to [out=0,in=180] (6.6,0.4) --
+ (7,0.4) -- (7.3,0.2) -- (7,0) -- (6.6,0) to [out=180,in=0] (2.4,2.5) --
+ (-0.5,2.5) -- (-0.2,2.7) -- cycle;
+ \node at (1.1,2.7) {6};
+ \fill[fill=ribbon2] (-0.5,2.2) -- (2.4,2.2) to [out=0,in=180] (4.4,2.9) --
+ (4.6,2.9) to [out=0,in=180] (6.6,3) -- (7,3) -- (7.4,2.55) -- (7,2.1) --
+ (6.6,2.1) to [out=180,in=0] (4.6,2) -- (4.4,2) to [out=180,in=0] (2.4,1.3) --
+ (-0.5,1.3) -- (-0.2,1.75) -- cycle;
+ \node at (1.1,1.75) {11};
+ \fill[fill=ribbon6] (-0.5,1.3) -- (2.4,1.3) to [out=0,in=180] (4.4,2) -- (4.6,2) to
+ [out=0,in=180] (6.6,0) -- (7,0) -- (7.1,-0.05) -- (7,-0.1) -- (6.6,-0.1) to
+ [out=180,in=0] (4.6,1.9) -- (4.4,1.9) to [out=180,in=0] (2.4,1.2) --
+ (-0.5,1.2) -- (-0.5,1.25) -- cycle;
+ \fill[fill=ribbon4] (-0.5,1.2) -- (3,1.2) to [out=0,in=180] (6.6,2.1)
+ -- (7,2.1) -- (7.5,1.5) -- (7,0.9)
+ -- (6.6,0.9) to [out=180,in=0] (3,0) -- (-0.5,0) -- (-0.1,0.6) -- cycle;
+ \node at (1.1,0.6) {17};
+ }
+ \filldraw[fill] (-0.1,2.5) rectangle (0.3,4.2);
+ \filldraw[fill] (2.1,2.5) rectangle (2.5,4.2);
+ \filldraw[fill] (4.3,1.9) rectangle (4.7,4.2);
+ \filldraw[fill] (6.5,0.9) rectangle (6.9,4.2);
+ \node at (0.1,4.6) {2016.1};
+ \node at (2.3,4.6) {2016.2};
+ \node at (4.5,4.6) {2017.4};
+ \node at (6.7,4.6) {2018.2};
+ \node at (0.1,2.7) {\color{presentationbg}{22}};
+ \node at (2.3,2.7) {\color{presentationbg}{22}};
+ \node at (4.5,2.1) {\color{presentationbg}{28}};
+ \node at (6.7,1.1) {\color{presentationbg}{43}};
+ \node at (3.4,5.3) {Vivado version};
+ \end{tikzpicture}
+ \end{column}%
+ \begin{column}{0.35\textwidth}
+ \begin{itemize}
+ \item Total number of bugs increase with versions
+ \item This does not mean there are more bugs, just that they were more commonly found
+ \end{itemize}
+ \end{column}
+ \end{columns}
+\end{frame}
+
+\note{One can see from the arrows that there are at least 3 different bugs in Vivado 2018.2, however, we identified 5 different ones in total.}
+
+\ymhgifextend%
+\begin{frame}
+ \frametitle{Reduction efficiency}
+ \large
+ \begin{center}
+ \begin{tikzpicture}
+ \begin{loglogaxis}[
+ width=0.65\linewidth,
+ legend style={nodes={scale=0.7, transform shape}},
+ legend pos=south east,
+ xlabel=Final size of reduced test case (lines of code),
+ ylabel=Time taken for reduction (s),
+ xticklabel style={
+ /pgf/number format/fixed,
+ /pgf/number format/precision=2
+ },
+ scaled x ticks=false,
+ grid=major,
+ major grid style={line width=.2pt,draw=black!20},
+ legend columns=2,
+ legend cell align=left,
+ ymin=0.4
+ ]
+ \addplot[only marks, verismith missynth]
+ coordinates {
+ (8,24.228676396) (12,48.020800025) (9,239.19471845) (19,78.85903502) (11,73.373059156) (265,396.931663908) (9,28.596337771) (9,121.520180855) (56,392.16407163) (12,9.194543707) (443,1106.024588047) (9,88.786871352) (9,166.899571358) (120,142.222511227) (9,73.07548465) (9,71.661578111) (26,47.691798645) (87,153.32273806) (9,89.500623124)
+ };
+ \addplot[only marks, creduce missynth]
+ coordinates {
+ (23,546.138) (40,549.916) (63,2954.062) (66,2565.887) (65,4355.297) (59,1695.4) (32,2355.947) (60,5091.577) (64,1611.466) (15,89.294) (137,6825.607) (74,13896.513) (64,9126.388) (90,4550.126) (43,5553.653) (27,1096.045) (16,340.533) (68,2814.821) (85,10592.831)
+ };
+ \addplot[only marks, verismith crash]
+ coordinates {
+ (462,31.025951033) (405,32.882851417) (75,49.630976912) (49,4.096207305) (234,10.081659552) (191,23.921349163) (99,10.894472949) (115,16.908927877) (32,18.313146602) (12,1.4856776) (230,30.366253517)
+ };
+ \addplot[only marks, creduce crash]
+ coordinates {
+ (30,225.177) (69,289.044) (33,136.239) (33,194.167) (52,352.996) (60,313.808) (54,285.255) (63,221.02) (60,137.885) (34,223.37) (54,213.942)
+ };
+ \legend{\verismith{}: mis-synthesis,C-Reduce: mis-synthesis,\verismith{}: crash,C-Reduce: crash}
+ \end{loglogaxis}
+ \end{tikzpicture}
+ \end{center}
+\end{frame}
+\fi
+
+\begin{frame}
+ \frametitle{Summary}
+ \large
+ Verismith can find hard-to-find bugs in synthesis tools by:
+
+ \begin{itemize}
+ \item Generating behavioural and deterministic Verilog.
+ \item Reducing it to a minimal representation if it is not.
+ \end{itemize}
+
+ In total 11 unique bugs were found, reported and fixed by tool vendors.
+
+ \vspace{2em}
+
+ Future work could be by supporting:
+ \begin{itemize}
+ \item A larger subset of Verilog
+ \item Controlled nondeterminism
+ \end{itemize}
+\end{frame}
+
+{
+ \setbeamercolor{footnote}{%
+ fg=black!2,
+ bg=mDarkTeal%
+ }
+ \begin{frame}[standout]
+ \Large
+ Finding and Understanding Bugs in FPGA Synthesis Tools
+
+ \vspace{1.5em}
+
+ \begin{columns}
+ \begin{column}{0.35\textwidth}
+ \begin{center}
+ Verismith Github\footnotemark
+
+ \vspace{1em}
+
+ \scalebox{0.5}{\includegraphics{verismith-github.pdf}}
+ \end{center}
+ \end{column}
+ \begin{column}{0.35\textwidth}
+ \begin{center}
+ Link to paper\footnotemark
+
+ \vspace{1em}
+
+ \scalebox{0.5}{\includegraphics{paper-code.pdf}}
+ \end{center}
+ \end{column}
+ \end{columns}
+ \addtocounter{footnote}{-1}
+ \footnotetext{\url{https://github.com/ymherklotz/verismith}}
+ \stepcounter{footnote}\footnotetext{\url{https://yannherklotz.com/papers/fubfst_fpga2020.pdf}}
+ \end{frame}
+}
+
+\begin{frame}[fragile]
+ \frametitle{Motivating Bug 2: Vivado}
+ \begin{columns}
+ \begin{column}{0.5\textwidth}
+ \definecolor{minline1}{named}{presentationbg}
+ \definecolor{minline2}{named}{presentationbg}
+ \definecolor{minline3}{named}{presentationbg}
+ \setminted{highlightlines={}}
+ \only<2>{
+ \definecolor{minline2}{named}{mintedhlcolor}
+ \definecolor{minline3}{named}{mintedhlcolor}
+ }
+ \only<3>{\setminted{highlightlines={4-5}}}
+ \only<4>{\setminted{highlightlines={8,11}}}
+ \only<5>{
+ \setminted{highlightlines={9-10}}
+ \definecolor{minline1}{named}{mintedhlcolor}
+ \definecolor{minline3}{named}{mintedhlcolor}
+ }
+ \only<6>{
+ \definecolor{minline1}{named}{mintedhlcolor}
+ \definecolor{minline3}{named}{mintedhlcolor}
+ }
+\begin{minted}[escapeinside=||]{verilog}
+module top (output [1:0] y,
+ input clk,
+ input [1:0] |\colorbox{minline2}{w0}|);
+ reg [1:0] r0 = 2'b0;
+ reg [2:0] r1 = 3'b0;
+ assign y = r1;
+ always @(posedge clk) begin
+ r0 <= 1'b1;
+ if (r0)
+ |\colorbox{minline1}{r1}| <= r0 ? |\colorbox{minline1}{\colorbox{minline3}{w0}[0:0]}| : 1'b0;
+ else r1 <= 3'b1;
+ end
+endmodule
+\end{minted}
+ \end{column}%
+ \begin{column}{0.5\textwidth}
+ Bug found in Vivado 2019.1.\footnotemark
+ \begin{itemize}
+ \item<2-> Assume \texttt{w0 = 2'b10},
+ \item<3-> initialise \texttt{r0 = 2'b0},
+
+ \texttt{r1 = 3'b0},
+ \item<4-> first \texttt{clk} edge sets \texttt{r0 = 1'b1},
+
+ \texttt{r1 = 3'b1},
+ \item<5-> next \texttt{clk} edge enters the \texttt{if} statement,
+ \item<6-> sets \texttt{r1 = w0[0:0] = 3'b0}
+
+ Vivado returns \texttt{r1 = w0[0:0] = 3'b010}
+ \end{itemize}
+ \end{column}
+ \end{columns}
+ \footnotetext{\tiny\url{https://forums.xilinx.com/t5/Synthesis/Vivado-2019-1-Bit-selection-synthesis-mismatch/td-p/982419}}
+\end{frame}
+
+\note[itemize]{%
+\item Assume that \texttt{w0 = 2'b10}.
+\item Everything else is initialised to \texttt{1'b0}.
+\item First edge sets \texttt{r0 = 2'b1}
+\item Therefore it should enter the if statement on the next iteration and assign \texttt{r1 = 3'b0} as that is the LSB of w0.
+\item However, \texttt{3'b010} is assigned instead which results in an output of \texttt{2'b10} instead of \texttt{2'b00}
+}
+
+\end{document}
+
+%%% Local Variables:
+%%% mode: latex
+%%% TeX-master: t
+%%% ymhg/TeX-expand-shell-escape: t
+%%% End:
diff --git a/presentation/verismith-github.pdf b/presentation/verismith-github.pdf
new file mode 100644
index 0000000..9e96d56
--- /dev/null
+++ b/presentation/verismith-github.pdf
Binary files differ