@ 260915.5

200621.1 · 013a5a9c707f5cef4d6ae069107c7a0121e1fc87

released 2.3.0 - context matching enhancements

reading declarations

Makefile.am

@@ -50,11 +50,11 @@ test:		$(top_builddir)/src/ugrep 		@echo 		@echo "*** SINGLE-THREADED TESTS ***" 		@echo-		-cd tests; ./verify.sh -J1+		cd tests && ./verify.sh -J1 		@echo 		@echo "*** MULTI-THREADED TESTS ***" 		@echo-		-cd tests; ./verify.sh+		cd tests && ./verify.sh 		@echo 		@echo "OK" 		@echo

Makefile.in

@@ -922,11 +922,11 @@ test:		$(top_builddir)/src/ugrep 		@echo 		@echo "*** SINGLE-THREADED TESTS ***" 		@echo-		-cd tests; ./verify.sh -J1+		cd tests && ./verify.sh -J1 		@echo 		@echo "*** MULTI-THREADED TESTS ***" 		@echo-		-cd tests; ./verify.sh+		cd tests && ./verify.sh 		@echo 		@echo "OK" 		@echo

README.md

@@ -28,9 +28,7 @@ search pdf and office documents using filters </div> <br> -- Written in clean and efficient C++11, built for speed and thoroughly tested with over 1000 test cases--- Portable (Linux, Unix, MacOS, Windows, etc), includes x86 and x64 binaries for Windows with the [GitHub releases](https://github.com/Genivia/ugrep/releases)+- Written in clean and efficient C++11, built for speed and thoroughly tested  - Ultra fast with new match algorithms [beating](#speed) grep, ripgrep, silver searcher, hyperscan, etc. @@ -38,7 +36,9 @@ search pdf and office documents using filters  - Optimized pattern matching (AVX, SSE2, ARM NEON/AArch64) and asynchronous IO for efficient concurrent searching -- Compatible to GNU/BSD grep command-line options [with minor differences for defaults](#equivalence) to make ugrep more user friendly+- Portable (Linux, Unix, MacOS, Windows, etc), includes x86 and x64 binaries for Windows with the [GitHub releases](https://github.com/Genivia/ugrep/releases)++- Compatible GNU/BSD grep command-line options, but user-friendly with sensible defaults and many more options  - Interactive [query UI](#query), press F1 or CTRL-Z for help @@ -61,6 +61,7 @@ search pdf and office documents using filters        ugrep --filter='pdf:pdftotext % -' PATTERN ...       ugrep --filter='odt,doc,docx,rtf,xls,xlsx,ppt,pptx:soffice --headless --cat %' PATTERN ...+      ugrep --filter='pem:openssl x509 -text,cer,crt,der:openssl x509 -text -inform der' PATTERN ...  - Search [binary files](#binary) and display hexdumps with binary pattern matches (Unicode text or raw byte patterns) @@ -160,13 +161,13 @@ Download and install  ### MacOS -Install the latest full featured **ugrep** with [Homebrew](https://brew.sh):+Install the latest **ugrep** with [Homebrew](https://brew.sh):      $ brew install https://raw.githubusercontent.com/Genivia/ugrep/master/Formula/ugrep.rb  ### Windows -Download the full featured ugrep executable as a release artifact from+Download the full-featured ugrep executable as a release artifact from <https://github.com/Genivia/ugrep/releases>  To add `ugrep.exe` to your execution path: go to *Settings* and search for@@ -240,7 +241,7 @@ To output results with a pager by default:  Choices for defaults include: -- `--enable-color` colorize output to terminals (default)+- `--enable-color` colorize output to terminals (this is the default) - `--enable-hidden` search hidden files and directories - `--enable-pager` use a pager to display output on terminals - `--enable-pretty` colorize output to terminals and add filename headings@@ -824,7 +825,7 @@ To show a list of `-t TYPES` option values:             editor to edit the file displayed on screen.  The editor is taken             from the environment variable GREP_EDIT if defined, or EDITOR if             GREP_EDIT is not defined.  Enables --heading.-    --no-confirm\n\+    --no-confirm             Do not confirm actions in -Q query mode.  The default is confirm.  This option starts a user interface to enter search patterns interactively:@@ -2393,8 +2394,8 @@ To display the line and column numbers of matches in XML with `--xml`:             font properties `n' (normal), `f' (faint), `h' (highlight), `i'             (invert), `u' (underline).  Selectively overrides GREP_COLORS.     --tag[=TAG[,END]]-            Disables colors to mark up matches with TAG.  If END is specified,-            the end of a match is marked with END.  The default is `___'.+            Disables colors to mark up matches with TAG.  END marks the end of+            a match if specified, otherwise TAG.  The default is `___'.     --pager[=COMMAND]             When output is sent to the terminal, uses COMMAND to page through             the output.  The default COMMAND is `less -R'.  Enables --heading@@ -3047,7 +3048,7 @@ in markdown:            -A NUM, --after-context=NUM                   Print  NUM  lines  of  trailing  context  after  matching lines.                   Places a --group-separator between contiguous groups of matches.-                  See  also options -B, -C, and -y.  Disables multi-line matching.+                  See also options -B, -C, and -y.             -a, --text                   Process a binary file as if it were text.  This is equivalent to@@ -3056,9 +3057,9 @@ in markdown:                   if the terminal driver interprets some of it as commands.             -B NUM, --before-context=NUM-                  Print  NUM  lines  of  leading  context  before  matching lines.+                  Print NUM  lines  of  leading  context  before  matching  lines.                   Places a --group-separator between contiguous groups of matches.-                  See  also options -A, -C, and -y.  Disables multi-line matching.+                  See also options -A, -C, and -y.             -b, --byte-offset                   The offset in bytes of a matched line is displayed in  front  of@@ -3283,7 +3284,8 @@ in markdown:                   Group matches per file.  Adds a heading and a line break between                   results from different files. -           --help Print a help message.+           --help, -?+                  Print a help message.             --hexdump=[1-8][b][c][h]                   Output matches in 1 to 8 columns of 8 hexadecimal  octets.   The@@ -3562,23 +3564,22 @@ in markdown:                   `tex', `text', `tiff', `Tiff',  `tt',  `typescript',  `verilog',                   `vhdl', `vim', `xml', `Xml', `yacc', `yaml'. -           --tabs=NUM+           --tabs[=NUM]                   Set the tab size to NUM to expand tabs for option -k.  The value                   of NUM may be 1, 2, 4, or 8.  The default tab size is 8.             --tag[=TAG[,END]]-                  Disables colors to mark up matches with TAG.  If END  is  speci--                  fied,  the  end  of  a match is marked with END.  The default is-                  `___'.+                  Disables colors to mark up matches with TAG.  END marks the  end+                  of a match if specified, otherwise TAG.  The default is `___'.             -U, --binary                   Disables Unicode matching for binary file matching, forcing PAT--                  TERN  to  match  bytes, not Unicode characters.  For example, -U-                  '\xa3' matches byte A3 (hex) instead of the Unicode  code  point+                  TERN to match bytes, not Unicode characters.   For  example,  -U+                  '\xa3'  matches  byte A3 (hex) instead of the Unicode code point                   U+00A3 represented by the two-byte UTF-8 sequence C2 A3.             -u, --ungroup-                  Do  not group multiple pattern matches on the same matched line.+                  Do not group multiple pattern matches on the same matched  line.                   Output the matched line again for each additional pattern match,                   using `+' as the field separator. @@ -3586,17 +3587,17 @@ in markdown:                   Display version information and exit.             -v, --invert-match-                  Selected  lines are those not matching any of the specified pat-+                  Selected lines are those not matching any of the specified  pat-                   terns.             -W, --with-hex-                  Output binary  matches  in  hexadecimal,  leaving  text  matches+                  Output  binary  matches  in  hexadecimal,  leaving  text matches                   alone.  This option is equivalent to the --binary-files=with-hex                   option.             -w, --word-regexp-                  The PATTERN is searched for as a word (as if  surrounded  by  \<-                  and  \>).   If  a PATTERN is specified (or -e PATTERN or -N PAT-+                  The  PATTERN  is  searched for as a word (as if surrounded by \<+                  and \>).  If a PATTERN is specified (or -e PATTERN  or  -N  PAT-                   TERN), then this option does not apply to -f FILE patterns.             -X, --hex@@ -3604,25 +3605,24 @@ in markdown:                   --binary-files=hex option.  See also option --hexdump.             -x, --line-regexp-                  Only  input lines selected against the entire PATTERN is consid--                  ered to be matching lines (as if surrounded by ^ and $).   If  a-                  PATTERN  is  specified  (or -e PATTERN or -N PATTERN), then this+                  Only input lines selected against the entire PATTERN is  consid-+                  ered  to  be matching lines (as if surrounded by ^ and $).  If a+                  PATTERN is specified (or -e PATTERN or -N  PATTERN),  then  this                   option does not apply to -f FILE patterns. -           --xml  Output file matches in XML.  If -H, -n, -k, or -b is  specified,+           --xml  Output  file matches in XML.  If -H, -n, -k, or -b is specified,                   additional values are output.  See also options --format and -u.             -Y, --empty-                  Permits empty matches.  By default, empty matches are  disabled,-                  unless  a  pattern  begins with `^' or ends with `$'.  With this-                  option, empty-matching pattern, such as x?  and  x*,  match  all+                  Permits  empty matches.  By default, empty matches are disabled,+                  unless a pattern begins with `^' or ends with  `$'.   With  this+                  option,  empty-matching  pattern,  such  as x? and x*, match all                   input, not only lines containing the character `x'.             -y, --any-line                   Any matching or non-matching line is output.  Non-matching lines-                  are output with the `-' separator as  context  of  the  matching-                  lines.   See  also  options -A, -B, and -C.  Disables multi-line-                  matching.+                  are  output  with  the  `-' separator as context of the matching+                  lines.  See also options -A, -B, and -C.             -Z[MAX], --fuzzy[=MAX]                   Fuzzy  mode:  report  approximate  pattern  matches  within  MAX@@ -4080,7 +4080,7 @@ in markdown:   -    ugrep 2.2.1                      June 10, 2020                        UGREP(1)+    ugrep 2.3.0                      June 21, 2020                        UGREP(1)  🔝 [Back to table of contents](#toc) 

bin/win32/ugrep.exe

Binary file changed

bin/win64/ugrep.exe

Binary file changed

include/reflex/absmatcher.h

@@ -105,6 +105,26 @@ class AbstractMatcher {     static const size_t REDO  = 0x7FFFFFFF; ///< reflex::Matcher::accept() returns "redo" with reflex::Matcher option "A"     static const size_t EMPTY = 0xFFFFFFFF; ///< accept() returns "empty" last split at end of input   };+  /// Context returned by before() and after()+  struct Context {+    Context()+      :+        buf(NULL),+        len(0),+        num(0)+    { }+    Context(const char *buf, size_t len, size_t num)+      :+        buf(buf),+        len(len),+        num(num)+    { }+    const char *buf; ///< pointer to buffer+    size_t      len; ///< length of buffered context+    size_t      num; ///< number of bytes shifted out so far, when buffer shifted+  };+  /// Event handler functor base class to invoke when the buffer contents are shifted out, e.g. for logging the data searched.+  struct Handler { virtual void operator()(AbstractMatcher&, const char*, size_t, size_t) = 0; };  protected:   /// AbstractMatcher::Options for matcher engines.   struct Option {@@ -114,7 +134,7 @@ class AbstractMatcher {         N(false),         T(8)     { }-    bool A; ///< accept any/all (?^X) negative patterns as 65535 accept index codes+    bool A; ///< accept any/all (?^X) negative patterns as Const::REDO accept index codes     bool N; ///< nullable, find may return empty match (N/A to scan, split, matches)     char T; ///< tab size, must be a power of 2, default is 8, for column count and indent \i, \j, and \k   };@@ -293,7 +313,7 @@ class AbstractMatcher {     DBGLOG("AbstractMatcher::reset(%s)", opt ? opt : "(null)");     if (opt)     {-      opt_.A = false; // when true: accept any/all (?^X) negative patterns as 65535 accept index codes+      opt_.A = false; // when true: accept any/all (?^X) negative patterns as Const::REDO accept index codes       opt_.N = false; // when true: find may return empty match (N/A to scan, split, matches)       opt_.T = 8;     // tab size 1, 2, 4, or 8       if (opt)@@ -336,6 +356,7 @@ class AbstractMatcher {     chr_ = '\0'; #if defined(WITH_SPAN)     bol_ = buf_;+    evh_ = NULL; #endif     lpb_ = buf_;     lno_ = 1;@@ -376,6 +397,32 @@ class AbstractMatcher {       (void)grow(1); // make sure we have room for a final \0     return in.eof();   }+#if defined(WITH_SPAN)+  /// Set event handler functor to invoke when the buffer contents are shifted out, e.g. for logging the data searched.+  void set_handler(Handler *handler)+  {+    evh_ = handler;+  }+  /// Get the buffered context before the matching line.+  Context before()+  {+    (void)lineno();+    return Context(buf_, bol_ - buf_, num_);+  }+  /// Get the buffered context after EOF is reached.+  Context after()+  {+    if (hit_end())+    {+      (void)lineno();+      // if there is no \n at the end of input: increase line count by one+      if (bol_ < txt_)+        ++lno_;+      return Context(buf_, end_, num_);+    }+    return Context(buf_, 0, num_);+  }+#endif   /// Set buffer to 1 for interactive input.   void interactive()     /// @note Use this method before any matching is done and before any input is read since the last time input was (re)set.@@ -428,6 +475,7 @@ class AbstractMatcher {       chr_ = '\0'; #if defined(WITH_SPAN)       bol_ = buf_;+      evh_ = NULL; #endif       lpb_ = buf_;       lno_ = 1;@@ -907,47 +955,6 @@ class AbstractMatcher {     }     return buf_ + end_;   }-  /// Returns pointer to the end of the nth line after the matched line, DANGER: invalidates previous bol(), eol(), text(), and after() pointers, use after() before bol(), eol(), text(), begin(), and end() when those are used.-  inline std::pair<size_t,const char*> after(size_t num) ///< number of lines to fetch-    /// @returns number of lines fetched (fewer than num if EOF or when out of memory) and pointer to the end of the nth line-  {-    if (num == 0)-      return std::pair<size_t,const char*>(0, eol(true));-    reset_text();-    size_t loc = pos_;-    size_t hit = 0;-    while (true)-    {-      while (loc < end_)-      {-        char *s = static_cast<char*>(std::memchr(buf_ + loc, '\n', end_ - loc));-        if (s == NULL)-          break;-        if (hit == num)-          return std::pair<size_t,const char*>(num, s + 1);-        loc = s - buf_ + 1;-      }-      if (eof_)-        break;-      try-      {-        (void)grow();-      }-      catch (std::bad_alloc& e)-      {-        break;-      }-      loc = end_;-      end_ += get(buf_ + end_, blk_ > 0 ? blk_ : max_ - end_ - 1);-      if (loc >= end_ && !wrap())-      {-        eof_ = true;-        break;-      }-      ++hit;-    }-    return std::pair<size_t,const char*>(hit, buf_ + end_);-  }   /// Returns the byte offset of the match from the start of the line.   size_t border()     /// @returns border offset@@ -1009,6 +1016,8 @@ class AbstractMatcher {         set_current(txt_ - buf_);         return true;       }+      if (eof_)+        break;       pos_ = cur_ = end_;       txt_ = buf_ + end_;       (void)grow();@@ -1233,19 +1242,21 @@ class AbstractMatcher {     = 0;   /// Shift or expand the internal buffer when it is too small to accommodate more input, where the buffer size is doubled when needed, change cur_, pos_, end_, max_, ind_, buf_, bol_, lpb_, and txt_.   bool grow(size_t need = Const::BLOCK) ///< optional needed space = Const::BLOCK size by default-    /// @returns true if buffer was shifted or was enlarged+    /// @returns true if buffer was shifted or enlarged   {     if (max_ - end_ >= need + 1)       return false; #if defined(WITH_SPAN)-    update();-    if (bol_ + Const::BLOCK < txt_)+    (void)lineno();+    if (bol_ + Const::BLOCK < txt_ && evh_ == NULL)     {       // this line is very long, likely a binary file, so shift a block size away from the match instead       DBGLOG("Line in buffer to long to shift, moving bol position to text match position minus %zu", Const::BLOCK);       bol_ = txt_ - Const::BLOCK;     }     size_t gap = bol_ - buf_;+    if (gap > 0 && evh_ != NULL)+      (*evh_)(*this, buf_, gap, num_);     cur_ -= gap;     ind_ -= gap;     pos_ -= gap;@@ -1253,6 +1264,7 @@ class AbstractMatcher {     txt_ -= gap;     bol_ -= gap;     lpb_ -= gap;+    num_ += gap;     std::memmove(buf_, buf_ + gap, end_);     if (max_ - end_ >= need)     {@@ -1283,11 +1295,12 @@ class AbstractMatcher {     if (max_ - end_ + gap >= need)     {       DBGLOG("Shift buffer to close gap of %zu bytes", gap);-      update();+      (void)lineno();       cur_ -= gap;       ind_ -= gap;       pos_ -= gap;       end_ -= gap;+      num_ += gap;       if (end_ > 0)         std::memmove(buf_, txt_, end_);       txt_ = buf_;@@ -1302,11 +1315,12 @@ class AbstractMatcher {       if (oldmax < max_)       {         DBGLOG("Expand buffer from %zu to %zu bytes", oldmax, max_);-        update();+        (void)lineno();         cur_ -= gap;         ind_ -= gap;         pos_ -= gap;         end_ -= gap;+        num_ += gap; #if defined(WITH_REALLOC)         std::memmove(buf_, txt_, end_);         char *newbuf = static_cast<char*>(std::realloc(static_cast<void*>(buf_), max_));@@ -1423,41 +1437,32 @@ class AbstractMatcher {       }     }   }-  /// Update the newline count, column count, and character count when shifting the buffer. -  inline void update()-  {-    (void)lineno();-#if defined(WITH_SPAN)-    num_ += bol_ - buf_;-#else-    num_ += txt_ - buf_;-#endif-  }-  Option opt_;              ///< options for matcher engines-  char  *buf_;              ///< input character sequence buffer-  char  *txt_;              ///< points to the matched text in buffer AbstractMatcher::buf_-  size_t len_;              ///< size of the matched text-  size_t cap_;              ///< nonzero capture index of an accepted match or zero-  size_t cur_;              ///< next position in AbstractMatcher::buf_ to assign to AbstractMatcher::txt_-  size_t pos_;              ///< position in AbstractMatcher::buf_ after AbstractMatcher::txt_-  size_t end_;              ///< ending position of the input buffered in AbstractMatcher::buf_-  size_t max_;              ///< total buffer size and max position + 1 to fill-  size_t ind_;              ///< current indent position-  size_t blk_;              ///< block size for block-based input reading, as set by AbstractMatcher::buffer-  int    got_;              ///< last unsigned character we looked at (to determine anchors and boundaries)-  int    chr_;              ///< the character located at AbstractMatcher::txt_[AbstractMatcher::len_]+  Option    opt_; ///< options for matcher engines+  char     *buf_; ///< input character sequence buffer+  char     *txt_; ///< points to the matched text in buffer AbstractMatcher::buf_+  size_t    len_; ///< size of the matched text+  size_t    cap_; ///< nonzero capture index of an accepted match or zero+  size_t    cur_; ///< next position in AbstractMatcher::buf_ to assign to AbstractMatcher::txt_+  size_t    pos_; ///< position in AbstractMatcher::buf_ after AbstractMatcher::txt_+  size_t    end_; ///< ending position of the input buffered in AbstractMatcher::buf_+  size_t    max_; ///< total buffer size and max position + 1 to fill+  size_t    ind_; ///< current indent position+  size_t    blk_; ///< block size for block-based input reading, as set by AbstractMatcher::buffer+  int       got_; ///< last unsigned character we looked at (to determine anchors and boundaries)+  int       chr_; ///< the character located at AbstractMatcher::txt_[AbstractMatcher::len_] #if defined(WITH_SPAN)-  char  *bol_;              ///< begin of line pointer in buffer+  char     *bol_; ///< begin of line pointer in buffer+  Handler  *evh_; ///< event handler functor to invoke when buffer contents are shifted out #endif-  char  *lpb_;              ///< line pointer in buffer, updated when counting line numbers with lineno()-  size_t lno_;              ///< line number count (cached)+  char     *lpb_; ///< line pointer in buffer, updated when counting line numbers with lineno()+  size_t    lno_; ///< line number count (cached) #if !defined(WITH_SPAN)-  size_t cno_;              ///< column number count (cached)+  size_t    cno_; ///< column number count (cached) #endif-  size_t num_;              ///< character count of the input till bol_-  bool   own_;              ///< true if AbstractMatcher::buf_ was allocated and should be deleted-  bool   eof_;              ///< input has reached EOF-  bool   mat_;              ///< true if AbstractMatcher::matches() was successful+  size_t    num_; ///< character count of the input till bol_+  bool      own_; ///< true if AbstractMatcher::buf_ was allocated and should be deleted+  bool      eof_; ///< input has reached EOF+  bool      mat_; ///< true if AbstractMatcher::matches() was successful };  /// The pattern matcher class template extends abstract matcher base class.

include/reflex/matcher.h

@@ -339,7 +339,7 @@ class Matcher : public PatternMatcher<reflex::Pattern> {   /// FSM code META EOL.   inline bool FSM_META_EOL(int c1)   {-    return c1 == EOF || c1 == '\n';+    return c1 == EOF || c1 == '\n' || peek() == '\n';   }   /// FSM code META BOL.   inline bool FSM_META_BOL()@@ -592,7 +592,7 @@ redo:                   continue;                 case Pattern::META_EOL - Pattern::META_MIN:                   DBGLOG("EOL? %d", c1);-                  if (jump == Pattern::Const::IMAX && (c1 == EOF || c1 == '\n'))+                  if (jump == Pattern::Const::IMAX && (c1 == EOF || c1 == '\n' || peek() == '\n'))                   {                     jump = Pattern::index_of(opcode);                     if (jump == Pattern::Const::LONG)

man/ugrep.1

@@ -1,4 +1,4 @@-.TH UGREP "1" "June 10, 2020" "ugrep 2.2.1" "User Commands"+.TH UGREP "1" "June 21, 2020" "ugrep 2.3.0" "User Commands" .SH NAME \fBugrep\fR -- file pattern searcher .SH SYNOPSIS@@ -33,7 +33,7 @@ The following options are available: \fB\-A\fR \fINUM\fR, \fB\-\-after\-context\fR=\fINUM\fR Print NUM lines of trailing context after matching lines.  Places a \fB\-\-group\-separator\fR between contiguous groups of matches.  See also-options \fB\-B\fR, \fB\-C\fR, and \fB\-y\fR.  Disables multi\-line matching.+options \fB\-B\fR, \fB\-C\fR, and \fB\-y\fR. .TP \fB\-a\fR, \fB\-\-text\fR Process a binary file as if it were text.  This is equivalent to@@ -44,7 +44,7 @@ the terminal driver interprets some of it as commands. \fB\-B\fR \fINUM\fR, \fB\-\-before\-context\fR=\fINUM\fR Print NUM lines of leading context before matching lines.  Places a \fB\-\-group\-separator\fR between contiguous groups of matches.  See also-options \fB\-A\fR, \fB\-C\fR, and \fB\-y\fR.  Disables multi\-line matching.+options \fB\-A\fR, \fB\-C\fR, and \fB\-y\fR. .TP \fB\-b\fR, \fB\-\-byte\-offset\fR The offset in bytes of a matched line is displayed in front of the@@ -264,7 +264,7 @@ when there is only one file (or only standard input) to search. Group matches per file.  Adds a heading and a line break between results from different files. .TP-\fB\-\-help\fR+\fB\-\-help\fR, \fB\-?\fR Print a help message. .TP \fB\-\-hexdump\fR=[1\-8][b][c][h]@@ -538,13 +538,13 @@ option may be repeated.  The possible file types can be (where `tcl', `tex', `text', `tiff', `Tiff', `tt', `typescript', `verilog', `vhdl', `vim', `xml', `Xml', `yacc', `yaml'. .TP-\fB\-\-tabs\fR=\fINUM\fR+\fB\-\-tabs[\fR=\fINUM\fR] Set the tab size to NUM to expand tabs for option \fB\-k\fR.  The value of NUM may be 1, 2, 4, or 8.  The default tab size is 8. .TP \fB\-\-tag[\fR=\fITAG\fR[,\fIEND\fR]]-Disables colors to mark up matches with TAG.  If END is specified,-the end of a match is marked with END.  The default is `___'.+Disables colors to mark up matches with TAG.  END marks the end of+a match if specified, otherwise TAG.  The default is `___'. .TP \fB\-U\fR, \fB\-\-binary\fR Disables Unicode matching for binary file matching, forcing PATTERN@@ -596,7 +596,7 @@ not only lines containing the character `x'. \fB\-y\fR, \fB\-\-any\-line\fR Any matching or non\-matching line is output.  Non\-matching lines are output with the `\fB\-'\fR separator as context of the matching lines.-See also options \fB\-A\fR, \fB\-B\fR, and \fB\-C\fR.  Disables multi\-line matching.+See also options \fB\-A\fR, \fB\-B\fR, and \fB\-C\fR. .TP \fB\-Z\fR[\fIMAX\fR], \fB\-\-fuzzy[\fR=\fIMAX\fR] Fuzzy mode: report approximate pattern matches within MAX errors.

src/output.cpp

@@ -37,46 +37,25 @@ #include "output.hpp"  // dump matching data in hex-void Output::Dump::hex(short mode, size_t byte_offset, const char *data, size_t size, const char *separator)+void Output::Dump::hex(short mode, size_t byte_offset, const char *data, size_t size) {   offset = byte_offset;   while (size > 0)   {     bytes[offset++ % flag_hex_columns] = (mode << 8) | *reinterpret_cast<const unsigned char*>(data++);     if (offset % flag_hex_columns == 0)-      line(separator);+      line();     --size;   } } -// next hex dump location-void Output::Dump::next(size_t byte_offset, const char *separator)-{-  if (offset - offset % flag_hex_columns != byte_offset - byte_offset % flag_hex_columns)-    done(separator);-}--// done dumping hex-void Output::Dump::done(const char *separator)-{-  if (offset % flag_hex_columns != 0)-  {-    line(separator);-    offset += flag_hex_columns - 1;-    offset -= offset % flag_hex_columns;-  }-}- // dump one line of hex-void Output::Dump::line(const char *separator)+void Output::Dump::line() {   out.str(color_bn);   out.hex((offset - 1) - (offset - 1) % flag_hex_columns, 8);   out.str(color_off);-  out.str(color_se);-  out.str(separator);-  if (flag_hex_hbr)-    out.chr(' ');+  out.chr(' ');    short last_hex_color = HEX_MAX; @@ -101,8 +80,8 @@ void Output::Dump::line(const char *separator)       short byte = bytes[i];       if ((byte >> 8) != last_hex_color)       {+        out.str(last_hex_color == HEX_MATCH || last_hex_color == HEX_CONTEXT_MATCH ? match_off : color_off);         last_hex_color = byte >> 8;-        out.str(color_off);         out.str(color_hex[last_hex_color]);       }       if (flag_hex_hbr || (i == 0 && flag_hex_cbr))@@ -142,8 +121,8 @@ void Output::Dump::line(const char *separator)         short byte = bytes[i];         if ((byte >> 8) != last_hex_color)         {+          out.str(last_hex_color == HEX_MATCH || last_hex_color == HEX_CONTEXT_MATCH ? match_off : color_off);           last_hex_color = byte >> 8;-          out.str(color_off);           out.str(color_hex[last_hex_color]);         }         byte &= 0xff;@@ -168,7 +147,9 @@ void Output::Dump::line(const char *separator)           else if (inverted)           {             out.str(color_off);+            out.str(color_hex[last_hex_color]);             out.chr(byte);+            inverted = false;           }           else           {@@ -201,8 +182,17 @@ void Output::Dump::line(const char *separator) // output the header part of the match, preceding the matched line void Output::header(const char *& pathname, const std::string& partname, size_t lineno, reflex::AbstractMatcher *matcher, size_t byte_offset, const char *separator, bool newline) {-  bool sep = false;-  bool nul = false;+  // if hex dump line is incomplete and a header is output, then complete the hex dump first+  if (dump.incomplete() &&+      ((flag_with_filename && pathname != NULL) ||+       (!flag_no_filename && !partname.empty()) ||+       flag_line_number ||+       flag_column_number ||+       flag_byte_offset))+    dump.done();++  bool sep = false; // when a separator is needed+  bool nul = false; // -Q: mark pathname with three NUL bytes unless -a    if (flag_with_filename && pathname != NULL)   { 

src/output.hpp

@@ -249,16 +249,34 @@ class Output {     }      // dump matching data in hex, mode is-    void hex(short mode, size_t byte_offset, const char *data, size_t size, const char *separator);+    void hex(short mode, size_t byte_offset, const char *data, size_t size); -    // next hex dump location-    void next(size_t byte_offset, const char *separator);+    // jump to the next hex dump location (option -o)+    void next(size_t byte_offset)+    {+      if (offset - offset % flag_hex_columns != byte_offset - byte_offset % flag_hex_columns)+        done();+    }++    // hex line is incomplete: to complete invoke done()+    bool incomplete()+    {+      return offset % flag_hex_columns != 0;+    }      // done dumping hex-    void done(const char *separator);+    void done()+    {+      if (offset % flag_hex_columns != 0)+      {+        line();+        offset += flag_hex_columns - 1;+        offset -= offset % flag_hex_columns;+      }+    }      // dump one line of hex-    void line(const char *separator);+    void line();      Output& out;                 // reference to the output state of this hex dump state     size_t  offset;              // current byte offset in the hex dump

src/ugrep.cpp

@@ -67,7 +67,7 @@ After this, you may want to test ugrep and install it (optional): */  // ugrep version-#define UGREP_VERSION "2.2.1"+#define UGREP_VERSION "2.3.0"  #include "ugrep.hpp" #include "glob.hpp"@@ -156,6 +156,11 @@ After this, you may want to test ugrep and install it (optional): # endif #endif +// the default --tabs+#ifndef DEFAULT_TABS+# define DEFAULT_TABS 8+#endif+ // the default --tag #ifndef DEFAULT_TAG # define DEFAULT_TAG "___"@@ -435,8 +440,8 @@ size_t flag_max_line               = 0; size_t flag_not_magic              = 0; size_t flag_min_magic              = 1; size_t flag_jobs                   = 0;-size_t flag_tabs                   = 8; size_t flag_hex_columns            = 16;+size_t flag_tabs                   = DEFAULT_TABS; size_t flag_max_mmap               = DEFAULT_MAX_MMAP_SIZE; size_t flag_min_steal              = MIN_STEAL; const char *flag_pager             = DEFAULT_PAGER;@@ -501,7 +506,8 @@ size_t strtofuzzy(const char *string, const char *message);  void extend(FILE *file, std::vector<std::string>& files, std::vector<std::string>& dirs, std::vector<std::string>& not_files, std::vector<std::string>& not_dirs); void format(const char *format, size_t matches);-void help(const char *message = NULL, const char *arg = NULL);+void help(const char *message, const char *arg = NULL, const char *valid = NULL);+void help(); void version(); void is_directory(const char *pathname); void cannot_decompress(const char *pathname, const char *message);@@ -726,1493 +732,2313 @@ struct Grep {     }   }; -  Grep(FILE *file, reflex::AbstractMatcher *matcher)-    :-      out(file),-      matcher(matcher),-      file(NULL)-#ifdef HAVE_LIBZ-    , zstream(NULL),-      stream(NULL)-#ifdef WITH_DECOMPRESSION_THREAD-    , extracting(false),-      waiting(false)-#endif-#endif-  { }+  // extend the reflex::AbstractMatcher::Handler with a grep object reference and references to some of the grep::search locals+  struct GrepHandler : public reflex::AbstractMatcher::Handler { -  virtual ~Grep()-  {-    if (stream != NULL)-    {-      delete stream;-      stream = NULL;-    }+    GrepHandler(Grep& grep, const char*& pathname, size_t& lineno, bool& hex, bool& binary, size_t& matches, bool& stop)+      :+        grep(grep),+        pathname(pathname),+        lineno(lineno),+        hex(hex),+        binary(binary),+        matches(matches),+        stop(stop)+    { } -    if (zstream != NULL)-    {-      delete zstream;-      zstream = NULL;-    }+    Grep&        grep;     // grep object+    const char*& pathname; // grep::search argument pathname+    size_t&      lineno;   // grep::search lineno local variable+    bool&        hex;      // grep::search hex local variable+    bool&        binary;   // grep::search binary local variable+    size_t&      matches;  // grep::search matches local variable+    bool&        stop;     // grep::search stop local variable -#ifdef WITH_DECOMPRESSION_THREAD-    if (thread.joinable())+    // get the start of the before context, if present+    void begin_before(reflex::AbstractMatcher& matcher, const char *buf, size_t len, size_t num, const char*& ptr, size_t& size, size_t& offset)     {-      pipe_zstrm.notify_one();-      thread.join();-    }-#endif-  }--  // search the specified files or standard input for pattern matches-  virtual void ugrep();--  // search file or directory for pattern matches-  Type select(size_t level, const char *pathname, const char *basename, int type, ino_t& inode, uint64_t& info, bool is_argument = false);+      if (len == 0)+      {+        ptr = NULL;+        return;+      } -  // recurse a directory-  virtual void recurse(size_t level, const char *pathname);+      size_t current = matcher.lineno();+      size_t between = current - lineno; -  // -Z and --sort=best: perform a presearch to determine edit distance cost, returns 65535 when no match is found-  uint16_t cost(const char *pathname);+      if (between <= 1)+      {+        ptr = NULL;+      }+      else+      {+        const char *s = buf + len;+        const char *e = s; -  // search a file-  virtual void search(const char *pathname);+        if (buf[len - 1] != '\n')+          --between; -  // open a file for (binary) reading and assign input, decompress the file when --z, --decompress specified-  bool open_file(const char *pathname)-  {-    if (pathname == NULL)-    {-      if (source == NULL)-        return false;+        while (--s >= buf)+        {+          if (*s == '\n')+          {+            if (--between == 0)+              break;;+            e = s + 1;+          }+        } -      pathname = flag_label;-      file = source;-    }-    else if (fopen_s(&file, pathname, (flag_binary || flag_decompress ? "rb" : "r")) != 0)-    {-      warning("cannot read", pathname);+        ptr = ++s;+        size = e - s;+        offset = s - buf + num; -      return false;+        ++lineno;+      }     } -    // --filter: fork process to filter file, when applicable-    if (!filter(file, pathname))-      return false;--#ifdef HAVE_LIBZ-    if (flag_decompress)+    // advance to the next before context, if present+    void next_before(const char *buf, size_t len, size_t num, const char*& ptr, size_t& size, size_t& offset)     {-#ifdef WITH_DECOMPRESSION_THREAD--      pipe_fd[0] = -1;-      pipe_fd[1] = -1;+      if (ptr == NULL)+        return; -      FILE *pipe_in = NULL;+      const char *s = ptr + size;+      const char *e = buf + len; -      // open pipe between worker and decompression thread, then start decompression thread-      if (pipe(pipe_fd) == 0 && (pipe_in = fdopen(pipe_fd[0], "r")) != NULL)+      if (s >= e)       {-        // create or open a new zstreambuf to (re)start the decompression thread-        if (zstream == NULL)-          zstream = new zstreambuf(pathname, file);-        else-          zstream->open(pathname, file);+        ptr = NULL;+      }+      else+      {+        e = static_cast<const char*>(memchr(s, '\n', e - s)); -        if (thread.joinable())-        {-          pipe_zstrm.notify_one();-        }+        if (e == NULL)+          e = buf + len;         else-        {-          try-          {-            extracting = false;-            waiting = false;--            thread = std::thread(&Grep::decompress, this);-          }--          catch (std::system_error&)-          {-            fclose(pipe_in);-            close(pipe_fd[1]);-            pipe_fd[0] = -1;-            pipe_fd[1] = -1;+          ++e; -            warning("cannot create thread to decompress",  pathname);+        ptr = s;+        size = e - s;+        offset = s - buf + num; -            return false;-          }-        }+        ++lineno;       }-      else-      {-        if (pipe_fd[0] != -1)-        {-          close(pipe_fd[0]);-          close(pipe_fd[1]);-          pipe_fd[0] = -1;-          pipe_fd[1] = -1;-        }+    }+  }; -        warning("cannot create pipe to decompress",  pathname);+  // extend event GrepHandler to output invert match lines for -v+  struct InvertMatchGrepHandler : public GrepHandler { -        return false;-      }+    InvertMatchGrepHandler(Grep& grep, const char*& pathname, size_t& lineno, bool& hex, bool& binary, size_t& matches, bool& stop)+      :+        GrepHandler(grep, pathname, lineno, hex, binary, matches, stop)+    { } -      input = reflex::Input(pipe_in, flag_encoding_type);+    // functor invoked by the reflex::AbstractMatcher when the buffer contents are shifted out, also called explicitly in grep::search+    virtual void operator()(reflex::AbstractMatcher& matcher, const char *buf, size_t len, size_t num) override+    {+      const char *ptr;+      size_t size;+      size_t offset; -#else+      begin_before(matcher, buf, len, num, ptr, size, offset); -      // create or open a new zstreambuf-      if (zstream == NULL)-        zstream = new zstreambuf(pathname, file);-      else-        zstream->open(pathname, file);+      while (ptr != NULL)+      {+        // --range: max line exceeded?+        if (flag_max_line > 0 && lineno > flag_max_line)+          break; -      stream = new std::istream(zstream);+        // --max-files: max reached?+        if (matches == 0 && !Stats::found_part())+        {+          stop = true;+          break;+        } -      input = stream;+        // -m: max number of matches reached?+        if (flag_max_count > 0 && matches >= flag_max_count)+          break; -#endif-    }-    else-#endif-    {-      input = reflex::Input(file, flag_encoding_type);-    }+        // output blocked?+        if (grep.out.eof)+          break; -    return true;-  }+        if (flag_with_hex)+          binary = false; -  // return true on success, create a pipe to replace file input if filtering files in a forked process-  bool filter(FILE *& in, const char *pathname)-  {-#ifndef OS_WIN+        binary = binary || flag_hex || (!flag_text && is_binary(ptr, size)); -    // --filter-    if (flag_filter != NULL && in != NULL)-    {-      const char *basename = strrchr(pathname, PATHSEPCHR);-      if (basename == NULL)-        basename = pathname;-      else-        ++basename;+        if (binary && !flag_hex && !flag_with_hex)+          break; -      // get the basenames's extension suffix-      const char *suffix = strrchr(basename, '.');+        if (hex && !binary)+          grep.out.dump.done();+        hex = binary; -      // don't consider . at the front of basename, otherwise skip .-      if (suffix == basename)-        suffix = NULL;-      else if (suffix != NULL)-        ++suffix;+        ++matches; -      // --filter-magic-label: if the file is seekable, then check for a magic pattern match-      if (!flag_filter_magic_label.empty() && fseek(in, 0, SEEK_CUR) == 0)-      {-        bool is_plus = false;+        if (!flag_no_header)+          grep.out.header(pathname, grep.partname, lineno, NULL, offset, flag_separator, binary); -        // --filter-magic-label: check for overriding +-        if (suffix != NULL)+        if (binary)         {-          for (auto& i : flag_filter_magic_label)+          grep.out.dump.hex(Output::Dump::HEX_LINE, offset, ptr, size);+        }+        else+        {+          if (size > 0)           {-            if (i.front() == '+')+            size_t sizen = size - (ptr[size - 1] == '\n');+            if (sizen > 0)             {-              is_plus = true;--              break;+              grep.out.str(color_sl);+              grep.out.str(ptr, sizen);+              grep.out.str(color_off);             }           }+          grep.out.nl();         } -        // --filter-magic-label: if the basename has no suffix or a +LABEL + then check magic bytes-        if (suffix == NULL || is_plus)-        {-          // create a matcher to match the magic pattern-          size_t match = reflex::Matcher(filter_magic_pattern, in).scan();+        next_before(buf, len, num, ptr, size, offset);+      }+    }+  }; -          // rewind the input after scan-          rewind(in);+  // extend event GrepHandler to output any context lines for -y+  struct AnyLineGrepHandler : public GrepHandler { -          if (match > 0 && match <= flag_filter_magic_label.size())-          {-            suffix = flag_filter_magic_label[match - 1].c_str();+    AnyLineGrepHandler(Grep& grep, const char*& pathname, size_t& lineno, bool& hex, bool& binary, size_t& matches, bool& stop, const char*& rest_line_data, size_t& rest_line_size, size_t& rest_line_last)+      :+        GrepHandler(grep, pathname, lineno, hex, binary, matches, stop),+        rest_line_data(rest_line_data),+        rest_line_size(rest_line_size),+        rest_line_last(rest_line_last)+    { } -            if (*suffix == '+')-              ++suffix;+    // functor invoked by the reflex::AbstractMatcher when the buffer contents are shifted out, also called explicitly in grep::search+    virtual void operator()(reflex::AbstractMatcher& matcher, const char *buf, size_t len, size_t num) override+    {+      const char *ptr;+      size_t size;+      size_t offset;++      begin_before(matcher, buf, len, num, ptr, size, offset);++      // display the rest of the matching line before the context lines+      if (rest_line_data != NULL && (lineno != matcher.lineno() || flag_ungroup))+      {+        if (binary)+        {+          grep.out.dump.hex(flag_invert_match ? Output::Dump::HEX_CONTEXT_LINE : Output::Dump::HEX_LINE, rest_line_last, rest_line_data, rest_line_size);+          grep.out.dump.done();+        }+        else+        {+          if (rest_line_size > 0)+          {+            rest_line_size -= rest_line_data[rest_line_size - 1] == '\n';+            if (rest_line_size > 0)+            {+              grep.out.str(flag_invert_match ? color_cx : color_sl);+              grep.out.str(rest_line_data, rest_line_size);+              grep.out.str(color_off);+            }           }+          grep.out.nl();         }-      }--      // basenames without a suffix get "*" as a suffix-      if (suffix == NULL || *suffix == '\0')-        suffix = "*"; -      size_t sep = strlen(suffix);+        rest_line_data = NULL;+      } -      const char *command = flag_filter;-      const char *default_command = NULL;+      // context colors with or without -v+      short v_hex_context_line = flag_invert_match ? Output::Dump::HEX_LINE : Output::Dump::HEX_CONTEXT_LINE;+      const char *v_color_cx = flag_invert_match ? color_sl : color_cx;+      const char *separator = flag_invert_match ? flag_separator : "-"; -      // find the command corresponding to the suffix-      while (true)+      while (ptr != NULL)       {-        while (isspace(*command))-          ++command;+        // --range: max line exceeded?+        if (flag_max_line > 0 && lineno > flag_max_line)+          break; -        if (*command == '*')-          default_command = strchr(command, ':');+        // --max-files: max reached?+        if (flag_invert_match && matches == 0 && !Stats::found_part())+        {+          stop = true;+          break;+        } -        if (strncmp(suffix, command, sep) == 0 && (command[sep] == ':' || command[sep] == ',' || isspace(command[sep])))+        // -m: max number of matches reached?+        if (flag_invert_match && flag_max_count > 0 && matches >= flag_max_count)         {-          command = strchr(command, ':');+          stop = true;           break;         } -        command = strchr(command, ',');-        if (command == NULL)+        // output blocked?+        if (grep.out.eof)           break; -        ++command;-      }+        if (flag_invert_match)+          ++matches; -      // if no matching command, use the *:command if specified-      if (command == NULL)-        command = default_command;--      // suffix has a command to execute-      if (command != NULL)-      {-        // skip over the ':'-        ++command;+        if (flag_with_hex)+          binary = false; -        int fd[2];+        binary = binary || flag_hex || (!flag_text && is_binary(ptr, size)); -        if (pipe(fd) == 0)-        {-          int pid;+        if (binary && !flag_hex && !flag_with_hex)+          break; -          if ((pid = fork()) == 0)-          {-            // child process+        if (hex && !binary)+          grep.out.dump.done();+        hex = binary; -            // close the reading end of the pipe-            close(fd[0]);+        if (!flag_no_header)+          grep.out.header(pathname, grep.partname, lineno, NULL, offset, separator, binary); -            // dup the input file to stdin unless reading stdin-            if (in != stdin)+        if (binary)+        {+          grep.out.dump.hex(v_hex_context_line, offset, ptr, size);+        }+        else+        {+          if (size > 0)+          {+            size_t sizen = size - (ptr[size - 1] == '\n');+            if (sizen > 0)             {-              dup2(fileno(in), STDIN_FILENO);-              fclose(in);+              grep.out.str(v_color_cx);+              grep.out.str(ptr, sizen);+              grep.out.str(color_off);             }+          }+          grep.out.nl();+        } -            // dup the writing end of the pipe to stdout-            dup2(fd[1], STDOUT_FILENO);-            close(fd[1]);+        next_before(buf, len, num, ptr, size, offset);+      }+    } -            // populate argv[] with the command and its arguments, thereby destroying flag_filter-            std::vector<const char*> args;+    const char*& rest_line_data;+    size_t&      rest_line_size;+    size_t&      rest_line_last; -            char *arg = const_cast<char*>(command);+  }; -            while (*arg != '\0' && *arg != ',')-            {-              while (isspace(*arg))-                ++arg;+  // extend event AnyLineGrepHandler to output specific context lines for -A, -B, and -C+  struct ContextGrepHandler : public AnyLineGrepHandler { -              char *p = arg;+    // context state to track context lines before and after a match+    struct ContextState { -              while (*p != '\0' && *p != ',' && !isspace(*p))-                ++p;+      ContextState()+        :+          before_index(0),+          before_length(0),+          after_lineno(0),+          after_length(flag_after_context)+      {+        before_binary.resize(flag_before_context);+        before_offset.resize(flag_before_context);+        before_line.resize(flag_before_context);+      } -              if (p > arg)-              {-                if (p - arg == 1 && *arg == '%')-                  args.push_back(in == stdin ? "-" : pathname);-                else-                  args.push_back(arg);-              }+      size_t                   before_index;  // before context rotation index+      size_t                   before_length; // accumulated length of the before context+      std::vector<bool>        before_binary; // before context binary line+      std::vector<size_t>      before_offset; // before context offset of line+      std::vector<std::string> before_line;   // before context line data+      size_t                   after_lineno;  // after context line number+      size_t                   after_length;  // accumulated length of the after context -              if (*p == '\0')-                break;+    }; -              if (*p == ',')-              {-                *p = '\0';-                break;-              }+    ContextGrepHandler(Grep& grep, const char*& pathname, size_t& lineno, bool& hex, bool& binary, size_t& matches, bool& stop, const char*& rest_line_data, size_t& rest_line_size, size_t& rest_line_last)+      :+        AnyLineGrepHandler(grep, pathname, lineno, hex, binary, matches, stop, rest_line_data, rest_line_size, rest_line_last)+    { } -              *p = '\0';+    // display the before context+    void output_before_context()+    {+      // the group separator indicates lines skipped, like GNU grep+      if (state.after_lineno > 0 && state.after_lineno + state.after_length < grep.matcher->lineno() - state.before_length)+      {+        if (hex)+          grep.out.dump.done();+        +        if (flag_group_separator != NULL)+        {+          grep.out.str(color_se);+          grep.out.str(flag_group_separator);+          grep.out.str(color_off);+          grep.out.nl();+        }+      } -              arg = p + 1;-            }+      // output the before context+      if (state.before_length > 0)+      {+        // the first line number of the before context+        size_t before_lineno = grep.matcher->lineno() - state.before_length; -            // silently bail out if there is no command-            if (args.empty())-              exit(EXIT_SUCCESS);+        for (size_t i = 0; i < state.before_length; ++i)+        {+          size_t j = (state.before_index + i) % state.before_length; -            // add sentinel-            args.push_back(NULL);+          if (hex && !state.before_binary[j])+            grep.out.dump.done();+          hex = state.before_binary[j]; -            // get argv[] array data-            char * const *argv = const_cast<char * const *>(args.data());+          if (!flag_no_header)+            grep.out.header(pathname, grep.partname, before_lineno + i, NULL, state.before_offset[j], "-", hex); -            // execute-            execvp(argv[0], argv);+          const char *ptr = state.before_line[j].c_str();+          size_t size = state.before_line[j].size(); -            error("--filter: cannot exec", argv[0]);+          if (hex)+          {+            grep.out.dump.hex(Output::Dump::HEX_CONTEXT_LINE, state.before_offset[j], ptr, size);+          }+          else+          {+            if (size > 0)+            {+              size -= ptr[size - 1] == '\n';+              if (size > 0)+              {+                grep.out.str(color_cx);+                grep.out.str(ptr, size);+                grep.out.str(color_off);+              }+            }+            grep.out.nl();           }+        }+      } -          // close the writing end of the pipe-          close(fd[1]);+      // reset the before context state+      state.before_index = 0;+      state.before_length = 0;+    } -          // close the file and use the reading end of the pipe-          if (in != stdin)-            fclose(in);-          in = fdopen(fd[0], "r");+    // set the after context+    void set_after_lineno(size_t lineno)+    {+      // set the after context state with the first after context line number+      state.after_length = 0;+      state.after_lineno = lineno;+    }++    // functor invoked by the reflex::AbstractMatcher when the buffer contents are shifted out, also called explicitly in grep::search+    virtual void operator()(reflex::AbstractMatcher& matcher, const char *buf, size_t len, size_t num) override+    {+      const char *ptr;+      size_t size;+      size_t offset;++      begin_before(matcher, buf, len, num, ptr, size, offset);++      // display the rest of the matching line before the context lines+      if (rest_line_data != NULL && (lineno != matcher.lineno() || flag_ungroup))+      {+        if (binary)+        {+          grep.out.dump.hex(flag_invert_match ? Output::Dump::HEX_CONTEXT_LINE : Output::Dump::HEX_LINE, rest_line_last, rest_line_data, rest_line_size);         }         else         {-          if (in != stdin)-            fclose(in);-          in = NULL;--          warning("--filter: cannot create pipe", flag_filter);--          return false;+          if (rest_line_size > 0)+          {+            rest_line_size -= rest_line_data[rest_line_size - 1] == '\n';+            if (rest_line_size > 0)+            {+              grep.out.str(flag_invert_match ? color_cx : color_sl);+              grep.out.str(rest_line_data, rest_line_size);+              grep.out.str(color_off);+            }+          }+          grep.out.nl();         }++        rest_line_data = NULL;       }-    } -#endif+      while (ptr != NULL)+      {+        // --range: max line exceeded?+        if (flag_max_line > 0 && lineno > flag_max_line)+          break; -    return true;-  }+        // --max-files: max reached?+        if (flag_invert_match && matches == 0 && !Stats::found_part())+        {+          stop = true;+          break;+        } -#ifdef HAVE_LIBZ-#ifdef WITH_DECOMPRESSION_THREAD+        // -m: max number of matches reached?+        if (flag_invert_match && flag_max_count > 0 && matches >= flag_max_count)+        {+          stop = true;+          break;+        } -  // decompression thread-  void decompress()-  {-    while (zstream != NULL)-    {-      // use the zstreambuf internal buffer to hold decompressed data-      unsigned char *buf;-      size_t maxlen;-      zstream->get_buffer(buf, maxlen);+        // output blocked?+        if (grep.out.eof)+          break; -      // to hold the path (prefix + name) extracted from the zip file-      std::string path;+        if (flag_invert_match)+          ++matches; -      // reset flags-      extracting = false;-      waiting = false;+        if (flag_with_hex)+          binary = false; -      // extract the parts of a zip file, one by one, if zip file detected-      while (true)-      {-        // a regular file, may be reset when unzipping a directory-        bool is_regular = true;+        binary = binary || flag_hex || (!flag_text && is_binary(ptr, size)); -        const zstreambuf::ZipInfo *zipinfo = zstream->zipinfo();+        if (binary && !flag_hex && !flag_with_hex)+          break; -        if (zipinfo != NULL)+        if (hex && !binary)+          grep.out.dump.done();+        hex = binary;++        if (state.after_lineno > 0 && state.after_length < flag_after_context)         {-          // extracting a zip file-          extracting = true;+          ++state.after_length; -          if (!zipinfo->name.empty() && zipinfo->name.back() == '/')+          if (!flag_no_header)+            grep.out.header(pathname, grep.partname, lineno, NULL, offset, "-", binary);++          if (binary)           {-            // skip zip directories-            is_regular = false;+            grep.out.dump.hex(Output::Dump::HEX_CONTEXT_LINE, offset, ptr, size);           }           else           {-            path.assign(zipinfo->name);--            // produce headers with zip file pathnames for each archived part (Grep::partname)-            if (!flag_no_filename)-              flag_no_header = false;+            if (size > 0)+            {+              size_t sizen = size - (ptr[size - 1] == '\n');+              if (sizen > 0)+              {+                grep.out.str(color_cx);+                grep.out.str(ptr, sizen);+                grep.out.str(color_off);+              }+            }+            grep.out.nl();           }         }--        // decompress a block of data into the buffer-        std::streamsize len = zstream->decompress(buf, maxlen);-        if (len < 0)+        else if (flag_before_context > 0)+        {+          if (state.before_length < flag_before_context)+            ++state.before_length;+          state.before_index %= state.before_length;+          state.before_binary[state.before_index] = binary;+          state.before_offset[state.before_index] = offset;+          state.before_line[state.before_index].assign(ptr, size);+          ++state.before_index;+        }+        else+        {           break;+        } -        if (!filter_tar(*zstream, path, buf, maxlen, len) && !filter_cpio(*zstream, path, buf, maxlen, len))-        {-          // not a tar/cpio file, decompress the data into pipe, if not unzipping or if zipped file meets selection criteria-          bool is_selected = is_regular && (zipinfo == NULL || select_matching(path.c_str(), buf, static_cast<size_t>(len), true));-          if (is_selected)-          {-            // if pipe is closed, then reopen it-            if (pipe_fd[1] == -1)-            {-              // signal close and wait until the main grep thread created a new pipe in close_file()-              std::unique_lock<std::mutex> lock(pipe_mutex);-              pipe_close.notify_one();-              waiting = true;-              pipe_ready.wait(lock);-              waiting = false;-              lock.unlock();+        next_before(buf, len, num, ptr, size, offset);+      }+    } -              // failed to create a pipe in close_file()-              if (pipe_fd[1] == -1)-                break;-            }+    ContextState state; -            // assign the Grep::partname (synchronized on pipe_mutex and pipe), before sending to the (new) pipe-            partname.swap(path);-          }+  }; -          // push decompressed data into pipe-          while (len > 0)-          {-            // write buffer data to the pipe, if the pipe is broken then the receiver is waiting for this thread to join-            if (is_selected && write(pipe_fd[1], buf, static_cast<size_t>(len)) < len)-              break;+  // extend event AnyLineGrepHandler to output specific context lines for -A, -B, and -C with -v+  struct InvertContextGrepHandler : public AnyLineGrepHandler { -            // decompress the next block of data into the buffer-            len = zstream->decompress(buf, maxlen);-          }-        }+    struct InvertContextMatch { -        // break if not unzipping or if no more files to unzip-        if (zstream->zipinfo() == NULL)-          break;+      InvertContextMatch(size_t pos, size_t size, size_t offset)+        :+          pos(pos),+          size(size),+          offset(offset)+      { } -        // extracting a zip file-        extracting = true;+      size_t pos;    // position on the line+      size_t size;   // size of the match+      size_t offset; // size of the match -        // close our end of the pipe-        close(pipe_fd[1]);-        pipe_fd[1] = -1;-      }+    }; -      extracting = false;+    typedef std::vector<InvertContextMatch> InvertContextMatches; -      if (pipe_fd[1] >= 0)+    // context state to track matching lines before non-matching lines+    struct InvertContextState {++      InvertContextState()+        :+          before_index(0),+          before_length(0),+          after_lineno(0)       {-        close(pipe_fd[1]);-        pipe_fd[1] = -1;+        before_binary.resize(flag_before_context);+        before_columno.resize(flag_before_context);+        before_offset.resize(flag_before_context);+        before_line.resize(flag_before_context);+        before_match.resize(flag_before_context);       } -      // wait until a new zstream is ready (zstream is NULL to terminate the thread)-      std::unique_lock<std::mutex> lock(pipe_mutex);-      pipe_close.notify_one();-      waiting = true;-      pipe_zstrm.wait(lock);-      waiting = false;-      lock.unlock();-    }-  }+      size_t                            before_index;   // before context rotation index+      size_t                            before_length;  // accumulated length of the before context+      std::vector<bool>                 before_binary;  // before context binary line+      std::vector<size_t>               before_columno; // before context column number of first match+      std::vector<size_t>               before_offset;  // before context offset of first match+      std::vector<std::string>          before_line;    // before context line data+      std::vector<InvertContextMatches> before_match;   // before context matches per line+      size_t                            after_lineno;   // the after context line number -  // if tar file, extract regular file contents and push into pipes one by one, return true when done-  bool filter_tar(zstreambuf& zstream, const std::string& partprefix, unsigned char *buf, size_t maxlen, std::streamsize len)-  {-    const int BLOCKSIZE = 512;+    }; -    if (len > BLOCKSIZE)-    {-      // v7 and ustar formats-      const char ustar_magic[8] = { 'u', 's', 't', 'a', 'r', 0, '0', '0' };--      // gnu and oldgnu formats-      const char gnutar_magic[8] = { 'u', 's', 't', 'a', 'r', ' ', ' ', 0 };+    InvertContextGrepHandler(Grep& grep, const char*& pathname, size_t& lineno, bool& hex, bool& binary, size_t& matches, bool& stop, const char*& rest_line_data, size_t& rest_line_size, size_t& rest_line_last)+      :+        AnyLineGrepHandler(grep, pathname, lineno, hex, binary, matches, stop, rest_line_data, rest_line_size, rest_line_last)+    { } -      // is this a tar archive?-      if (*buf != '\0' && (memcmp(buf + 257, ustar_magic, 8) == 0 || memcmp(buf + 257, gnutar_magic, 8) == 0))+    // display the before context+    void output_before_context()+    {+      // the group separator indicates lines skipped, like GNU grep+      if (state.after_lineno > 0 && state.after_lineno + flag_after_context + flag_before_context < lineno && flag_group_separator != NULL)       {-        // produce headers with tar file pathnames for each archived part (Grep::partname)-        if (!flag_no_filename)-          flag_no_header = false;+        if (hex)+          grep.out.dump.done();+        +        grep.out.str(color_se);+        grep.out.str(flag_group_separator);+        grep.out.str(color_off);+        grep.out.nl();+      } -        // inform the main grep thread we are extracing an archive-        extracting = true;+      // output the before context+      if (state.before_length > 0)+      {+        // the first line number of the before context+        size_t before_lineno = lineno - state.before_length; -        // to hold the path (prefix + name) extracted from the header-        std::string path;+        for (size_t i = 0; i < state.before_length; ++i)+        {+          size_t j = (state.before_index + i) % state.before_length;+          size_t offset = state.before_match[j].empty() ? state.before_offset[j] : state.before_match[j].front().offset; -        // to hold long path extracted from the previous header block that is marked with typeflag 'x' or 'L'-        std::string long_path;+          if (hex && !state.before_binary[j])+            grep.out.dump.done();+          hex = state.before_binary[j]; -        while (true)-        {-          // extract tar header fields (name and prefix strings are not \0-terminated!!)-          const char *name = reinterpret_cast<const char*>(buf);-          const char *prefix = reinterpret_cast<const char*>(buf + 345);-          size_t size = strtoul(reinterpret_cast<const char*>(buf + 124), NULL, 8);-          int padding = (BLOCKSIZE - size % BLOCKSIZE) % BLOCKSIZE;-          unsigned char typeflag = buf[156];+          if (!flag_no_header)+            grep.out.header(pathname, grep.partname, before_lineno + i, NULL, offset, "-", hex); -          // header types-          bool is_regular = typeflag == '0' || typeflag == '\0';-          bool is_xhd = typeflag == 'x';-          bool is_extended = typeflag == 'L';+          const char *ptr = state.before_line[j].c_str();+          size_t size = state.before_line[j].size();+          size_t pos = 0; -          // assign the (long) tar pathname-          path.clear();-          if (long_path.empty())+          for (auto& match : state.before_match[j])           {-            if (*prefix != '\0')+            if (hex)             {-              if (prefix[154] == '\0')-                path.assign(prefix);-              else-                path.assign(prefix, 155);-              path.push_back('/');+              grep.out.dump.hex(Output::Dump::HEX_CONTEXT_LINE, match.offset - (match.pos - pos), ptr + pos, match.pos - pos);+              grep.out.dump.hex(Output::Dump::HEX_CONTEXT_MATCH, match.offset, ptr + match.pos, match.size);             }-            if (name[99] == '\0')-              path.append(name);             else-              path.append(name, 100);-          }-          else-          {-            path.swap(long_path);-          }+            {+              if (match.pos > pos)+              {+                grep.out.str(color_cx);+                grep.out.str(ptr + pos, match.pos - pos);+                grep.out.str(color_off);+              } -          // remove header to advance to the body-          len -= BLOCKSIZE;-          memmove(buf, buf + BLOCKSIZE, static_cast<size_t>(len));+              if (match.size > 0)+              {+                size_t sizen = match.size - (ptr[match.pos + match.size - 1] == '\n');+                if (sizen > 0)+                {+                  grep.out.str(match_mc);+                  grep.out.str(ptr + match.pos, sizen);+                  grep.out.str(match_off);+                }+              }+            } -          // check if archived file meets selection criteria-          size_t minlen = std::min(static_cast<size_t>(len), size);-          bool is_selected = select_matching(path.c_str(), buf, minlen, is_regular);+            pos = match.pos + match.size;+          } -          // if extended headers are present-          if (is_xhd)+          if (hex)           {-            // typeflag 'x': extract the long path from the pax extended header block in the body-            const char *b = reinterpret_cast<const char*>(buf);-            const char *e = b + minlen;-            const char *t = "path=";-            const char *s = std::search(b, e, t, t + 5);-            if (s != NULL)-            {-              e = static_cast<const char*>(memchr(s, '\n', e - s));-              if (e != NULL)-                long_path.assign(s + 5, e - s - 5);-            }+            grep.out.dump.hex(Output::Dump::HEX_CONTEXT_LINE, state.before_offset[j] + pos, ptr + pos, size - pos);           }-          else if (is_extended)+          else           {-            // typeflag 'L': get long name from the body-            long_path.assign(reinterpret_cast<const char*>(buf), minlen);+            if (size > pos)+            {+              size -= ptr[size - 1] == '\n';+              if (size > pos)+              {+                grep.out.str(color_cx);+                grep.out.str(ptr + pos, size - pos);+                grep.out.str(color_off);+              }+            }+            grep.out.nl();           }+        }+      } -          // if the pipe is closed, then get a new pipe to search the next part in the archive-          if (is_selected && pipe_fd[1] == -1)-          {-            // signal close and wait until the main grep thread created a new pipe in close_file()-            std::unique_lock<std::mutex> lock(pipe_mutex);-            pipe_close.notify_one();-            waiting = true;-            pipe_ready.wait(lock);-            waiting = false;-            lock.unlock();+      // reset the context state+      state.before_index = 0;+      state.before_length = 0;+      state.after_lineno = lineno;+    } -            // failed to create a pipe in close_file()-            if (pipe_fd[1] == -1)-              break;-          }+    // add line with the first match to the before context+    void add_before_context_line(const char *bol, const char *eol, size_t columno, size_t offset)+    {+      if (state.before_length < flag_before_context)+        ++state.before_length;+      state.before_index %= state.before_length;+      state.before_binary[state.before_index] = binary;+      state.before_columno[state.before_index] = columno;+      state.before_offset[state.before_index] = offset;+      state.before_line[state.before_index].assign(bol, eol - bol);+      state.before_match[state.before_index].clear();+      ++state.before_index;+    } -          // assign the Grep::partname (synchronized on pipe_mutex and pipe), before sending to the (new) pipe-          if (is_selected)-          {-            if (!partprefix.empty())-              partname.assign(partprefix).append(":").append(path);-            else-              partname.swap(path);-          }+    // add match fragment to the before context+    void add_before_context_match(size_t pos, size_t size, size_t offset)+    {+      // only add a match if we have a before line, i.e. not an after line with a multiline match+      if (state.before_length > 0)+      {+        size_t index = (state.before_index + state.before_length - 1) % state.before_length;+        state.before_match[index].emplace_back(pos, size, offset);+      }+    } -          // it is ok to push the body into the pipe for the main thread to search-          bool ok = is_selected;+    // set the after context+    void set_after_lineno(size_t lineno)+    {+      state.after_lineno = lineno;+    } -          while (len > 0)-          {-            size_t len_out = std::min(static_cast<size_t>(len), size);+    // functor invoked by the reflex::AbstractMatcher when the buffer contents are shifted out, also called explicitly in grep::search+    virtual void operator()(reflex::AbstractMatcher& matcher, const char *buf, size_t len, size_t num) override+    {+      const char *ptr;+      size_t size;+      size_t offset; -            if (ok)+      begin_before(matcher, buf, len, num, ptr, size, offset);++      // display the rest of the "after" matching line+      if (rest_line_data != NULL && (lineno != matcher.lineno() || flag_ungroup))+      {+        if (binary)+        {+          grep.out.dump.hex(Output::Dump::HEX_CONTEXT_LINE, rest_line_last, rest_line_data, rest_line_size);+        }+        else+        {+          if (rest_line_size > 0)+          {+            rest_line_size -= rest_line_data[rest_line_size - 1] == '\n';+            if (rest_line_size > 0)             {-              // write decompressed data to the pipe, if the pipe is broken then stop pushing more data into this pipe-              if (write(pipe_fd[1], buf, len_out) < static_cast<ssize_t>(len_out))-                ok = false;+              grep.out.str(color_cx);+              grep.out.str(rest_line_data, rest_line_size);+              grep.out.str(color_off);             }+          }+          grep.out.nl();+        } -            size -= len_out;+        rest_line_data = NULL;+      } -            // reached the end of the tar body?-            if (size == 0)-            {-              len -= len_out;-              memmove(buf, buf + len_out, static_cast<size_t>(len));+      if (ptr != NULL)+        output_before_context(); -              break;-            }+      while (ptr != NULL)+      {+        state.after_lineno = lineno + 1; -            // decompress the next block of data into the buffer-            len = zstream.decompress(buf, maxlen);-          }+        // --range: max line exceeded?+        if (flag_max_line > 0 && lineno > flag_max_line)+          break; -          // error?-          if (len < 0)-            break;+        // --max-files: max reached?+        if (matches == 0 && !Stats::found_part())+        {+          stop = true;+          break;+        } -          // fill the rest of the buffer with decompressed data-          if (static_cast<size_t>(len) < maxlen)-          {-            std::streamsize len_in = zstream.decompress(buf + len, maxlen - static_cast<size_t>(len));+        // -m: max number of matches reached?+        if (flag_invert_match && flag_max_count > 0 && matches >= flag_max_count)+        {+          stop = true;+          break;+        } -            // error?-            if (len_in < 0)-              break;+        // output blocked?+        if (grep.out.eof)+          break; -            len += len_in;-          }+        if (flag_with_hex)+          binary = false; -          // skip padding-          if (len > padding)-          {-            len -= padding;-            memmove(buf, buf + padding, static_cast<size_t>(len));-          }+        binary = binary || flag_hex || (!flag_text && is_binary(ptr, size)); -          // rest of the file is too short, something is wrong-          if (len <= BLOCKSIZE)-            break;+        if (binary && !flag_hex && !flag_with_hex)+          break; -          // no more parts to extract?-          if (*buf == '\0' || (memcmp(buf + 257, ustar_magic, 8) != 0 && memcmp(buf + 257, gnutar_magic, 8) != 0))-            break;+        if (hex && !binary)+          grep.out.dump.done();+        hex = binary; -          // get a new pipe to search the next part in the archive, if the previous part was a regular file-          if (is_selected)+        ++matches;++        if (!flag_no_header)+          grep.out.header(pathname, grep.partname, lineno, NULL, offset, flag_separator, binary);++        if (binary)+        {+          grep.out.dump.hex(Output::Dump::HEX_LINE, offset, ptr, size);+        }+        else+        {+          if (size > 0)           {-            // close our end of the pipe-            close(pipe_fd[1]);-            pipe_fd[1] = -1;+            size_t sizen = size - (ptr[size - 1] == '\n');+            if (sizen > 0)+            {+              grep.out.str(color_sl);+              grep.out.str(ptr, sizen);+              grep.out.str(color_off);+            }           }+          grep.out.nl();         } -        // done extracting the tar file-        return true;+        next_before(buf, len, num, ptr, size, offset);       }     } -    // not a tar file-    return false;-  }+    InvertContextState state; -  // if cpio file, extract regular file contents and push into pipes one by one, return true when done-  bool filter_cpio(zstreambuf& zstream, const std::string& partprefix, unsigned char *buf, size_t maxlen, std::streamsize len)-  {-    const int HEADERSIZE = 110;+  }; -    if (len > HEADERSIZE)+  Grep(FILE *file, reflex::AbstractMatcher *matcher)+    :+      out(file),+      matcher(matcher),+      file(NULL)+#ifdef HAVE_LIBZ+    , zstream(NULL),+      stream(NULL)+#ifdef WITH_DECOMPRESSION_THREAD+    , extracting(false),+      waiting(false)+#endif+#endif+  { }++  virtual ~Grep()+  {+    if (stream != NULL)     {-      // odc format-      const char odc_magic[6] = { '0', '7', '0', '7', '0', '7' };+      delete stream;+      stream = NULL;+    } -      // newc format-      const char newc_magic[6] = { '0', '7', '0', '7', '0', '1' };+    if (zstream != NULL)+    {+      delete zstream;+      zstream = NULL;+    } -      // newc+crc format-      const char newc_crc_magic[6] = { '0', '7', '0', '7', '0', '2' };+#ifdef WITH_DECOMPRESSION_THREAD+    if (thread.joinable())+    {+      pipe_zstrm.notify_one();+      thread.join();+    }+#endif+  } -      // is this a cpio archive?-      if (memcmp(buf, odc_magic, 6) == 0 || memcmp(buf, newc_magic, 6) == 0 || memcmp(buf, newc_crc_magic, 6) == 0)-      {-        // produce headers with cpio file pathnames for each archived part (Grep::partname)-        if (!flag_no_filename)-          flag_no_header = false;+  // search the specified files or standard input for pattern matches+  virtual void ugrep(); -        // inform the main grep thread we are extracing an archive-        extracting = true;+  // search file or directory for pattern matches+  Type select(size_t level, const char *pathname, const char *basename, int type, ino_t& inode, uint64_t& info, bool is_argument = false); -        // to hold the path (prefix + name) extracted from the header-        std::string path;+  // recurse a directory+  virtual void recurse(size_t level, const char *pathname); -        // need a new pipe, close current pipe first to create a new pipe-        bool in_progress = false;+  // -Z and --sort=best: perform a presearch to determine edit distance cost, returns 65535 when no match is found+  uint16_t cost(const char *pathname); -        while (true)-        {-          // true if odc, false if newc-          bool is_odc = buf[5] == '7';+  // search a file+  virtual void search(const char *pathname); -          int header_len = is_odc ? 76 : 110;+  // open a file for (binary) reading and assign input, decompress the file when --z, --decompress specified+  bool open_file(const char *pathname)+  {+    if (pathname == NULL)+    {+      if (source == NULL)+        return false; -          char tmp[16];-          char *rest;+      pathname = flag_label;+      file = source;+    }+    else if (fopen_s(&file, pathname, (flag_binary || flag_decompress ? "rb" : "r")) != 0)+    {+      warning("cannot read", pathname); -          // get the namesize-          size_t namesize;-          if (is_odc)-          {-            memcpy(tmp, buf + 59, 6);-            tmp[6] = '\0';-            namesize = strtoul(tmp, &rest, 8);-          }-          else-          {-            memcpy(tmp, buf + 94, 8);-            tmp[8] = '\0';-            namesize = strtoul(tmp, &rest, 16);-          }+      return false;+    } -          // if not a valid mode value, then something is wrong-          if (rest == NULL || *rest != '\0')-          {-            // data was read, stop reading more-            if (in_progress)-              break;+    // --filter: fork process to filter file, when applicable+    if (!filter(file, pathname))+      return false; -            // assume this is not a cpio file and return false-            return false;-          }+#ifdef HAVE_LIBZ+    if (flag_decompress)+    {+#ifdef WITH_DECOMPRESSION_THREAD -          // pathnames with trailing \0 cannot be empty or too large-          if (namesize <= 1 || namesize >= 65536)-            break;+      pipe_fd[0] = -1;+      pipe_fd[1] = -1; -          // get the filesize-          size_t filesize;-          if (is_odc)-          {-            memcpy(tmp, buf + 65, 11);-            tmp[11] = '\0';-            filesize = strtoul(tmp, &rest, 8);-          }-          else-          {-            memcpy(tmp, buf + 54, 8);-            tmp[8] = '\0';-            filesize = strtoul(tmp, &rest, 16);-          }+      FILE *pipe_in = NULL; -          // if not a valid mode value, then something is wrong-          if (rest == NULL || *rest != '\0')+      // open pipe between worker and decompression thread, then start decompression thread+      if (pipe(pipe_fd) == 0 && (pipe_in = fdopen(pipe_fd[0], "r")) != NULL)+      {+        // create or open a new zstreambuf to (re)start the decompression thread+        if (zstream == NULL)+          zstream = new zstreambuf(pathname, file);+        else+          zstream->open(pathname, file);++        if (thread.joinable())+        {+          pipe_zstrm.notify_one();+        }+        else+        {+          try           {-            // data was read, stop reading more-            if (in_progress)-              break;+            extracting = false;+            waiting = false; -            // assume this is not a cpio file and return false-            return false;+            thread = std::thread(&Grep::decompress, this);           } -          // true if this is a regular file when (mode & 0170000) == 0100000-          bool is_regular;-          if (is_odc)-          {-            memcpy(tmp, buf + 18, 6);-            tmp[6] = '\0';-            is_regular = (strtoul(tmp, &rest, 8) & 0170000) == 0100000;-          }-          else+          catch (std::system_error&)           {-            memcpy(tmp, buf + 14, 8);-            tmp[8] = '\0';-            is_regular = (strtoul(tmp, &rest, 16) & 0170000) == 0100000;-          }+            fclose(pipe_in);+            close(pipe_fd[1]);+            pipe_fd[0] = -1;+            pipe_fd[1] = -1; -          // if not a valid mode value, then something is wrong-          if (rest == NULL || *rest != '\0')-          {-            // data was read, stop reading more-            if (in_progress)-              break;+            warning("cannot create thread to decompress",  pathname); -            // assume this is not a cpio file and return false             return false;           }+        }+      }+      else+      {+        if (pipe_fd[0] != -1)+        {+          close(pipe_fd[0]);+          close(pipe_fd[1]);+          pipe_fd[0] = -1;+          pipe_fd[1] = -1;+        } -          // remove header to advance to the body-          len -= header_len;-          memmove(buf, buf + header_len, static_cast<size_t>(len));+        warning("cannot create pipe to decompress",  pathname); -          // assign the cpio pathname-          path.clear();+        return false;+      } -          size_t size = namesize;+      input = reflex::Input(pipe_in, flag_encoding_type); -          while (len > 0)-          {-            size_t n = std::min(static_cast<size_t>(len), size);-            char *b = reinterpret_cast<char*>(buf);+#else -            path.append(b, n);-            size -= n;+      // create or open a new zstreambuf+      if (zstream == NULL)+        zstream = new zstreambuf(pathname, file);+      else+        zstream->open(pathname, file); -            if (size == 0)-            {-              // remove pathname to advance to the body-              len -= n;-              memmove(buf, buf + n, static_cast<size_t>(len));+      stream = new std::istream(zstream); -              break;-            }+      input = stream; -            // decompress the next block of data into the buffer-            len = zstream.decompress(buf, maxlen);-          }+#endif+    }+    else+#endif+    {+      input = reflex::Input(file, flag_encoding_type);+    } -          // error?-          if (len < 0)-            break;+    return true;+  } -          // remove trailing \0-          if (path.back() == '\0')-            path.pop_back();+  // return true on success, create a pipe to replace file input if filtering files in a forked process+  bool filter(FILE *& in, const char *pathname)+  {+#ifndef OS_WIN -          // reached the end of the cpio archive?-          if (path == "TRAILER!!!")-            break;+    // --filter+    if (flag_filter != NULL && in != NULL)+    {+      const char *basename = strrchr(pathname, PATHSEPCHR);+      if (basename == NULL)+        basename = pathname;+      else+        ++basename; -          // fill the rest of the buffer with decompressed data-          if (static_cast<size_t>(len) < maxlen)-          {-            std::streamsize len_in = zstream.decompress(buf + len, maxlen - static_cast<size_t>(len));+      // get the basenames's extension suffix+      const char *suffix = strrchr(basename, '.'); -            // error?-            if (len_in < 0)-              break;+      // don't consider . at the front of basename, otherwise skip .+      if (suffix == basename)+        suffix = NULL;+      else if (suffix != NULL)+        ++suffix; -            len += len_in;-          }+      // --filter-magic-label: if the file is seekable, then check for a magic pattern match+      if (!flag_filter_magic_label.empty() && fseek(in, 0, SEEK_CUR) == 0)+      {+        bool is_plus = false; -          // skip newc format \0 padding after the pathname-          if (!is_odc && len > 3)+        // --filter-magic-label: check for overriding ++        if (suffix != NULL)+        {+          for (auto& i : flag_filter_magic_label)           {-            size_t n = 4 - (110 + namesize) % 4;-            len -= n;-            memmove(buf, buf + n, static_cast<size_t>(len));-          }+            if (i.front() == '+')+            {+              is_plus = true; -          // check if archived file meets selection criteria-          size_t minlen = std::min(static_cast<size_t>(len), filesize);-          bool is_selected = select_matching(path.c_str(), buf, minlen, is_regular);--          // if the pipe is closed, then get a new pipe to search the next part in the archive-          if (is_selected && pipe_fd[1] == -1)-          {-            // signal close and wait until the main grep thread created a new pipe in close_file()-            std::unique_lock<std::mutex> lock(pipe_mutex);-            pipe_close.notify_one();-            waiting = true;-            pipe_ready.wait(lock);-            waiting = false;-            lock.unlock();--            // failed to create a pipe in close_file()-            if (pipe_fd[1] == -1)               break;+            }           }+        } -          // assign the Grep::partname (synchronized on pipe_mutex and pipe), before sending to the (new) pipe-          if (is_selected)+        // --filter-magic-label: if the basename has no suffix or a +LABEL + then check magic bytes+        if (suffix == NULL || is_plus)+        {+          // create a matcher to match the magic pattern+          size_t match = reflex::Matcher(filter_magic_pattern, in).scan();++          // rewind the input after scan+          rewind(in);++          if (match > 0 && match <= flag_filter_magic_label.size())           {-            if (!partprefix.empty())-              partname.assign(partprefix).append(":").append(path);-            else-              partname.swap(path);+            suffix = flag_filter_magic_label[match - 1].c_str();++            if (*suffix == '+')+              ++suffix;           }+        }+      } -          // it is ok to push the body into the pipe for the main thread to search-          bool ok = is_selected;+      // basenames without a suffix get "*" as a suffix+      if (suffix == NULL || *suffix == '\0')+        suffix = "*"; -          size = filesize;+      size_t sep = strlen(suffix); -          while (len > 0)+      const char *command = flag_filter;+      const char *default_command = NULL;++      // find the command corresponding to the suffix+      while (true)+      {+        while (isspace(*command))+          ++command;++        if (*command == '*')+          default_command = strchr(command, ':');++        if (strncmp(suffix, command, sep) == 0 && (command[sep] == ':' || command[sep] == ',' || isspace(command[sep])))+        {+          command = strchr(command, ':');+          break;+        }++        command = strchr(command, ',');+        if (command == NULL)+          break;++        ++command;+      }++      // if no matching command, use the *:command if specified+      if (command == NULL)+        command = default_command;++      // suffix has a command to execute+      if (command != NULL)+      {+        // skip over the ':'+        ++command;++        int fd[2];++        if (pipe(fd) == 0)+        {+          int pid;++          if ((pid = fork()) == 0)           {-            size_t len_out = std::min(static_cast<size_t>(len), size);+            // child process -            if (ok)+            // close the reading end of the pipe+            close(fd[0]);++            // dup the input file to stdin unless reading stdin+            if (in != stdin)             {-              // write decompressed data to the pipe, if the pipe is broken then stop pushing more data into this pipe-              if (write(pipe_fd[1], buf, len_out) < static_cast<ssize_t>(len_out))-                ok = false;+              dup2(fileno(in), STDIN_FILENO);+              fclose(in);             } -            size -= len_out;+            // dup the writing end of the pipe to stdout+            dup2(fd[1], STDOUT_FILENO);+            close(fd[1]); -            // reached the end of the cpio body?-            if (size == 0)+            // populate argv[] with the command and its arguments, thereby destroying flag_filter+            std::vector<const char*> args;++            char *arg = const_cast<char*>(command);++            while (*arg != '\0' && *arg != ',')             {-              len -= len_out;-              memmove(buf, buf + len_out, static_cast<size_t>(len));+              while (isspace(*arg))+                ++arg; -              break;-            }+              char *p = arg; -            // decompress the next block of data into the buffer-            len = zstream.decompress(buf, maxlen);-          }+              while (*p != '\0' && *p != ',' && !isspace(*p))+                ++p; -          // error?-          if (len < 0)-            break;+              if (p > arg)+              {+                if (p - arg == 1 && *arg == '%')+                  args.push_back(in == stdin ? "-" : pathname);+                else+                  args.push_back(arg);+              } -          if (static_cast<size_t>(len) < maxlen)-          {-            // fill the rest of the buffer with decompressed data-            std::streamsize len_in = zstream.decompress(buf + len, maxlen - static_cast<size_t>(len));+              if (*p == '\0')+                break; -            // error?-            if (len_in < 0)-              break;+              if (*p == ',')+              {+                *p = '\0';+                break;+              } -            len += len_in;-          }+              *p = '\0'; -          // skip newc format \0 padding-          if (!is_odc && len > 2)-          {-            size_t n = (4 - filesize % 4) % 4;-            len -= n;-            memmove(buf, buf + n, static_cast<size_t>(len));-          }+              arg = p + 1;+            } -          // rest of the file is too short, something is wrong-          if (len <= HEADERSIZE)-            break;+            // silently bail out if there is no command+            if (args.empty())+              exit(EXIT_SUCCESS); -          // quit if this is not valid cpio header magic-          if (memcmp(buf, odc_magic, 6) != 0 && memcmp(buf, newc_magic, 6) != 0 && memcmp(buf, newc_crc_magic, 6) != 0)-            break;+            // add sentinel+            args.push_back(NULL); -          // get a new pipe to search the next part in the archive, if the previous part was a regular file-          if (is_selected)-          {-            // close our end of the pipe-            close(pipe_fd[1]);-            pipe_fd[1] = -1;+            // get argv[] array data+            char * const *argv = const_cast<char * const *>(args.data()); -            in_progress = true;+            // execute+            execvp(argv[0], argv);++            error("--filter: cannot exec", argv[0]);           }++          // close the writing end of the pipe+          close(fd[1]);++          // close the file and use the reading end of the pipe+          if (in != stdin)+            fclose(in);+          in = fdopen(fd[0], "r");         }+        else+        {+          if (in != stdin)+            fclose(in);+          in = NULL; -        // done extracting the cpio file-        return true;+          warning("--filter: cannot create pipe", flag_filter);++          return false;+        }       }     } -    // not a cpio file-    return false;+#endif++    return true;   } -  // true if path matches search constraints or buf contains magic bytes-  bool select_matching(const char *path, const unsigned char *buf, size_t len, bool is_regular)-  {-    bool is_selected = is_regular;+#ifdef HAVE_LIBZ+#ifdef WITH_DECOMPRESSION_THREAD -    if (is_selected)+  // decompression thread+  void decompress()+  {+    while (zstream != NULL)     {-      const char *basename = strrchr(path, '/');-      if (basename == NULL)-        basename = path;-      else-        ++basename;+      // use the zstreambuf internal buffer to hold decompressed data+      unsigned char *buf;+      size_t maxlen;+      zstream->get_buffer(buf, maxlen); -      if (*basename == '.' && !flag_hidden)-        return false;+      // to hold the path (prefix + name) extracted from the zip file+      std::string path; -      // -O, -t, and -g (--include and --exclude): check if pathname or basename matches globs, is_selected = false if not-      if (!flag_all_exclude.empty() || !flag_all_include.empty())+      // reset flags+      extracting = false;+      waiting = false;++      // extract the parts of a zip file, one by one, if zip file detected+      while (true)       {-        // exclude files whose basename matches any one of the --exclude globs-        for (auto& glob : flag_all_exclude)-          if (!(is_selected = !glob_match(path, basename, glob.c_str())))-            break;+        // a regular file, may be reset when unzipping a directory+        bool is_regular = true; -        // include only if not excluded-        if (is_selected)+        const zstreambuf::ZipInfo *zipinfo = zstream->zipinfo();++        if (zipinfo != NULL)         {-          // include files whose basename matches any one of the --include globs-          for (auto& glob : flag_all_include)-            if ((is_selected = glob_match(path, basename, glob.c_str())))-              break;-        }-      }--      // -M: check magic bytes, requires sufficiently large len of buf[] to match patterns, which is fine when Z_BUF_LEN is large e.g. 64K-      if (buf != NULL && !flag_file_magic.empty() && (flag_all_include.empty() || !is_selected))-      {-        // create a matcher to match the magic pattern, we cannot use magic_matcher because it is not thread safe-        reflex::Matcher magic(magic_pattern);-        magic.buffer(const_cast<char*>(reinterpret_cast<const char*>(buf)), len + 1);-        size_t match = magic.scan();-        is_selected = match == flag_not_magic || match >= flag_min_magic;-      }-    }--    return is_selected;-  }--#endif-#endif-  -  // close the file and clear input, return true if next file is extracted from an archive to search-  bool close_file(const char *pathname)-  {-    (void)pathname; // appease -Wunused-parameter--#ifdef HAVE_LIBZ--#ifdef WITH_DECOMPRESSION_THREAD+          // extracting a zip file+          extracting = true; -    if (flag_decompress && pipe_fd[0] != -1)-    {-      // close the FILE* and its underlying pipe created with pipe() and fdopen()-      if (input.file() != NULL)-        fclose(input.file());+          if (!zipinfo->name.empty() && zipinfo->name.back() == '/')+          {+            // skip zip directories+            is_regular = false;+          }+          else+          {+            path.assign(zipinfo->name); -      // our end of the pipe is now closed-      pipe_fd[0] = -1;+            // produce headers with zip file pathnames for each archived part (Grep::partname)+            if (!flag_no_filename)+              flag_no_header = false;+          }+        } -      // if extracting and the decompression filter thread is not yet waiting, then wait until the other end closed the pipe-      std::unique_lock<std::mutex> lock(pipe_mutex);-      if (!waiting)-        pipe_close.wait(lock);-      lock.unlock();+        // decompress a block of data into the buffer+        std::streamsize len = zstream->decompress(buf, maxlen);+        if (len < 0)+          break; -      // extract the next file from the archive when applicable, e.g. zip format-      if (extracting)-      {-        // output is not blocked or cancelled-        if (!out.eof && !out.cancelled())+        if (!filter_tar(*zstream, path, buf, maxlen, len) && !filter_cpio(*zstream, path, buf, maxlen, len))         {-          FILE *pipe_in = NULL;--          // open pipe between worker and decompression thread, then start decompression thread-          if (pipe(pipe_fd) == 0 && (pipe_in = fdopen(pipe_fd[0], "r")) != NULL)+          // not a tar/cpio file, decompress the data into pipe, if not unzipping or if zipped file meets selection criteria+          bool is_selected = is_regular && (zipinfo == NULL || select_matching(path.c_str(), buf, static_cast<size_t>(len), true));+          if (is_selected)           {-            // notify the decompression filter thread of the new pipe-            pipe_ready.notify_one();+            // if pipe is closed, then reopen it+            if (pipe_fd[1] == -1)+            {+              // signal close and wait until the main grep thread created a new pipe in close_file()+              std::unique_lock<std::mutex> lock(pipe_mutex);+              pipe_close.notify_one();+              waiting = true;+              pipe_ready.wait(lock);+              waiting = false;+              lock.unlock(); -            input = reflex::Input(pipe_in, flag_encoding_type);+              // failed to create a pipe in close_file()+              if (pipe_fd[1] == -1)+                break;+            } -            // loop back in search() to start searching the next file in the archive-            return true;+            // assign the Grep::partname (synchronized on pipe_mutex and pipe), before sending to the (new) pipe+            partname.swap(path);           } -          // failed to create a new pipe-          if (pipe_fd[0] != -1)+          // push decompressed data into pipe+          while (len > 0)           {-            warning("cannot open pipe while reading", pathname);+            // write buffer data to the pipe, if the pipe is broken then the receiver is waiting for this thread to join+            if (is_selected && write(pipe_fd[1], buf, static_cast<size_t>(len)) < len)+              break; -            close(pipe_fd[0]);-            close(pipe_fd[1]);+            // decompress the next block of data into the buffer+            len = zstream->decompress(buf, maxlen);           }         } -        pipe_fd[0] = -1;-        pipe_fd[1] = -1;+        // break if not unzipping or if no more files to unzip+        if (zstream->zipinfo() == NULL)+          break; -        // notify the decompression thread filter_tar/filter_cpio-        pipe_ready.notify_one();-      }-    }+        // extracting a zip file+        extracting = true; -#endif+        // close our end of the pipe+        close(pipe_fd[1]);+        pipe_fd[1] = -1;+      } -    if (stream != NULL)-    {-      delete stream;-      stream = NULL;-    }+      extracting = false; -#endif+      if (pipe_fd[1] >= 0)+      {+        close(pipe_fd[1]);+        pipe_fd[1] = -1;+      } -    // close the file-    if (file != NULL && file != stdin && file != source)-    {-      fclose(file);-      file = NULL;+      // wait until a new zstream is ready (zstream is NULL to terminate the thread)+      std::unique_lock<std::mutex> lock(pipe_mutex);+      pipe_close.notify_one();+      waiting = true;+      pipe_zstrm.wait(lock);+      waiting = false;+      lock.unlock();     }--    input.clear();--    return false;   } -  // specify input to read for matcher, when input is a regular file then try mmap for zero copy overhead-  void read_file()+  // if tar file, extract regular file contents and push into pipes one by one, return true when done+  bool filter_tar(zstreambuf& zstream, const std::string& partprefix, unsigned char *buf, size_t maxlen, std::streamsize len)   {-    const char *base;-    size_t size;+    const int BLOCKSIZE = 512; -    // attempt to mmap the input file-    if (mmap.file(input, base, size))-    {-      // matcher reads directly from protected mmap memory (cast is safe: base[0..size] is not modified!)-      matcher->buffer(const_cast<char*>(base), size + 1);-    }-    else+    if (len > BLOCKSIZE)     {-      matcher->input(input);--#ifdef HAVE_BOOST_REGEX-      // buffer all input to work around Boost.Regex bug, this may throw std::bad_alloc if the file is too large-      if (flag_perl_regexp)-        matcher->buffer();-#endif-    }--    // --range=NUM1[,NUM2]: start searching at line NUM1-    for (size_t i = flag_min_line; i > 1; --i)-      if (!matcher->skip('\n'))-        break;-  }--  std::string              partname;   // the name of an extracted file from an archive-  Output                   out;        // buffered and synchronized output-  reflex::AbstractMatcher *matcher;    // the pattern matcher we're using-  MMap                     mmap;       // mmap state-  reflex::Input            input;      // input to the matcher-  FILE                    *file;       // the current input file-#ifdef HAVE_LIBZ-  zstreambuf              *zstream;    // the decompressed stream from the current input file-  std::istream            *stream;     // input stream layered on the decompressed stream-#ifdef WITH_DECOMPRESSION_THREAD-  std::thread              thread;     // decompression thread-  int                      pipe_fd[2]; // decompressed stream pipe-  std::mutex               pipe_mutex; // mutex to extract files in thread-  std::condition_variable  pipe_zstrm; // cv to control new pipe creation-  std::condition_variable  pipe_ready; // cv to control new pipe creation-  std::condition_variable  pipe_close; // cv to control new pipe creation-  volatile bool            extracting; // true if extracting files from TAR-  volatile bool            waiting;    // true if decompression thread is waiting-#endif-#endif--};--// a job in the job queue-struct Job {+      // v7 and ustar formats+      const char ustar_magic[8] = { 'u', 's', 't', 'a', 'r', 0, '0', '0' }; -  // sentinel job NONE-  static const size_t NONE = UNDEFINED_SIZE;+      // gnu and oldgnu formats+      const char gnutar_magic[8] = { 'u', 's', 't', 'a', 'r', ' ', ' ', 0 }; -  Job()-    :-      pathname(),-      slot(NONE)-  { }+      // is this a tar archive?+      if (*buf != '\0' && (memcmp(buf + 257, ustar_magic, 8) == 0 || memcmp(buf + 257, gnutar_magic, 8) == 0))+      {+        // produce headers with tar file pathnames for each archived part (Grep::partname)+        if (!flag_no_filename)+          flag_no_header = false; -  Job(const char *pathname, size_t slot)-    :-      pathname(pathname),-      slot(slot)-  { }+        // inform the main grep thread we are extracing an archive+        extracting = true; -  bool none()-  {-    return slot == NONE;-  }+        // to hold the path (prefix + name) extracted from the header+        std::string path; -  std::string pathname;-  size_t      slot;-};+        // to hold long path extracted from the previous header block that is marked with typeflag 'x' or 'L'+        std::string long_path; -struct GrepWorker;+        while (true)+        {+          // extract tar header fields (name and prefix strings are not \0-terminated!!)+          const char *name = reinterpret_cast<const char*>(buf);+          const char *prefix = reinterpret_cast<const char*>(buf + 345);+          size_t size = strtoul(reinterpret_cast<const char*>(buf + 124), NULL, 8);+          int padding = (BLOCKSIZE - size % BLOCKSIZE) % BLOCKSIZE;+          unsigned char typeflag = buf[156]; -// master submits jobs to workers and implements operations to support lock-free job stealing-struct GrepMaster : public Grep {+          // header types+          bool is_regular = typeflag == '0' || typeflag == '\0';+          bool is_xhd = typeflag == 'x';+          bool is_extended = typeflag == 'L'; -  GrepMaster(FILE *file, reflex::AbstractMatcher *matcher)-    :-      Grep(file, matcher),-      sync(flag_sort_key == Sort::NA ? Output::Sync::Mode::UNORDERED : Output::Sync::Mode::ORDERED)-  {-    // master and workers synchronize their output-    out.sync_on(&sync);+          // assign the (long) tar pathname+          path.clear();+          if (long_path.empty())+          {+            if (*prefix != '\0')+            {+              if (prefix[154] == '\0')+                path.assign(prefix);+              else+                path.assign(prefix, 155);+              path.push_back('/');+            }+            if (name[99] == '\0')+              path.append(name);+            else+              path.append(name, 100);+          }+          else+          {+            path.swap(long_path);+          } -    // set global handle to be able to call cancel_ugrep()-    set_grep_handle(this);+          // remove header to advance to the body+          len -= BLOCKSIZE;+          memmove(buf, buf + BLOCKSIZE, static_cast<size_t>(len)); -    start_workers();+          // check if archived file meets selection criteria+          size_t minlen = std::min(static_cast<size_t>(len), size);+          bool is_selected = select_matching(path.c_str(), buf, minlen, is_regular); -    iworker = workers.begin();-  }+          // if extended headers are present+          if (is_xhd)+          {+            // typeflag 'x': extract the long path from the pax extended header block in the body+            const char *b = reinterpret_cast<const char*>(buf);+            const char *e = b + minlen;+            const char *t = "path=";+            const char *s = std::search(b, e, t, t + 5);+            if (s != NULL)+            {+              e = static_cast<const char*>(memchr(s, '\n', e - s));+              if (e != NULL)+                long_path.assign(s + 5, e - s - 5);+            }+          }+          else if (is_extended)+          {+            // typeflag 'L': get long name from the body+            long_path.assign(reinterpret_cast<const char*>(buf), minlen);+          } -  virtual ~GrepMaster()-  {-    stop_workers();-    clear_grep_handle();-  }+          // if the pipe is closed, then get a new pipe to search the next part in the archive+          if (is_selected && pipe_fd[1] == -1)+          {+            // signal close and wait until the main grep thread created a new pipe in close_file()+            std::unique_lock<std::mutex> lock(pipe_mutex);+            pipe_close.notify_one();+            waiting = true;+            pipe_ready.wait(lock);+            waiting = false;+            lock.unlock(); -  // search a file by submitting it as a job to a worker-  void search(const char *pathname) override-  {-    submit(pathname);-  }+            // failed to create a pipe in close_file()+            if (pipe_fd[1] == -1)+              break;+          } -  // start worker threads-  void start_workers();+          // assign the Grep::partname (synchronized on pipe_mutex and pipe), before sending to the (new) pipe+          if (is_selected)+          {+            if (!partprefix.empty())+              partname.assign(partprefix).append(":").append(path);+            else+              partname.swap(path);+          } -  // stop all workers-  void stop_workers();+          // it is ok to push the body into the pipe for the main thread to search+          bool ok = is_selected; -  // cancel search and terminate workers-  void cancel();+          while (len > 0)+          {+            size_t len_out = std::min(static_cast<size_t>(len), size); -  // submit a job with a pathname to a worker, workers are visited round-robin-  void submit(const char *pathname);+            if (ok)+            {+              // write decompressed data to the pipe, if the pipe is broken then stop pushing more data into this pipe+              if (write(pipe_fd[1], buf, len_out) < static_cast<ssize_t>(len_out))+                ok = false;+            } -  // lock-free job stealing on behalf of a worker from a co-worker with at least --min-steal jobs still to do-  bool steal(GrepWorker *worker);+            size -= len_out; -  std::list<GrepWorker>           workers;   // workers running threads-  std::list<GrepWorker>::iterator iworker;   // the next worker to submit a job to-  Output::Sync                    sync;      // sync output of workers+            // reached the end of the tar body?+            if (size == 0)+            {+              len -= len_out;+              memmove(buf, buf + len_out, static_cast<size_t>(len)); -};+              break;+            } -// worker runs a thread to execute jobs submitted by the master-struct GrepWorker : public Grep {+            // decompress the next block of data into the buffer+            len = zstream.decompress(buf, maxlen);+          } -  GrepWorker(FILE *file, reflex::AbstractMatcher *matcher, GrepMaster *master)-    :-      Grep(file, matcher->clone()),-      master(master),-      todo(0)-  {-    // all workers synchronize their output on the master's sync object-    out.sync_on(&master->sync);+          // error?+          if (len < 0)+            break; -    // run worker thread executing jobs assigned in its queue-    thread = std::thread(&GrepWorker::execute, this);-  }+          // fill the rest of the buffer with decompressed data+          if (static_cast<size_t>(len) < maxlen)+          {+            std::streamsize len_in = zstream.decompress(buf + len, maxlen - static_cast<size_t>(len)); -  virtual ~GrepWorker()-  {-    // delete the cloned matcher-    delete matcher;-  }+            // error?+            if (len_in < 0)+              break; -  // worker thread execution-  void execute();+            len += len_in;+          } -  // submit Job::NONE sentinel to this worker-  void submit_job()-  {-    std::unique_lock<std::mutex> lock(queue_mutex);+          // skip padding+          if (len > padding)+          {+            len -= padding;+            memmove(buf, buf + padding, static_cast<size_t>(len));+          } -    jobs.emplace_back();-    ++todo;+          // rest of the file is too short, something is wrong+          if (len <= BLOCKSIZE)+            break; -    queue_work.notify_one();-  }+          // no more parts to extract?+          if (*buf == '\0' || (memcmp(buf + 257, ustar_magic, 8) != 0 && memcmp(buf + 257, gnutar_magic, 8) != 0))+            break; -  // submit a job to this worker-  void submit_job(const char *pathname, size_t slot)-  {-    std::unique_lock<std::mutex> lock(queue_mutex);+          // get a new pipe to search the next part in the archive, if the previous part was a regular file+          if (is_selected)+          {+            // close our end of the pipe+            close(pipe_fd[1]);+            pipe_fd[1] = -1;+          }+        } -    jobs.emplace_back(pathname, slot);-    ++todo;+        // done extracting the tar file+        return true;+      }+    } -    queue_work.notify_one();+    // not a tar file+    return false;   } -  // move a stolen job to this worker, maintaining job slot order-  void move_job(Job& job)+  // if cpio file, extract regular file contents and push into pipes one by one, return true when done+  bool filter_cpio(zstreambuf& zstream, const std::string& partprefix, unsigned char *buf, size_t maxlen, std::streamsize len)   {-    std::unique_lock<std::mutex> lock(queue_mutex);--    bool inserted = false;+    const int HEADERSIZE = 110; -    // insert job in the queue to maintain job order-    for (std::deque<Job>::iterator j = jobs.begin(); j != jobs.end(); ++j)+    if (len > HEADERSIZE)     {-      if (j->slot > job.slot)-      {-        jobs.insert(j, std::move(job));-        inserted = true;-        break;-      }-    }+      // odc format+      const char odc_magic[6] = { '0', '7', '0', '7', '0', '7' }; -    if (!inserted)-      jobs.emplace_back(std::move(job));+      // newc format+      const char newc_magic[6] = { '0', '7', '0', '7', '0', '1' }; -    ++todo;+      // newc+crc format+      const char newc_crc_magic[6] = { '0', '7', '0', '7', '0', '2' }; -    queue_work.notify_one();-  }+      // is this a cpio archive?+      if (memcmp(buf, odc_magic, 6) == 0 || memcmp(buf, newc_magic, 6) == 0 || memcmp(buf, newc_crc_magic, 6) == 0)+      {+        // produce headers with cpio file pathnames for each archived part (Grep::partname)+        if (!flag_no_filename)+          flag_no_header = false; -  // receive a job for this worker, wait until one arrives-  void next_job(Job& job)-  {-    std::unique_lock<std::mutex> lock(queue_mutex);+        // inform the main grep thread we are extracing an archive+        extracting = true; -    while (jobs.empty())-      queue_work.wait(lock);+        // to hold the path (prefix + name) extracted from the header+        std::string path; -    job = jobs.front();+        // need a new pipe, close current pipe first to create a new pipe+        bool in_progress = false; -    jobs.pop_front();-    --todo;+        while (true)+        {+          // true if odc, false if newc+          bool is_odc = buf[5] == '7'; -    // if we popped a Job::NONE sentinel but the queue has some jobs, then move the sentinel to the back of the queue-    if (job.none() && !jobs.empty())-    {-      jobs.emplace_back();-      job = jobs.front();-      jobs.pop_front();-    }-  }+          int header_len = is_odc ? 76 : 110; -  // steal a job from this worker, if at least --min-steal jobs to do, returns true if successful-  bool steal_job(Job& job)-  {-    // not enough jobs in the queue to steal from-    if (todo < flag_min_steal)-      return false;+          char tmp[16];+          char *rest; -    std::unique_lock<std::mutex> lock(queue_mutex);+          // get the namesize+          size_t namesize;+          if (is_odc)+          {+            memcpy(tmp, buf + 59, 6);+            tmp[6] = '\0';+            namesize = strtoul(tmp, &rest, 8);+          }+          else+          {+            memcpy(tmp, buf + 94, 8);+            tmp[8] = '\0';+            namesize = strtoul(tmp, &rest, 16);+          } -    if (jobs.empty())-      return false;+          // if not a valid mode value, then something is wrong+          if (rest == NULL || *rest != '\0')+          {+            // data was read, stop reading more+            if (in_progress)+              break; -    job = jobs.front();+            // assume this is not a cpio file and return false+            return false;+          } -    // we cannot steal a Job::NONE sentinel-    if (job.none())-      return false;+          // pathnames with trailing \0 cannot be empty or too large+          if (namesize <= 1 || namesize >= 65536)+            break; -    jobs.pop_front();-    --todo;+          // get the filesize+          size_t filesize;+          if (is_odc)+          {+            memcpy(tmp, buf + 65, 11);+            tmp[11] = '\0';+            filesize = strtoul(tmp, &rest, 8);+          }+          else+          {+            memcpy(tmp, buf + 54, 8);+            tmp[8] = '\0';+            filesize = strtoul(tmp, &rest, 16);+          } -    return true;-  }+          // if not a valid mode value, then something is wrong+          if (rest == NULL || *rest != '\0')+          {+            // data was read, stop reading more+            if (in_progress)+              break; -  // submit Job::NONE sentinel to stop this worker-  void stop()-  {-    submit_job();-  }+            // assume this is not a cpio file and return false+            return false;+          } -  std::thread             thread;      // thread of this worker, spawns GrepWorker::execute()-  GrepMaster             *master;      // the master of this worker-  std::mutex              queue_mutex; // job queue mutex-  std::condition_variable queue_work;  // cv to control the job queue-  std::deque<Job>         jobs;        // queue of pending jobs submitted to this worker-  std::atomic_size_t      todo;        // number of jobs in the queue, atomic for lock-free job stealing+          // true if this is a regular file when (mode & 0170000) == 0100000+          bool is_regular;+          if (is_odc)+          {+            memcpy(tmp, buf + 18, 6);+            tmp[6] = '\0';+            is_regular = (strtoul(tmp, &rest, 8) & 0170000) == 0100000;+          }+          else+          {+            memcpy(tmp, buf + 14, 8);+            tmp[8] = '\0';+            is_regular = (strtoul(tmp, &rest, 16) & 0170000) == 0100000;+          } -};+          // if not a valid mode value, then something is wrong+          if (rest == NULL || *rest != '\0')+          {+            // data was read, stop reading more+            if (in_progress)+              break; -// start worker threads-void GrepMaster::start_workers()-{-  size_t num;+            // assume this is not a cpio file and return false+            return false;+          } -  // create worker threads-  try-  {-    for (num = 0; num < threads; ++num)-      workers.emplace(workers.end(), out.file, matcher, this);-  }+          // remove header to advance to the body+          len -= header_len;+          memmove(buf, buf + header_len, static_cast<size_t>(len)); -  // if sufficient resources are not available then reduce the number of threads to the number of active workers created-  catch (std::system_error& error)-  {-    if (error.code() != std::errc::resource_unavailable_try_again)-      throw;+          // assign the cpio pathname+          path.clear(); -    threads = num;-  }-}+          size_t size = namesize; -// stop all workers-void GrepMaster::stop_workers()-{-  // submit Job::NONE sentinel to workers-  for (auto& worker : workers)-    worker.stop();+          while (len > 0)+          {+            size_t n = std::min(static_cast<size_t>(len), size);+            char *b = reinterpret_cast<char*>(buf); -  // wait for workers to join-  for (auto& worker : workers)-    worker.thread.join();-}+            path.append(b, n);+            size -= n; -// submit a job with a pathname to a worker, workers are visited round-robin-void GrepMaster::submit(const char *pathname)-{-  iworker->submit_job(pathname, sync.next++);+            if (size == 0)+            {+              // remove pathname to advance to the body+              len -= n;+              memmove(buf, buf + n, static_cast<size_t>(len)); -  // around we go-  ++iworker;-  if (iworker == workers.end())-    iworker = workers.begin();-}+              break;+            } -// lock-free job stealing on behalf of a worker from a co-worker with at least --min-steal jobs still to do-bool GrepMaster::steal(GrepWorker *worker)-{-  // pick a random co-worker using thread-safe std::chrono::high_resolution_clock as a simple RNG-  size_t n = std::chrono::duration_cast<std::chrono::nanoseconds>(std::chrono::high_resolution_clock::now().time_since_epoch()).count() % threads;-  std::list<GrepWorker>::iterator iworker = workers.begin();+            // decompress the next block of data into the buffer+            len = zstream.decompress(buf, maxlen);+          } -  while (n > 0)-  {-    ++iworker;-    --n;-  }+          // error?+          if (len < 0)+            break; -  // try to steal a job from the random co-worker or the next co-workers-  for (size_t i = 0; i < threads; ++i)-  {-    // around we go-    if (iworker == workers.end())-      iworker = workers.begin();+          // remove trailing \0+          if (path.back() == '\0')+            path.pop_back(); -    // if co-worker isn't this worker (no self-stealing!)-    if (&*iworker != worker)-    {-      Job job;+          // reached the end of the cpio archive?+          if (path == "TRAILER!!!")+            break; -      // if co-worker has at least --min-steal jobs then steal one for this worker-      if (iworker->steal_job(job))-      {-        worker->move_job(job);+          // fill the rest of the buffer with decompressed data+          if (static_cast<size_t>(len) < maxlen)+          {+            std::streamsize len_in = zstream.decompress(buf + len, maxlen - static_cast<size_t>(len)); -        return true;-      }-    }+            // error?+            if (len_in < 0)+              break; -    // try next co-worker-    ++iworker;-  }+            len += len_in;+          } -  // couldn't steal any job-  return false;-}+          // skip newc format \0 padding after the pathname+          if (!is_odc && len > 3)+          {+            size_t n = 4 - (110 + namesize) % 4;+            len -= n;+            memmove(buf, buf + n, static_cast<size_t>(len));+          } -// execute worker thread-void GrepWorker::execute()-{-  Job job;+          // check if archived file meets selection criteria+          size_t minlen = std::min(static_cast<size_t>(len), filesize);+          bool is_selected = select_matching(path.c_str(), buf, minlen, is_regular); -  while (!out.eof && !out.cancelled())-  {-    // wait for next job-    next_job(job);+          // if the pipe is closed, then get a new pipe to search the next part in the archive+          if (is_selected && pipe_fd[1] == -1)+          {+            // signal close and wait until the main grep thread created a new pipe in close_file()+            std::unique_lock<std::mutex> lock(pipe_mutex);+            pipe_close.notify_one();+            waiting = true;+            pipe_ready.wait(lock);+            waiting = false;+            lock.unlock(); -    // worker should stop?-    if (job.none())-      break;+            // failed to create a pipe in close_file()+            if (pipe_fd[1] == -1)+              break;+          } -    // start synchronizing output for this job slot in ORDERED mode (--sort)-    out.begin(job.slot);+          // assign the Grep::partname (synchronized on pipe_mutex and pipe), before sending to the (new) pipe+          if (is_selected)+          {+            if (!partprefix.empty())+              partname.assign(partprefix).append(":").append(path);+            else+              partname.swap(path);+          }++          // it is ok to push the body into the pipe for the main thread to search+          bool ok = is_selected;++          size = filesize;++          while (len > 0)+          {+            size_t len_out = std::min(static_cast<size_t>(len), size);++            if (ok)+            {+              // write decompressed data to the pipe, if the pipe is broken then stop pushing more data into this pipe+              if (write(pipe_fd[1], buf, len_out) < static_cast<ssize_t>(len_out))+                ok = false;+            }++            size -= len_out;++            // reached the end of the cpio body?+            if (size == 0)+            {+              len -= len_out;+              memmove(buf, buf + len_out, static_cast<size_t>(len));++              break;+            }++            // decompress the next block of data into the buffer+            len = zstream.decompress(buf, maxlen);+          }++          // error?+          if (len < 0)+            break;++          if (static_cast<size_t>(len) < maxlen)+          {+            // fill the rest of the buffer with decompressed data+            std::streamsize len_in = zstream.decompress(buf + len, maxlen - static_cast<size_t>(len));++            // error?+            if (len_in < 0)+              break;++            len += len_in;+          }++          // skip newc format \0 padding+          if (!is_odc && len > 2)+          {+            size_t n = (4 - filesize % 4) % 4;+            len -= n;+            memmove(buf, buf + n, static_cast<size_t>(len));+          }++          // rest of the file is too short, something is wrong+          if (len <= HEADERSIZE)+            break;++          // quit if this is not valid cpio header magic+          if (memcmp(buf, odc_magic, 6) != 0 && memcmp(buf, newc_magic, 6) != 0 && memcmp(buf, newc_crc_magic, 6) != 0)+            break;++          // get a new pipe to search the next part in the archive, if the previous part was a regular file+          if (is_selected)+          {+            // close our end of the pipe+            close(pipe_fd[1]);+            pipe_fd[1] = -1;++            in_progress = true;+          }+        }++        // done extracting the cpio file+        return true;+      }+    }++    // not a cpio file+    return false;+  }++  // true if path matches search constraints or buf contains magic bytes+  bool select_matching(const char *path, const unsigned char *buf, size_t len, bool is_regular)+  {+    bool is_selected = is_regular;++    if (is_selected)+    {+      const char *basename = strrchr(path, '/');+      if (basename == NULL)+        basename = path;+      else+        ++basename;++      if (*basename == '.' && !flag_hidden)+        return false;++      // -O, -t, and -g (--include and --exclude): check if pathname or basename matches globs, is_selected = false if not+      if (!flag_all_exclude.empty() || !flag_all_include.empty())+      {+        // exclude files whose basename matches any one of the --exclude globs+        for (auto& glob : flag_all_exclude)+          if (!(is_selected = !glob_match(path, basename, glob.c_str())))+            break;++        // include only if not excluded+        if (is_selected)+        {+          // include files whose basename matches any one of the --include globs+          for (auto& glob : flag_all_include)+            if ((is_selected = glob_match(path, basename, glob.c_str())))+              break;+        }+      }++      // -M: check magic bytes, requires sufficiently large len of buf[] to match patterns, which is fine when Z_BUF_LEN is large e.g. 64K+      if (buf != NULL && !flag_file_magic.empty() && (flag_all_include.empty() || !is_selected))+      {+        // create a matcher to match the magic pattern, we cannot use magic_matcher because it is not thread safe+        reflex::Matcher magic(magic_pattern);+        magic.buffer(const_cast<char*>(reinterpret_cast<const char*>(buf)), len + 1);+        size_t match = magic.scan();+        is_selected = match == flag_not_magic || match >= flag_min_magic;+      }+    }++    return is_selected;+  }++#endif+#endif+  +  // close the file and clear input, return true if next file is extracted from an archive to search+  bool close_file(const char *pathname)+  {+    (void)pathname; // appease -Wunused-parameter++#ifdef HAVE_LIBZ++#ifdef WITH_DECOMPRESSION_THREAD++    if (flag_decompress && pipe_fd[0] != -1)+    {+      // close the FILE* and its underlying pipe created with pipe() and fdopen()+      if (input.file() != NULL)+        fclose(input.file());++      // our end of the pipe is now closed+      pipe_fd[0] = -1;++      // if extracting and the decompression filter thread is not yet waiting, then wait until the other end closed the pipe+      std::unique_lock<std::mutex> lock(pipe_mutex);+      if (!waiting)+        pipe_close.wait(lock);+      lock.unlock();++      // extract the next file from the archive when applicable, e.g. zip format+      if (extracting)+      {+        // output is not blocked or cancelled+        if (!out.eof && !out.cancelled())+        {+          FILE *pipe_in = NULL;++          // open pipe between worker and decompression thread, then start decompression thread+          if (pipe(pipe_fd) == 0 && (pipe_in = fdopen(pipe_fd[0], "r")) != NULL)+          {+            // notify the decompression filter thread of the new pipe+            pipe_ready.notify_one();++            input = reflex::Input(pipe_in, flag_encoding_type);++            // loop back in search() to start searching the next file in the archive+            return true;+          }++          // failed to create a new pipe+          if (pipe_fd[0] != -1)+          {+            warning("cannot open pipe while reading", pathname);++            close(pipe_fd[0]);+            close(pipe_fd[1]);+          }+        }++        pipe_fd[0] = -1;+        pipe_fd[1] = -1;++        // notify the decompression thread filter_tar/filter_cpio+        pipe_ready.notify_one();+      }+    }++#endif++    if (stream != NULL)+    {+      delete stream;+      stream = NULL;+    }++#endif++    // close the file+    if (file != NULL && file != stdin && file != source)+    {+      fclose(file);+      file = NULL;+    }++    input.clear();++    return false;+  }++  // specify input to read for matcher, when input is a regular file then try mmap for zero copy overhead+  bool init_read()+  {+    const char *base;+    size_t size;++    // attempt to mmap the input file+    if (mmap.file(input, base, size))+    {+      // matcher reads directly from protected mmap memory (cast is safe: base[0..size] is not modified!)+      matcher->buffer(const_cast<char*>(base), size + 1);+    }+    else+    {+      matcher->input(input);++#ifdef HAVE_BOOST_REGEX+      // buffer all input to work around Boost.Regex bug, this may throw std::bad_alloc if the file is too large+      if (flag_perl_regexp)+        matcher->buffer();+#endif+    }++    // -I: do not match binary+    if (flag_binary_without_match)+    {+      const char *eol = matcher->eol(); // warning: call eol() before bol()+      const char *bol = matcher->bol();+      if (is_binary(bol, eol - bol))+        return false;+    }++    // --range=NUM1[,NUM2]: start searching at line NUM1+    for (size_t i = flag_min_line; i > 1; --i)+      if (!matcher->skip('\n'))+        break;++    return true;+  }++  const char              *filename;   // the name of the file being searched+  std::string              partname;   // the name of an extracted file from an archive+  Output                   out;        // buffered and synchronized output+  reflex::AbstractMatcher *matcher;    // the pattern matcher we're using+  MMap                     mmap;       // mmap state+  reflex::Input            input;      // input to the matcher+  FILE                    *file;       // the current input file+#ifdef HAVE_LIBZ+  zstreambuf              *zstream;    // the decompressed stream from the current input file+  std::istream            *stream;     // input stream layered on the decompressed stream+#ifdef WITH_DECOMPRESSION_THREAD+  std::thread              thread;     // decompression thread+  int                      pipe_fd[2]; // decompressed stream pipe+  std::mutex               pipe_mutex; // mutex to extract files in thread+  std::condition_variable  pipe_zstrm; // cv to control new pipe creation+  std::condition_variable  pipe_ready; // cv to control new pipe creation+  std::condition_variable  pipe_close; // cv to control new pipe creation+  volatile bool            extracting; // true if extracting files from TAR+  volatile bool            waiting;    // true if decompression thread is waiting+#endif+#endif++};++// a job in the job queue+struct Job {++  // sentinel job NONE+  static const size_t NONE = UNDEFINED_SIZE;++  Job()+    :+      pathname(),+      slot(NONE)+  { }++  Job(const char *pathname, size_t slot)+    :+      pathname(pathname),+      slot(slot)+  { }++  bool none()+  {+    return slot == NONE;+  }++  std::string pathname;+  size_t      slot;+};++struct GrepWorker;++// master submits jobs to workers and implements operations to support lock-free job stealing+struct GrepMaster : public Grep {++  GrepMaster(FILE *file, reflex::AbstractMatcher *matcher)+    :+      Grep(file, matcher),+      sync(flag_sort_key == Sort::NA ? Output::Sync::Mode::UNORDERED : Output::Sync::Mode::ORDERED)+  {+    // master and workers synchronize their output+    out.sync_on(&sync);++    // set global handle to be able to call cancel_ugrep()+    set_grep_handle(this);++    start_workers();++    iworker = workers.begin();+  }++  virtual ~GrepMaster()+  {+    stop_workers();+    clear_grep_handle();+  }++  // search a file by submitting it as a job to a worker+  void search(const char *pathname) override+  {+    submit(pathname);+  }++  // start worker threads+  void start_workers();++  // stop all workers+  void stop_workers();++  // cancel search and terminate workers+  void cancel();++  // submit a job with a pathname to a worker, workers are visited round-robin+  void submit(const char *pathname);++  // lock-free job stealing on behalf of a worker from a co-worker with at least --min-steal jobs still to do+  bool steal(GrepWorker *worker);++  std::list<GrepWorker>           workers;   // workers running threads+  std::list<GrepWorker>::iterator iworker;   // the next worker to submit a job to+  Output::Sync                    sync;      // sync output of workers++};++// worker runs a thread to execute jobs submitted by the master+struct GrepWorker : public Grep {++  GrepWorker(FILE *file, reflex::AbstractMatcher *matcher, GrepMaster *master)+    :+      Grep(file, matcher->clone()),+      master(master),+      todo(0)+  {+    // all workers synchronize their output on the master's sync object+    out.sync_on(&master->sync);++    // run worker thread executing jobs assigned in its queue+    thread = std::thread(&GrepWorker::execute, this);+  }++  virtual ~GrepWorker()+  {+    // delete the cloned matcher+    delete matcher;+  }++  // worker thread execution+  void execute();++  // submit Job::NONE sentinel to this worker+  void submit_job()+  {+    std::unique_lock<std::mutex> lock(queue_mutex);++    jobs.emplace_back();+    ++todo;++    queue_work.notify_one();+  }++  // submit a job to this worker+  void submit_job(const char *pathname, size_t slot)+  {+    std::unique_lock<std::mutex> lock(queue_mutex);++    jobs.emplace_back(pathname, slot);+    ++todo;++    queue_work.notify_one();+  }++  // move a stolen job to this worker, maintaining job slot order+  void move_job(Job& job)+  {+    std::unique_lock<std::mutex> lock(queue_mutex);++    bool inserted = false;++    // insert job in the queue to maintain job order+    for (std::deque<Job>::iterator j = jobs.begin(); j != jobs.end(); ++j)+    {+      if (j->slot > job.slot)+      {+        jobs.insert(j, std::move(job));+        inserted = true;+        break;+      }+    }++    if (!inserted)+      jobs.emplace_back(std::move(job));++    ++todo;++    queue_work.notify_one();+  }++  // receive a job for this worker, wait until one arrives+  void next_job(Job& job)+  {+    std::unique_lock<std::mutex> lock(queue_mutex);++    while (jobs.empty())+      queue_work.wait(lock);++    job = jobs.front();++    jobs.pop_front();+    --todo;++    // if we popped a Job::NONE sentinel but the queue has some jobs, then move the sentinel to the back of the queue+    if (job.none() && !jobs.empty())+    {+      jobs.emplace_back();+      job = jobs.front();+      jobs.pop_front();+    }+  }++  // steal a job from this worker, if at least --min-steal jobs to do, returns true if successful+  bool steal_job(Job& job)+  {+    // not enough jobs in the queue to steal from+    if (todo < flag_min_steal)+      return false;++    std::unique_lock<std::mutex> lock(queue_mutex);++    if (jobs.empty())+      return false;++    job = jobs.front();++    // we cannot steal a Job::NONE sentinel+    if (job.none())+      return false;++    jobs.pop_front();+    --todo;++    return true;+  }++  // submit Job::NONE sentinel to stop this worker+  void stop()+  {+    submit_job();+  }++  std::thread             thread;      // thread of this worker, spawns GrepWorker::execute()+  GrepMaster             *master;      // the master of this worker+  std::mutex              queue_mutex; // job queue mutex+  std::condition_variable queue_work;  // cv to control the job queue+  std::deque<Job>         jobs;        // queue of pending jobs submitted to this worker+  std::atomic_size_t      todo;        // number of jobs in the queue, atomic for lock-free job stealing++};++// start worker threads+void GrepMaster::start_workers()+{+  size_t num;++  // create worker threads+  try+  {+    for (num = 0; num < threads; ++num)+      workers.emplace(workers.end(), out.file, matcher, this);+  }++  // if sufficient resources are not available then reduce the number of threads to the number of active workers created+  catch (std::system_error& error)+  {+    if (error.code() != std::errc::resource_unavailable_try_again)+      throw;++    threads = num;+  }+}++// stop all workers+void GrepMaster::stop_workers()+{+  // submit Job::NONE sentinel to workers+  for (auto& worker : workers)+    worker.stop();++  // wait for workers to join+  for (auto& worker : workers)+    worker.thread.join();+}++// submit a job with a pathname to a worker, workers are visited round-robin+void GrepMaster::submit(const char *pathname)+{+  iworker->submit_job(pathname, sync.next++);++  // around we go+  ++iworker;+  if (iworker == workers.end())+    iworker = workers.begin();+}++// lock-free job stealing on behalf of a worker from a co-worker with at least --min-steal jobs still to do+bool GrepMaster::steal(GrepWorker *worker)+{+  // pick a random co-worker using thread-safe std::chrono::high_resolution_clock as a simple RNG+  size_t n = std::chrono::duration_cast<std::chrono::nanoseconds>(std::chrono::high_resolution_clock::now().time_since_epoch()).count() % threads;+  std::list<GrepWorker>::iterator iworker = workers.begin();++  while (n > 0)+  {+    ++iworker;+    --n;+  }++  // try to steal a job from the random co-worker or the next co-workers+  for (size_t i = 0; i < threads; ++i)+  {+    // around we go+    if (iworker == workers.end())+      iworker = workers.begin();++    // if co-worker isn't this worker (no self-stealing!)+    if (&*iworker != worker)+    {+      Job job;++      // if co-worker has at least --min-steal jobs then steal one for this worker+      if (iworker->steal_job(job))+      {+        worker->move_job(job);++        return true;+      }+    }++    // try next co-worker+    ++iworker;+  }++  // couldn't steal any job+  return false;+}++// execute worker thread+void GrepWorker::execute()+{+  Job job;++  while (!out.eof && !out.cancelled())+  {+    // wait for next job+    next_job(job);++    // worker should stop?+    if (job.none())+      break;++    // start synchronizing output for this job slot in ORDERED mode (--sort)+    out.begin(job.slot);      // search the file for this job     search(job.pathname.c_str());@@ -2516,8 +3342,10 @@ void options(int argc, const char **argv)                   flag_after_context = strtopos(arg + 14, "invalid argument --after-context=");                 else if (strcmp(arg, "any-line") == 0)                   flag_any_line = true;+                else if (strcmp(arg, "after-context") == 0)+                  help("missing argument for --", arg);                 else-                  help("invalid option --", arg);+                  help("invalid option --", arg, "--after-context or --any-line");                 break;                case 'b':@@ -2533,8 +3361,10 @@ void options(int argc, const char **argv)                   flag_break = true;                 else if (strcmp(arg, "byte-offset") == 0)                   flag_byte_offset = true;+                else if (strcmp(arg, "before-context") == 0 || strcmp(arg, "binary-files") == 0)+                  help("missing argument for --", arg);                 else-                  help("invalid option --", arg);+                  help("invalid option --", arg, "--basic-regexp, --before-context, --binary, --binary-files, --break or --byte-offset");                 break;                case 'c':@@ -2552,18 +3382,20 @@ void options(int argc, const char **argv)                   flag_column_number = true;                 else if (strcmp(arg, "confirm") == 0)                   flag_no_confirm = false;-                else if (strncmp(arg, "context=", 8) == 0)-                  flag_after_context = flag_before_context = strtopos(arg + 8, "invalid argument --context=");                 else if (strcmp(arg, "context") == 0)                   flag_after_context = flag_before_context = 2;+                else if (strncmp(arg, "context=", 8) == 0)+                  flag_after_context = flag_before_context = strtopos(arg + 8, "invalid argument --context=");                 else if (strcmp(arg, "count") == 0)                   flag_count = true;                 else if (strcmp(arg, "cpp") == 0)                   flag_cpp = true;                 else if (strcmp(arg, "csv") == 0)                   flag_csv = true;+                else if (strcmp(arg, "colors") == 0 || strcmp(arg, "colours") == 0)+                  help("missing argument for --", arg);                 else-                  help("invalid option --", arg);+                  help("invalid option --", arg, "--color, --colors, --column-number, --confirm, --context, --count, --cpp or --csv");                 break;                case 'd':@@ -2579,8 +3411,10 @@ void options(int argc, const char **argv)                   flag_devices = arg + 8;                 else if (strncmp(arg, "directories=", 12) == 0)                   flag_directories = arg + 12;+                else if (strcmp(arg, "depth") == 0)+                  help("missing argument for --", arg);                 else-                  help("invalid option --", arg);+                  help("invalid option --", arg, "--decompress, --depth, --dereference, --dereference-recursive, --devices or --directories");                 break;                case 'e':@@ -2598,8 +3432,14 @@ void options(int argc, const char **argv)                   flag_exclude_fs.emplace_back(arg + 11);                 else if (strcmp(arg, "extended-regexp") == 0)                   flag_basic_regexp = false;+                else if (strcmp(arg, "encoding") == 0 ||+                    strcmp(arg, "exclude") == 0 ||+                    strcmp(arg, "exclude-dir") == 0 ||+                    strcmp(arg, "exclude-from") == 0 ||+                    strcmp(arg, "exclude-fs") == 0)+                  help("missing argument for --", arg);                 else-                  help("invalid option --", arg);+                  help("invalid option --", arg, "--empty, --encoding, --exclude, --exclude-dir, --exclude-from, --exclude-fs or --extended-regexp");                 break;                case 'f':@@ -2637,8 +3477,20 @@ void options(int argc, const char **argv)                   flag_fuzzy = strtofuzzy(arg + 6, "invalid argument --fuzzy=");                 else if (strcmp(arg, "free-space") == 0)                   flag_free_space = true;+                else if (strcmp(arg, "file") == 0 ||+                    strcmp(arg, "file-extension") == 0 ||+                    strcmp(arg, "file-magic") == 0 ||+                    strcmp(arg, "file-type") == 0 ||+                    strcmp(arg, "filter") == 0 ||+                    strcmp(arg, "filter-magic-label") == 0 ||+                    strcmp(arg, "format") == 0 ||+                    strcmp(arg, "format-begin") == 0 ||+                    strcmp(arg, "format-close") == 0 ||+                    strcmp(arg, "format-end") == 0 ||+                    strcmp(arg, "format-open") == 0)+                  help("missing argument for --", arg);                 else-                  help("invalid option --", arg);+                  help("invalid option --", arg, "--file, --file-extension, --file-magic, --file-type, --files-with-matches, --files-without-match, --fixed-strings, --filter, --filter-magic-label, --format, --format-begin, --format-close, --format-end, --format-open, --fuzzy or --free-space");                 break;                case 'g':@@ -2648,8 +3500,10 @@ void options(int argc, const char **argv)                   flag_group_separator = arg + 16;                 else if (strcmp(arg, "group-separator") == 0)                   flag_group_separator = "--";+                else if (strcmp(arg, "glob") == 0)+                  help("missing argument for --", arg);                 else-                  help("invalid option --", arg);+                  help("invalid option --", arg, "--glob or --group-separator");                 break;                case 'h':@@ -2659,21 +3513,23 @@ void options(int argc, const char **argv)                   help();                 else if (strcmp(arg, "hex") == 0)                   flag_binary_files = "hex";+                else if (strcmp(arg, "hexdump") == 0)+                  flag_hexdump = "2";                 else if (strncmp(arg, "hexdump=", 8) == 0)                   flag_hexdump = arg + 8;                 else if (strcmp(arg, "hidden") == 0)                   flag_hidden = true;                 else-                  help("invalid option --", arg);+                  help("invalid option --", arg, "--heading, --help, --hex, --hexdump or --hidden");                 break;                case 'i':                 if (strcmp(arg, "ignore-case") == 0)                   flag_ignore_case = true;-                else if (strncmp(arg, "ignore-files=", 13) == 0)-                  flag_ignore_files.emplace_back(arg + 13);                 else if (strcmp(arg, "ignore-files") == 0)                   flag_ignore_files.emplace_back(DEFAULT_IGNORE_FILE);+                else if (strncmp(arg, "ignore-files=", 13) == 0)+                  flag_ignore_files.emplace_back(arg + 13);                 else if (strncmp(arg, "include=", 8) == 0)                   flag_include.emplace_back(arg + 8);                 else if (strncmp(arg, "include-dir=", 12) == 0)@@ -2686,8 +3542,13 @@ void options(int argc, const char **argv)                   flag_initial_tab = true;                 else if (strcmp(arg, "invert-match") == 0)                   flag_invert_match = true;+                else if (strcmp(arg, "include") == 0 ||+                    strcmp(arg, "include-dir") == 0 ||+                    strcmp(arg, "include-from") == 0 ||+                    strcmp(arg, "include-fs") == 0)+                  help("missing argument for --", arg);                 else-                  help("invalid option --", arg);+                  help("invalid option --", arg, "--ignore-case, --ignore-files, --include, --include-dir, --include-from, --include-fs, --initial-tab or --invert-match");                 break;                case 'j':@@ -2695,8 +3556,10 @@ void options(int argc, const char **argv)                   flag_jobs = strtonum(arg + 4, "invalid argument --jobs=");                 else if (strcmp(arg, "json") == 0)                   flag_json = true;+                else if (strcmp(arg, "jobs") == 0)+                  help("missing argument for --", arg);                 else-                  help("invalid option --", arg);+                  help("invalid option --", arg, "--jobs or --json");                 break;                case 'l':@@ -2709,7 +3572,7 @@ void options(int argc, const char **argv)                 else if (strcmp(arg, "line-regexp") == 0)                   flag_line_regexp = true;                 else-                  help("invalid option --", arg);+                  help("invalid option --", arg, "--label, --line-buffered, --line-number or --line-regexp");                 break;                case 'm':@@ -2725,13 +3588,17 @@ void options(int argc, const char **argv)                   flag_max_mmap = MAX_MMAP_SIZE;                 else if (strncmp(arg, "mmap=", 5) == 0)                   flag_max_mmap = strtopos(arg + 5, "invalid argument --mmap=");+                else if (strcmp(arg, "max-count") == 0 || strcmp(arg, "max-files") == 0)+                  help("missing argument for --", arg);                 else-                  help("invalid option --", arg);+                  help("invalid option --", arg, "--match, --max-count, --max-files or --mmap");                 break;                case 'n':                 if (strncmp(arg, "neg-regexp=", 11) == 0)                   flag_neg_regexp.emplace_back(arg + 11);+                else if (strcmp(arg, "no-color") == 0 || strcmp(arg, "no-colour") == 0)+                  flag_color = "never";                 else if (strcmp(arg, "no-confirm") == 0)                   flag_no_confirm = true;                 else if (strcmp(arg, "no-dereference") == 0)@@ -2754,8 +3621,10 @@ void options(int argc, const char **argv)                   flag_pretty = false;                 else if (strcmp(arg, "null") == 0)                   flag_null = true;+                else if (strcmp(arg, "neg-regexp") == 0)+                  help("missing argument for --", arg);                 else-                  help("invalid option --", arg);+                  help("invalid option --", arg, "--neg-regexp, --no-color, --no-confirm, --no-dereference, --no-filename, --no-group-separator, --no-heading, --no-hidden, --no-messages, --no-mmap, --no-pager, --no-pretty or --null");                 break;                case 'o':@@ -2764,7 +3633,7 @@ void options(int argc, const char **argv)                 else if (strcmp(arg, "only-matching") == 0)                   flag_only_matching = true;                 else-                  help("invalid option --", arg);+                  help("invalid option --", arg, "--only-line-number or --only-matching");                 break;                case 'p':@@ -2777,7 +3646,7 @@ void options(int argc, const char **argv)                 else if (strcmp(arg, "pretty") == 0)                   flag_pretty = true;                 else-                  help("invalid option --", arg);+                  help("invalid option --", arg, "--pager, --perl-regexp or --pretty");                 break;                case 'q':@@ -2785,10 +3654,10 @@ void options(int argc, const char **argv)                   flag_query = DEFAULT_QUERY_DELAY;                 else if (strncmp(arg, "query=", 6) == 0)                   flag_query = strtopos(arg + 6, "invalid argument --query=");-                else if (strcmp(arg, "quiet") == 0 || strcmp(arg, "silent") == 0)+                else if (strcmp(arg, "quiet") == 0)                   flag_quiet = flag_no_messages = true;                 else-                  help("invalid option --", arg);+                  help("invalid option --", arg, "--query or --quiet");                 break;                case 'r':@@ -2798,8 +3667,10 @@ void options(int argc, const char **argv)                   flag_directories = "recurse";                 else if (strncmp(arg, "regexp=", 7) == 0)                   flag_regexp.emplace_back(arg + 7);+                else if (strcmp(arg, "range") == 0)+                  help("missing argument for --", arg);                 else-                  help("invalid option --", arg);+                  help("invalid option --", arg, "--range, --recursive or --regexp");                 break;                case 's':@@ -2807,6 +3678,8 @@ void options(int argc, const char **argv)                   flag_separator = ":";                 else if (strncmp(arg, "separator=", 10) == 0)                   flag_separator = arg + 10;+                else if (strcmp(arg, "silent") == 0)+                  flag_quiet = flag_no_messages = true;                 else if (strcmp(arg, "smart-case") == 0)                   flag_smart_case = true;                 else if (strcmp(arg, "sort") == 0)@@ -2818,11 +3691,13 @@ void options(int argc, const char **argv)                 else if (strncmp(arg, "stats=", 6) == 0)                   flag_stats = arg + 6;                 else-                  help("invalid option --", arg);+                  help("invalid option --", arg, "--separator, --silent, --smart-case, --sort or --stats");                 break;                case 't':-                if (strncmp(arg, "tabs=", 5) == 0)+                if (strcmp(arg, "tabs") == 0)+                  flag_tabs = DEFAULT_TABS;+                else if (strncmp(arg, "tabs=", 5) == 0)                   flag_tabs = strtopos(arg + 5, "invalid argument --tabs=");                 else if (strcmp(arg, "tag") == 0)                   flag_tag = DEFAULT_TAG;@@ -2831,21 +3706,21 @@ void options(int argc, const char **argv)                 else if (strcmp(arg, "text") == 0)                   flag_binary_files = "text";                 else-                  help("invalid option --", arg);+                  help("invalid option --", arg, "--tabs, --tag or --text");                 break;                case 'u':                 if (strcmp(arg, "ungroup") == 0)                   flag_ungroup = true;                 else-                  help("invalid option --", arg);+                  help("invalid option --", arg, "--ungroup");                 break;                case 'v':                 if (strcmp(arg, "version") == 0)                   version();                 else-                  help("invalid option --", arg);+                  help("invalid option --", arg, "--version");                 break;                case 'w':@@ -2856,14 +3731,14 @@ void options(int argc, const char **argv)                 else if (strcmp(arg, "word-regexp") == 0)                   flag_word_regexp = true;                 else-                  help("invalid option --", arg);+                  help("invalid option --", arg, "--with-filename, --with-hex or --word-regexp");                 break;                case 'x':                 if (strcmp(arg, "xml") == 0)                   flag_xml = true;                 else-                  help("invalid option --", arg);+                  help("invalid option --", arg, "--xml");                 break;                default:@@ -3231,14 +4106,18 @@ void options(int argc, const char **argv)               help("invalid argument -", arg);             break; -          case '.':-            flag_hidden = true;+          case '?':+            help();             break;            case '+':             flag_heading = true;             break; +          case '.':+            flag_hidden = true;+            break;+           default:             help("invalid option -", arg);         }@@ -3365,7 +4244,7 @@ void options(int argc, const char **argv)    // if no regex pattern is specified and no -f file and not -Q, then exit with usage message   if (arg_pattern == NULL && flag_regexp.empty() && flag_file.empty() && flag_query == 0)-    help("no PATTERN specified: use --match or an empty \"\" pattern to match all input");+    help("no PATTERN specified: specify an empty \"\" pattern to match all input");    // regex PATTERN should be a FILE argument when -Q or -e PATTERN is specified   if (arg_pattern != NULL && (flag_query > 0 || !flag_regexp.empty()))@@ -3538,146 +4417,509 @@ void options(int argc, const char **argv)         size_t to = mounts.find(',', from);         size_t size = (to == std::string::npos ? mounts.size() : to) - from; -        if (size > 0)-        {-          std::string mount(mounts.substr(from, size));+        if (size > 0)+        {+          std::string mount(mounts.substr(from, size));++          if (statvfs(mount.c_str(), &buf) == 0)+            include_fs_ids.insert(static_cast<uint64_t>(buf.f_fsid));+          else+            warning("--include-fs", mount.c_str());+        }++        if (to == std::string::npos)+          break;++        from = to + 1;+      }+    }+  }++#endif++  // --exclude-from: add globs to the exclude and exclude-dir lists+  for (auto& from : flag_exclude_from)+  {+    if (!from.empty())+    {+      FILE *file = NULL;++      if (from == "-")+        file = stdin;+      else if (fopen_s(&file, from.c_str(), "r") != 0)+        error("cannot read", from.c_str());++      extend(file, flag_exclude, flag_exclude_dir, flag_not_exclude, flag_not_exclude_dir);++      if (file != stdin)+        fclose(file);+    }+  }++  // --include-from: add globs to the include and include-dir lists+  for (auto& from : flag_include_from)+  {+    if (!from.empty())+    {+      FILE *file = NULL;++      if (from == "-")+        file = stdin;+      else if (fopen_s(&file, from.c_str(), "r") != 0)+        error("cannot read", from.c_str());++      extend(file, flag_include, flag_include_dir, flag_not_include, flag_not_include_dir);++      if (file != stdin)+        fclose(file);+    }+  }++  // -t: parse TYPES and access type table to add -O (--file-extension) and -M (--file-magic) values+  for (auto& types : flag_file_type)+  {+    size_t from = 0;++    while (true)+    {+      size_t to = types.find(',', from);+      size_t size = (to == std::string::npos ? types.size() : to) - from;++      if (size > 0)+      {+        bool negate = size > 1 && (types[from] == '!' || types[from] == '^');++        if (negate)+        {+          ++from;+          --size;+        }++        std::string type(types.substr(from, size));++        size_t i;++        // scan the type_table[] for a matching type+        for (i = 0; type_table[i].type != NULL; ++i)+          if (type == type_table[i].type)+            break;++        if (type_table[i].type == NULL)+        {+          std::string msg = "invalid argument -t TYPES, valid arguments are";++          for (int i = 0; type_table[i].type != NULL; ++i)+            msg.append(" '").append(type_table[i].type).append("',");+          msg.append(" and 'list' to show a detailed list of file types");++          help(msg.c_str());+        }++        std::string extensions(type_table[i].extensions);++        if (negate)+        {+          extensions.insert(0, "!");+          size_t j = 0;+          while ((j = extensions.find(',', j)) != std::string::npos)+            extensions.insert(++j, "!");+        }++        flag_file_extension.emplace_back(extensions);++        if (type_table[i].magic != NULL)+        {+          flag_file_magic.emplace_back(type_table[i].magic);++          if (negate)+            flag_file_magic.back().insert(0, "!");+        }+      }++      if (to == std::string::npos)+        break;++      from = to + 1;+    }+  }++  // -O: add filename extensions as globs+  for (auto& extensions : flag_file_extension)+  {+    size_t from = 0;+    std::string glob;++    while (true)+    {+      size_t to = extensions.find(',', from);+      size_t size = (to == std::string::npos ? extensions.size() : to) - from;++      if (size > 0)+      {+        bool negate = size > 1 && (extensions[from] == '!' || extensions[from] == '^');++        if (negate)+        {+          ++from;+          --size;+        }++        flag_glob.emplace_back(glob.assign(negate ? "^*." : "*.").append(extensions.substr(from, size)));+      }++      if (to == std::string::npos)+        break;++      from = to + 1;+    }+  }++  // -M: file "magic bytes" regex string+  std::string magic_regex;++  // -M !MAGIC: combine to create a regex string+  for (auto& magic : flag_file_magic)+  {+    if (magic.size() > 1 && (magic.front() == '!' || magic.front() == '^'))+    {+      if (!magic_regex.empty())+        magic_regex.push_back('|');+      magic_regex.append(magic.substr(1));++      // tally negative MAGIC patterns+      ++flag_min_magic;+    }+  }++  // -M MAGIC: append to regex string+  for (auto& magic : flag_file_magic)+  {+    if (magic.size() <= 1 || (magic.front() != '!' && magic.front() != '^'))+    {+      if (!magic_regex.empty())+        magic_regex.push_back('|');+      magic_regex.append(magic);++      // we have positive MAGIC patterns, so scan() is a match when flag_min_magic or greater+      flag_not_magic = flag_min_magic;+    }+  }++  // -M: create a magic matcher for the MAGIC regex to match file with magic.scan()+  try+  {+    // construct magic_pattern DFA for -M !MAGIC and -M MAGIC+    if (!magic_regex.empty())+      magic_pattern.assign(magic_regex, "r");+    magic_matcher.pattern(magic_pattern);+  }++  catch (reflex::regex_error& error)+  {+    abort("option -M: ", error.what());+  }++  // --filter-magic-label: construct filter_magic_pattern and map "magic bytes" to labels+  magic_regex = "(";++  // --filter-magic-label: append pattern to magic_labels, parenthesized to ensure capture indexing+  for (auto& label : flag_filter_magic_label)+  {+    size_t sep = label.find(':');++    if (sep != std::string::npos && sep > 0 && sep + 1 < label.size())+    {+      if (!label.empty() && magic_regex.size() > 1)+        magic_regex.append(")|(");+      magic_regex.append(label.substr(sep + 1));++      // truncate so we end up with a list of labels without patterns+      label.resize(sep);+    }+    else+    {+      abort("option --filter-magic-label: invalid LABEL:MAGIC argument ", label);+    }+  }++  magic_regex.push_back(')');++  // --filter-magic-label: create a filter_magic_pattern+  try+  {+    // construct filter_magic_pattern DFA+    if (magic_regex.size() > 2)+      filter_magic_pattern.assign(magic_regex, "r");+  }++  catch (reflex::regex_error& error)+  {+    abort("option --filter-magic-label: ", error.what());+  }+}++// check TTY info and set colors+void terminal()+{+  if (flag_query > 0)+  {+    // -Q: disable --quiet+    flag_quiet = false;+  }+  else if (!flag_quiet)+  {+    // is output sent to a color TTY, to a pager, or to /dev/null?++    // check if standard output is a TTY+    tty_term = isatty(STDOUT_FILENO) != 0; -          if (statvfs(mount.c_str(), &buf) == 0)-            include_fs_ids.insert(static_cast<uint64_t>(buf.f_fsid));-          else-            warning("--include-fs", mount.c_str());-        }+#ifndef OS_WIN -        if (to == std::string::npos)-          break;+    if (!tty_term)+    {+      output_stat_result = fstat(STDOUT_FILENO, &output_stat) == 0;+      output_stat_regular = output_stat_result && S_ISREG(output_stat.st_mode); -        from = to + 1;+      // if output is sent to /dev/null, then enable -q (i.e. "cheat" like GNU grep!)+      struct stat dev_null_stat;+      if (output_stat_result &&+          S_ISCHR(output_stat.st_mode) &&+          stat("/dev/null", &dev_null_stat) == 0 &&+          output_stat.st_dev == dev_null_stat.st_dev &&+          output_stat.st_ino == dev_null_stat.st_ino)+      {+        flag_quiet = true;       }     }-  }  #endif+  } -  // --exclude-from: add globs to the exclude and exclude-dir lists-  for (auto& from : flag_exclude_from)+  // whether to apply colors+  flag_apply_color = flag_tag != NULL ? "never" : flag_query > 0 ? "always" : flag_color;++  if (!flag_quiet)   {-    if (!from.empty())+    if (tty_term || flag_query > 0)     {-      FILE *file = NULL;+      if (flag_pretty)+      {+        // --pretty: if output is to a TTY then enable --color and --heading -      if (from == "-")-        file = stdin;-      else if (fopen_s(&file, from.c_str(), "r") != 0)-        error("cannot read", from.c_str());+        // enable --color+        if (flag_apply_color == NULL)+          flag_apply_color = "auto"; -      extend(file, flag_exclude, flag_exclude_dir, flag_not_exclude, flag_not_exclude_dir);+        // enable --heading (enables --break later)+        flag_heading = true; -      if (file != stdin)-        fclose(file);-    }-  }+        // enable -T (initial tab)+        flag_initial_tab = true;+      }+      else if (flag_apply_color != NULL)+      {+        // --colors: if output is to a TTY then enable --color and use the specified --colors -  // --include-from: add globs to the include and include-dir lists-  for (auto& from : flag_include_from)-  {-    if (!from.empty())-    {-      FILE *file = NULL;+        // enable --color+        if (flag_apply_color == NULL)+          flag_apply_color = "auto";+      } -      if (from == "-")-        file = stdin;-      else if (fopen_s(&file, from.c_str(), "r") != 0)-        error("cannot read", from.c_str());+      if (flag_query > 0)+      {+        // --query: run the interactive query UI -      extend(file, flag_include, flag_include_dir, flag_not_include, flag_not_include_dir);+        // enable --heading+        flag_heading = true; -      if (file != stdin)-        fclose(file);-    }-  }+        // enable --line-buffered to flush output immediately+        flag_line_buffered = true;+      }+      else if (flag_pager != NULL)+      {+        // --pager: if output is to a TTY then page through the results -  // -t: parse TYPES and access type table to add -O (--file-extension) and -M (--file-magic) values-  for (auto& types : flag_file_type)-  {-    size_t from = 0;+        // open a pipe to a forked pager+        output = popen(flag_pager, "w");+        if (output == NULL)+          error("cannot open pipe to pager", flag_pager); -    while (true)+        // enable --heading+        flag_heading = true;++        // enable --line-buffered to flush output to the pager immediately+        flag_line_buffered = true;+      }+    }++    // --color: (re)set flag_apply_color depending on color_term and TTY output+    if (flag_apply_color != NULL)     {-      size_t to = types.find(',', from);-      size_t size = (to == std::string::npos ? types.size() : to) - from;+      color_term = flag_query > 0; -      if (size > 0)+      if (strcmp(flag_apply_color, "never") == 0)       {-        bool negate = size > 1 && (types[from] == '!' || types[from] == '^');+        flag_apply_color = NULL;+      }+      else+      {+#ifdef OS_WIN -        if (negate)+        if (tty_term || flag_query > 0)         {-          ++from;-          --size;+#ifdef ENABLE_VIRTUAL_TERMINAL_PROCESSING+          // assume we have a color terminal on Windows if isatty() is true+          HANDLE hConOut = GetStdHandle(STD_OUTPUT_HANDLE);+          if (hConOut != INVALID_HANDLE_VALUE)+          {+#ifdef CP_UTF8+            // enable UTF-8 output+            SetConsoleOutputCP(CP_UTF8);+#endif+            // try virtual terminal processing for ANSI SGR codes, enable colors when successful+            DWORD outMode;+            GetConsoleMode(hConOut, &outMode);+            outMode |= ENABLE_VIRTUAL_TERMINAL_PROCESSING;+            color_term = SetConsoleMode(hConOut, outMode) != 0;+          }+#endif         } -        std::string type(types.substr(from, size));+#else -        size_t i;+        // check whether we have a color terminal+        if (tty_term)+        {+          const char *term = getenv("TERM");+          if (term &&+              (strstr(term, "ansi") != NULL ||+               strstr(term, "xterm") != NULL ||+               strstr(term, "color") != NULL))+            color_term = true;+        } -        // scan the type_table[] for a matching type-        for (i = 0; type_table[i].type != NULL; ++i)-          if (type == type_table[i].type)-            break;+#endif -        if (type_table[i].type == NULL)+        if (strcmp(flag_apply_color, "auto") == 0)         {-          std::string msg = "invalid argument -t TYPES, valid arguments are";+          if (!color_term)+            flag_apply_color = NULL;+        }+        else if (strcmp(flag_apply_color, "always") != 0)+        {+          help("invalid argument --color=WHEN, valid arguments are 'never', 'always', and 'auto'");+        } -          for (int i = 0; type_table[i].type != NULL; ++i)-            msg.append(" '").append(type_table[i].type).append("',");-          msg.append(" and 'list' to show a detailed list of file types");+        if (flag_apply_color != NULL)+        {+          // get GREP_COLOR and GREP_COLORS, when defined+          char *env_grep_color = NULL;+          dupenv_s(&env_grep_color, "GREP_COLOR");+          char *env_grep_colors = NULL;+          dupenv_s(&env_grep_colors, "GREP_COLORS");+          const char *grep_colors = env_grep_colors; -          help(msg.c_str());-        }+          // if GREP_COLOR is defined, use it to set mt= default value (overridden by GREP_COLORS mt=, ms=, mc=)+          if (env_grep_color != NULL)+            set_color(std::string("mt=").append(env_grep_color).c_str(), "mt", color_mt);+          else if (grep_colors == NULL)+            grep_colors = DEFAULT_GREP_COLORS; -        std::string extensions(type_table[i].extensions);+          // parse GREP_COLORS+          set_color(grep_colors, "sl", color_sl); // selected line+          set_color(grep_colors, "cx", color_cx); // context line+          set_color(grep_colors, "mt", color_mt); // matched text in any line+          set_color(grep_colors, "ms", color_ms); // matched text in selected line+          set_color(grep_colors, "mc", color_mc); // matched text in a context line+          set_color(grep_colors, "fn", color_fn); // file name+          set_color(grep_colors, "ln", color_ln); // line number+          set_color(grep_colors, "cn", color_cn); // column number+          set_color(grep_colors, "bn", color_bn); // byte offset+          set_color(grep_colors, "se", color_se); // separator -        if (negate)-        {-          extensions.insert(0, "!");-          size_t j = 0;-          while ((j = extensions.find(',', j)) != std::string::npos)-            extensions.insert(++j, "!");-        }+          // parse --colors+          set_color(flag_colors, "sl", color_sl); // selected line+          set_color(flag_colors, "cx", color_cx); // context line+          set_color(flag_colors, "mt", color_mt); // matched text in any line+          set_color(flag_colors, "ms", color_ms); // matched text in selected line+          set_color(flag_colors, "mc", color_mc); // matched text in a context line+          set_color(flag_colors, "fn", color_fn); // file name+          set_color(flag_colors, "ln", color_ln); // line number+          set_color(flag_colors, "cn", color_cn); // column number+          set_color(flag_colors, "bn", color_bn); // byte offset+          set_color(flag_colors, "se", color_se); // separator -        flag_file_extension.emplace_back(extensions);+          // -v: if rv in GREP_COLORS then swap the sl and cx colors+          if (flag_invert_match &&+              ((grep_colors != NULL && strstr(grep_colors, "rv") != NULL) ||+               (flag_colors != NULL && strstr(flag_colors, "rv") != NULL)))+          {+            char color_tmp[COLORLEN];+            copy_color(color_tmp, color_sl);+            copy_color(color_sl, color_cx);+            copy_color(color_cx, color_tmp);+          } -        if (type_table[i].magic != NULL)-        {-          flag_file_magic.emplace_back(type_table[i].magic);+          // if ms= is not specified, use the mt= value+          if (*color_ms == '\0')+            copy_color(color_ms, color_mt); -          if (negate)-            flag_file_magic.back().insert(0, "!");+          // if mc= is not specified, use the mt= value+          if (*color_mc == '\0')+            copy_color(color_mc, color_mt);++          color_off = "\033[m";+          color_del = "\033[K";++          copy_color(match_off, color_off);++          if (isatty(STDERR_FILENO))+          {+            color_high    = "\033[1m";+            color_error   = "\033[1;31m";+            color_warning = "\033[1;35m";+            color_message = "\033[1;36m";+          }++          if (env_grep_color != NULL)+            free(env_grep_color);+          if (env_grep_colors != NULL)+            free(env_grep_colors);         }       }--      if (to == std::string::npos)-        break;--      from = to + 1;     }   }+} -  // -O: add filename extensions as globs-  for (auto& extensions : flag_file_extension)+// search the specified files, directories, and/or standard input for pattern matches+void ugrep()+{+  // reset warnings+  warnings = 0;++  // reset stats+  Stats::reset();++  // populate the combined all-include and all-exclude+  flag_all_include = flag_include;+  flag_all_include_dir = flag_include_dir;+  flag_all_exclude = flag_exclude;+  flag_all_exclude_dir = flag_exclude_dir;++  // -g, --glob: add globs to all-include/all-exclude+  for (auto& globs : flag_glob)   {     size_t from = 0;     std::string glob;      while (true)     {-      size_t to = extensions.find(',', from);-      size_t size = (to == std::string::npos ? extensions.size() : to) - from;+      size_t to = globs.find(',', from);+      size_t size = (to == std::string::npos ? globs.size() : to) - from;        if (size > 0)       {-        bool negate = size > 1 && (extensions[from] == '!' || extensions[from] == '^');+        bool negate = size > 1 && (globs[from] == '!' || globs[from] == '^');          if (negate)         {@@ -3685,7 +4927,7 @@ void options(int argc, const char **argv)           --size;         } -        flag_glob.emplace_back(glob.assign(negate ? "^*." : "*.").append(extensions.substr(from, size)));+        (negate ? flag_all_exclude : flag_all_include).emplace_back(globs.substr(from, size));       }        if (to == std::string::npos)@@ -3695,2266 +4937,2495 @@ void options(int argc, const char **argv)     }   } -  // -M: file "magic bytes" regex string-  std::string magic_regex;--  // -M !MAGIC: combine to create a regex string-  for (auto& magic : flag_file_magic)+  // all excluded files: normalize by moving directory globs (globs ending in a path separator /) to --exclude-dir+  auto i = flag_all_exclude.begin();+  while (i != flag_all_exclude.end())   {-    if (magic.size() > 1 && (magic.front() == '!' || magic.front() == '^'))+    if (i->empty())     {-      if (!magic_regex.empty())-        magic_regex.push_back('|');-      magic_regex.append(magic.substr(1));--      // tally negative MAGIC patterns-      ++flag_min_magic;+      i = flag_all_exclude.erase(i);+    }+    else if (i->back() == '/')+    {+      flag_all_exclude_dir.emplace_back(*i);+      i = flag_all_exclude.erase(i);+    }+    else+    {+      ++i;     }   } -  // -M MAGIC: append to regex string-  for (auto& magic : flag_file_magic)+  // all included files: normalize by moving directory globs (globs ending in a path separator /) to --include-dir+  i = flag_all_include.begin();+  while (i != flag_all_include.end())   {-    if (magic.size() <= 1 || (magic.front() != '!' && magic.front() != '^'))+    if (i->empty())     {-      if (!magic_regex.empty())-        magic_regex.push_back('|');-      magic_regex.append(magic);--      // we have positive MAGIC patterns, so scan() is a match when flag_min_magic or greater-      flag_not_magic = flag_min_magic;+      i = flag_all_include.erase(i);+    }+    else if (i->back() == '/')+    {+      flag_all_include_dir.emplace_back(*i);+      i = flag_all_include.erase(i);+    }+    else+    {+      ++i;     }   } -  // -M: create a magic matcher for the MAGIC regex to match file with magic.scan()-  try+#ifdef HAVE_LIBZ+#ifdef WITH_DECOMPRESSION_THREAD+  // -z with -M or -O/--include: add globs to search archive contents+  if (flag_decompress && (!flag_file_magic.empty() || !flag_all_include.empty()))   {-    // construct magic_pattern DFA for -M !MAGIC and -M MAGIC-    if (!magic_regex.empty())-      magic_pattern.assign(magic_regex, "r");-    magic_matcher.pattern(magic_pattern);+    flag_all_include.emplace_back("*.cpio");+    flag_all_include.emplace_back("*.pax");+    flag_all_include.emplace_back("*.tar");+    flag_all_include.emplace_back("*.zip");+    flag_all_include.emplace_back("*.ZIP");++    flag_all_include.emplace_back("*.cpio.gz");+    flag_all_include.emplace_back("*.pax.gz");+    flag_all_include.emplace_back("*.tar.gz");+    flag_all_include.emplace_back("*.taz");+    flag_all_include.emplace_back("*.tgz");+    flag_all_include.emplace_back("*.tpz");++    flag_all_include.emplace_back("*.cpio.Z");+    flag_all_include.emplace_back("*.pax.Z");+    flag_all_include.emplace_back("*.tar.Z");++    flag_all_include.emplace_back("*.cpio.zip");+    flag_all_include.emplace_back("*.pax.zip");+    flag_all_include.emplace_back("*.tar.zip");++#ifdef HAVE_LIBBZ2+    flag_all_include.emplace_back("*.cpio.bz");+    flag_all_include.emplace_back("*.pax.bz");+    flag_all_include.emplace_back("*.tar.bz");+    flag_all_include.emplace_back("*.cpio.bz2");+    flag_all_include.emplace_back("*.pax.bz2");+    flag_all_include.emplace_back("*.tar.bz2");+    flag_all_include.emplace_back("*.cpio.bzip2");+    flag_all_include.emplace_back("*.pax.bzip2");+    flag_all_include.emplace_back("*.tar.bzip2");+    flag_all_include.emplace_back("*.tb2");+    flag_all_include.emplace_back("*.tbz");+    flag_all_include.emplace_back("*.tbz2");+    flag_all_include.emplace_back("*.tz2");+#endif++#ifdef HAVE_LIBLZMA+    flag_all_include.emplace_back("*.cpio.lzma");+    flag_all_include.emplace_back("*.pax.lzma");+    flag_all_include.emplace_back("*.tar.lzma");+    flag_all_include.emplace_back("*.cpio.xz");+    flag_all_include.emplace_back("*.pax.xz");+    flag_all_include.emplace_back("*.tar.xz");+    flag_all_include.emplace_back("*.tlz");+    flag_all_include.emplace_back("*.txz");+#endif   }+#endif+#endif -  catch (reflex::regex_error& error)+  // all excluded-dirs: normalize by removing trailing path separators+  for (auto& i : flag_all_exclude_dir)+    while (i.size() > 1 && i.back() == '/')+      i.pop_back();++  // all included-dirs: normalize by removing trailing path separators+  for (auto& i : flag_all_include_dir)+    while (i.size() > 1 && i.back() == '/')+      i.pop_back();++  // --sort: check sort KEY and set flags+  if (flag_sort != NULL)   {-    abort("option -M: ", error.what());+    flag_sort_rev = *flag_sort == 'r';++    if (strcmp(flag_sort, "name") == 0 || strcmp(flag_sort, "rname") == 0)+      flag_sort_key = Sort::NAME;+    else if (strcmp(flag_sort, "best") == 0 || strcmp(flag_sort, "rbest") == 0)+      flag_sort_key = Sort::BEST;+    else if (strcmp(flag_sort, "size") == 0 || strcmp(flag_sort, "rsize") == 0)+      flag_sort_key = Sort::SIZE;+    else if (strcmp(flag_sort, "used") == 0 || strcmp(flag_sort, "rused") == 0)+      flag_sort_key = Sort::USED;+    else if (strcmp(flag_sort, "changed") == 0 || strcmp(flag_sort, "rchanged") == 0)+      flag_sort_key = Sort::CHANGED;+    else if (strcmp(flag_sort, "created") == 0 || strcmp(flag_sort, "rcreated") == 0)+      flag_sort_key = Sort::CREATED;+    else+      help("invalid argument --sort=KEY, valid arguments are 'name', 'best', 'size', 'used', 'changed', 'created', 'rname', 'rbest', 'rsize', 'rused', 'rchanged', and 'rcreated'");   } -  // --filter-magic-label: construct filter_magic_pattern and map "magic bytes" to labels-  magic_regex = "(";+  // -x: enable -Y+  if (flag_line_regexp)+    flag_empty = true; -  // --filter-magic-label: append pattern to magic_labels, parenthesized to ensure capture indexing-  for (auto& label : flag_filter_magic_label)+  // the regex compiled from PATTERN, -e PATTERN, -N PATTERN, and -f FILE+  std::string regex;++  // -F: make newline-separated lines in regex literal with \Q and \E+  const char *Q = flag_fixed_strings ? "\\Q" : "";+  const char *E = flag_fixed_strings ? "\\E|" : "|";++  // either one PATTERN or one or more -e PATTERN (cannot specify both)+  std::vector<std::string> arg_patterns;+  if (arg_pattern != NULL)+    arg_patterns.emplace_back(arg_pattern);+  std::vector<std::string>& patterns = arg_pattern != NULL ? arg_patterns : flag_regexp;++  // combine all -e PATTERN into a single regex string for matching+  for (auto& pattern : patterns)   {-    size_t sep = label.find(':');+    // empty PATTERN matches everything+    if (pattern.empty())+    {+      // pattern ".*\n?|" could be used throughout without flag_empty = true, but this garbles output for -o, -H, -n, etc.+      if (flag_line_regexp)+      {+        regex.append("^$|");+      }+      else if (flag_hex)+      {+        regex.append(".*\n?|");++        // we're matching everything+        flag_match = true;+      }+      else+      {+        regex.append(".*|");++        // we're matching everything+        flag_match = true;+      }++      // enable -Y: include empty pattern matches in the results+      flag_empty = true;++      // disable -w+      flag_word_regexp = false;+    }+    else+    {+      // split newline-separated regex up into alternations+      size_t from = 0;+      size_t to;++      // replace all \E in pattern with \E\\E\Q (or perhaps \\EE\Q)+      if (flag_fixed_strings)+      {+        while ((to = pattern.find("\\E", from)) != std::string::npos)+        {+          pattern.insert(to + 2, "\\\\E\\Q");+          from = to + 7;+        }+      }++      from = 0;++      // split regex at newlines, for -F add \Q \E to each string, separate by |+      while ((to = pattern.find('\n', from)) != std::string::npos)+      {+        if (from < to)+        {+          size_t len = to - from - (pattern[to - 1] == '\r');+          if (len > 0)+            regex.append(Q).append(pattern.substr(from, to - from - (pattern[to - 1] == '\r'))).append(E);+        }+        from = to + 1;+      } -    if (sep != std::string::npos && sep > 0 && sep + 1 < label.size())-    {-      if (!label.empty() && magic_regex.size() > 1)-        magic_regex.append(")|(");-      magic_regex.append(label.substr(sep + 1));+      if (from < pattern.size())+        regex.append(Q).append(pattern.substr(from)).append(E); -      // truncate so we end up with a list of labels without patterns-      label.resize(sep);-    }-    else-    {-      abort("option --filter-magic-label: invalid LABEL:MAGIC argument ", label);+      // if pattern starts with ^ and ends with $, enable -Y+      if (pattern.size() >= 1 && (pattern.front() == '^' || pattern.back() == '$'))+        flag_empty = true;     }   } -  magic_regex.push_back(')');--  // --filter-magic-label: create a filter_magic_pattern-  try-  {-    // construct filter_magic_pattern DFA-    if (magic_regex.size() > 2)-      filter_magic_pattern.assign(magic_regex, "r");-  }--  catch (reflex::regex_error& error)-  {-    abort("option --filter-magic-label: ", error.what());-  }-}+  // we're matching everything, including empty lines+  if (flag_match)+    flag_empty = true; -// check TTY info and set colors-void terminal()-{-  if (flag_query > 0)+  // --match: adjust color highlighting to show matches as selected lines+  if (flag_match)   {-    // -Q: disable --quiet-    flag_quiet = false;+    copy_color(match_ms, color_sl);+    copy_color(match_mc, color_cx);+    copy_color(match_off, color_off);   }-  else if (!flag_quiet)+  else   {-    // is output sent to a color TTY, to a pager, or to /dev/null?--    // check if standard output is a TTY-    tty_term = isatty(STDOUT_FILENO) != 0;--#ifndef OS_WIN--    if (!tty_term)+    // --tag: tag matches instead of colors+    if (flag_tag != NULL)     {-      output_stat_result = fstat(STDOUT_FILENO, &output_stat) == 0;-      output_stat_regular = output_stat_result && S_ISREG(output_stat.st_mode);+      const char *s1 = strchr(flag_tag, ',');+      const char *s2 = s1 != NULL ? strchr(s1 + 1, ',') : NULL; -      // if output is sent to /dev/null, then enable -q (i.e. "cheat" like GNU grep!)-      struct stat dev_null_stat;-      if (output_stat_result &&-          S_ISCHR(output_stat.st_mode) &&-          stat("/dev/null", &dev_null_stat) == 0 &&-          output_stat.st_dev == dev_null_stat.st_dev &&-          output_stat.st_ino == dev_null_stat.st_ino)+      copy_color(match_ms, flag_tag);++      if (s1 == NULL)       {-        flag_quiet = true;+        copy_color(match_mc, flag_tag);+        copy_color(match_off, flag_tag);       }-    }+      else+      {+        copy_color(match_off, s1 + 1); -#endif+        if (s2 == NULL)+          copy_color(match_mc, match_ms);+        else+          copy_color(match_mc, s2 + 1);+      }+    }+    else+    {+      copy_color(match_ms, color_ms);+      copy_color(match_mc, color_mc);+      copy_color(match_off, color_off);+    }   } -  // whether to apply colors-  flag_apply_color = flag_tag != NULL ? "never" : flag_query > 0 ? "always" : flag_color;+  // the regex compiled from -N PATTERN+  std::string neg_regex; -  if (!flag_quiet)+  // append -N PATTERN to regex as negative patterns+  for (auto& pattern : flag_neg_regexp)   {-    if (tty_term || flag_query > 0)+    if (!pattern.empty())     {-      if (flag_pretty)-      {-        // --pretty: if output is to a TTY then enable --color and --heading--        // enable --color-        if (flag_apply_color == NULL)-          flag_apply_color = "auto";--        // enable --heading (enables --break later)-        flag_heading = true;+      // split newline-separated regex up into alternations+      size_t from = 0;+      size_t to; -        // enable -T (initial tab)-        flag_initial_tab = true;-      }-      else if (flag_apply_color != NULL)+      // split regex at newlines, for -F add \Q \E to each string, separate by |+      while ((to = pattern.find('\n', from)) != std::string::npos)       {-        // --colors: if output is to a TTY then enable --color and use the specified --colors--        // enable --color-        if (flag_apply_color == NULL)-          flag_apply_color = "auto";+        if (from < to)+        {+          size_t len = to - from - (pattern[to - 1] == '\r');+          if (len > 0)+            neg_regex.append(Q).append(pattern.substr(from, to - from - (pattern[to - 1] == '\r'))).append(E);+        }+        from = to + 1;       } -      if (flag_query > 0)-      {-        // --query: run the interactive query UI+      if (from < pattern.size())+        neg_regex.append(Q).append(pattern.substr(from)).append(E); -        // enable --heading-        flag_heading = true;+      if (pattern.size() >= 1 && (pattern.front() == '^' || pattern.back() == '$'))+        flag_empty = true; // we're possibly matching empty lines, so enable -Y+    }+  } -        // enable --line-buffered to flush output immediately-        flag_line_buffered = true;-      }-      else if (flag_pager != NULL)-      {-        // --pager: if output is to a TTY then page through the results+  // -x or -w: apply to -N PATTERN+  if (!neg_regex.empty())+  {+    // remove the ending '|' from the |-concatenated regexes in the regex string+    neg_regex.pop_back(); -        // open a pipe to a forked pager-        output = popen(flag_pager, "w");-        if (output == NULL)-          error("cannot open pipe to pager", flag_pager);+    if (regex != "^$")+    {+      // -x or -w+      if (flag_line_regexp)+        neg_regex.insert(0, "^(").append(")$"); // make the regex line-anchored+      else if (flag_word_regexp)+        neg_regex.insert(0, "\\<(").append(")\\>"); // make the regex word-anchored+    } -        // enable --heading-        flag_heading = true;+    // construct negative (?^PATTERN)+    neg_regex.insert(0, "(?^").push_back(')');+  } -        // enable --line-buffered to flush output to the pager immediately-        flag_line_buffered = true;-      }-    }+  // -x or -w: apply to PATTERN then disable -x, -w, -F for patterns in -f FILE when PATTERN or -e PATTERN is specified+  if (!regex.empty())+  {+    // remove the ending '|' from the |-concatenated regexes in the regex string+    regex.pop_back(); -    // --color: (re)set flag_apply_color depending on color_term and TTY output-    if (flag_apply_color != NULL)+    if (regex != "^$")     {-      color_term = flag_query > 0;+      // -x or -w+      if (flag_line_regexp)+        regex.insert(0, "^(").append(")$"); // make the regex line-anchored+      else if (flag_word_regexp)+        regex.insert(0, "\\<(").append(")\\>"); // make the regex word-anchored+    } -      if (strcmp(flag_apply_color, "never") == 0)-      {-        flag_apply_color = NULL;-      }-      else-      {-#ifdef OS_WIN+    // -x and -w do not apply to patterns in -f FILE when PATTERN or -e PATTERN is specified+    flag_line_regexp = false;+    flag_word_regexp = false; -        if (tty_term || flag_query > 0)-        {-#ifdef ENABLE_VIRTUAL_TERMINAL_PROCESSING-          // assume we have a color terminal on Windows if isatty() is true-          HANDLE hConOut = GetStdHandle(STD_OUTPUT_HANDLE);-          if (hConOut != INVALID_HANDLE_VALUE)-          {-#ifdef CP_UTF8-            // enable UTF-8 output-            SetConsoleOutputCP(CP_UTF8);-#endif-            // try virtual terminal processing for ANSI SGR codes, enable colors when successful-            DWORD outMode;-            GetConsoleMode(hConOut, &outMode);-            outMode |= ENABLE_VIRTUAL_TERMINAL_PROCESSING;-            color_term = SetConsoleMode(hConOut, outMode) != 0;-          }-#endif-        }+    // -F does not apply to patterns in -f FILE when PATTERN or -e PATTERN is specified+    Q = "";+    E = "|";+  } -#else+  // combine regexes+  if (regex.empty())+    regex.swap(neg_regex);+  else if (!neg_regex.empty())+    regex.append("|").append(neg_regex); -        // check whether we have a color terminal-        if (tty_term)-        {-          const char *term = getenv("TERM");-          if (term &&-              (strstr(term, "ansi") != NULL ||-               strstr(term, "xterm") != NULL ||-               strstr(term, "color") != NULL))-            color_term = true;-        }+  // -f: get patterns from file+  if (!flag_file.empty())+  {+    // add an ending '|' to the regex to concatenate sub-expressions+    if (!regex.empty())+      regex.push_back('|'); -#endif+    // -f: read patterns from the specified file or files+    for (auto& filename : flag_file)+    {+      FILE *file = NULL;++      if (filename == "-")+        file = stdin;+      else if (fopen_s(&file, filename.c_str(), "r") != 0)+        file = NULL;++      if (file == NULL)+      {+        // could not open, try GREP_PATH environment variable+        char *env_grep_path = NULL;+        dupenv_s(&env_grep_path, "GREP_PATH"); -        if (strcmp(flag_apply_color, "auto") == 0)-        {-          if (!color_term)-            flag_apply_color = NULL;-        }-        else if (strcmp(flag_apply_color, "always") != 0)+        if (env_grep_path != NULL)         {-          help("invalid argument --color=WHEN, valid arguments are 'never', 'always', and 'auto'");+          std::string path_file(env_grep_path);+          path_file.append(PATHSEPSTR).append(filename);++          if (fopen_s(&file, path_file.c_str(), "r") != 0)+            file = NULL;++          free(env_grep_path);         }+      } -        if (flag_apply_color != NULL)-        {-          // get GREP_COLOR and GREP_COLORS, when defined-          char *env_grep_color = NULL;-          dupenv_s(&env_grep_color, "GREP_COLOR");-          char *env_grep_colors = NULL;-          dupenv_s(&env_grep_colors, "GREP_COLORS");-          const char *grep_colors = env_grep_colors;+#ifdef GREP_PATH+      if (file == NULL)+      {+        std::string path_file(GREP_PATH);+        path_file.append(PATHSEPSTR).append(filename); -          // if GREP_COLOR is defined, use it to set mt= default value (overridden by GREP_COLORS mt=, ms=, mc=)-          if (env_grep_color != NULL)-            set_color(std::string("mt=").append(env_grep_color).c_str(), "mt", color_mt);-          else if (grep_colors == NULL)-            grep_colors = DEFAULT_GREP_COLORS;+        if (fopen_s(&file, path_file.c_str(), "r") != 0)+          file = NULL;+      }+#endif -          // parse GREP_COLORS-          set_color(grep_colors, "sl", color_sl); // selected line-          set_color(grep_colors, "cx", color_cx); // context line-          set_color(grep_colors, "mt", color_mt); // matched text in any line-          set_color(grep_colors, "ms", color_ms); // matched text in selected line-          set_color(grep_colors, "mc", color_mc); // matched text in a context line-          set_color(grep_colors, "fn", color_fn); // file name-          set_color(grep_colors, "ln", color_ln); // line number-          set_color(grep_colors, "cn", color_cn); // column number-          set_color(grep_colors, "bn", color_bn); // byte offset-          set_color(grep_colors, "se", color_se); // separator+      if (file == NULL)+        error("cannot read", filename.c_str()); -          // parse --colors-          set_color(flag_colors, "sl", color_sl); // selected line-          set_color(flag_colors, "cx", color_cx); // context line-          set_color(flag_colors, "mt", color_mt); // matched text in any line-          set_color(flag_colors, "ms", color_ms); // matched text in selected line-          set_color(flag_colors, "mc", color_mc); // matched text in a context line-          set_color(flag_colors, "fn", color_fn); // file name-          set_color(flag_colors, "ln", color_ln); // line number-          set_color(flag_colors, "cn", color_cn); // column number-          set_color(flag_colors, "bn", color_bn); // byte offset-          set_color(flag_colors, "se", color_se); // separator+      reflex::BufferedInput input(file);+      std::string line; -          // -v: if rv in GREP_COLORS then swap the sl and cx colors-          if (flag_invert_match &&-              ((grep_colors != NULL && strstr(grep_colors, "rv") != NULL) ||-               (flag_colors != NULL && strstr(flag_colors, "rv") != NULL)))-          {-            char color_tmp[COLORLEN];-            copy_color(color_tmp, color_sl);-            copy_color(color_sl, color_cx);-            copy_color(color_cx, color_tmp);-          }+      while (true)+      {+        // read the next line+        if (getline(input, line))+          break; -          // if ms= is not specified, use the mt= value-          if (*color_ms == '\0')-            copy_color(color_ms, color_mt);+        // add line to the regex if not empty+        if (!line.empty())+          regex.append(Q).append(line).append(E);+      } -          // if mc= is not specified, use the mt= value-          if (*color_mc == '\0')-            copy_color(color_mc, color_mt);+      if (file != stdin)+        fclose(file);+    } -          color_off = "\033[m";-          color_del = "\033[K";+    // remove the ending '|' from the |-concatenated regexes in the regex string+    regex.pop_back(); -          copy_color(match_off, color_off);+    // -x or -w+    if (flag_line_regexp)+      regex.insert(0, "^(").append(")$"); // make the regex line-anchored+    else if (flag_word_regexp)+      regex.insert(0, "\\<(").append(")\\>"); // make the regex word-anchored+  } -          if (isatty(STDERR_FILENO))-          {-            color_high    = "\033[1m";-            color_error   = "\033[1;31m";-            color_warning = "\033[1;35m";-            color_message = "\033[1;36m";-          }+  // -j: case insensitive search if regex does not contain an upper case letter+  if (flag_smart_case)+  {+    flag_ignore_case = true; -          if (env_grep_color != NULL)-            free(env_grep_color);-          if (env_grep_colors != NULL)-            free(env_grep_colors);-        }+    for (size_t i = 0; i < regex.size(); ++i)+    {+      if (regex[i] == '\\')+      {+        ++i;+      }+      else if (regex[i] == '{')+      {+        while (++i < regex.size() && regex[i] != '}')+          continue;+      }+      else if (isupper(regex[i]))+      {+        flag_ignore_case = false;+        break;       }     }   }-} -// search the specified files, directories, and/or standard input for pattern matches-void ugrep()-{-  // reset warnings-  warnings = 0;+  // -y: disable -A, -B, and -C+  if (flag_any_line)+    flag_after_context = flag_before_context = 0; -  // reset stats-  Stats::reset();+  // -A, -B, or -C: disable -o+  if (flag_after_context > 0 || flag_before_context > 0)+    flag_only_matching = false; -  // populate the combined all-include and all-exclude-  flag_all_include = flag_include;-  flag_all_include_dir = flag_include_dir;-  flag_all_exclude = flag_exclude;-  flag_all_exclude_dir = flag_exclude_dir;+  // -v or -y: disable -o and -u+  if (flag_invert_match || flag_any_line)+    flag_only_matching = flag_ungroup = false; -  // -g, --glob: add globs to all-include/all-exclude-  for (auto& globs : flag_glob)+  // --depth: if -R or -r is not specified then enable -R +  if ((flag_min_depth > 0 || flag_max_depth > 0) && flag_directories_action != Action::RECURSE)   {-    size_t from = 0;-    std::string glob;+    flag_directories_action = Action::RECURSE;+    flag_dereference = true;+  } -    while (true)-    {-      size_t to = globs.find(',', from);-      size_t size = (to == std::string::npos ? globs.size() : to) - from;+  // -p (--no-dereference) and -S (--dereference): -p takes priority over -S and -R+  if (flag_no_dereference)+    flag_dereference = false; -      if (size > 0)-      {-        bool negate = size > 1 && (globs[from] == '!' || globs[from] == '^');+  // display file name if more than one input file is specified or options -R, -r, and option -h --no-filename is not specified+  if (!flag_no_filename && (flag_all_threads || flag_directories_action == Action::RECURSE || arg_files.size() > 1 || (flag_stdin && !arg_files.empty())))+    flag_with_filename = true; -        if (negate)-        {-          ++from;-          --size;-        }+  // --only-line-number implies -n+  if (flag_only_line_number)+    flag_line_number = true; -        (negate ? flag_all_exclude : flag_all_include).emplace_back(globs.substr(from, size));-      }+  // if no display options -H, -n, -k, -b are set, enable --no-labels to suppress labels for speed+  if (!flag_with_filename && !flag_line_number && !flag_column_number && !flag_byte_offset)+    flag_no_header = true; -      if (to == std::string::npos)-        break;+  // -q: we only need to find one matching file and we're done+  if (flag_quiet)+  {+    flag_max_files = 1; -      from = to + 1;-    }+    // -q overrides -l and -L+    flag_files_with_matches = false;+    flag_files_without_match = false;   } -  // all excluded files: normalize by moving directory globs (globs ending in a path separator /) to --exclude-dir-  auto i = flag_all_exclude.begin();-  while (i != flag_all_exclude.end())+  // -L: enable -l and flip -v i.e. -L=-lv and -l=-Lv+  if (flag_files_without_match)   {-    if (i->empty())-    {-      i = flag_all_exclude.erase(i);-    }-    else if (i->back() == '/')-    {-      flag_all_exclude_dir.emplace_back(*i);-      i = flag_all_exclude.erase(i);-    }-    else-    {-      ++i;-    }+    flag_files_with_matches = true;+    flag_invert_match = !flag_invert_match;   } -  // all included files: normalize by moving directory globs (globs ending in a path separator /) to --include-dir-  i = flag_all_include.begin();-  while (i != flag_all_include.end())+  // -l or -L: enable -H, disable -c+  if (flag_files_with_matches)   {-    if (i->empty())-    {-      i = flag_all_include.erase(i);-    }-    else if (i->back() == '/')-    {-      flag_all_include_dir.emplace_back(*i);-      i = flag_all_include.erase(i);-    }-    else-    {-      ++i;-    }+    flag_with_filename = true;+    flag_count = false;   } -#ifdef HAVE_LIBZ-#ifdef WITH_DECOMPRESSION_THREAD-  // -z with -M or -O/--include: add globs to search archive contents-  if (flag_decompress && (!flag_file_magic.empty() || !flag_all_include.empty()))+  // --heading: enable --break when filenames are shown+  if (flag_heading && flag_with_filename)+    flag_break = true;++  // -J: when not set the default is the number of cores (or hardware threads), limited to MAX_JOBS+  if (flag_jobs == 0)   {-    flag_all_include.emplace_back("*.cpio");-    flag_all_include.emplace_back("*.pax");-    flag_all_include.emplace_back("*.tar");-    flag_all_include.emplace_back("*.zip");-    flag_all_include.emplace_back("*.ZIP");+    unsigned int cores = std::thread::hardware_concurrency();+    unsigned int concurrency = cores > 2 ? cores : 2;+    flag_jobs = std::min(concurrency, MAX_JOBS);+  } -    flag_all_include.emplace_back("*.cpio.gz");-    flag_all_include.emplace_back("*.pax.gz");-    flag_all_include.emplace_back("*.tar.gz");-    flag_all_include.emplace_back("*.taz");-    flag_all_include.emplace_back("*.tgz");-    flag_all_include.emplace_back("*.tpz");+  // --sort and --max-files: limit number of threads to --max-files to prevent unordered results, this is a special case+  if (flag_sort_key != Sort::NA && flag_max_files > 0)+    flag_jobs = std::min(flag_jobs, flag_max_files); -    flag_all_include.emplace_back("*.cpio.Z");-    flag_all_include.emplace_back("*.pax.Z");-    flag_all_include.emplace_back("*.tar.Z");+  // set the number of threads to the number of files or when recursing to the value of -J, --jobs+  if (flag_all_threads || flag_directories_action == Action::RECURSE)+    threads = flag_jobs;+  else+    threads = std::min(arg_files.size() + flag_stdin, flag_jobs); -    flag_all_include.emplace_back("*.cpio.zip");-    flag_all_include.emplace_back("*.pax.zip");-    flag_all_include.emplace_back("*.tar.zip");+  // negative character classes do not match newlines+  reflex::convert_flag_type convert_flags = reflex::convert_flag::notnewline; -#ifdef HAVE_LIBBZ2-    flag_all_include.emplace_back("*.cpio.bz");-    flag_all_include.emplace_back("*.pax.bz");-    flag_all_include.emplace_back("*.tar.bz");-    flag_all_include.emplace_back("*.cpio.bz2");-    flag_all_include.emplace_back("*.pax.bz2");-    flag_all_include.emplace_back("*.tar.bz2");-    flag_all_include.emplace_back("*.cpio.bzip2");-    flag_all_include.emplace_back("*.pax.bzip2");-    flag_all_include.emplace_back("*.tar.bzip2");-    flag_all_include.emplace_back("*.tb2");-    flag_all_include.emplace_back("*.tbz");-    flag_all_include.emplace_back("*.tbz2");-    flag_all_include.emplace_back("*.tz2");-#endif+  // not -U: convert regex to Unicode+  if (!flag_binary)+    convert_flags |= reflex::convert_flag::unicode; -#ifdef HAVE_LIBLZMA-    flag_all_include.emplace_back("*.cpio.lzma");-    flag_all_include.emplace_back("*.pax.lzma");-    flag_all_include.emplace_back("*.tar.lzma");-    flag_all_include.emplace_back("*.cpio.xz");-    flag_all_include.emplace_back("*.pax.xz");-    flag_all_include.emplace_back("*.tar.xz");-    flag_all_include.emplace_back("*.tlz");-    flag_all_include.emplace_back("*.txz");-#endif-  }-#endif-#endif+  // -G: convert basic regex (BRE) to extended regex (ERE)+  if (flag_basic_regexp)+    convert_flags |= reflex::convert_flag::basic; -  // all excluded-dirs: normalize by removing trailing path separators-  for (auto& i : flag_all_exclude_dir)-    while (i.size() > 1 && i.back() == '/')-      i.pop_back();+  // set reflex::Pattern options to enable multiline mode+  std::string pattern_options("(?m"); -  // all included-dirs: normalize by removing trailing path separators-  for (auto& i : flag_all_include_dir)-    while (i.size() > 1 && i.back() == '/')-      i.pop_back();+  // -i: case insensitive reflex::Pattern option, applies to ASCII only+  if (flag_ignore_case)+    pattern_options.push_back('i'); -  // --sort: check sort KEY and set flags-  if (flag_sort != NULL)+  // --free-space: this is needed to check free-space conformance by the converter+  if (flag_free_space)   {-    flag_sort_rev = *flag_sort == 'r';--    if (strcmp(flag_sort, "name") == 0 || strcmp(flag_sort, "rname") == 0)-      flag_sort_key = Sort::NAME;-    else if (strcmp(flag_sort, "best") == 0 || strcmp(flag_sort, "rbest") == 0)-      flag_sort_key = Sort::BEST;-    else if (strcmp(flag_sort, "size") == 0 || strcmp(flag_sort, "rsize") == 0)-      flag_sort_key = Sort::SIZE;-    else if (strcmp(flag_sort, "used") == 0 || strcmp(flag_sort, "rused") == 0)-      flag_sort_key = Sort::USED;-    else if (strcmp(flag_sort, "changed") == 0 || strcmp(flag_sort, "rchanged") == 0)-      flag_sort_key = Sort::CHANGED;-    else if (strcmp(flag_sort, "created") == 0 || strcmp(flag_sort, "rcreated") == 0)-      flag_sort_key = Sort::CREATED;-    else-      help("invalid argument --sort=KEY, valid arguments are 'name', 'best', 'size', 'used', 'changed', 'created', 'rname', 'rbest', 'rsize', 'rused', 'rchanged', and 'rcreated'");+    convert_flags |= reflex::convert_flag::freespace;+    pattern_options.push_back('x');   } -  // -x: enable -Y-  if (flag_line_regexp)-    flag_empty = true;+  // prepend the pattern options (?m...) to the regex+  pattern_options.push_back(')');+  regex = pattern_options + regex; -  // the regex compiled from PATTERN, -e PATTERN, -N PATTERN, and -f FILE-  std::string regex;+  // reflex::Matcher options+  std::string matcher_options; -  // -F: make newline-separated lines in regex literal with \Q and \E-  const char *Q = flag_fixed_strings ? "\\Q" : "";-  const char *E = flag_fixed_strings ? "\\E|" : "|";+  // -Y: permit empty pattern matches+  if (flag_empty)+    matcher_options.push_back('N'); -  // either one PATTERN or one or more -e PATTERN (cannot specify both)-  std::vector<std::string> arg_patterns;-  if (arg_pattern != NULL)-    arg_patterns.emplace_back(arg_pattern);-  std::vector<std::string>& patterns = arg_pattern != NULL ? arg_patterns : flag_regexp;+  // --tabs: set reflex::Matcher option T to NUM (1, 2, 4, or 8) tab size+  if (flag_tabs)+    matcher_options.append("T=").push_back(static_cast<char>(flag_tabs) + '0'); -  // combine all -e PATTERN into a single regex string for matching-  for (auto& pattern : patterns)+  // --format-begin+  if (!flag_quiet && flag_format_begin != NULL)+    format(flag_format_begin, 0);++  size_t nodes = 0;+  size_t edges = 0;+  size_t words = 0;+  size_t nodes_time = 0;+  size_t edges_time = 0;+  size_t words_time = 0;++  // -P: Perl matching with Boost.Regex+  if (flag_perl_regexp)   {-    // empty PATTERN matches everything-    if (pattern.empty())+#if defined(HAVE_PCRE2)+    // construct the PCRE2 JIT-optimized NFA-based Perl pattern matcher+    std::string pattern(reflex::PCRE2Matcher::convert(regex, convert_flags));+    reflex::PCRE2Matcher matcher(pattern, reflex::Input(), matcher_options.c_str());++    if (threads > 1)     {-      // pattern ".*\n?|" could be used throughout without flag_empty = true, but this garbles output for -o, -H, -n, etc.-      if (flag_line_regexp)+      GrepMaster grep(output, &matcher);+      grep.ugrep();+    }+    else+    {+      Grep grep(output, &matcher);+      set_grep_handle(&grep);+      grep.ugrep();+      clear_grep_handle();+    }+#elif defined(HAVE_BOOST_REGEX)+    try+    {+      // construct the Boost.Regex NFA-based Perl pattern matcher+      std::string pattern(reflex::BoostPerlMatcher::convert(regex, convert_flags));+      reflex::BoostPerlMatcher matcher(pattern, reflex::Input(), matcher_options.c_str());++      if (threads > 1)       {-        regex.append("^$|");+        GrepMaster grep(output, &matcher);+        grep.ugrep();       }-      else if (flag_hex)+      else       {-        regex.append(".*\n?|");+        Grep grep(output, &matcher);+        set_grep_handle(&grep);+        grep.ugrep();+        clear_grep_handle();+      }+    } -        // we're matching everything-        flag_match = true;+    catch (boost::regex_error& error)+    {+      const char *message;+      reflex::regex_error_type code;++      switch (error.code())+      {+        case boost::regex_constants::error_collate:+          code = reflex::regex_error::invalid_collating;+          break;+        case boost::regex_constants::error_ctype:+          code = reflex::regex_error::invalid_class;+          break;+        case boost::regex_constants::error_escape:+          code = reflex::regex_error::invalid_escape;+          break;+        case boost::regex_constants::error_backref:+          code = reflex::regex_error::invalid_backreference;+          break;+        case boost::regex_constants::error_brack:+          code = reflex::regex_error::invalid_class;+          break;+        case boost::regex_constants::error_paren:+          code = reflex::regex_error::mismatched_parens;+          break;+        case boost::regex_constants::error_brace:+          code = reflex::regex_error::mismatched_braces;+          break;+        case boost::regex_constants::error_badbrace:+          code = reflex::regex_error::invalid_repeat;+          break;+        case boost::regex_constants::error_range:+          code = reflex::regex_error::invalid_class_range;+          break;+        case boost::regex_constants::error_space:+          code = reflex::regex_error::exceeds_limits;+          break;+        case boost::regex_constants::error_badrepeat:+          code = reflex::regex_error::invalid_repeat;+          break;+        case boost::regex_constants::error_complexity:+          code = reflex::regex_error::exceeds_limits;+          break;+        case boost::regex_constants::error_stack:+          code = reflex::regex_error::exceeds_limits;+          break;+        default:+          code = reflex::regex_error::invalid_syntax;+      }++      throw reflex::regex_error(code, regex, error.position() + 1);+    }+#endif+  }+  else+  {+    // construct the RE/flex DFA-based pattern matcher and start matching files+    reflex::Pattern pattern(reflex::Matcher::convert(regex, convert_flags), "r");++    if (flag_fuzzy > 0)+    {+      reflex::FuzzyMatcher matcher(pattern, static_cast<uint16_t>(flag_fuzzy), reflex::Input(), matcher_options.c_str());++      if (threads > 1)+      {+        GrepMaster grep(output, &matcher);+        grep.ugrep();       }       else       {-        regex.append(".*|");--        // we're matching everything-        flag_match = true;+        Grep grep(output, &matcher);+        set_grep_handle(&grep);+        grep.ugrep();+        clear_grep_handle();       }--      // enable -Y: include empty pattern matches in the results-      flag_empty = true;--      // disable -w-      flag_word_regexp = false;     }     else     {-      // split newline-separated regex up into alternations-      size_t from = 0;-      size_t to;+      reflex::Matcher matcher(pattern, reflex::Input(), matcher_options.c_str()); -      // replace all \E in pattern with \E\\E\Q (or perhaps \\EE\Q)-      if (flag_fixed_strings)+      if (threads > 1)       {-        while ((to = pattern.find("\\E", from)) != std::string::npos)-        {-          pattern.insert(to + 2, "\\\\E\\Q");-          from = to + 7;-        }+        GrepMaster grep(output, &matcher);+        grep.ugrep();       }--      from = 0;--      // split regex at newlines, for -F add \Q \E to each string, separate by |-      while ((to = pattern.find('\n', from)) != std::string::npos)+      else       {-        if (from < to)-        {-          size_t len = to - from - (pattern[to - 1] == '\r');-          if (len > 0)-            regex.append(Q).append(pattern.substr(from, to - from - (pattern[to - 1] == '\r'))).append(E);-        }-        from = to + 1;+        Grep grep(output, &matcher);+        set_grep_handle(&grep);+        grep.ugrep();+        clear_grep_handle();       }+    } -      if (from < pattern.size())-        regex.append(Q).append(pattern.substr(from)).append(E);+    nodes = pattern.nodes();+    edges = pattern.edges();+    words = pattern.words();+    nodes_time = static_cast<size_t>(pattern.nodes_time());+    edges_time = static_cast<size_t>(pattern.parse_time() + pattern.edges_time());+    words_time = static_cast<size_t>(pattern.words_time());+  } -      // if pattern starts with ^ and ends with $, enable -Y-      if (pattern.size() >= 1 && (pattern.front() == '^' || pattern.back() == '$'))-        flag_empty = true;-    }+  // --format-end+  if (!flag_quiet && flag_format_end != NULL)+    format(flag_format_end, Stats::found_parts());++  // --stats: display stats when we're done+  if (flag_stats != NULL)+  {+    Stats::report();++    if (strcmp(flag_stats, "vm") == 0 && words > 0)+      fprintf(output, "VM memory: %zu nodes (%zums), %zu edges (%zums), %zu opcode words (%zums)\n", nodes, nodes_time, edges, edges_time, words, words_time);   } -  // we're matching everything, including empty lines-  if (flag_match)-    flag_empty = true;+  // close the pipe to the forked pager+  if (flag_pager != NULL && output != NULL && output != stdout)+    pclose(output);+} -  // --match: adjust color highlighting to show matches as selected lines-  if (flag_match)+// cancel the search+void cancel_ugrep()+{+  std::unique_lock<std::mutex> lock(grep_handle_mutex);+  if (grep_handle != NULL)+    grep_handle->out.cancel();+}++// set the handle to be able to use cancel_ugrep()+void set_grep_handle(Grep *grep)+{+  std::unique_lock<std::mutex> lock(grep_handle_mutex);+  grep_handle = grep;+}++// reset the grep handle+void clear_grep_handle()+{+  std::unique_lock<std::mutex> lock(grep_handle_mutex);+  grep_handle = NULL;+}++// search the specified files or standard input for pattern matches+void Grep::ugrep()+{+  if (!flag_stdin && arg_files.empty())   {-    copy_color(match_ms, color_sl);-    copy_color(match_mc, color_cx);-    copy_color(match_off, color_off);+    recurse(1, ".");   }   else   {-    // --tag: tag matches instead of colors-    if (flag_tag != NULL)+    // read each input file to find pattern matches+    if (flag_stdin)     {-      const char *s1 = strchr(flag_tag, ',');-      const char *s2 = s1 != NULL ? strchr(s1 + 1, ',') : NULL;+      Stats::score_file(); -      copy_color(match_ms, flag_tag);+      // search standard input+      search(NULL);+    } -      if (s1 == NULL)-      {-        copy_color(match_mc, flag_tag);-        copy_color(match_off, flag_tag);-      }-      else-      {-        copy_color(match_off, s1 + 1);+#ifndef OS_WIN+    std::pair<std::set<ino_t>::iterator,bool> vino;+#endif -        if (s2 == NULL)-          copy_color(match_mc, match_ms);-        else-          copy_color(match_mc, s2 + 1);-      }-    }-    else+    for (auto pathname : arg_files)     {-      copy_color(match_ms, color_ms);-      copy_color(match_mc, color_mc);-      copy_color(match_off, color_off);-    }-  }+      // stop after finding max-files matching files+      if (flag_max_files > 0 && Stats::found_parts() >= flag_max_files)+        break; -  // the regex compiled from -N PATTERN-  std::string neg_regex;+      // stop when output is blocked or search cancelled+      if (out.eof)+        break; -  // append -N PATTERN to regex as negative patterns-  for (auto& pattern : flag_neg_regexp)-  {-    if (!pattern.empty())-    {-      // split newline-separated regex up into alternations-      size_t from = 0;-      size_t to;+      // search file or directory, get the basename from the file argument first+      const char *basename = strrchr(pathname, PATHSEPCHR);+      if (basename != NULL)+        ++basename;+      else+        basename = pathname; -      // split regex at newlines, for -F add \Q \E to each string, separate by |-      while ((to = pattern.find('\n', from)) != std::string::npos)+      ino_t inode = 0;+      uint64_t info;++      // search file, unless searchable directory into which we should recurse+      switch (select(1, pathname, basename, DIRENT_TYPE_UNKNOWN, inode, info, true))       {-        if (from < to)-        {-          size_t len = to - from - (pattern[to - 1] == '\r');-          if (len > 0)-            neg_regex.append(Q).append(pattern.substr(from, to - from - (pattern[to - 1] == '\r'))).append(E);-        }-        from = to + 1;-      }+        case Type::DIRECTORY:+#ifndef OS_WIN+          if (flag_dereference)+            vino = visited.insert(inode);+#endif -      if (from < pattern.size())-        neg_regex.append(Q).append(pattern.substr(from)).append(E);+          recurse(1, pathname); -      if (pattern.size() >= 1 && (pattern.front() == '^' || pattern.back() == '$'))-        flag_empty = true; // we're possibly matching empty lines, so enable -Y-    }-  }+#ifndef OS_WIN+          if (flag_dereference)+            visited.erase(vino.first);+#endif+          break; -  // -x or -w: apply to -N PATTERN-  if (!neg_regex.empty())-  {-    // remove the ending '|' from the |-concatenated regexes in the regex string-    neg_regex.pop_back();+        case Type::OTHER:+          search(pathname);+          break; -    if (regex != "^$")-    {-      // -x or -w-      if (flag_line_regexp)-        neg_regex.insert(0, "^(").append(")$"); // make the regex line-anchored-      else if (flag_word_regexp)-        neg_regex.insert(0, "\\<(").append(")\\>"); // make the regex word-anchored+        case Type::SKIP:+          break;+      }     }--    // construct negative (?^PATTERN)-    neg_regex.insert(0, "(?^").push_back(')');   }+} -  // -x or -w: apply to PATTERN then disable -x, -w, -F for patterns in -f FILE when PATTERN or -e PATTERN is specified-  if (!regex.empty())-  {-    // remove the ending '|' from the |-concatenated regexes in the regex string-    regex.pop_back();+// search file or directory for pattern matches+Grep::Type Grep::select(size_t level, const char *pathname, const char *basename, int type, ino_t& inode, uint64_t& info, bool is_argument)+{+  if (*basename == '.' && !flag_hidden && !is_argument)+    return Type::SKIP; -    if (regex != "^$")-    {-      // -x or -w-      if (flag_line_regexp)-        regex.insert(0, "^(").append(")$"); // make the regex line-anchored-      else if (flag_word_regexp)-        regex.insert(0, "\\<(").append(")\\>"); // make the regex word-anchored-    }+#ifdef OS_WIN -    // -x and -w do not apply to patterns in -f FILE when PATTERN or -e PATTERN is specified-    flag_line_regexp = false;-    flag_word_regexp = false;+  DWORD attr = GetFileAttributesA(pathname); -    // -F does not apply to patterns in -f FILE when PATTERN or -e PATTERN is specified-    Q = "";-    E = "|";+  if (attr == INVALID_FILE_ATTRIBUTES)+  {+    errno = ENOENT;+    warning("cannot read", pathname);+    return Type::SKIP;   } -  // combine regexes-  if (regex.empty())-    regex.swap(neg_regex);-  else if (!neg_regex.empty())-    regex.append("|").append(neg_regex);+  if (!flag_hidden && !is_argument && ((attr & FILE_ATTRIBUTE_HIDDEN) || (attr & FILE_ATTRIBUTE_SYSTEM)))+    return Type::SKIP; -  // -f: get patterns from file-  if (!flag_file.empty())+  if ((attr & FILE_ATTRIBUTE_DIRECTORY))   {-    // add an ending '|' to the regex to concatenate sub-expressions-    if (!regex.empty())-      regex.push_back('|');+    if (flag_directories_action == Action::READ)+    {+      // directories cannot be read actually, so grep produces a warning message (errno is not set)+      is_directory(pathname);+      return Type::SKIP;+    } -    // -f: read patterns from the specified file or files-    for (auto& filename : flag_file)+    if (is_argument || flag_directories_action == Action::RECURSE)     {-      FILE *file = NULL;+      // --depth: recursion level exceeds max depth?+      if (flag_max_depth > 0 && level > flag_max_depth)+        return Type::SKIP; -      if (filename == "-")-        file = stdin;-      else if (fopen_s(&file, filename.c_str(), "r") != 0)-        file = NULL;+      // hard maximum recursion depth reached?+      if (level > MAX_DEPTH)+      {+        if (!flag_no_messages)+          fprintf(stderr, "%sugrep: %s%s%s recursion depth hit hard limit of %d\n", color_off, color_high, pathname, color_off, MAX_DEPTH);+        return Type::SKIP;+      } -      if (file == NULL)+      // check for --exclude-dir and --include-dir constraints if pathname != "."+      if (strcmp(pathname, ".") != 0)       {-        // could not open, try GREP_PATH environment variable-        char *env_grep_path = NULL;-        dupenv_s(&env_grep_path, "GREP_PATH");+        // do not exclude directories that are reversed by ! negation+        bool negate = false;+        for (auto& glob : flag_not_exclude_dir)+          if ((negate = glob_match(pathname, basename, glob.c_str())))+            break; -        if (env_grep_path != NULL)+        if (!negate)         {-          std::string path_file(env_grep_path);-          path_file.append(PATHSEPSTR).append(filename);+          // exclude directories whose basename matches any one of the --exclude-dir globs+          for (auto& glob : flag_all_exclude_dir)+            if (glob_match(pathname, basename, glob.c_str()))+              return Type::SKIP;+        } -          if (fopen_s(&file, path_file.c_str(), "r") != 0)-            file = NULL;+        if (!flag_all_include_dir.empty())+        {+          // do not include directories that are reversed by ! negation+          for (auto& glob : flag_not_include_dir)+            if (glob_match(pathname, basename, glob.c_str()))+              return Type::SKIP; -          free(env_grep_path);+          // include directories whose basename matches any one of the --include-dir globs+          bool ok = false;+          for (auto& glob : flag_all_include_dir)+            if ((ok = glob_match(pathname, basename, glob.c_str())))+              break;+          if (!ok)+            return Type::SKIP;         }       } -#ifdef GREP_PATH-      if (file == NULL)-      {-        std::string path_file(GREP_PATH);-        path_file.append(PATHSEPSTR).append(filename);+      return Type::DIRECTORY;+    }+  }+  else if ((attr & FILE_ATTRIBUTE_DEVICE) == 0 || flag_devices_action == Action::READ)+  {+    // --depth: recursion level not deep enough?+    if (flag_min_depth > 0 && level <= flag_min_depth)+      return Type::SKIP; -        if (fopen_s(&file, path_file.c_str(), "r") != 0)-          file = NULL;-      }-#endif+    // do not exclude files that are reversed by ! negation+    bool negate = false;+    for (auto& glob : flag_not_exclude)+      if ((negate = glob_match(pathname, basename, glob.c_str())))+        break; -      if (file == NULL)-        error("cannot read", filename.c_str());+    if (!negate)+    {+      // exclude files whose basename matches any one of the --exclude globs+      for (auto& glob : flag_all_exclude)+        if (glob_match(pathname, basename, glob.c_str()))+          return Type::SKIP;+    } -      reflex::BufferedInput input(file);-      std::string line;+    // check magic pattern against the file signature, when --file-magic=MAGIC is specified+    if (!flag_file_magic.empty())+    {+      FILE *file; -      while (true)+      if (fopen_s(&file, pathname, (flag_binary || flag_decompress ? "rb" : "r")) != 0)       {-        // read the next line-        if (getline(input, line))-          break;--        // add line to the regex if not empty-        if (!line.empty())-          regex.append(Q).append(line).append(E);+        warning("cannot read", pathname);+        return Type::SKIP;       } -      if (file != stdin)-        fclose(file);-    }--    // remove the ending '|' from the |-concatenated regexes in the regex string-    regex.pop_back();+#ifdef HAVE_LIBZ+      if (flag_decompress)+      {+        zstreambuf streambuf(pathname, file);+        std::istream stream(&streambuf); -    // -x or -w-    if (flag_line_regexp)-      regex.insert(0, "^(").append(")$"); // make the regex line-anchored-    else if (flag_word_regexp)-      regex.insert(0, "\\<(").append(")\\>"); // make the regex word-anchored-  }+        // file has the magic bytes we're looking for: search the file+        size_t match = magic_matcher.input(&stream).scan();+        if (match == flag_not_magic || match >= flag_min_magic)+        {+          fclose(file); -  // -j: case insensitive search if regex does not contain an upper case letter-  if (flag_smart_case)-  {-    flag_ignore_case = true;+          Stats::score_file(); -    for (size_t i = 0; i < regex.size(); ++i)-    {-      if (regex[i] == '\\')-      {-        ++i;-      }-      else if (regex[i] == '{')-      {-        while (++i < regex.size() && regex[i] != '}')-          continue;+          return Type::OTHER;+        }       }-      else if (isupper(regex[i]))+      else+#endif       {-        flag_ignore_case = false;-        break;-      }-    }-  }--  // -y: disable -A, -B, and -C-  if (flag_any_line)-    flag_after_context = flag_before_context = 0;--  // -A, -B, or -C: disable -o-  if (flag_after_context > 0 || flag_before_context > 0)-    flag_only_matching = false;--  // -v or -y: disable -o and -u-  if (flag_invert_match || flag_any_line)-    flag_only_matching = flag_ungroup = false;+        size_t match = magic_matcher.input(reflex::Input(file, flag_encoding_type)).scan();+        if (match == flag_not_magic || match >= flag_min_magic)+        {+          fclose(file); -  // --depth: if -R or -r is not specified then enable -R -  if ((flag_min_depth > 0 || flag_max_depth > 0) && flag_directories_action != Action::RECURSE)-  {-    flag_directories_action = Action::RECURSE;-    flag_dereference = true;-  }+          Stats::score_file(); -  // -p (--no-dereference) and -S (--dereference): -p takes priority over -S and -R-  if (flag_no_dereference)-    flag_dereference = false;+          return Type::OTHER;+        }+      } -  // display file name if more than one input file is specified or options -R, -r, and option -h --no-filename is not specified-  if (!flag_no_filename && (flag_all_threads || flag_directories_action == Action::RECURSE || arg_files.size() > 1 || (flag_stdin && !arg_files.empty())))-    flag_with_filename = true;+      fclose(file); -  // --only-line-number implies -n-  if (flag_only_line_number)-    flag_line_number = true;+      if (flag_all_include.empty())+        return Type::SKIP;+    } -  // if no display options -H, -n, -k, -b are set, enable --no-labels to suppress labels for speed-  if (!flag_with_filename && !flag_line_number && !flag_column_number && !flag_byte_offset)-    flag_no_header = true;+    if (!flag_all_include.empty())+    {+      // do not include files that are reversed by ! negation+      for (auto& glob : flag_not_include)+        if (glob_match(pathname, basename, glob.c_str()))+          return Type::SKIP; -  // -q: we only need to find one matching file and we're done-  if (flag_quiet)-  {-    flag_max_files = 1;+      // include files whose basename matches any one of the --include globs+      bool ok = false;+      for (auto& glob : flag_all_include)+        if ((ok = glob_match(pathname, basename, glob.c_str())))+          break;+      if (!ok)+        return Type::SKIP;+    } -    // -q overrides -l and -L-    flag_files_with_matches = false;-    flag_files_without_match = false;-  }+    Stats::score_file(); -  // -L: enable -l and flip -v i.e. -L=-lv and -l=-Lv-  if (flag_files_without_match)-  {-    flag_files_with_matches = true;-    flag_invert_match = !flag_invert_match;+    return Type::OTHER;   } -  // -l or -L: enable -H, disable -c-  if (flag_files_with_matches)-  {-    flag_with_filename = true;-    flag_count = false;-  }+#else -  // --heading: enable --break when filenames are shown-  if (flag_heading && flag_with_filename)-    flag_break = true;+  struct stat buf; -  // -J: when not set the default is the number of cores (or hardware threads), limited to MAX_JOBS-  if (flag_jobs == 0)+  // if dir entry is unknown, use lstat() to check if pathname is a symlink+  if (type != DIRENT_TYPE_UNKNOWN || lstat(pathname, &buf) == 0)   {-    unsigned int cores = std::thread::hardware_concurrency();-    unsigned int concurrency = cores > 2 ? cores : 2;-    flag_jobs = std::min(concurrency, MAX_JOBS);-  }--  // --sort and --max-files: limit number of threads to --max-files to prevent unordered results, this is a special case-  if (flag_sort_key != Sort::NA && flag_max_files > 0)-    flag_jobs = std::min(flag_jobs, flag_max_files);--  // set the number of threads to the number of files or when recursing to the value of -J, --jobs-  if (flag_all_threads || flag_directories_action == Action::RECURSE)-    threads = flag_jobs;-  else-    threads = std::min(arg_files.size() + flag_stdin, flag_jobs);+    // symlinks are followed when specified on the command line (unless option -p) or with options -R, -S, --dereference+    if ((is_argument && !flag_no_dereference) || flag_dereference || (type != DIRENT_TYPE_UNKNOWN ? type != DIRENT_TYPE_LNK : !S_ISLNK(buf.st_mode)))+    {+      // if we got a symlink, use stat() to check if pathname is a directory or a regular file, we also stat when sorting by stat info+      if (((flag_sort_key == Sort::NA || flag_sort_key == Sort::NAME) && type != DIRENT_TYPE_UNKNOWN && type != DIRENT_TYPE_LNK) || stat(pathname, &buf) == 0)+      {+        // check if directory+        if (type == DIRENT_TYPE_DIR || ((type == DIRENT_TYPE_UNKNOWN || type == DIRENT_TYPE_LNK) && S_ISDIR(buf.st_mode)))+        {+          if (flag_directories_action == Action::READ)+          {+            // directories cannot be read actually, so grep produces a warning message (errno is not set)+            is_directory(pathname);+            return Type::SKIP;+          } -  // negative character classes do not match newlines-  reflex::convert_flag_type convert_flags = reflex::convert_flag::notnewline;+          if (is_argument || flag_directories_action == Action::RECURSE)+          {+            // --depth: recursion level exceeds max depth?+            if (flag_max_depth > 0 && level > flag_max_depth)+              return Type::SKIP; -  // not -U: convert regex to Unicode-  if (!flag_binary)-    convert_flags |= reflex::convert_flag::unicode;+            // hard maximum recursion depth reached?+            if (level > MAX_DEPTH)+            {+              if (!flag_no_messages)+                fprintf(stderr, "%sugrep: %s%s%s recursion depth hit hard limit of %d\n", color_off, color_high, pathname, color_off, MAX_DEPTH);+              return Type::SKIP;+            } -  // -G: convert basic regex (BRE) to extended regex (ERE)-  if (flag_basic_regexp)-    convert_flags |= reflex::convert_flag::basic;+            // check for --exclude-dir and --include-dir constraints if pathname != "."+            if (strcmp(pathname, ".") != 0)+            {+              // do not exclude directories that are reversed by ! negation+              bool negate = false;+              for (auto& glob : flag_not_exclude_dir)+                if ((negate = glob_match(pathname, basename, glob.c_str())))+                  break; -  // set reflex::Pattern options to enable multiline mode-  std::string pattern_options("(?m");+              if (!negate)+              {+                // exclude directories whose pathname matches any one of the --exclude-dir globs+                for (auto& glob : flag_all_exclude_dir)+                  if (glob_match(pathname, basename, glob.c_str()))+                    return Type::SKIP;+              } -  // -i: case insensitive reflex::Pattern option, applies to ASCII only-  if (flag_ignore_case)-    pattern_options.push_back('i');+              if (!flag_all_include_dir.empty())+              {+                // do not include directories that are reversed by ! negation+                for (auto& glob : flag_not_include_dir)+                  if (glob_match(pathname, basename, glob.c_str()))+                    return Type::SKIP; -  // --free-space: this is needed to check free-space conformance by the converter-  if (flag_free_space)-  {-    convert_flags |= reflex::convert_flag::freespace;-    pattern_options.push_back('x');-  }+                // include directories whose pathname matches any one of the --include-dir globs+                bool ok = false;+                for (auto& glob : flag_all_include_dir)+                  if ((ok = glob_match(pathname, basename, glob.c_str())))+                    break;+                if (!ok)+                  return Type::SKIP;+              }+            } -  // prepend the pattern options (?m...) to the regex-  pattern_options.push_back(')');-  regex = pattern_options + regex;+            if (type != DIRENT_TYPE_DIR)+              inode = buf.st_ino; -  // reflex::Matcher options-  std::string matcher_options;+            info = Entry::sort_info(buf); -  // -Y: permit empty pattern matches-  if (flag_empty)-    matcher_options.push_back('N');+            return Type::DIRECTORY;+          }+        }+        else if (type == DIRENT_TYPE_REG ? !is_output(inode) : (type == DIRENT_TYPE_UNKNOWN || type == DIRENT_TYPE_LNK) && S_ISREG(buf.st_mode) ? !is_output(buf.st_ino) : flag_devices_action == Action::READ)+        {+          // --depth: recursion level not deep enough?+          if (flag_min_depth > 0 && level <= flag_min_depth)+            return Type::SKIP; -  // --tabs: set reflex::Matcher option T to NUM (1, 2, 4, or 8) tab size-  if (flag_tabs)-    matcher_options.append("T=").push_back(static_cast<char>(flag_tabs) + '0');+          // do not exclude files that are reversed by ! negation+          bool negate = false;+          for (auto& glob : flag_not_exclude)+            if ((negate = glob_match(pathname, basename, glob.c_str())))+              break; -  // --format-begin-  if (!flag_quiet && flag_format_begin != NULL)-    format(flag_format_begin, 0);+          if (!negate)+          {+            // exclude files whose pathname matches any one of the --exclude globs+            for (auto& glob : flag_all_exclude)+              if (glob_match(pathname, basename, glob.c_str()))+                return Type::SKIP;+          } -  size_t nodes = 0;-  size_t edges = 0;-  size_t words = 0;-  size_t nodes_time = 0;-  size_t edges_time = 0;-  size_t words_time = 0;+          // check magic pattern against the file signature, when --file-magic=MAGIC is specified+          if (!flag_file_magic.empty())+          {+            FILE *file; -  // -P: Perl matching with Boost.Regex-  if (flag_perl_regexp)-  {-#if defined(HAVE_PCRE2)-    // construct the PCRE2 JIT-optimized NFA-based Perl pattern matcher-    std::string pattern(reflex::PCRE2Matcher::convert(regex, convert_flags));-    reflex::PCRE2Matcher matcher(pattern, reflex::Input(), matcher_options.c_str());+            if (fopen_s(&file, pathname, (flag_binary || flag_decompress ? "rb" : "r")) != 0)+            {+              warning("cannot read", pathname);+              return Type::SKIP;+            } -    if (threads > 1)-    {-      GrepMaster grep(output, &matcher);-      grep.ugrep();-    }-    else-    {-      Grep grep(output, &matcher);-      set_grep_handle(&grep);-      grep.ugrep();-      clear_grep_handle();-    }-#elif defined(HAVE_BOOST_REGEX)-    try-    {-      // construct the Boost.Regex NFA-based Perl pattern matcher-      std::string pattern(reflex::BoostPerlMatcher::convert(regex, convert_flags));-      reflex::BoostPerlMatcher matcher(pattern, reflex::Input(), matcher_options.c_str());+#ifdef HAVE_LIBZ+            if (flag_decompress)+            {+              zstreambuf streambuf(pathname, file);+              std::istream stream(&streambuf); -      if (threads > 1)-      {-        GrepMaster grep(output, &matcher);-        grep.ugrep();-      }-      else-      {-        Grep grep(output, &matcher);-        set_grep_handle(&grep);-        grep.ugrep();-        clear_grep_handle();-      }-    }+              // file has the magic bytes we're looking for: search the file+              size_t match = magic_matcher.input(&stream).scan();+              if (match == flag_not_magic || match >= flag_min_magic)+              {+                fclose(file); -    catch (boost::regex_error& error)-    {-      const char *message;-      reflex::regex_error_type code;+                Stats::score_file(); -      switch (error.code())-      {-        case boost::regex_constants::error_collate:-          code = reflex::regex_error::invalid_collating;-          break;-        case boost::regex_constants::error_ctype:-          code = reflex::regex_error::invalid_class;-          break;-        case boost::regex_constants::error_escape:-          code = reflex::regex_error::invalid_escape;-          break;-        case boost::regex_constants::error_backref:-          code = reflex::regex_error::invalid_backreference;-          break;-        case boost::regex_constants::error_brack:-          code = reflex::regex_error::invalid_class;-          break;-        case boost::regex_constants::error_paren:-          code = reflex::regex_error::mismatched_parens;-          break;-        case boost::regex_constants::error_brace:-          code = reflex::regex_error::mismatched_braces;-          break;-        case boost::regex_constants::error_badbrace:-          code = reflex::regex_error::invalid_repeat;-          break;-        case boost::regex_constants::error_range:-          code = reflex::regex_error::invalid_class_range;-          break;-        case boost::regex_constants::error_space:-          code = reflex::regex_error::exceeds_limits;-          break;-        case boost::regex_constants::error_badrepeat:-          code = reflex::regex_error::invalid_repeat;-          break;-        case boost::regex_constants::error_complexity:-          code = reflex::regex_error::exceeds_limits;-          break;-        case boost::regex_constants::error_stack:-          code = reflex::regex_error::exceeds_limits;-          break;-        default:-          code = reflex::regex_error::invalid_syntax;-      }+                info = Entry::sort_info(buf); -      throw reflex::regex_error(code, regex, error.position() + 1);-    }+                return Type::OTHER;+              }+            }+            else #endif-  }-  else-  {-    // construct the RE/flex DFA-based pattern matcher and start matching files-    reflex::Pattern pattern(reflex::Matcher::convert(regex, convert_flags), "r");--    if (flag_fuzzy > 0)-    {-      reflex::FuzzyMatcher matcher(pattern, static_cast<uint16_t>(flag_fuzzy), reflex::Input(), matcher_options.c_str());--      if (threads > 1)-      {-        GrepMaster grep(output, &matcher);-        grep.ugrep();-      }-      else-      {-        Grep grep(output, &matcher);-        set_grep_handle(&grep);-        grep.ugrep();-        clear_grep_handle();-      }-    }-    else-    {-      reflex::Matcher matcher(pattern, reflex::Input(), matcher_options.c_str());+            {+              // if file has the magic bytes we're looking for: search the file+              size_t match = magic_matcher.input(reflex::Input(file, flag_encoding_type)).scan();+              if (match == flag_not_magic || match >= flag_min_magic)+              {+                fclose(file); -      if (threads > 1)-      {-        GrepMaster grep(output, &matcher);-        grep.ugrep();-      }-      else-      {-        Grep grep(output, &matcher);-        set_grep_handle(&grep);-        grep.ugrep();-        clear_grep_handle();-      }-    }+                Stats::score_file(); -    nodes = pattern.nodes();-    edges = pattern.edges();-    words = pattern.words();-    nodes_time = static_cast<size_t>(pattern.nodes_time());-    edges_time = static_cast<size_t>(pattern.parse_time() + pattern.edges_time());-    words_time = static_cast<size_t>(pattern.words_time());-  }+                info = Entry::sort_info(buf); -  // --format-end-  if (!flag_quiet && flag_format_end != NULL)-    format(flag_format_end, Stats::found_parts());+                return Type::OTHER;+              }+            } -  // --stats: display stats when we're done-  if (flag_stats != NULL)-  {-    Stats::report();+            fclose(file); -    if (strcmp(flag_stats, "vm") == 0 && words > 0)-      fprintf(output, "VM memory: %zu nodes (%zums), %zu edges (%zums), %zu opcode words (%zums)\n", nodes, nodes_time, edges, edges_time, words, words_time);-  }+            if (flag_all_include.empty())+              return Type::SKIP;+          } -  // close the pipe to the forked pager-  if (flag_pager != NULL && output != NULL && output != stdout)-    pclose(output);-}+          if (!flag_all_include.empty())+          {+            // do not include files that are reversed by ! negation+            for (auto& glob : flag_not_include)+              if (glob_match(pathname, basename, glob.c_str()))+                return Type::SKIP; -// cancel the search-void cancel_ugrep()-{-  std::unique_lock<std::mutex> lock(grep_handle_mutex);-  if (grep_handle != NULL)-    grep_handle->out.cancel();-}+            // include files whose pathname matches any one of the --include globs+            bool ok = false;+            for (auto& glob : flag_all_include)+              if ((ok = glob_match(pathname, basename, glob.c_str())))+                break;+            if (!ok)+              return Type::SKIP;+          } -// set the handle to be able to use cancel_ugrep()-void set_grep_handle(Grep *grep)-{-  std::unique_lock<std::mutex> lock(grep_handle_mutex);-  grep_handle = grep;-}+          Stats::score_file(); -// reset the grep handle-void clear_grep_handle()-{-  std::unique_lock<std::mutex> lock(grep_handle_mutex);-  grep_handle = NULL;-}+          info = Entry::sort_info(buf); -// search the specified files or standard input for pattern matches-void Grep::ugrep()-{-  if (!flag_stdin && arg_files.empty())-  {-    recurse(1, ".");+          return Type::OTHER;+        }+      }+    }   }   else   {-    // read each input file to find pattern matches-    if (flag_stdin)-    {-      Stats::score_file();--      // search standard input-      search(NULL);-    }+    warning(NULL, pathname);+  } -#ifndef OS_WIN-    std::pair<std::set<ino_t>::iterator,bool> vino; #endif -    for (auto file : arg_files)-    {-      // stop after finding max-files matching files-      if (flag_max_files > 0 && Stats::found_parts() >= flag_max_files)-        break;+  return Type::SKIP;+} -      // stop when output is blocked or search cancelled-      if (out.eof)-        break;+// recurse over directory, searching for pattern matches in files and subdirectories+void Grep::recurse(size_t level, const char *pathname)+{+#ifdef OS_WIN -      // search file or directory, get the basename from the file argument first-      const char *basename = strrchr(file, PATHSEPCHR);-      if (basename != NULL)-        ++basename;-      else-        basename = file;+  WIN32_FIND_DATAA ffd; -      ino_t inode = 0;-      uint64_t info;+  std::string glob; -      // search file, unless searchable directory into which we should recurse-      switch (select(1, file, basename, DIRENT_TYPE_UNKNOWN, inode, info, true))-      {-        case Type::DIRECTORY:-#ifndef OS_WIN-          if (flag_dereference)-            vino = visited.insert(inode);-#endif+  if (strcmp(pathname, ".") != 0)+    glob.assign(pathname).append("/*");+  else+    glob.assign("*"); -          recurse(1, file);+  HANDLE hFind = FindFirstFileA(glob.c_str(), &ffd); -#ifndef OS_WIN-          if (flag_dereference)-            visited.erase(vino.first);-#endif-          break;+  if (hFind == INVALID_HANDLE_VALUE) +  {+    if (GetLastError() != ERROR_FILE_NOT_FOUND)+      warning("cannot open directory", pathname);+    return;+  }  -        case Type::OTHER:-          search(file);-          break;+#else -        case Type::SKIP:-          break;-      }+#ifdef HAVE_STATVFS++  if (!exclude_fs_ids.empty() || !include_fs_ids.empty())+  {+    struct statvfs buf;++    if (statvfs(pathname, &buf) == 0)+    {+      uint64_t id = static_cast<uint64_t>(buf.f_fsid);++      if (exclude_fs_ids.find(id) != exclude_fs_ids.end())+        return;++      if (!include_fs_ids.empty() && include_fs_ids.find(id) == include_fs_ids.end())+        return;     }   }-}--// search file or directory for pattern matches-Grep::Type Grep::select(size_t level, const char *pathname, const char *basename, int type, ino_t& inode, uint64_t& info, bool is_argument)-{-  if (*basename == '.' && !flag_hidden && !is_argument)-    return Type::SKIP; -#ifdef OS_WIN+#endif -  DWORD attr = GetFileAttributesA(pathname);+  DIR *dir = opendir(pathname); -  if (attr == INVALID_FILE_ATTRIBUTES)+  if (dir == NULL)   {-    errno = ENOENT;-    warning("cannot read", pathname);-    return Type::SKIP;+    warning("cannot open directory", pathname);+    return;   } -  if (!flag_hidden && !is_argument && ((attr & FILE_ATTRIBUTE_HIDDEN) || (attr & FILE_ATTRIBUTE_SYSTEM)))-    return Type::SKIP;+#endif -  if ((attr & FILE_ATTRIBUTE_DIRECTORY))+  // --ignore-files: check if one or more a present to read and extend the file and dir exclusions+  // std::vector<std::string> *save_exclude = NULL, *save_exclude_dir = NULL, *save_not_exclude = NULL, *save_not_exclude_dir = NULL;+  std::unique_ptr<std::vector<std::string>> save_all_exclude, save_all_exclude_dir, save_not_exclude, save_not_exclude_dir;+  bool saved = false;++  if (!flag_ignore_files.empty())   {-    if (flag_directories_action == Action::READ)-    {-      // directories cannot be read actually, so grep produces a warning message (errno is not set)-      is_directory(pathname);-      return Type::SKIP;-    }+    std::string filename; -    if (is_argument || flag_directories_action == Action::RECURSE)+    for (auto& i : flag_ignore_files)     {-      // --depth: recursion level exceeds max depth?-      if (flag_max_depth > 0 && level > flag_max_depth)-        return Type::SKIP;--      // hard maximum recursion depth reached?-      if (level > MAX_DEPTH)-      {-        if (!flag_no_messages)-          fprintf(stderr, "%sugrep: %s%s%s recursion depth hit hard limit of %d\n", color_off, color_high, pathname, color_off, MAX_DEPTH);-        return Type::SKIP;-      }+      filename.assign(pathname).append(PATHSEPSTR).append(i); -      // check for --exclude-dir and --include-dir constraints if pathname != "."-      if (strcmp(pathname, ".") != 0)+      FILE *file = NULL;+      if (fopen_s(&file, filename.c_str(), "r") == 0)       {-        // do not exclude directories that are reversed by ! negation-        bool negate = false;-        for (auto& glob : flag_not_exclude_dir)-          if ((negate = glob_match(pathname, basename, glob.c_str())))-            break;--        if (!negate)-        {-          // exclude directories whose basename matches any one of the --exclude-dir globs-          for (auto& glob : flag_all_exclude_dir)-            if (glob_match(pathname, basename, glob.c_str()))-              return Type::SKIP;-        }--        if (!flag_all_include_dir.empty())+        if (!saved)         {-          // do not include directories that are reversed by ! negation-          for (auto& glob : flag_not_include_dir)-            if (glob_match(pathname, basename, glob.c_str()))-              return Type::SKIP;--          // include directories whose basename matches any one of the --include-dir globs-          bool ok = false;-          for (auto& glob : flag_all_include_dir)-            if ((ok = glob_match(pathname, basename, glob.c_str())))-              break;-          if (!ok)-            return Type::SKIP;+          save_all_exclude = std::unique_ptr<std::vector<std::string>>(new std::vector<std::string>);+          save_all_exclude->swap(flag_all_exclude);+          save_all_exclude_dir = std::unique_ptr<std::vector<std::string>>(new std::vector<std::string>);+          save_all_exclude_dir->swap(flag_all_exclude_dir);+          save_not_exclude = std::unique_ptr<std::vector<std::string>>(new std::vector<std::string>);+          save_not_exclude->swap(flag_not_exclude);+          save_not_exclude_dir = std::unique_ptr<std::vector<std::string>>(new std::vector<std::string>);+          save_not_exclude_dir->swap(flag_not_exclude_dir);++          saved = true;         }-      } -      return Type::DIRECTORY;+        Stats::ignore_file(filename);+        extend(file, flag_all_exclude, flag_all_exclude_dir, flag_not_exclude, flag_not_exclude_dir);+        fclose(file);+      }     }   }-  else if ((attr & FILE_ATTRIBUTE_DEVICE) == 0 || flag_devices_action == Action::READ)-  {-    // --depth: recursion level not deep enough?-    if (flag_min_depth > 0 && level <= flag_min_depth)-      return Type::SKIP; -    // do not exclude files that are reversed by ! negation-    bool negate = false;-    for (auto& glob : flag_not_exclude)-      if ((negate = glob_match(pathname, basename, glob.c_str())))-        break;+  Stats::score_dir(); -    if (!negate)-    {-      // exclude files whose basename matches any one of the --exclude globs-      for (auto& glob : flag_all_exclude)-        if (glob_match(pathname, basename, glob.c_str()))-          return Type::SKIP;-    }+  std::vector<Entry> content;+  std::vector<Entry> subdirs;+  std::string dirpathname; -    // check magic pattern against the file signature, when --file-magic=MAGIC is specified-    if (!flag_file_magic.empty())+#ifdef OS_WIN++  do+  {+    // search directory entries that aren't . or .. or hidden when --no-hidden is enabled+    if (ffd.cFileName[0] != '.' || (flag_hidden && ffd.cFileName[1] != '\0' && ffd.cFileName[1] != '.'))     {-      FILE *file;+      if (pathname[0] == '.' && pathname[1] == '\0')+        dirpathname.assign(ffd.cFileName);+      else+        dirpathname.assign(pathname).append(PATHSEPSTR).append(ffd.cFileName); -      if (fopen_s(&file, pathname, (flag_binary || flag_decompress ? "rb" : "r")) != 0)-      {-        warning("cannot read", pathname);-        return Type::SKIP;-      }+      ino_t inode = 0;+      uint64_t info = 0; -#ifdef HAVE_LIBZ-      if (flag_decompress)+      // --sort: get file info+      if (flag_sort_key != Sort::NA && flag_sort_key != Sort::NAME)       {-        zstreambuf streambuf(pathname, file);-        std::istream stream(&streambuf);--        // file has the magic bytes we're looking for: search the file-        size_t match = magic_matcher.input(&stream).scan();-        if (match == flag_not_magic || match >= flag_min_magic)+        if (flag_sort_key == Sort::SIZE)         {-          fclose(file);--          Stats::score_file();--          return Type::OTHER;+          info = static_cast<uint64_t>(ffd.nFileSizeLow) | (static_cast<uint64_t>(ffd.nFileSizeHigh) << 32);+        }+        else+        {+          struct _FILETIME& time = flag_sort_key == Sort::USED ? ffd.ftLastAccessTime : flag_sort_key == Sort::CHANGED ? ffd.ftLastWriteTime : ffd.ftCreationTime;+          info = static_cast<uint64_t>(time.dwLowDateTime) | (static_cast<uint64_t>(time.dwHighDateTime) << 32);         }       }-      else-#endif++      // search dirpathname, unless searchable directory into which we should recurse+      switch (select(level + 1, dirpathname.c_str(), ffd.cFileName, DIRENT_TYPE_UNKNOWN, inode, info))       {-        size_t match = magic_matcher.input(reflex::Input(file, flag_encoding_type)).scan();-        if (match == flag_not_magic || match >= flag_min_magic)-        {-          fclose(file);+        case Type::DIRECTORY:+          subdirs.emplace_back(dirpathname, 0, info);+          break; -          Stats::score_file();+        case Type::OTHER:+          if (flag_sort_key == Sort::NA)+            search(dirpathname.c_str());+          else+            content.emplace_back(dirpathname, 0, info);+          break; -          return Type::OTHER;-        }+        case Type::SKIP:+          break;       } -      fclose(file);+      // stop after finding max-files matching files+      if (flag_max_files > 0 && Stats::found_parts() >= flag_max_files)+        break; -      if (flag_all_include.empty())-        return Type::SKIP;+      // stop when output is blocked or search cancelled+      if (out.eof)+        break;     }+  } while (FindNextFileA(hFind, &ffd) != 0); -    if (!flag_all_include.empty())+  FindClose(hFind);++#else++  struct dirent *dirent = NULL;++  while ((dirent = readdir(dir)) != NULL)+  {+    // search directory entries that aren't . or .. or hidden when --no-hidden is enabled+    if (dirent->d_name[0] != '.' || (flag_hidden && dirent->d_name[1] != '\0' && dirent->d_name[1] != '.'))     {-      // do not include files that are reversed by ! negation-      for (auto& glob : flag_not_include)-        if (glob_match(pathname, basename, glob.c_str()))-          return Type::SKIP;+      if (pathname[0] == '.' && pathname[1] == '\0')+        dirpathname.assign(dirent->d_name);+      else+        dirpathname.assign(pathname).append(PATHSEPSTR).append(dirent->d_name); -      // include files whose basename matches any one of the --include globs-      bool ok = false;-      for (auto& glob : flag_all_include)-        if ((ok = glob_match(pathname, basename, glob.c_str())))+      Type type;+      ino_t inode;+      uint64_t info;++      // search dirpathname, unless searchable directory into which we should recurse+#if defined(HAVE_STRUCT_DIRENT_D_TYPE) && defined(HAVE_STRUCT_DIRENT_D_INO)+      inode = dirent->d_ino;+      type = select(level + 1, dirpathname.c_str(), dirent->d_name, dirent->d_type, inode, info);+#else+      inode = 0;+      type = select(level + 1, dirpathname.c_str(), dirent->d_name, DIRENT_TYPE_UNKNOWN, inode, info);+#endif++      switch (type)+      {+        case Type::DIRECTORY:+          subdirs.emplace_back(dirpathname, inode, info);           break;-      if (!ok)-        return Type::SKIP;-    } -    Stats::score_file();+        case Type::OTHER:+          if (flag_sort_key == Sort::NA)+            search(dirpathname.c_str());+          else+            content.emplace_back(dirpathname, inode, info);+          break; -    return Type::OTHER;+        case Type::SKIP:+          break;+      }++      // stop after finding max-files matching files+      if (flag_max_files > 0 && Stats::found_parts() >= flag_max_files)+        break;++      // stop when output is blocked or search cancelled+      if (out.eof)+        break;+    }   } -#else+  closedir(dir); -  struct stat buf;+#endif -  // if dir entry is unknown, use lstat() to check if pathname is a symlink-  if (type != DIRENT_TYPE_UNKNOWN || lstat(pathname, &buf) == 0)+  // -Z and --sort=best: presearch the selected files to determine edit distance cost+  if (flag_fuzzy > 0 && flag_sort_key == Sort::BEST)   {-    // symlinks are followed when specified on the command line (unless option -p) or with options -R, -S, --dereference-    if ((is_argument && !flag_no_dereference) || flag_dereference || (type != DIRENT_TYPE_UNKNOWN ? type != DIRENT_TYPE_LNK : !S_ISLNK(buf.st_mode)))+    std::vector<Entry>::iterator entry = content.begin();+    while (entry != content.end())     {-      // if we got a symlink, use stat() to check if pathname is a directory or a regular file, we also stat when sorting by stat info-      if (((flag_sort_key == Sort::NA || flag_sort_key == Sort::NAME) && type != DIRENT_TYPE_UNKNOWN && type != DIRENT_TYPE_LNK) || stat(pathname, &buf) == 0)-      {-        // check if directory-        if (type == DIRENT_TYPE_DIR || ((type == DIRENT_TYPE_UNKNOWN || type == DIRENT_TYPE_LNK) && S_ISDIR(buf.st_mode)))-        {-          if (flag_directories_action == Action::READ)-          {-            // directories cannot be read actually, so grep produces a warning message (errno is not set)-            is_directory(pathname);-            return Type::SKIP;-          }+      entry->cost = cost(entry->pathname.c_str()); -          if (is_argument || flag_directories_action == Action::RECURSE)-          {-            // --depth: recursion level exceeds max depth?-            if (flag_max_depth > 0 && level > flag_max_depth)-              return Type::SKIP;+      // if a file has no match, remove it+      if (entry->cost == 65535)+        entry = content.erase(entry);+      else+        ++entry;+    }+  } -            // hard maximum recursion depth reached?-            if (level > MAX_DEPTH)-            {-              if (!flag_no_messages)-                fprintf(stderr, "%sugrep: %s%s%s recursion depth hit hard limit of %d\n", color_off, color_high, pathname, color_off, MAX_DEPTH);-              return Type::SKIP;-            }+  // --sort: sort the selected non-directory entries and search them+  if (flag_sort_key != Sort::NA)+  {+    if (flag_sort_key == Sort::NAME)+    {+      if (flag_sort_rev)+        std::sort(content.begin(), content.end(), Entry::rev_comp_by_path);+      else+        std::sort(content.begin(), content.end(), Entry::comp_by_path);+    }+    else if (flag_sort_key == Sort::BEST)+    {+      if (flag_sort_rev)+        std::sort(content.begin(), content.end(), Entry::rev_comp_by_best);+      else+        std::sort(content.begin(), content.end(), Entry::comp_by_best);+    }+    else+    {+      if (flag_sort_rev)+        std::sort(content.begin(), content.end(), Entry::rev_comp_by_info);+      else+        std::sort(content.begin(), content.end(), Entry::comp_by_info);+    } -            // check for --exclude-dir and --include-dir constraints if pathname != "."-            if (strcmp(pathname, ".") != 0)-            {-              // do not exclude directories that are reversed by ! negation-              bool negate = false;-              for (auto& glob : flag_not_exclude_dir)-                if ((negate = glob_match(pathname, basename, glob.c_str())))-                  break;+    // search the select sorted non-directory entries+    for (auto& entry : content)+    {+      search(entry.pathname.c_str()); -              if (!negate)-              {-                // exclude directories whose pathname matches any one of the --exclude-dir globs-                for (auto& glob : flag_all_exclude_dir)-                  if (glob_match(pathname, basename, glob.c_str()))-                    return Type::SKIP;-              }+      // stop after finding max-files matching files+      if (flag_max_files > 0 && Stats::found_parts() >= flag_max_files)+        break; -              if (!flag_all_include_dir.empty())-              {-                // do not include directories that are reversed by ! negation-                for (auto& glob : flag_not_include_dir)-                  if (glob_match(pathname, basename, glob.c_str()))-                    return Type::SKIP;+      // stop when output is blocked or search cancelled+      if (out.eof)+        break;+    }+  } -                // include directories whose pathname matches any one of the --include-dir globs-                bool ok = false;-                for (auto& glob : flag_all_include_dir)-                  if ((ok = glob_match(pathname, basename, glob.c_str())))-                    break;-                if (!ok)-                  return Type::SKIP;-              }-            }+  // --sort: sort the selected subdirectory entries+  if (flag_sort_key != Sort::NA)+  {+    if (flag_sort_key == Sort::NAME || flag_sort_key == Sort::BEST)+    {+      if (flag_sort_rev)+        std::sort(subdirs.begin(), subdirs.end(), Entry::rev_comp_by_path);+      else+        std::sort(subdirs.begin(), subdirs.end(), Entry::comp_by_path);+    }+    else+    {+      if (flag_sort_rev)+        std::sort(subdirs.begin(), subdirs.end(), Entry::rev_comp_by_info);+      else+        std::sort(subdirs.begin(), subdirs.end(), Entry::comp_by_info);+    }+  } -            if (type != DIRENT_TYPE_DIR)-              inode = buf.st_ino;+  // recurse into the selected subdirectories+  for (auto& entry : subdirs)+  {+    // stop after finding max-files matching files+    if (flag_max_files > 0 && Stats::found_parts() >= flag_max_files)+      break; -            info = Entry::sort_info(buf);+    // stop when output is blocked or search cancelled+    if (out.eof)+      break; -            return Type::DIRECTORY;-          }-        }-        else if (type == DIRENT_TYPE_REG ? !is_output(inode) : (type == DIRENT_TYPE_UNKNOWN || type == DIRENT_TYPE_LNK) && S_ISREG(buf.st_mode) ? !is_output(buf.st_ino) : flag_devices_action == Action::READ)-        {-          // --depth: recursion level not deep enough?-          if (flag_min_depth > 0 && level <= flag_min_depth)-            return Type::SKIP;+#ifndef OS_WIN+    // -R: check if this directory was visited before+    std::pair<std::set<ino_t>::iterator,bool> vino; -          // do not exclude files that are reversed by ! negation-          bool negate = false;-          for (auto& glob : flag_not_exclude)-            if ((negate = glob_match(pathname, basename, glob.c_str())))-              break;+    if (flag_dereference)+    {+      vino = visited.insert(entry.inode); -          if (!negate)-          {-            // exclude files whose pathname matches any one of the --exclude globs-            for (auto& glob : flag_all_exclude)-              if (glob_match(pathname, basename, glob.c_str()))-                return Type::SKIP;-          }+      // if visited before, then do not recurse on this directory again+      if (!vino.second)+        continue;+    }+#endif -          // check magic pattern against the file signature, when --file-magic=MAGIC is specified-          if (!flag_file_magic.empty())-          {-            FILE *file;+    recurse(level + 1, entry.pathname.c_str()); -            if (fopen_s(&file, pathname, (flag_binary || flag_decompress ? "rb" : "r")) != 0)-            {-              warning("cannot read", pathname);-              return Type::SKIP;-            }+#ifndef OS_WIN+    if (flag_dereference)+      visited.erase(vino.first);+#endif+  } -#ifdef HAVE_LIBZ-            if (flag_decompress)-            {-              zstreambuf streambuf(pathname, file);-              std::istream stream(&streambuf);+  // --ignore-files: restore if changed+  if (saved)+  {+    save_all_exclude->swap(flag_all_exclude);+    save_all_exclude_dir->swap(flag_all_exclude_dir);+    save_not_exclude->swap(flag_not_exclude);+    save_not_exclude_dir->swap(flag_not_exclude_dir);+  }+} -              // file has the magic bytes we're looking for: search the file-              size_t match = magic_matcher.input(&stream).scan();-              if (match == flag_not_magic || match >= flag_min_magic)-              {-                fclose(file);+// -Z and --sort=best: perform a presearch to determine edit distance cost, returns 65535 when no match is found+uint16_t Grep::cost(const char *pathname)+{+  // stop when output is blocked+  if (out.eof)+    return 0; -                Stats::score_file();+  // open (archive or compressed) file (pathname is NULL to read stdin), return on failure+  if (!open_file(pathname))+    return 0; -                info = Entry::sort_info(buf);+  // -Z: matcher is a FuzzyMatcher+  reflex::FuzzyMatcher *fuzzy_matcher = dynamic_cast<reflex::FuzzyMatcher*>(matcher); -                return Type::OTHER;-              }-            }-            else-#endif-            {-              // if file has the magic bytes we're looking for: search the file-              size_t match = magic_matcher.input(reflex::Input(file, flag_encoding_type)).scan();-              if (match == flag_not_magic || match >= flag_min_magic)-              {-                fclose(file);+  uint16_t cost = 65535; -                Stats::score_file();+  // -z: loop over extracted archive parts, when applicable+  do+  {+    try+    {+      if (init_read())+      {+        while (fuzzy_matcher->find())+        {+          if (fuzzy_matcher->edits() < cost)+            cost = fuzzy_matcher->edits(); -                info = Entry::sort_info(buf);+          // exact match?+          if (cost == 0)+            break;+        }+      }+    } -                return Type::OTHER;-              }-            }+    catch (...)+    {+      // this should never happen+      warning("exception while searching", pathname);+    } -            fclose(file);+    // close file or -z: loop over next extracted archive parts, when applicable+  } while (close_file(pathname)); -            if (flag_all_include.empty())-              return Type::SKIP;-          }+  return cost;+} -          if (!flag_all_include.empty())-          {-            // do not include files that are reversed by ! negation-            for (auto& glob : flag_not_include)-              if (glob_match(pathname, basename, glob.c_str()))-                return Type::SKIP;+// search input and display pattern matches+void Grep::search(const char *pathname)+{+  // stop when output is blocked+  if (out.eof)+    return; -            // include files whose pathname matches any one of the --include globs-            bool ok = false;-            for (auto& glob : flag_all_include)-              if ((ok = glob_match(pathname, basename, glob.c_str())))-                break;-            if (!ok)-              return Type::SKIP;-          }+  // open (archive or compressed) file (pathname is NULL to read stdin), return on failure+  if (!open_file(pathname))+    return; -          Stats::score_file();+  // pathname is NULL when stdin is searched+  if (pathname == NULL)+    pathname = flag_label; -          info = Entry::sort_info(buf);+  bool matched = false; -          return Type::OTHER;-        }-      }-    }-  }-  else+  // -z: loop over extracted archive parts, when applicable+  do   {-    warning(NULL, pathname);-  }+    try+    {+      size_t matches = 0; -#endif+      if (flag_quiet || flag_files_with_matches)+      {+        // option -q, -l, or -L -  return Type::SKIP;-}+        if (!init_read())+          goto exit_search; -// recurse over directory, searching for pattern matches in files and subdirectories-void Grep::recurse(size_t level, const char *pathname)-{-#ifdef OS_WIN+        matches = matcher->find() != 0; -  WIN32_FIND_DATAA ffd;+        // --range: max line exceeded?+        if (flag_max_line > 0 && matcher->lineno() > flag_max_line)+          matches = 0; -  std::string glob;+        // -v: invert+        if (flag_invert_match)+          matches = !matches;++        if (matches > 0)+        {+          // --format-open or format-close: we must acquire lock early before Stats::found_part()+          if (flag_files_with_matches && (flag_format_open != NULL || flag_format_close != NULL))+            out.acquire();++          // --max-files: max reached?+          if (!Stats::found_part())+            goto exit_search;++          // -l or -L+          if (flag_files_with_matches)+          {+            if (flag_format != NULL)+            {+              if (flag_format_open != NULL)+                out.format(flag_format_open, pathname, partname, Stats::found_parts(), matcher, false, Stats::found_parts() > 1);+              out.format(flag_format, pathname, partname, 1, matcher, false, false);+              if (flag_format_close != NULL)+                out.format(flag_format_close, pathname, partname, Stats::found_parts(), matcher, false, Stats::found_parts() > 1);+            }+            else+            {+              out.str(color_fn);+              out.str(pathname);+              if (!partname.empty())+              {+                out.chr('{');+                out.str(partname);+                out.chr('}');+              }+              out.str(color_off);+              out.chr(flag_null ? '\0' : '\n');+            }+          }+        }+      }+      else if (flag_count)+      {+        // option -c -  if (strcmp(pathname, ".") != 0)-    glob.assign(pathname).append("/*");-  else-    glob.assign("*");+        if (init_read())+        {+          if (flag_ungroup || flag_only_matching)+          {+            // -co or -cu: count the number of patterns matched in the file -  HANDLE hFind = FindFirstFileA(glob.c_str(), &ffd);+            while (matcher->find())+            {+              // --range: max line exceeded?+              if (flag_max_line > 0 && matcher->lineno() > flag_max_line)+                break; -  if (hFind == INVALID_HANDLE_VALUE) -  {-    if (GetLastError() != ERROR_FILE_NOT_FOUND)-      warning("cannot open directory", pathname);-    return;-  } +              ++matches; -#else+              // -m: max number of matches reached?+              if (flag_max_count > 0 && matches >= flag_max_count)+                break;+            }+          }+          else+          {+            // -c without -o/-u: count the number of matching lines -#ifdef HAVE_STATVFS+            size_t lineno = 0; -  if (!exclude_fs_ids.empty() || !include_fs_ids.empty())-  {-    struct statvfs buf;+            while (matcher->find())+            {+              size_t current_lineno = matcher->lineno(); -    if (statvfs(pathname, &buf) == 0)-    {-      uint64_t id = static_cast<uint64_t>(buf.f_fsid);+              if (lineno != current_lineno)+              {+                // --range: max line exceeded?+                if (flag_max_line > 0 && current_lineno > flag_max_line)+                  break; -      if (exclude_fs_ids.find(id) != exclude_fs_ids.end())-        return;+                ++matches; -      if (!include_fs_ids.empty() && include_fs_ids.find(id) == include_fs_ids.end())-        return;-    }-  }+                // -m: max number of matches reached?+                if (flag_max_count > 0 && matches >= flag_max_count)+                  break; -#endif+                lineno = current_lineno;+              }+            } -  DIR *dir = opendir(pathname);+            // -c with -v: count non-matching lines+            if (flag_invert_match)+            {+              matches = matcher->lineno() - matches;+              if (matches > 0)+                --matches;+            }+          }+        } -  if (dir == NULL)-  {-    warning("cannot open directory", pathname);-    return;-  }+        // --format-open or --format-close: we must acquire lock early before Stats::found_part()+        if (flag_format_open != NULL || flag_format_close != NULL)+          out.acquire(); -#endif+        // --max-files: max reached?+        if (matches > 0 || flag_format_open != NULL || flag_format_close != NULL)+          if (!Stats::found_part())+            goto exit_search; -  // --ignore-files: check if one or more a present to read and extend the file and dir exclusions-  // std::vector<std::string> *save_exclude = NULL, *save_exclude_dir = NULL, *save_not_exclude = NULL, *save_not_exclude_dir = NULL;-  std::unique_ptr<std::vector<std::string>> save_all_exclude, save_all_exclude_dir, save_not_exclude, save_not_exclude_dir;-  bool saved = false;+        if (flag_format != NULL)+        {+          if (flag_format_open != NULL)+            out.format(flag_format_open, pathname, partname, Stats::found_parts(), matcher, false, Stats::found_parts() > 1);+          out.format(flag_format, pathname, partname, matches, matcher, false, false);+          if (flag_format_close != NULL)+            out.format(flag_format_close, pathname, partname, Stats::found_parts(), matcher, false, Stats::found_parts() > 1);+        }+        else+        {+          if (flag_with_filename || !partname.empty())+          {+            out.str(color_fn);+            out.str(pathname);+            if (!partname.empty())+            {+              out.chr('{');+              out.str(partname);+              out.chr('}');+            }+            out.str(color_off); -  if (!flag_ignore_files.empty())-  {-    std::string filename;+            if (flag_null)+            {+              out.chr('\0');+            }+            else+            {+              out.str(color_se);+              out.str(flag_separator);+              out.str(color_off);+            }+          }+          out.num(matches);+          out.chr('\n');+        }+      }+      else if (flag_format != NULL)+      {+        // option --format -    for (auto& i : flag_ignore_files)-    {-      filename.assign(pathname).append(PATHSEPSTR).append(i);+        if (!init_read())+          goto exit_search; -      FILE *file = NULL;-      if (fopen_s(&file, filename.c_str(), "r") == 0)-      {-        if (!saved)+        while (matcher->find())         {-          save_all_exclude = std::unique_ptr<std::vector<std::string>>(new std::vector<std::string>);-          save_all_exclude->swap(flag_all_exclude);-          save_all_exclude_dir = std::unique_ptr<std::vector<std::string>>(new std::vector<std::string>);-          save_all_exclude_dir->swap(flag_all_exclude_dir);-          save_not_exclude = std::unique_ptr<std::vector<std::string>>(new std::vector<std::string>);-          save_not_exclude->swap(flag_not_exclude);-          save_not_exclude_dir = std::unique_ptr<std::vector<std::string>>(new std::vector<std::string>);-          save_not_exclude_dir->swap(flag_not_exclude_dir);--          saved = true;-        }+          // --range: max line exceeded?+          if (flag_max_line > 0 && matcher->lineno() > flag_max_line)+            break; -        Stats::ignore_file(filename);-        extend(file, flag_all_exclude, flag_all_exclude_dir, flag_not_exclude, flag_not_exclude_dir);-        fclose(file);-      }-    }-  }+          // output --format-open+          if (matches == 0)+          {+            // --format-open or --format-close: we must acquire lock early before Stats::found_part()+            if (flag_format_open != NULL || flag_format_close != NULL)+              out.acquire(); -  Stats::score_dir();+            // --max-files: max reached?+            if (!Stats::found_part())+              goto exit_search; -  std::vector<Entry> content;-  std::vector<Entry> subdirs;-  std::string dirpathname;+            if (flag_format_open != NULL)+              out.format(flag_format_open, pathname, partname, Stats::found_parts(), matcher, false, Stats::found_parts() > 1);+          } -#ifdef OS_WIN+          ++matches; -  do-  {-    // search directory entries that aren't . or .. or hidden when --no-hidden is enabled-    if (ffd.cFileName[0] != '.' || (flag_hidden && ffd.cFileName[1] != '\0' && ffd.cFileName[1] != '.'))-    {-      if (pathname[0] == '.' && pathname[1] == '\0')-        dirpathname.assign(ffd.cFileName);-      else-        dirpathname.assign(pathname).append(PATHSEPSTR).append(ffd.cFileName);+          // output --format+          out.format(flag_format, pathname, partname, matches, matcher, matches > 1, matches > 1); -      ino_t inode = 0;-      uint64_t info = 0;+          // -m: max number of matches reached?+          if (flag_max_count > 0 && matches >= flag_max_count)+            break; -      // --sort: get file info-      if (flag_sort_key != Sort::NA && flag_sort_key != Sort::NAME)-      {-        if (flag_sort_key == Sort::SIZE)-        {-          info = static_cast<uint64_t>(ffd.nFileSizeLow) | (static_cast<uint64_t>(ffd.nFileSizeHigh) << 32);-        }-        else-        {-          struct _FILETIME& time = flag_sort_key == Sort::USED ? ffd.ftLastAccessTime : flag_sort_key == Sort::CHANGED ? ffd.ftLastWriteTime : ffd.ftCreationTime;-          info = static_cast<uint64_t>(time.dwLowDateTime) | (static_cast<uint64_t>(time.dwHighDateTime) << 32);+          if (flag_line_buffered)+            out.flush();         }-      } -      // search dirpathname, unless searchable directory into which we should recurse-      switch (select(level + 1, dirpathname.c_str(), ffd.cFileName, DIRENT_TYPE_UNKNOWN, inode, info))+        // output --format-close+        if (matches > 0 && flag_format_close != NULL)+          out.format(flag_format_close, pathname, partname, Stats::found_parts(), matcher, false, Stats::found_parts() > 1);+      }+      else if (flag_only_line_number)       {-        case Type::DIRECTORY:-          subdirs.emplace_back(dirpathname, 0, info);-          break;+        // option --only-line-number -        case Type::OTHER:-          if (flag_sort_key == Sort::NA)-            search(dirpathname.c_str());-          else-            content.emplace_back(dirpathname, 0, info);-          break;+        if (!init_read())+          goto exit_search; -        case Type::SKIP:-          break;-      }+        size_t lineno = 0;+        const char *separator = flag_separator; -      // stop after finding max-files matching files-      if (flag_max_files > 0 && Stats::found_parts() >= flag_max_files)-        break;+        while (matcher->find())+        {+          size_t current_lineno = matcher->lineno(); -      // stop when output is blocked or search cancelled-      if (out.eof)-        break;-    }-  } while (FindNextFileA(hFind, &ffd) != 0);+          separator = lineno != current_lineno ? flag_separator : "+"; -  FindClose(hFind);+          if (lineno != current_lineno || flag_ungroup)+          {+            // --range: max line exceeded?+            if (flag_max_line > 0 && current_lineno > flag_max_line)+              break; -#else+            // --max-files: max reached?+            if (matches == 0 && !Stats::found_part())+              goto exit_search; -  struct dirent *dirent = NULL;+            ++matches; -  while ((dirent = readdir(dir)) != NULL)-  {-    // search directory entries that aren't . or .. or hidden when --no-hidden is enabled-    if (dirent->d_name[0] != '.' || (flag_hidden && dirent->d_name[1] != '\0' && dirent->d_name[1] != '.'))-    {-      if (pathname[0] == '.' && pathname[1] == '\0')-        dirpathname.assign(dirent->d_name);-      else-        dirpathname.assign(pathname).append(PATHSEPSTR).append(dirent->d_name);+            out.header(pathname, partname, current_lineno, matcher, matcher->first(), separator, true); -      Type type;-      ino_t inode;-      uint64_t info;+            // -m: max number of matches reached?+            if (flag_max_count > 0 && matches >= flag_max_count)+              break; -      // search dirpathname, unless searchable directory into which we should recurse-#if defined(HAVE_STRUCT_DIRENT_D_TYPE) && defined(HAVE_STRUCT_DIRENT_D_INO)-      inode = dirent->d_ino;-      type = select(level + 1, dirpathname.c_str(), dirent->d_name, dirent->d_type, inode, info);-#else-      inode = 0;-      type = select(level + 1, dirpathname.c_str(), dirent->d_name, DIRENT_TYPE_UNKNOWN, inode, info);-#endif+            // output blocked?+            if (out.eof)+              goto exit_search; -      switch (type)+            lineno = current_lineno;+          }+        }+      }+      else if (flag_only_matching)       {-        case Type::DIRECTORY:-          subdirs.emplace_back(dirpathname, inode, info);-          break;+        // option -o -        case Type::OTHER:-          if (flag_sort_key == Sort::NA)-            search(dirpathname.c_str());-          else-            content.emplace_back(dirpathname, inode, info);-          break;+        if (!init_read())+          goto exit_search; -        case Type::SKIP:-          break;-      }+        size_t lineno = 0;+        bool hex = false;+        bool nl = false; -      // stop after finding max-files matching files-      if (flag_max_files > 0 && Stats::found_parts() >= flag_max_files)-        break;+        while (matcher->find())+        {+          const char *begin = matcher->begin();+          size_t size = matcher->size();+          bool binary = flag_hex || (!flag_text && is_binary(begin, size)); -      // stop when output is blocked or search cancelled-      if (out.eof)-        break;-    }-  }+          if (hex && !binary)+          {+            out.dump.done();+          }+          else if (!hex && binary && nl)+          {+            out.nl();+            nl = false;+          }+          hex = binary; -  closedir(dir);+          size_t current_lineno = matcher->lineno(); -#endif+          if (lineno != current_lineno || flag_ungroup)+          {+            if (nl)+            {+              out.nl();+              nl = false;+            } -  // -Z and --sort=best: presearch the selected files to determine edit distance cost-  if (flag_fuzzy > 0 && flag_sort_key == Sort::BEST)-  {-    std::vector<Entry>::iterator entry = content.begin();-    while (entry != content.end())-    {-      entry->cost = cost(entry->pathname.c_str());+            // --range: max line exceeded?+            if (flag_max_line > 0 && current_lineno > flag_max_line)+              break; -      // if a file has no match, remove it-      if (entry->cost == 65535)-        entry = content.erase(entry);-      else-        ++entry;-    }-  }+            // --max-files: max reached?+            if (matches == 0 && !Stats::found_part())+              goto exit_search; -  // --sort: sort the selected non-directory entries and search them-  if (flag_sort_key != Sort::NA)-  {-    if (flag_sort_key == Sort::NAME)-    {-      if (flag_sort_rev)-        std::sort(content.begin(), content.end(), Entry::rev_comp_by_path);-      else-        std::sort(content.begin(), content.end(), Entry::comp_by_path);-    }-    else if (flag_sort_key == Sort::BEST)-    {-      if (flag_sort_rev)-        std::sort(content.begin(), content.end(), Entry::rev_comp_by_best);-      else-        std::sort(content.begin(), content.end(), Entry::comp_by_best);-    }-    else-    {-      if (flag_sort_rev)-        std::sort(content.begin(), content.end(), Entry::rev_comp_by_info);-      else-        std::sort(content.begin(), content.end(), Entry::comp_by_info);-    }+            // -m: max number of matches reached?+            if (flag_max_count > 0 && matches >= flag_max_count)+              break; -    // search the select sorted non-directory entries-    for (auto& entry : content)-    {-      search(entry.pathname.c_str());+            // output blocked?+            if (out.eof)+              goto exit_search; -      // stop after finding max-files matching files-      if (flag_max_files > 0 && Stats::found_parts() >= flag_max_files)-        break;+            ++matches; -      // stop when output is blocked or search cancelled-      if (out.eof)-        break;-    }-  }+            if (binary && !flag_hex && !flag_with_hex)+            {+              if (flag_binary_without_match)+              {+                matches = 0;+              }+              else+              {+                out.binary_file_matches(pathname, partname);+                matches = 1;+              } -  // --sort: sort the selected subdirectory entries-  if (flag_sort_key != Sort::NA)-  {-    if (flag_sort_key == Sort::NAME || flag_sort_key == Sort::BEST)-    {-      if (flag_sort_rev)-        std::sort(subdirs.begin(), subdirs.end(), Entry::rev_comp_by_path);-      else-        std::sort(subdirs.begin(), subdirs.end(), Entry::comp_by_path);-    }-    else-    {-      if (flag_sort_rev)-        std::sort(subdirs.begin(), subdirs.end(), Entry::rev_comp_by_info);-      else-        std::sort(subdirs.begin(), subdirs.end(), Entry::comp_by_info);-    }-  }+              goto done_search;+            } -  // recurse into the selected subdirectories-  for (auto& entry : subdirs)-  {-    // stop after finding max-files matching files-    if (flag_max_files > 0 && Stats::found_parts() >= flag_max_files)-      break;+            if (!flag_no_header)+            {+              const char *separator = lineno != current_lineno ? flag_separator : "+";+              out.header(pathname, partname, current_lineno, matcher, matcher->first(), separator, binary);+            } -    // stop when output is blocked or search cancelled-    if (out.eof)-      break;+            lineno = current_lineno;+          } -#ifndef OS_WIN-    // -R: check if this directory was visited before-    std::pair<std::set<ino_t>::iterator,bool> vino;+          if (binary)+          {+            if (flag_hex || flag_with_hex)+            {+              out.dump.next(matcher->first());+              out.dump.hex(Output::Dump::HEX_MATCH, matcher->first(), begin, size);+            }+            else+            {+              if (flag_binary_without_match)+              {+                matches = 0;+              }+              else+              {+                out.binary_file_matches(pathname, partname);+                matches = 1;+              } -    if (flag_dereference)-    {-      vino = visited.insert(entry.inode);+              goto done_search;+            } -      // if visited before, then do not recurse on this directory again-      if (!vino.second)-        continue;-    }-#endif+            lineno += matcher->lines() - 1;+          }+          else+          {+            // echo multi-line matches line-by-line -    recurse(level + 1, entry.pathname.c_str());+            const char *from = begin;+            const char *to; -#ifndef OS_WIN-    if (flag_dereference)-      visited.erase(vino.first);-#endif-  }+            while ((to = static_cast<const char*>(memchr(from, '\n', size - (from - begin)))) != NULL)+            {+              out.str(match_ms);+              out.str(from, to - from);+              out.str(match_off);+              out.chr('\n'); -  // --ignore-files: restore if changed-  if (saved)-  {-    save_all_exclude->swap(flag_all_exclude);-    save_all_exclude_dir->swap(flag_all_exclude_dir);-    save_not_exclude->swap(flag_not_exclude);-    save_not_exclude_dir->swap(flag_not_exclude_dir);-  }-}+              out.header(pathname, partname, ++lineno, NULL, matcher->first() + (to - begin) + 1, "|", false); -// -Z and --sort=best: perform a presearch to determine edit distance cost, returns 65535 when no match is found-uint16_t Grep::cost(const char *pathname)-{-  // stop when output is blocked-  if (out.eof)-    return 0;+              from = to + 1;+            }++            size -= from - begin;++            if (size > 0)+            {+              size -= from[size - 1] == '\n';+              if (size > 0)+              {+                out.str(match_ms);+                out.str(from, size);+                out.str(match_off);+              }+              out.nl();+            }+            else+            {+              nl = true;+            }+          }+        } -  // open (archive or compressed) file (pathname is NULL to read stdin), return on failure-  if (!open_file(pathname))-    return 0;+        if (nl)+          out.nl(); -  // -Z: matcher is a FuzzyMatcher-  reflex::FuzzyMatcher *fuzzy_matcher = dynamic_cast<reflex::FuzzyMatcher*>(matcher);+        if (hex)+          out.dump.done();+      }+      else if (flag_before_context == 0 && flag_after_context == 0 && !flag_any_line && !flag_invert_match)+      {+        // options -A, -B, -C, -y, -v are not specified -  uint16_t cost = 65535;+        if (!init_read())+          goto exit_search; -  // -z: loop over extracted archive parts, when applicable-  do-  {-    try-    {-      read_file();+        size_t lineno = 0;+        bool hex = false;+        bool binary = false;+        std::string rest_line;+        const char *rest_line_data = NULL;+        size_t rest_line_size = 0;+        size_t rest_line_last = 0; -      while (fuzzy_matcher->find())-      {-        if (fuzzy_matcher->edits() < cost)-          cost = fuzzy_matcher->edits();+        while (matcher->find())+        {+          size_t current_lineno = matcher->lineno(); -        // exact match?-        if (cost == 0)-          break;-      }-    }+          if (lineno != current_lineno || flag_ungroup)+          {+            if (rest_line_data != NULL)+            {+              if (binary)+              {+                out.dump.hex(Output::Dump::HEX_LINE, rest_line_last, rest_line_data, rest_line_size);+              }+              else+              {+                if (rest_line_size > 0)+                {+                  rest_line_size -= rest_line_data[rest_line_size - 1] == '\n';+                  if (rest_line_size > 0)+                  {+                    out.str(color_sl);+                    out.str(rest_line_data, rest_line_size);+                    out.str(color_off);+                  }+                }+                out.nl();+              } -    catch (...)-    {-      // this should never happen-      warning("exception while searching", pathname);-    }+              rest_line_data = NULL;+            } -    // close file or -z: loop over next extracted archive parts, when applicable-  } while (close_file(pathname));+            // --range: max line exceeded?+            if (flag_max_line > 0 && current_lineno > flag_max_line)+              break; -  return cost;-}+            // --max-files: max reached?+            if (matches == 0 && !Stats::found_part())+              goto exit_search; -// search input and display pattern matches-void Grep::search(const char *pathname)-{-  // stop when output is blocked-  if (out.eof)-    return;+            // -m: max number of matches reached?+            if (flag_max_count > 0 && matches >= flag_max_count)+              break; -  // open (archive or compressed) file (pathname is NULL to read stdin), return on failure-  if (!open_file(pathname))-    return;+            // output blocked?+            if (out.eof)+              goto exit_search; -  // pathname is NULL when stdin is searched-  if (pathname == NULL)-    pathname = flag_label;+            const char *eol = matcher->eol(true); // warning: call eol() before bol() and end()+            const char *bol = matcher->bol(); -  bool matched = false;+            binary = flag_hex || (!flag_text && is_binary(bol, eol - bol)); -  // -z: loop over extracted archive parts, when applicable-  do-  {-    try-    {-      size_t matches = 0;+            if (binary && !flag_hex && !flag_with_hex)+            {+              if (flag_binary_without_match)+              {+                matches = 0;+              }+              else+              {+                out.binary_file_matches(pathname, partname);+                matches = 1;+              } -      if (flag_quiet || flag_files_with_matches)-      {-        // -q, -l, or -L: report if a single pattern match was found in the input+              goto done_search;+            } -        read_file();+            if (hex && !binary)+              out.dump.done();+            hex = binary; -        // -I: do not match binary-        if (flag_binary_without_match)-        {-          const char *eol = matcher->eol(); // warning: call eol() before bol()-          const char *bol = matcher->bol();-          if (is_binary(bol, eol - bol))-            goto exit_search;-        }+            ++matches; -        matches = matcher->find() != 0;+            size_t border = matcher->border();+            size_t first = matcher->first();+            const char *begin = matcher->begin();+            const char *end = matcher->end();+            size_t size = matcher->size(); -        // --range: max line exceeded?-        if (flag_max_line > 0 && matcher->lineno() > flag_max_line)-          matches = 0;+            if (!flag_no_header)+            {+              const char *separator = lineno != current_lineno ? flag_separator : "+";+              out.header(pathname, partname, current_lineno, matcher, first, separator, binary);+            } -        // -v: invert-        if (flag_invert_match)-          matches = !matches;+            lineno = current_lineno; -        if (matches > 0)-        {-          // --format-open or format-close: we must acquire lock early before Stats::found_part()-          if (flag_files_with_matches && (flag_format_open != NULL || flag_format_close != NULL))-            out.acquire();+            if (binary)+            {+              out.dump.hex(Output::Dump::HEX_LINE, first - border, bol, border);+              out.dump.hex(Output::Dump::HEX_MATCH, first, begin, size); -          if (!Stats::found_part())-            goto exit_search;+              if (flag_ungroup)+              {+                out.dump.hex(Output::Dump::HEX_LINE, matcher->last(), end, eol - end);+                out.dump.done();+              }+              else+              {+                rest_line.assign(end, eol - end);+                rest_line_data = rest_line.c_str();+                rest_line_size = rest_line.size();+                rest_line_last = matcher->last();+              } -          // -l or -L-          if (flag_files_with_matches)-          {-            if (flag_format != NULL)-            {-              if (flag_format_open != NULL)-                out.format(flag_format_open, pathname, partname, Stats::found_parts(), matcher, false, Stats::found_parts() > 1);-              out.format(flag_format, pathname, partname, 1, matcher, false, false);-              if (flag_format_close != NULL)-                out.format(flag_format_close, pathname, partname, Stats::found_parts(), matcher, false, Stats::found_parts() > 1);+              lineno += matcher->lines() - 1;             }             else             {-              out.str(color_fn);-              out.str(pathname);-              if (!partname.empty())+              out.str(color_sl);+              out.str(bol, border);+              out.str(color_off);++              // echo multi-line matches line-by-line++              const char *from = begin;+              const char *to;++              while ((to = static_cast<const char*>(memchr(from, '\n', size - (from - begin)))) != NULL)               {-                out.chr('{');-                out.str(partname);-                out.chr('}');+                out.str(match_ms);+                out.str(from, to - from);+                out.str(match_off);+                out.chr('\n');++                out.header(pathname, partname, ++lineno, NULL, first + (to - begin) + 1, "|", false);++                from = to + 1;+              }++              size -= from - begin;+              begin = from;++              out.str(match_ms);+              out.str(begin, size);+              out.str(match_off);++              if (flag_ungroup)+              {+                if (eol > end)+                {+                  eol -= end[eol - end - 1] == '\n';+                  if (eol > end)+                  {+                    out.str(color_sl);+                    out.str(end, eol - end);+                    out.str(color_off);+                  }+                  out.nl();+                }+                else if (matcher->hit_end())+                {+                  out.nl();+                }+                else if (flag_line_buffered)+                {+                  out.flush();+                }+              }+              else+              {+                rest_line.assign(end, eol - end);+                rest_line_data = rest_line.c_str();+                rest_line_size = rest_line.size();+                rest_line_last = matcher->last();               }-              out.str(color_off);-              out.chr(flag_null ? '\0' : '\n');             }           }-        }-      }-      else if (flag_count)-      {-        // -c: count the number of lines/patterns matched+          else+          {+            size_t size = matcher->size(); -        read_file();+            if (size > 0)+            {+              size_t lines = matcher->lines(); -        // -I: do not match binary-        bool binary = false;-        if (flag_binary_without_match)-        {-          const char *eol = matcher->eol(); // warning: call eol() before bol()-          const char *bol = matcher->bol();-          binary = is_binary(bol, eol - bol);-        }+              if (lines > 1 || flag_apply_color)+              {+                size_t first = matcher->first();+                size_t last = matcher->last();+                const char *begin = matcher->begin(); -        if (!binary)-        {-          if (flag_ungroup || flag_only_matching)-          {-            // -co or -cu: count the number of patterns matched in the file+                if (binary)+                {+                  out.dump.hex(Output::Dump::HEX_LINE, rest_line_last, rest_line_data, first - rest_line_last);+                  out.dump.hex(Output::Dump::HEX_MATCH, first, begin, size);+                }+                else+                {+                  out.str(color_sl);+                  out.str(rest_line_data, first - rest_line_last);+                  out.str(color_off);++                  if (lines > 1)+                  {+                    // echo multi-line matches line-by-line++                    const char *from = begin;+                    const char *to;+                    size_t num = 1;++                    while ((to = static_cast<const char*>(memchr(from, '\n', size - (from - begin)))) != NULL)+                    {+                      out.str(match_ms);+                      out.str(from, to - from);+                      out.str(match_off);+                      out.chr('\n');++                      out.header(pathname, partname, lineno + num, NULL, first + (to - begin) + 1, "|", false);++                      from = to + 1;+                      ++num;+                    } -            while (matcher->find())-            {-              // --range: max line exceeded?-              if (flag_max_line > 0 && matcher->lineno() > flag_max_line)-                break;+                    size -= from - begin;+                    begin = from;+                  } -              ++matches;+                  out.str(match_ms);+                  out.str(begin, size);+                  out.str(match_off);+                } -              // -m: max number of matches reached?-              if (flag_max_count > 0 && matches >= flag_max_count)-                break;-            }-          }-          else-          {-            // -c without -o/-u: count the number of matching lines+                if (lines == 1)+                {+                  rest_line_data += last - rest_line_last;+                  rest_line_size -= last - rest_line_last;+                  rest_line_last = last;+                }+                else+                {+                  const char *eol = matcher->eol(true); // warning: call eol() before end()+                  const char *end = matcher->end(); -            size_t lineno = 0;+                  binary = flag_hex || (!flag_text && is_binary(end, eol - end)); -            while (matcher->find())-            {-              size_t current_lineno = matcher->lineno();+                  if (hex && !binary)+                    out.dump.done();+                  else if (!hex && binary)+                    out.nl(); -              if (lineno != current_lineno)-              {-                // --range: max line exceeded?-                if (flag_max_line > 0 && current_lineno > flag_max_line)-                  break;+                  if (hex != binary && !flag_no_header)+                    out.header(pathname, partname, lineno + lines - 1, matcher, last, flag_separator, binary); -                ++matches;+                  hex = binary; -                // -m: max number of matches reached?-                if (flag_max_count > 0 && matches >= flag_max_count)-                  break;+                  if (flag_ungroup)+                  {+                    if (binary)+                    {+                      out.dump.hex(Output::Dump::HEX_LINE, matcher->last(), end, eol - end);+                      out.dump.done();+                    }+                    else+                    {+                      if (eol > end)+                      {+                        eol -= end[eol - end - 1] == '\n';+                        if (eol > end)+                        {+                          out.str(color_sl);+                          out.str(end, eol - end);+                          out.str(color_off);+                        }+                        out.nl();+                      }+                      else if (matcher->hit_end())+                      {+                        out.nl();+                      }+                      else if (flag_line_buffered)+                      {+                        out.flush();+                      }+                    }+                  }+                  else+                  {+                    rest_line.assign(end, eol - end);+                    rest_line_data = rest_line.c_str();+                    rest_line_size = rest_line.size();+                    rest_line_last = last;+                  } -                lineno = current_lineno;+                  lineno += lines - 1;+                }               }             }--            // -c with -v: count non-matching lines-            if (flag_invert_match)-            {-              matches = matcher->lineno() - matches;-              if (matches > 0)-                --matches;-            }           }         } -        // --format-open or --format-close: we must acquire lock early before Stats::found_part()-        if (flag_format_open != NULL || flag_format_close != NULL)-          out.acquire();--        if (matches > 0 || flag_format_open != NULL || flag_format_close != NULL)-          if (!Stats::found_part())-            goto exit_search;--        if (flag_format != NULL)-        {-          if (flag_format_open != NULL)-            out.format(flag_format_open, pathname, partname, Stats::found_parts(), matcher, false, Stats::found_parts() > 1);-          out.format(flag_format, pathname, partname, matches, matcher, false, false);-          if (flag_format_close != NULL)-            out.format(flag_format_close, pathname, partname, Stats::found_parts(), matcher, false, Stats::found_parts() > 1);-        }-        else+        if (rest_line_data != NULL)         {-          if (flag_with_filename || !partname.empty())+          if (binary)           {-            out.str(color_fn);-            out.str(pathname);-            if (!partname.empty())-            {-              out.chr('{');-              out.str(partname);-              out.chr('}');-            }-            out.str(color_off);--            if (flag_null)-            {-              out.chr('\0');-            }-            else-            {-              out.str(color_se);-              out.str(flag_separator);-              out.str(color_off);-            }+            out.dump.hex(Output::Dump::HEX_LINE, rest_line_last, rest_line_data, rest_line_size);           }-          out.num(matches);-          out.chr('\n');-        }-      }-      else if (flag_format != NULL)-      {-        // --format--        read_file();--        // -I: do not match binary-        if (flag_binary_without_match)-        {-          const char *eol = matcher->eol(); // warning: call eol() before bol()-          const char *bol = matcher->bol();-          if (is_binary(bol, eol - bol))-            goto exit_search;-        }--        while (matcher->find())-        {-          // --range: max line exceeded?-          if (flag_max_line > 0 && matcher->lineno() > flag_max_line)-            break;--          // output --format-open-          if (matches == 0)+          else           {-            // --format-open or --format-close: we must acquire lock early before Stats::found_part()-            if (flag_format_open != NULL || flag_format_close != NULL)-              out.acquire();--            if (!Stats::found_part())-              goto exit_search;--            if (flag_format_open != NULL)-              out.format(flag_format_open, pathname, partname, Stats::found_parts(), matcher, false, Stats::found_parts() > 1);+            if (rest_line_size > 0)+            {+              rest_line_size -= rest_line_data[rest_line_size - 1] == '\n';+              if (rest_line_size > 0)+              {+                out.str(color_sl);+                out.str(rest_line_data, rest_line_size);+                out.str(color_off);+              }+            }+            out.nl();           } -          ++matches;--          // output --format-          out.format(flag_format, pathname, partname, matches, matcher, matches > 1, matches > 1);--          // -m: max number of matches reached?-          if (flag_max_count > 0 && matches >= flag_max_count)-            break;--          if (flag_line_buffered)-            out.flush();+          rest_line_data = NULL;         } -        // output --format-close-        if (matches > 0 && flag_format_close != NULL)-          out.format(flag_format_close, pathname, partname, Stats::found_parts(), matcher, false, Stats::found_parts() > 1);+        if (binary)+          out.dump.done();       }-      else if (flag_only_line_number)+      else if (flag_before_context == 0 && flag_after_context == 0 && !flag_any_line)       {-        // --only-line-number+        // option -v without -A, -B, -C, -y -        size_t lineno = 0;-        const char *separator = flag_separator;+        if (!init_read())+          goto exit_search;++        // InvertMatchHandler requires lineno to be set precisely, i.e. after skipping --range lines+        size_t lineno = flag_min_line > 0 ? flag_min_line - 1 : 0;+        bool hex = false;+        bool binary = false;+        bool stop = false; -        read_file();+        // construct event handler functor with captured *this and some of the locals+        InvertMatchGrepHandler invert_match_handler(*this, pathname, lineno, hex, binary, matches, stop); -        // -I: do not match binary-        if (flag_binary_without_match)-        {-          const char *eol = matcher->eol(); // warning: call eol() before bol()-          const char *bol = matcher->bol();-          if (is_binary(bol, eol - bol))-            goto exit_search;-        }+        // register a event handler to display non-matching lines+        matcher->set_handler(&invert_match_handler);++        // to get the context from the invert_match handler explicitly+        reflex::AbstractMatcher::Context context;          while (matcher->find())         {           size_t current_lineno = matcher->lineno(); -          separator = lineno != current_lineno ? flag_separator : "+";--          if (lineno != current_lineno || flag_ungroup)+          if (lineno != current_lineno)           {-            // --range: max line exceeded?-            if (flag_max_line > 0 && current_lineno > flag_max_line)+            // get the lines before the matched line+            context = matcher->before();++            if (context.len > 0)+              invert_match_handler(*matcher, context.buf, context.len, context.num);++            if (binary && !flag_hex && !flag_with_hex)               break; -            if (matches == 0)-              if (!Stats::found_part())-                goto exit_search;+            if (binary)+              out.dump.done(); -            ++matches;+            // --range: max line exceeded?+            if (flag_max_line > 0 && current_lineno > flag_max_line)+              goto done_search; -            out.header(pathname, partname, current_lineno, matcher, matcher->first(), separator, true);+            // --max-files: max reached?+            if (stop)+              goto exit_search;              // -m: max number of matches reached?             if (flag_max_count > 0 && matches >= flag_max_count)-              break;+              goto done_search;              // output blocked?             if (out.eof)               goto exit_search;+          } -            lineno = current_lineno;+          lineno = current_lineno + matcher->lines() - 1;+        }++        // get the remaining context+        context = matcher->after();++        if (context.len > 0)+          invert_match_handler(*matcher, context.buf, context.len, context.num);++        if (binary && !flag_hex && !flag_with_hex)+        {+          if (flag_binary_without_match)+          {+            matches = 0;+          }+          else+          {+            out.binary_file_matches(pathname, partname);+            matches = 1;           }         }++        if (binary)+          out.dump.done();       }-      else if (flag_only_matching)+      else if (flag_any_line)       {-        // -o+        // option -y +        if (!init_read())+          goto exit_search;++        // AnyLineGrepHandler requires lineno to be set precisely, i.e. after skipping --range lines+        size_t lineno = flag_min_line > 0 ? flag_min_line - 1 : 0;         bool hex = false;-        size_t lineno = 0;+        bool binary = false;+        bool stop = false;++        // to display the rest of the matching line+        std::string rest_line;+        const char *rest_line_data = NULL;+        size_t rest_line_size = 0;+        size_t rest_line_last = 0; -        read_file();+        // construct event handler functor with captured *this and some of the locals+        AnyLineGrepHandler any_line_handler(*this, pathname, lineno, hex, binary, matches, stop, rest_line_data, rest_line_size, rest_line_last); -        // -I: do not match binary-        if (flag_binary_without_match)-        {-          const char *eol = matcher->eol(); // warning: call eol() before bol()-          const char *bol = matcher->bol();-          if (is_binary(bol, eol - bol))-            goto exit_search;-        }+        // register an event handler functor to display non-matching lines+        matcher->set_handler(&any_line_handler);++        // to display colors with or without -v+        short v_hex_line = flag_invert_match ? Output::Dump::HEX_CONTEXT_LINE : Output::Dump::HEX_LINE;+        short v_hex_match = flag_invert_match ? Output::Dump::HEX_CONTEXT_MATCH : Output::Dump::HEX_MATCH;+        const char *v_color_sl = flag_invert_match ? color_cx : color_sl;+        const char *v_match_ms = flag_invert_match ? match_mc : match_ms;++        // to get the context from the any_line handler explicitly+        reflex::AbstractMatcher::Context context;          while (matcher->find())         {-          const char *begin = matcher->begin();-          size_t size = matcher->size();+          size_t current_lineno = matcher->lineno();++          if (lineno != current_lineno || flag_ungroup)+          {+            if (rest_line_data != NULL)+            {+              if (binary)+              {+                out.dump.hex(v_hex_line, rest_line_last, rest_line_data, rest_line_size);+              }+              else+              {+                if (rest_line_size > 0)+                {+                  rest_line_size -= rest_line_data[rest_line_size - 1] == '\n';+                  if (rest_line_size > 0)+                  {+                    out.str(v_color_sl);+                    out.str(rest_line_data, rest_line_size);+                    out.str(color_off);+                  }+                }+                out.nl();+              }++              rest_line_data = NULL;+            } -          bool binary = flag_hex || (!flag_text && is_binary(begin, size));+            // get the lines before the matched line+            context = matcher->before(); -          size_t current_lineno = matcher->lineno();+            if (context.len > 0)+              any_line_handler(*matcher, context.buf, context.len, context.num);++            if (binary && !flag_hex && !flag_with_hex)+            {+              if (flag_binary_without_match)+              {+                matches = 0;+              }+              else+              {+                out.binary_file_matches(pathname, partname);+                matches = 1;+              }++              goto done_search;+            } -          if (lineno != current_lineno || flag_ungroup)-          {             // --range: max line exceeded?             if (flag_max_line > 0 && current_lineno > flag_max_line)               break; -            if (matches == 0)-              if (!Stats::found_part())-                goto exit_search;+            // --max-files: max reached?+            if (stop)+              goto exit_search;++            // --max-files: max reached?+            if (!flag_invert_match && matches == 0 && !Stats::found_part())+              goto exit_search;              // -m: max number of matches reached?             if (flag_max_count > 0 && matches >= flag_max_count)@@ -5964,7 +7435,10 @@ void Grep::search(const char *pathname)             if (out.eof)               goto exit_search; -            ++matches;+            const char *eol = matcher->eol(true); // warning: call eol() before bol() and end()+            const char *bol = matcher->bol();++            binary = flag_hex || (!flag_text && is_binary(bol, eol - bol));              if (binary && !flag_hex && !flag_with_hex)             {@@ -5981,110 +7455,304 @@ void Grep::search(const char *pathname)               goto done_search;             } -            if (!flag_no_header)-            {-              if (hex && out.dump.offset < matcher->first())-                out.dump.done(flag_separator);-              hex = false;+            if (hex && !binary)+              out.dump.done();+            hex = binary; -              const char *separator = lineno != current_lineno ? flag_separator : "+";+            if (!flag_invert_match)+              ++matches; -              out.header(pathname, partname, current_lineno, matcher, matcher->first(), separator, binary);+            size_t border = matcher->border();+            size_t first = matcher->first();+            const char *begin = matcher->begin();+            const char *end = matcher->end();+            size_t size = matcher->size();++            if (!flag_no_header)+            {+              const char *separator = lineno != current_lineno ? flag_invert_match ? "-" : flag_separator : "+";+              out.header(pathname, partname, current_lineno, matcher, first, separator, binary);             }              lineno = current_lineno;-          } -          if (binary)-          {-            if (flag_hex || flag_with_hex)+            if (binary)             {-              if (hex)-                out.dump.next(matcher->first(), flag_separator);+              out.dump.hex(v_hex_line, first - border, bol, border);+              out.dump.hex(v_hex_match, first, begin, size); -              out.dump.hex(Output::Dump::HEX_MATCH, matcher->first(), begin, size, flag_separator);-              hex = true;-            }-            else-            {-              if (flag_binary_without_match)+              if (flag_ungroup)               {-                matches = 0;+                out.dump.hex(v_hex_line, matcher->last(), end, eol - end);+                out.dump.done();               }               else               {-                out.binary_file_matches(pathname, partname);-                matches = 1;+                rest_line.assign(end, eol - end);+                rest_line_data = rest_line.c_str();+                rest_line_size = rest_line.size();+                rest_line_last = matcher->last();               } -              goto done_search;+              lineno += matcher->lines() - 1;             }-          }-          else-          {-            if (hex && out.dump.offset < matcher->first())-              out.dump.done(flag_separator);-            hex = false;--            if (!flag_no_header)+            else             {-              // -o with -n: echo multi-line matches line-by-line+              out.str(v_color_sl);+              out.str(bol, border);+              out.str(color_off);++              // echo multi-line matches line-by-line                const char *from = begin;               const char *to;                while ((to = static_cast<const char*>(memchr(from, '\n', size - (from - begin)))) != NULL)               {-                out.str(match_ms);-                out.str(from, to - from + 1);+                out.str(v_match_ms);+                out.str(from, to - from);                 out.str(match_off);+                out.chr('\n'); -                if (to + 1 <= begin + size)-                  out.header(pathname, partname, ++lineno, NULL, matcher->first() + (to - begin) + 1, "|", false);+                out.header(pathname, partname, ++lineno, NULL, first + (to - begin) + 1, "|", false);                  from = to + 1;               }                size -= from - begin;               begin = from;++              out.str(v_match_ms);+              out.str(begin, size);+              out.str(match_off);++              if (flag_ungroup)+              {+                if (eol > end)+                {+                  eol -= end[eol - end - 1] == '\n';+                  if (eol > end)+                  {+                    out.str(v_color_sl);+                    out.str(end, eol - end);+                    out.str(color_off);+                  }+                  out.nl();+                }+                else if (matcher->hit_end())+                {+                  out.nl();+                }+                else if (flag_line_buffered)+                {+                  out.flush();+                }+              }+              else+              {+                rest_line.assign(end, eol - end);+                rest_line_data = rest_line.c_str();+                rest_line_size = rest_line.size();+                rest_line_last = matcher->last();+              }             }+          }+          else+          {+            size_t size = matcher->size(); -            out.str(match_ms);-            out.str(begin, size);-            out.str(match_off);+            if (size > 0)+            {+              size_t lines = matcher->lines(); -            if (size == 0 || begin[size - 1] != '\n')-              out.chr('\n');+              if (lines > 1 || flag_apply_color)+              {+                size_t first = matcher->first();+                size_t last = matcher->last();+                const char *begin = matcher->begin();++                if (binary)+                {+                  out.dump.hex(v_hex_line, rest_line_last, rest_line_data, first - rest_line_last);+                  out.dump.hex(v_hex_match, first, begin, size);+                }+                else+                {+                  out.str(v_color_sl);+                  out.str(rest_line_data, first - rest_line_last);+                  out.str(color_off);++                  if (lines > 1)+                  {+                    // echo multi-line matches line-by-line++                    const char *from = begin;+                    const char *to;+                    size_t num = 1;++                    while ((to = static_cast<const char*>(memchr(from, '\n', size - (from - begin)))) != NULL)+                    {+                      out.str(v_match_ms);+                      out.str(from, to - from);+                      out.str(match_off);+                      out.chr('\n');++                      out.header(pathname, partname, lineno + num, NULL, first + (to - begin) + 1, "|", false);++                      from = to + 1;+                      ++num;+                    }++                    size -= from - begin;+                    begin = from;+                  }++                  out.str(v_match_ms);+                  out.str(begin, size);+                  out.str(match_off);+                }++                if (lines == 1)+                {+                  rest_line_data += last - rest_line_last;+                  rest_line_size -= last - rest_line_last;+                  rest_line_last = last;+                }+                else+                {+                  const char *eol = matcher->eol(true); // warning: call eol() before end()+                  const char *end = matcher->end();++                  binary = flag_hex || (!flag_text && is_binary(end, eol - end));++                  if (hex && !binary)+                    out.dump.done();+                  else if (!hex && binary)+                    out.nl();++                  if (hex != binary && !flag_no_header)+                    out.header(pathname, partname, lineno + lines - 1, matcher, last, flag_separator, binary);++                  hex = binary;++                  if (flag_ungroup)+                  {+                    if (binary)+                    {+                      out.dump.hex(v_hex_line, matcher->last(), end, eol - end);+                      out.dump.done();+                    }+                    else+                    {+                      if (eol > end)+                      {+                        eol -= end[eol - end - 1] == '\n';+                        if (eol > end)+                        {+                          out.str(v_color_sl);+                          out.str(end, eol - end);+                          out.str(color_off);+                        }+                        out.nl();+                      }+                      else if (matcher->hit_end())+                      {+                        out.nl();+                      }+                      else if (flag_line_buffered)+                      {+                        out.flush();+                      }+                    }+                  }+                  else+                  {+                    rest_line.assign(end, eol - end);+                    rest_line_data = rest_line.c_str();+                    rest_line_size = rest_line.size();+                    rest_line_last = last;+                  }++                  lineno += lines - 1;+                }+              }+            }           }+        } -          if (flag_line_buffered)-            out.flush();+        if (rest_line_data != NULL)+        {+          if (binary)+          {+            out.dump.hex(v_hex_line, rest_line_last, rest_line_data, rest_line_size);+          }+          else+          {+            if (rest_line_size > 0)+            {+              rest_line_size -= rest_line_data[rest_line_size - 1] == '\n';+              if (rest_line_size > 0)+              {+                out.str(v_color_sl);+                out.str(rest_line_data, rest_line_size);+                out.str(color_off);+              }+            }+            out.nl();+          }++          rest_line_data = NULL;         } -        if (hex)-          out.dump.done(flag_separator);+        // get the remaining context+        context = matcher->after();++        if (context.len > 0)+          any_line_handler(*matcher, context.buf, context.len, context.num);++        if (binary && !flag_hex && !flag_with_hex)+        {+          if (flag_binary_without_match)+          {+            matches = 0;+          }+          else+          {+            out.binary_file_matches(pathname, partname);+            matches = 1;+          }+        }++        if (binary)+          out.dump.done();       }-      else if (flag_before_context == 0 && flag_after_context == 0 && !flag_any_line && !flag_invert_match)+      else if (!flag_invert_match)       {-        // options -A, -B, -C, -y, -v are not specified+        // options -A, -B, -C without -v++        if (!init_read())+          goto exit_search; +        // ContextGrepHandler requires lineno to be set precisely, i.e. after skipping --range lines+        size_t lineno = flag_min_line > 0 ? flag_min_line - 1 : 0;+        bool hex = false;         bool binary = false;+        bool stop = false;++        // to display the rest of the matching line         std::string rest_line;         const char *rest_line_data = NULL;         size_t rest_line_size = 0;         size_t rest_line_last = 0;-        size_t lineno = 0; -        read_file();+        // construct event handler functor with captured *this and some of the locals+        ContextGrepHandler context_handler(*this, pathname, lineno, hex, binary, matches, stop, rest_line_data, rest_line_size, rest_line_last); -        // -I: do not match binary-        if (flag_binary_without_match)-        {-          const char *eol = matcher->eol(); // warning: call eol() before bol()-          const char *bol = matcher->bol();-          if (is_binary(bol, eol - bol))-            goto exit_search;-        }+        // register an event handler functor to display non-matching lines+        matcher->set_handler(&context_handler);++        // to get the context from the any_line handler explicitly+        reflex::AbstractMatcher::Context context;          while (matcher->find())         {@@ -6096,33 +7764,60 @@ void Grep::search(const char *pathname)             {               if (binary)               {-                out.dump.hex(Output::Dump::HEX_LINE, rest_line_last, rest_line_data, rest_line_size, flag_separator);-                out.dump.done(flag_separator);+                out.dump.hex(Output::Dump::HEX_LINE, rest_line_last, rest_line_data, rest_line_size);               }               else               {                 if (rest_line_size > 0)                 {-                  out.str(color_sl);-                  if (rest_line_data[rest_line_size - 1] == '\n')-                    out.str(rest_line_data, rest_line_size - 1);-                  else+                  rest_line_size -= rest_line_data[rest_line_size - 1] == '\n';+                  if (rest_line_size > 0)+                  {+                    out.str(color_sl);                     out.str(rest_line_data, rest_line_size);-                  out.str(color_off);-                  out.nl();+                    out.str(color_off);+                  }                 }+                out.nl();+              }++              rest_line_data = NULL;+            }++            // get the lines before the matched line+            context = matcher->before();++            if (context.len > 0)+              context_handler(*matcher, context.buf, context.len, context.num);++            if (binary && !flag_hex && !flag_with_hex)+            {+              if (flag_binary_without_match)+              {+                matches = 0;+              }+              else+              {+                out.binary_file_matches(pathname, partname);+                matches = 1;               } -              rest_line_data = NULL;+              goto done_search;             } +            context_handler.output_before_context();+             // --range: max line exceeded?             if (flag_max_line > 0 && current_lineno > flag_max_line)               break; -            if (matches == 0)-              if (!Stats::found_part())-                goto exit_search;+            // --max-files: max reached?+            if (stop)+              goto exit_search;++            // --max-files: max reached?+            if (!flag_invert_match && matches == 0 && !Stats::found_part())+              goto exit_search;              // -m: max number of matches reached?             if (flag_max_count > 0 && matches >= flag_max_count)@@ -6137,8 +7832,6 @@ void Grep::search(const char *pathname)              binary = flag_hex || (!flag_text && is_binary(bol, eol - bol)); -            ++matches;-             if (binary && !flag_hex && !flag_with_hex)             {               if (flag_binary_without_match)@@ -6154,14 +7847,12 @@ void Grep::search(const char *pathname)               goto done_search;             } -            if (!flag_no_header)-            {-              const char *separator = lineno != current_lineno ? flag_separator : "+";--              out.header(pathname, partname, current_lineno, matcher, matcher->first(), separator, binary);-            }+            if (hex && !binary)+              out.dump.done();+            hex = binary; -            lineno = current_lineno;+            if (!flag_invert_match)+              ++matches;              size_t border = matcher->border();             size_t first = matcher->first();@@ -6169,26 +7860,33 @@ void Grep::search(const char *pathname)             const char *end = matcher->end();             size_t size = matcher->size(); +            if (!flag_no_header)+            {+              const char *separator = lineno != current_lineno ? flag_invert_match ? "-" : flag_separator : "+";+              out.header(pathname, partname, current_lineno, matcher, first, separator, binary);+            }++            lineno = current_lineno;+             if (binary)             {-              if (flag_hex || flag_with_hex)-              {-                out.dump.hex(Output::Dump::HEX_LINE, first - border, bol, border, flag_separator);-                out.dump.hex(Output::Dump::HEX_MATCH, first, begin, size, flag_separator);+              out.dump.hex(Output::Dump::HEX_LINE, first - border, bol, border);+              out.dump.hex(Output::Dump::HEX_MATCH, first, begin, size); -                if (flag_ungroup)-                {-                  out.dump.hex(Output::Dump::HEX_LINE, matcher->last(), end, eol - end, flag_separator);-                  out.dump.done(flag_separator);-                }-                else-                {-                  rest_line.assign(end, eol - end);-                  rest_line_data = rest_line.c_str();-                  rest_line_size = rest_line.size();-                  rest_line_last = matcher->last();-                }+              if (flag_ungroup)+              {+                out.dump.hex(Output::Dump::HEX_LINE, matcher->last(), end, eol - end);+                out.dump.done();+              }+              else+              {+                rest_line.assign(end, eol - end);+                rest_line_data = rest_line.c_str();+                rest_line_size = rest_line.size();+                rest_line_last = matcher->last();               }++              lineno += matcher->lines() - 1;             }             else             {@@ -6196,31 +7894,26 @@ void Grep::search(const char *pathname)               out.str(bol, border);               out.str(color_off); -              if (!flag_no_header)-              {-                // -n: echo multi-line matches line-by-line--                const char *from = begin;-                const char *to;-                size_t num = 1;+              // echo multi-line matches line-by-line -                while ((to = static_cast<const char*>(memchr(from, '\n', size - (from - begin)))) != NULL)-                {-                  out.str(match_ms);-                  out.str(from, to - from + 1);-                  out.str(match_off);+              const char *from = begin;+              const char *to; -                  if (to + 1 <= begin + size)-                    out.header(pathname, partname, lineno + num, NULL, first + (to - begin) + 1, "|", false);+              while ((to = static_cast<const char*>(memchr(from, '\n', size - (from - begin)))) != NULL)+              {+                out.str(match_ms);+                out.str(from, to - from);+                out.str(match_off);+                out.chr('\n'); -                  from = to + 1;-                  ++num;-                }+                out.header(pathname, partname, ++lineno, NULL, first + (to - begin) + 1, "|", false); -                size -= from - begin;-                begin = from;+                from = to + 1;               } +              size -= from - begin;+              begin = from;+               out.str(match_ms);               out.str(begin, size);               out.str(match_off);@@ -6229,12 +7922,13 @@ void Grep::search(const char *pathname)               {                 if (eol > end)                 {-                  out.str(color_sl);-                  if (end[eol - end - 1] == '\n')-                    out.str(end, eol - end - 1);-                  else+                  eol -= end[eol - end - 1] == '\n';+                  if (eol > end)+                  {+                    out.str(color_sl);                     out.str(end, eol - end);-                  out.str(color_off);+                    out.str(color_off);+                  }                   out.nl();                 }                 else if (matcher->hit_end())@@ -6254,8 +7948,6 @@ void Grep::search(const char *pathname)                 rest_line_last = matcher->last();               }             }--            lineno += matcher->lines() - 1;           }           else           {@@ -6273,8 +7965,8 @@ void Grep::search(const char *pathname)                  if (binary)                 {-                  out.dump.hex(Output::Dump::HEX_LINE, rest_line_last, rest_line_data, first - rest_line_last, flag_separator);-                  out.dump.hex(Output::Dump::HEX_MATCH, first, begin, size, flag_separator);+                  out.dump.hex(Output::Dump::HEX_LINE, rest_line_last, rest_line_data, first - rest_line_last);+                  out.dump.hex(Output::Dump::HEX_MATCH, first, begin, size);                 }                 else                 {@@ -6282,9 +7974,9 @@ void Grep::search(const char *pathname)                   out.str(rest_line_data, first - rest_line_last);                   out.str(color_off); -                  if (lines > 1 && !flag_no_header)+                  if (lines > 1)                   {-                    // -n: echo multi-line matches line-by-line+                    // echo multi-line matches line-by-line                      const char *from = begin;                     const char *to;@@ -6293,11 +7985,11 @@ void Grep::search(const char *pathname)                     while ((to = static_cast<const char*>(memchr(from, '\n', size - (from - begin)))) != NULL)                     {                       out.str(match_ms);-                      out.str(from, to - from + 1);+                      out.str(from, to - from);                       out.str(match_off);+                      out.chr('\n'); -                      if (to + 1 <= begin + size)-                        out.header(pathname, partname, lineno + num, NULL, first + (to - begin) + 1, "|", false);+                      out.header(pathname, partname, lineno + num, NULL, first + (to - begin) + 1, "|", false);                        from = to + 1;                       ++num;@@ -6323,38 +8015,36 @@ void Grep::search(const char *pathname)                   const char *eol = matcher->eol(true); // warning: call eol() before end()                   const char *end = matcher->end(); -                  bool rest_binary = flag_hex || (!flag_text && is_binary(end, eol - end));+                  binary = flag_hex || (!flag_text && is_binary(end, eol - end)); -                  if (binary && !rest_binary)-                  {-                    out.dump.done(flag_separator);-                    out.header(pathname, partname, lineno + lines - 1, matcher, last, flag_separator, false);-                  }-                  else if (!binary && rest_binary)-                  {+                  if (hex && !binary)+                    out.dump.done();+                  else if (!hex && binary)                     out.nl();-                    out.header(pathname, partname, lineno + lines - 1, matcher, last, flag_separator, true);-                  } -                  binary = rest_binary;+                  if (hex != binary && !flag_no_header)+                    out.header(pathname, partname, lineno + lines - 1, matcher, last, flag_separator, binary);++                  hex = binary;                    if (flag_ungroup)                   {                     if (binary)                     {-                      out.dump.hex(Output::Dump::HEX_LINE, matcher->last(), end, eol - end, flag_separator);-                      out.dump.done(flag_separator);+                      out.dump.hex(Output::Dump::HEX_LINE, matcher->last(), end, eol - end);+                      out.dump.done();                     }                     else                     {                       if (eol > end)                       {-                        out.str(color_sl);-                        if (end[eol - end - 1] == '\n')-                          out.str(end, eol - end - 1);-                        else+                        eol -= end[eol - end - 1] == '\n';+                        if (eol > end)+                        {+                          out.str(color_sl);                           out.str(end, eol - end);-                        out.str(color_off);+                          out.str(color_off);+                        }                         out.nl();                       }                       else if (matcher->hit_end())@@ -6380,672 +8070,537 @@ void Grep::search(const char *pathname)               }             }           }++          context_handler.set_after_lineno(lineno + 1);         }          if (rest_line_data != NULL)         {           if (binary)           {-            out.dump.hex(Output::Dump::HEX_LINE, rest_line_last, rest_line_data, rest_line_size, flag_separator);+            out.dump.hex(Output::Dump::HEX_LINE, rest_line_last, rest_line_data, rest_line_size);           }           else           {             if (rest_line_size > 0)             {-              out.str(color_sl);-              if (rest_line_data[rest_line_size - 1] == '\n')-                out.str(rest_line_data, rest_line_size - 1);-              else+              rest_line_size -= rest_line_data[rest_line_size - 1] == '\n';+              if (rest_line_size > 0)+              {+                out.str(color_sl);                 out.str(rest_line_data, rest_line_size);-              out.str(color_off);+                out.str(color_off);+              }             }-            out.chr('\n');+            out.nl();           }-        }--        if (binary)-          out.dump.done(flag_separator);-      }-      else-      {-        // read input line-by-line and display lines that match the pattern with context lines -        // mmap base and size, set with mmap.file()-        const char *base = NULL;-        size_t size = 0;--        reflex::BufferedInput buffered_input;--        if (!mmap.file(input, base, size))-          buffered_input = input;--        const char *here = base;-        size_t left = size;+          rest_line_data = NULL;+        } -        size_t byte_offset = 0;-        size_t lineno = 1;-        size_t before = 0;-        size_t after = 0;+        // get the remaining context+        context = matcher->after(); -        const char *hex = NULL;+        if (context.len > 0)+          context_handler(*matcher, context.buf, context.len, context.num); -        // --range=NUM1[,NUM2]: start searching at line NUM1-        if (flag_min_line > 0)+        if (binary && !flag_hex && !flag_with_hex)         {-          std::string line;--          for (size_t i = flag_min_line; i > 1; --i)+          if (flag_binary_without_match)           {-            // read the next line from mmap, buffered input, or unbuffered input-            if (getline(here, left, buffered_input, input, line))-              goto exit_search;+            matches = 0;+          }+          else+          {+            out.binary_file_matches(pathname, partname);+            matches = 1;           }--          lineno = flag_min_line;-        }--        std::vector<bool> binary;-        std::vector<size_t> byte_offsets;-        std::vector<std::string> lines;--        binary.reserve(flag_before_context + 1);-        byte_offsets.reserve(flag_before_context + 1);-        lines.reserve(flag_before_context + 1);--        for (size_t i = 0; i <= flag_before_context; ++i)-        {-          binary[i] = false;-          byte_offsets.emplace_back(0);-          lines.emplace_back("");         } -        while (true)-        {-          // --range: max line exceeded?-          if (flag_max_line > 0 && lineno > flag_max_line)-            break;--          size_t current = lineno % (flag_before_context + 1);+        if (binary)+          out.dump.done();+      }+      else+      {+        // options -A, -B, -C with -v -          binary[current] = flag_hex;-          byte_offsets[current] = byte_offset;+        if (!init_read())+          goto exit_search; -          // read the next line from mmap, buffered input, or unbuffered input-          if (getline(here, left, buffered_input, input, lines[current]))-            break;+        // InvertContextGrepHandler requires lineno to be set precisely, i.e. after skipping --range lines+        size_t lineno = flag_min_line > 0 ? flag_min_line - 1 : 0;+        size_t last_lineno = 0;+        size_t after = flag_after_context;+        bool hex = false;+        bool binary = false;+        bool stop = false; -          bool before_context = flag_before_context > 0;-          bool after_context = flag_after_context > 0;+        // to display the rest of the matching line+        std::string rest_line;+        const char *rest_line_data = NULL;+        size_t rest_line_size = 0;+        size_t rest_line_last = 0; -          size_t last = UNDEFINED_SIZE;+        // construct event handler functor with captured *this and some of the locals+        InvertContextGrepHandler invert_context_handler(*this, pathname, lineno, hex, binary, matches, stop, rest_line_data, rest_line_size, rest_line_last); -          // the current input line to match-          read_line(matcher, lines[current]);+        // register an event handler functor to display non-matching lines+        matcher->set_handler(&invert_context_handler); -          if (!flag_text && !flag_hex && is_binary(lines[current].c_str(), lines[current].size()))-          {-            if (flag_binary_without_match)-            {-              matches = 0;+        // to get the context from the any_line handler explicitly+        reflex::AbstractMatcher::Context context; -              break;-            }+        while (matcher->find())+        {+          size_t current_lineno = matcher->lineno();+          size_t lines = matcher->lines(); -            binary[current] = true;-          }+          if (last_lineno + 1 >= current_lineno)+            after += lines;+          else if (last_lineno != current_lineno)+            after = 0; -          if (flag_invert_match)+          if (last_lineno != current_lineno)           {-            // -v: select non-matching line--            bool found = false;--            while (matcher->find())+            if (rest_line_data != NULL)             {-              if (flag_any_line || (after > 0 && after + flag_after_context >= lineno))+              if (binary)               {-                // -A NUM: show context after matched lines, simulates BSD grep -A--                if (last == UNDEFINED_SIZE)-                {-                  if (matches == 0)-                    if (!Stats::found_part())-                      goto exit_search;--                  if (!flag_no_header)-                  {-                    if (hex != NULL && !binary[current])-                    {-                      out.dump.done(hex);-                      hex = NULL;-                    }--                    if (!binary[current] || flag_hex || flag_with_hex)-                      out.header(pathname, partname, lineno, matcher, byte_offset, "-", binary[current]);-                  }--                  last = 0;-                }--                if (binary[current])-                {-                  out.dump.hex(Output::Dump::HEX_CONTEXT_LINE, byte_offsets[current] + last, lines[current].c_str() + last, matcher->first() - last, "-");-                }-                else+                out.dump.hex(Output::Dump::HEX_CONTEXT_LINE, rest_line_last, rest_line_data, rest_line_size);+              }+              else+              {+                if (rest_line_size > 0)                 {-                  if (hex != NULL)+                  rest_line_size -= rest_line_data[rest_line_size - 1] == '\n';+                  if (rest_line_size > 0)                   {-                    out.dump.done(hex);-                    hex = NULL;+                    out.str(color_cx);+                    out.str(rest_line_data, rest_line_size);+                    out.str(color_off);                   }--                  out.str(color_cx);-                  out.str(lines[current].c_str() + last, matcher->first() - last);-                  out.str(color_off);-                }--                last = matcher->last();--                // skip any further empty pattern matches-                if (last == 0)-                  break;--                if (binary[current])-                {-                  out.dump.hex(Output::Dump::HEX_CONTEXT_MATCH, byte_offsets[current] + matcher->first(), matcher->begin(), matcher->size(), "-");-                }-                else-                {-                  out.str(match_mc);-                  out.str(matcher->begin(), matcher->size());-                  out.str(match_off);                 }+                out.nl();               }-              else-              {-                found = true; -                break;-              }+              rest_line_data = NULL;             } -            if (last != UNDEFINED_SIZE)+            // get the lines before the matched line+            context = matcher->before();++            if (context.len > 0)+              invert_context_handler(*matcher, context.buf, context.len, context.num);++            if (binary && !flag_hex && !flag_with_hex)             {-              if (binary[current])+              if (flag_binary_without_match)               {-                if (flag_hex || flag_with_hex)-                {-                  out.dump.hex(Output::Dump::HEX_CONTEXT_LINE, byte_offsets[current] + last, lines[current].c_str() + last, lines[current].size() - last, "-");--                  if (flag_any_line)-                    hex = "-";-                  else-                    out.dump.done("-");-                }+                matches = 0;               }               else-              {-                if (hex != NULL)-                {-                  out.dump.done(hex);-                  hex = NULL;-                }--                size_t size = lines[current].size();--                if (size > last)-                {-                  if (lines[current][size - 1] == '\n')-                    --size;-                  out.str(color_cx);-                  out.str(lines[current].c_str() + last, size - last);-                  out.str(color_off);-                  out.nl();-                }-              }-            }-            else if (!found)-            {-              if (matches == 0)-                if (!Stats::found_part())-                  goto exit_search;--              if (binary[current] && !flag_hex && !flag_with_hex)               {                 out.binary_file_matches(pathname, partname);                 matches = 1;--                goto done_search;-              }--              if (after_context)-              {-                // -A NUM: show context after matched lines, simulates BSD grep -A--                // indicate the end of the group of after lines of the previous matched line-                if (after + flag_after_context < lineno && matches > 0 && flag_group_separator != NULL)-                {-                  out.str(color_se);-                  out.str(flag_group_separator);-                  out.str(color_off);-                  out.nl();-                }--                // remember the matched line-                after = lineno;               } -              if (before_context)-              {-                // -B NUM: show context before matched lines, simulates BSD grep -B--                size_t begin = before + 1;--                if (lineno > flag_before_context && begin < lineno - flag_before_context)-                  begin = lineno - flag_before_context;--                // indicate the begin of the group of before lines-                if (begin < lineno && matches > 0 && flag_group_separator != NULL)-                {-                  out.str(color_se);-                  out.str(flag_group_separator);-                  out.str(color_off);-                  out.nl();-                }--                // display lines before the matched line-                while (begin < lineno)-                {-                  size_t begin_context = begin % (flag_before_context + 1);--                  last = UNDEFINED_SIZE;--                  read_line(matcher, lines[begin_context]);--                  while (matcher->find())-                  {-                    if (last == UNDEFINED_SIZE)-                    {-                      if (!flag_no_header)-                        out.header(pathname, partname, begin, matcher, byte_offsets[begin_context], "-", binary[begin_context]);--                      last = 0;-                    }+              goto done_search;+            } -                    if (binary[begin_context])-                    {-                      out.dump.hex(Output::Dump::HEX_CONTEXT_LINE, byte_offsets[begin_context] + last, lines[begin_context].c_str() + last, matcher->first() - last, "-");-                    }-                    else-                    {-                      out.str(color_cx);-                      out.str(lines[begin_context].c_str() + last, matcher->first() - last);-                      out.str(color_off);-                    }+            lineno = current_lineno; -                    last = matcher->last();+            // --range: max line exceeded?+            if (flag_max_line > 0 && lineno > flag_max_line)+              break; -                    // skip any further empty pattern matches-                    if (last == 0)-                      break;+            // --max-files: max reached?+            if (stop)+              goto exit_search; -                    if (binary[begin_context])-                    {-                      out.dump.hex(Output::Dump::HEX_CONTEXT_MATCH, byte_offsets[begin_context] + matcher->first(), matcher->begin(), matcher->size(), "-");-                    }-                    else-                    {-                      out.str(match_mc);-                      out.str(matcher->begin(), matcher->size());-                      out.str(match_off);-                    }-                  }+            // --max-files: max reached?+            if (!flag_invert_match && matches == 0 && !Stats::found_part())+              goto exit_search; -                  if (last != UNDEFINED_SIZE)-                  {-                    if (binary[begin % (flag_before_context + 1)])-                    {-                      out.dump.hex(Output::Dump::HEX_CONTEXT_LINE, byte_offsets[begin_context] + last, lines[begin_context].c_str() + last, lines[begin_context].size() - last, "-");-                      out.dump.done("-");-                    }-                    else-                    {-                      size_t size = lines[begin_context].size();+            // -m: max number of matches reached?+            if (flag_max_count > 0 && matches >= flag_max_count)+              break; -                      if (size > last)-                      {-                        if (lines[begin_context][size - 1] == '\n')-                          --size;-                        out.str(color_cx);-                        out.str(lines[begin_context].c_str() + last, size - last);-                        out.str(color_off);-                        out.nl();-                      }-                    }-                  }+            // output blocked?+            if (out.eof)+              goto exit_search; -                  ++begin;-                }+            if (after < flag_after_context)+            {+              const char *eol = matcher->eol(true); // warning: call eol() before bol() and end()+              const char *bol = matcher->bol(); -                // remember the matched line-                before = lineno;-              }+              binary = flag_hex || (!flag_text && is_binary(bol, eol - bol)); -              if (!flag_no_header)+              if (binary && !flag_hex && !flag_with_hex)               {-                if (hex != NULL && !binary[current])+                if (flag_binary_without_match)                 {-                  out.dump.done(hex);-                  hex = NULL;+                  matches = 0;+                }+                else+                {+                  out.binary_file_matches(pathname, partname);+                  matches = 1;                 } -                out.header(pathname, partname, lineno, NULL, byte_offsets[current], flag_separator, binary[current]);+                goto done_search;               } -              if (binary[current])+              if (hex && !binary)+                out.dump.done();+              hex = binary;++              size_t border = matcher->border();+              size_t first = matcher->first();+              const char *begin = matcher->begin();+              const char *end = matcher->end();+              size_t size = matcher->size();++              if (!flag_no_header)+                out.header(pathname, partname, lineno, matcher, first, "-", binary);++              if (binary)               {-                out.dump.hex(Output::Dump::HEX_LINE, byte_offsets[current], lines[current].c_str(), lines[current].size(), flag_separator);+                if (flag_hex || flag_with_hex)+                {+                  out.dump.hex(Output::Dump::HEX_CONTEXT_LINE, first - border, bol, border);+                  out.dump.hex(Output::Dump::HEX_CONTEXT_MATCH, first, begin, size); -                if (flag_any_line)-                  hex = flag_separator;-                else-                  out.dump.done(flag_separator);+                  rest_line.assign(end, eol - end);+                  rest_line_data = rest_line.c_str();+                  rest_line_size = rest_line.size();+                  rest_line_last = matcher->last();+                }               }               else               {-                if (hex != NULL)-                {-                  out.dump.done(hex);-                  hex = NULL;-                }--                size_t size = lines[current].size();+                out.str(color_cx);+                out.str(bol, border);+                out.str(color_off); -                if (size > 0)+                if (lines > 1)                 {-                  if (lines[current][size - 1] == '\n')-                    --size;-                  out.str(color_sl);-                  out.str(lines[current].c_str(), size);-                  out.str(color_off);-                  out.nl();-                }-              }+                  // echo multi-line matches line-by-line -              ++matches;+                  const char *from = begin;+                  const char *to;+                  size_t num = 1; -              // -m: max number of matches reached?-              if (flag_max_count > 0 && matches >= flag_max_count)-                break;+                  while ((to = static_cast<const char*>(memchr(from, '\n', size - (from - begin)))) != NULL)+                  {+                    out.str(match_mc);+                    out.str(from, to - from);+                    out.str(match_off);+                    out.chr('\n'); -              // output blocked?-              if (out.eof)-                goto exit_search;-            }-          }-          else-          {-            // search the line for pattern matches+                    out.header(pathname, partname, lineno + num, NULL, first + (to - begin) + 1, "-", false); -            while (matcher->find())-            {-              if (matches == 0)-                if (!Stats::found_part())-                  goto exit_search;+                    from = to + 1;+                    ++num;+                  } -              if (last == UNDEFINED_SIZE && !flag_hex && !flag_with_hex && binary[current])-              {-                out.binary_file_matches(pathname, partname);-                matches = 1;+                  size -= from - begin;+                  begin = from;+                } -                goto done_search;+                out.str(match_mc);+                out.str(begin, size);+                out.str(match_off);++                rest_line.assign(end, eol - end);+                rest_line_data = rest_line.c_str();+                rest_line_size = rest_line.size();+                rest_line_last = matcher->last();               }+            }+            else if (flag_before_context > 0)+            {+              const char *eol = matcher->eol(true); // warning: call eol() before bol() and begin()+              const char *bol = matcher->bol(); -              if (after_context)-              {-                // -A NUM: show context after matched lines, simulates BSD grep -A+              binary = flag_hex || (!flag_text && is_binary(bol, eol - bol)); -                // indicate the end of the group of after lines of the previous matched line-                if (after + flag_after_context < lineno && matches > 0 && flag_group_separator != NULL)+              if (binary && !flag_hex && !flag_with_hex)+              {+                if (flag_binary_without_match)                 {-                  out.str(color_se);-                  out.str(flag_group_separator);-                  out.str(color_off);-                  out.nl();+                  matches = 0;+                }+                else+                {+                  out.binary_file_matches(pathname, partname);+                  matches = 1;                 } -                // remember the matched line and we're done with the after context-                after = lineno;-                after_context = false;+                goto done_search;               } -              if (before_context)-              {-                // -B NUM: show context before matched lines, simulates BSD grep -B+              if (hex && !binary)+                out.dump.done();+              hex = binary; -                size_t begin = before + 1;+              const char *begin = matcher->begin();+              size_t size = matcher->size();+              size_t offset = matcher->first(); -                if (lineno > flag_before_context && begin < lineno - flag_before_context)-                  begin = lineno - flag_before_context;+              if (lines == 1)+              {+                invert_context_handler.add_before_context_line(bol, eol, matcher->columno(), offset - (begin - bol));+                invert_context_handler.add_before_context_match(begin - bol, size, offset);+              }+              else+              {+                // add lines to the before context -                // indicate the begin of the group of before lines-                if (begin < lineno && matches > 0 && flag_group_separator != NULL)-                {-                  out.str(color_se);-                  out.str(flag_group_separator);-                  out.str(color_off);-                  out.nl();-                }+                const char *from = begin;+                const char *to; -                // display lines before the matched line-                while (begin < lineno)+                while ((to = static_cast<const char*>(memchr(from, '\n', eol - from))) != NULL)                 {-                  size_t begin_context = begin % (flag_before_context + 1);--                  if (!flag_no_header)-                    out.header(pathname, partname, begin, NULL, byte_offsets[begin_context], "-", binary[begin_context]);--                  if (binary[begin_context])+                  if (from == begin)                   {-                    out.dump.hex(Output::Dump::HEX_CONTEXT_LINE, byte_offsets[begin_context], lines[begin_context].c_str(), lines[begin_context].size(), "-");-                    out.dump.done("-");+                    invert_context_handler.add_before_context_line(bol, to + 1, matcher->columno(), offset - (begin - bol));+                    invert_context_handler.add_before_context_match(begin - bol, to - from + 1, offset);                   }                   else                   {-                    size_t size = lines[begin_context].size();--                    if (size > 0)-                    {-                      if (lines[begin_context][size - 1] == '\n')-                        --size;-                      out.str(color_cx);-                      out.str(lines[begin_context].c_str(), size);-                      out.str(color_off);-                      out.nl();-                    }+                    invert_context_handler.add_before_context_line(from, to + 1, 1, offset);+                    invert_context_handler.add_before_context_match(0, to + 1 < from + size ? to - from + 1 : size, offset);                   } -                  ++begin;+                  size -= to - from + 1;+                  offset += to - from + 1;+                  from = to + 1;                 }--                // remember the matched line and we're done with the before context-                before = lineno;-                before_context = false;               }+            }+          }+          else if (after < flag_after_context)+          {+            size_t size = matcher->size(); -              if (flag_ungroup && !binary[current])+            if (size > 0)+            {+              if (lines > 1 || flag_apply_color)               {-                // -u: do not group matches on a single line but on multiple lines, counting each match separately+                size_t first = matcher->first();+                size_t last = matcher->last();+                const char *begin = matcher->begin(); -                const char *separator = last == UNDEFINED_SIZE ? flag_separator : "+";+                if (binary)+                {+                  out.dump.hex(Output::Dump::HEX_CONTEXT_LINE, rest_line_last, rest_line_data, first - rest_line_last);+                  out.dump.hex(Output::Dump::HEX_CONTEXT_MATCH, first, begin, size);+                }+                else+                {+                  out.str(color_cx);+                  out.str(rest_line_data, first - rest_line_last);+                  out.str(color_off); -                if (!flag_no_header)-                  out.header(pathname, partname, lineno, matcher, byte_offset + matcher->first(), separator, binary[current]);+                  if (lines > 1)+                  {+                    // echo multi-line matches line-by-line -                out.str(color_sl);-                out.str(lines[current].c_str(), matcher->first());-                out.str(color_off);-                out.str(match_ms);-                out.str(matcher->begin(), matcher->size());-                out.str(match_off);-                out.str(color_sl);-                out.str(lines[current].c_str() + matcher->last(), lines[current].size() - matcher->last());-                out.str(color_off);+                    const char *from = begin;+                    const char *to;+                    size_t num = 1; -                ++matches;+                    while ((to = static_cast<const char*>(memchr(from, '\n', size - (from - begin)))) != NULL)+                    {+                      out.str(match_mc);+                      out.str(from, to - from);+                      out.str(match_off);+                      out.chr('\n'); -                // -m: max number of matches reached?-                if (flag_max_count > 0 && matches >= flag_max_count)-                  goto done_search;+                      out.header(pathname, partname, lineno + num, NULL, first + (to - begin) + 1, "-", false); -                // output blocked?-                if (out.eof)-                  goto exit_search;-              }-              else-              {-                if (last == UNDEFINED_SIZE)-                {-                  if (!flag_no_header)-                  {-                    if (hex != NULL && !binary[current])-                    {-                      out.dump.done(hex);-                      hex = NULL;+                      from = to + 1;+                      ++num;                     } -                    out.header(pathname, partname, lineno, matcher, byte_offset, flag_separator, binary[current]);+                    size -= from - begin;+                    begin = from;                   } -                  ++matches;--                  last = 0;+                  out.str(match_mc);+                  out.str(begin, size);+                  out.str(match_off);                 } -                if (binary[current])+                if (lines == 1)                 {-                  out.dump.hex(Output::Dump::HEX_LINE, byte_offsets[current] + last, lines[current].c_str() + last, matcher->first() - last, flag_separator);-                  out.dump.hex(Output::Dump::HEX_MATCH, byte_offsets[current] + matcher->first(), matcher->begin(), matcher->size(), flag_separator);+                  rest_line_data += last - rest_line_last;+                  rest_line_size -= last - rest_line_last;+                  rest_line_last = last;                 }                 else                 {-                  if (hex != NULL)-                  {-                    out.dump.done(hex);-                    hex = NULL;-                  }+                  const char *eol = matcher->eol(true); // warning: call eol() before end()+                  const char *end = matcher->end(); -                  out.str(color_sl);-                  out.str(lines[current].c_str() + last, matcher->first() - last);-                  out.str(color_off);-                  out.str(match_ms);-                  out.str(matcher->begin(), matcher->size());-                  out.str(match_off);-                }-              }+                  binary = flag_hex || (!flag_text && is_binary(end, eol - end)); -              last = matcher->last();+                  if (hex && !binary)+                    out.dump.done();+                  else if (!hex && binary)+                    out.nl(); -              // skip any further empty pattern matches-              if (last == 0)-                break;-            }+                  if (hex != binary && !flag_no_header)+                    out.header(pathname, partname, lineno + lines - 1, matcher, last, "-", binary); -            if (last != UNDEFINED_SIZE)+                  hex = binary;++                  rest_line.assign(end, eol - end);+                  rest_line_data = rest_line.c_str();+                  rest_line_size = rest_line.size();+                  rest_line_last = last;+                }+              }+            }+          }+          else+          {+            if (rest_line_data != NULL)             {-              if (binary[current])+              if (binary)               {-                out.dump.hex(Output::Dump::HEX_LINE, byte_offsets[current] + last, lines[current].c_str() + last, lines[current].size() - last, flag_separator);--                if (flag_any_line)-                  hex = flag_separator;-                else-                  out.dump.done(flag_separator);+                out.dump.hex(Output::Dump::HEX_CONTEXT_LINE, rest_line_last, rest_line_data, rest_line_size);               }-              else if (!flag_ungroup)+              else               {-                if (hex != NULL)-                {-                  out.dump.done(hex);-                  hex = NULL;-                }--                size_t size = lines[current].size();--                if (size > last)+                if (rest_line_size > 0)                 {-                  if (lines[current][size - 1] == '\n')-                    --size;-                  out.str(color_sl);-                  out.str(lines[current].c_str() + last, size - last);-                  out.str(color_off);-                  out.nl();+                  rest_line_size -= rest_line_data[rest_line_size - 1] == '\n';+                  if (rest_line_size > 0)+                  {+                    out.str(color_cx);+                    out.str(rest_line_data, rest_line_size);+                    out.str(color_off);+                  }                 }+                out.nl();               }++              rest_line_data = NULL;             }-            else if (flag_any_line || (after > 0 && after + flag_after_context >= lineno))++            if (flag_before_context > 0)             {-              // -A NUM: show context after matched lines, simulates BSD grep -A+              const char *eol = matcher->eol(true); // warning: call eol() before bol()+              const char *bol = matcher->bol();+              const char *begin = matcher->begin();+              size_t size = matcher->size();+              size_t offset = matcher->first(); -              if (!binary[current] || flag_hex || flag_with_hex)+              if (lines == 1)               {-                // display line as part of the after context of the matched line-                if (!flag_no_header)+                invert_context_handler.add_before_context_match(begin - bol, size, offset);+              }+              else+              {+                // add lines to the before context++                const char *end = matcher->end();++                binary = flag_hex || (!flag_text && is_binary(end, eol - end));++                if (binary && !flag_hex && !flag_with_hex)                 {-                  if (hex != NULL && !binary[current])+                  if (flag_binary_without_match)+                  {+                    matches = 0;+                  }+                  else                   {-                    out.dump.done(hex);-                    hex = NULL;+                    out.binary_file_matches(pathname, partname);+                    matches = 1;                   } -                  out.header(pathname, partname, lineno, NULL, byte_offsets[current], "-", binary[current]);+                  goto done_search;                 } -                if (binary[current])-                {-                  out.dump.hex(Output::Dump::HEX_CONTEXT_LINE, byte_offsets[current], lines[current].c_str(), lines[current].size(), "-");+                if (hex && !binary)+                  out.dump.done();+                hex = binary; -                  if (flag_any_line)-                    hex = "-";-                  else-                    out.dump.done("-");-                }-                else+                const char *from = begin;+                const char *to;++                while ((to = static_cast<const char*>(memchr(from, '\n', eol - from))) != NULL)                 {-                  if (hex != NULL)+                  if (from == begin)                   {-                    out.dump.done(hex);-                    hex = NULL;+                    invert_context_handler.add_before_context_match(begin - bol, to - from + 1, offset);                   }--                  size_t size = lines[current].size();--                  if (size > 0)+                  else                   {-                    if (lines[current][size - 1] == '\n')-                      --size;-                    out.str(color_cx);-                    out.str(lines[current].c_str(), size);-                    out.str(color_off);-                    out.nl();+                    invert_context_handler.add_before_context_line(from, to + 1, 1, offset);+                    invert_context_handler.add_before_context_match(0, to + 1 < from + size ? to - from + 1 : size, offset);                   }++                  size -= to - from + 1;+                  offset += to - from + 1;+                  from = to + 1;                 }               }             }+          } -            // -m: max number of matches reached?-            if (flag_max_count > 0 && matches >= flag_max_count)-              break;+          lineno = current_lineno + lines - 1;+          last_lineno = lineno;+        } -            // output blocked?-            if (out.eof)-              goto exit_search;+        if (rest_line_data != NULL)+        {+          if (binary)+          {+            out.dump.hex(Output::Dump::HEX_CONTEXT_LINE, rest_line_last, rest_line_data, rest_line_size);+          }+          else+          {+            if (rest_line_size > 0)+            {+              rest_line_size -= rest_line_data[rest_line_size - 1] == '\n';+              if (rest_line_size > 0)+              {+                out.str(color_cx);+                out.str(rest_line_data, rest_line_size);+                out.str(color_off);+              }+            }+            out.nl();           } -          // update byte offset and line number-          byte_offset += lines[current].size();-          ++lineno;+          rest_line_data = NULL;+        }++        // get the remaining context+        context = matcher->after();++        if (context.len > 0)+          invert_context_handler(*matcher, context.buf, context.len, context.num);++        if (binary && !flag_hex && !flag_with_hex)+        {+          if (flag_binary_without_match)+          {+            matches = 0;+          }+          else+          {+            out.binary_file_matches(pathname, partname);+            matches = 1;+          }         }++        if (binary)+          out.dump.done();       }  done_search:@@ -7472,25 +9027,26 @@ size_t strtofuzzy(const char *string, const char *message)   return max | flags; } -// display usage/help information with an optional diagnostic message and exit-void help(const char *message, const char *arg)+// display diagnostic message and exit+void help(const char *message, const char *arg, const char *valid) {-  if (message && *message)-    std::cout << "ugrep: " << message << (arg != NULL ? arg : "") << std::endl;--  std::cout << "Usage: ugrep [OPTIONS] [PATTERN] [-f FILE] [-e PATTERN] [FILE ...]\n";+  std::cerr << "ugrep: " << message << (arg != NULL ? arg : "");+  if (valid != NULL)+    std::cerr << ", did you mean " << valid << "?";+  std::cerr << "\nUsage: ugrep [OPTIONS] [PATTERN] [-f FILE] [-e PATTERN] [FILE ...]\n";+  std::cerr << "Try 'ugrep --help' for more information.\n";+  exit(EXIT_ERROR);+} -  if (message)-  {-    std::cout << "Try 'ugrep --help' for more information.\n";-  }-  else-  {-    std::cout << "\n\+// display usage/help information and exit+void help()+{+  std::cout <<+    "Usage: ugrep [OPTIONS] [PATTERN] [-f FILE] [-e PATTERN] [FILE ...]\n\n\     -A NUM, --after-context=NUM\n\             Print NUM lines of trailing context after matching lines.  Places\n\             a --group-separator between contiguous groups of matches.  See also\n\-            options -B, -C, and -y.  Disables multi-line matching.\n\+            options -B, -C, and -y.\n\     -a, --text\n\             Process a binary file as if it were text.  This is equivalent to\n\             the --binary-files=text option.  This option might output binary\n\@@ -7499,7 +9055,7 @@ void help(const char *message, const char *arg)     -B NUM, --before-context=NUM\n\             Print NUM lines of leading context before matching lines.  Places\n\             a --group-separator between contiguous groups of matches.  See also\n\-            options -A, -C, and -y.  Disables multi-line matching.\n\+            options -A, -C, and -y.\n\     -b, --byte-offset\n\             The offset in bytes of a matched line is displayed in front of the\n\             respective matched line.  If -u is specified, displays the offset\n\@@ -7691,7 +9247,7 @@ void help(const char *message, const char *arg)     --heading, -+\n\             Group matches per file.  Adds a heading and a line break between\n\             results from different files.\n\-    --help\n\+    --help, -?\n\             Print a help message.\n\     --hexdump=[1-8][b][c][h]\n\             Output matches in 1 to 8 columns of 8 hexadecimal octets.  The\n\@@ -7926,12 +9482,12 @@ void help(const char *message, const char *arg)   for (int i = 0; type_table[i].type != NULL; ++i)     std::cout << (i == 0 ? "" : ",") << (i % 7 ? " " : "\n            ") << "`" << type_table[i].type << "'";   std::cout << ".\n\-    --tabs=NUM\n\+    --tabs[=NUM]\n\             Set the tab size to NUM to expand tabs for option -k.  The value of\n\             NUM may be 1, 2, 4, or 8.  The default tab size is 8.\n\     --tag[=TAG[,END]]\n\-            Disables colors to mark up matches with TAG.  If END is specified,\n\-            the end of a match is marked with END.  The default is `___'.\n\+            Disables colors to mark up matches with TAG.  END marks the end of\n\+            a match if specified, otherwise TAG.  The default is `___'.\n\     -U, --binary\n"; #ifdef OS_WIN   std::cout << "\@@ -7984,7 +9540,7 @@ void help(const char *message, const char *arg)     -y, --any-line\n\             Any matching or non-matching line is output.  Non-matching lines\n\             are output with the `-' separator as context of the matching lines.\n\-            See also options -A, -B, and -C.  Disables multi-line matching.\n\+            See also options -A, -B, and -C.\n\     -Z[MAX], --fuzzy[=MAX]\n\             Fuzzy mode: report approximate pattern matches within MAX errors.\n\             By default, MAX is 1: one deletion, insertion or substitution is\n\@@ -8034,7 +9590,6 @@ void help(const char *message, const char *arg)     If -q or --quiet or --silent is used and a line is selected, the exit\n\     status is 0 even if an error occurred.\n\ " << std::endl;-  }    exit(EXIT_ERROR); }

src/ugrep.hpp

@@ -237,8 +237,8 @@ extern size_t flag_max_line; extern size_t flag_not_magic; extern size_t flag_min_magic; extern size_t flag_jobs;-extern size_t flag_tabs; extern size_t flag_hex_columns;+extern size_t flag_tabs; extern size_t flag_max_mmap; extern size_t flag_min_steal; extern const char *flag_pager;

tests/archive.gz

Binary file changed

tests/archive.tar.zip

Binary file changed

tests/archive.tgz

Binary file changed

tests/archive.zip

Binary file changed

tests/gen.sh

@@ -81,10 +81,10 @@ $UG --max-count=1 Hello Hello.bat Hello.class Hello.java Hello.pdf Hello.sh Hell $UG --max-files=1 Hello Hello.bat Hello.class Hello.java Hello.pdf Hello.sh Hello.txt > out/Hello_Hello--max-files.out $UG --range=1,1   Hello Hello.bat Hello.class Hello.java Hello.pdf Hello.sh Hello.txt > out/Hello_Hello--range.out -for PAT in '' 'Hello' '\w+\s+\S+' 'nomatch' ; do+for PAT in '' 'Hello' '\w+\s+\S+' '\S\n\S' 'nomatch' ; do   FN=`echo "Hello_$PAT" | tr -Cd '[:alnum:]_'`   for OUT in '' '-I' '-W' '-X' ; do-    for OPS in '' '-l' '-lv' '-c' '-co' '-cv' '-n' '-nkbT' '-unkbT' '-o' '-on' '-onkbT' '-ounkbT' '-nv' '-nC1' '-nvC1' '-ny' '-nvy' ; do+    for OPS in '' '-l' '-lv' '-c' '-co' '-cv' '-n' '-nkbT' '-unkbT' '-o' '-on' '-onkbT' '-ounkbT' '-v' '-nv' '-C2' '-nC2' '-vC2' '-nvC2' '-y' '-ny' '-vy' '-nvy' ; do       $UG -U $OUT $OPS "$PAT" Hello.bat Hello.class Hello.java Hello.pdf Hello.sh Hello.txt > "out/$FN$OUT$OPS.out"     done   done

tests/out/Hello_-C2.out

new file mode 100644@@ -0,0 +1,15 @@+Hello.bat:#!/bin/sh+Hello.bat:echo "Hello World!"+Binary file Hello.class matches+Hello.java:import java.lang.*;+Hello.java:+Hello.java:public class Hello // prints a Hello World! greeting+Hello.java:{ public static void main(String[] arg)+Hello.java:  { System.out.println("Hello World!");+Hello.java:  }+Hello.java:}+Hello.pdf:%PDF-1.3+Binary file Hello.pdf matches+Hello.sh:#!/bin/sh+Hello.sh:echo "Hello World!"+Hello.txt:Hello

tests/out/Hello_-F.out

@@ -1,15 +1,15 @@-Hello.bat:#!/bin/sh-Hello.bat:echo "Hello World!"+Hello.bat:#!/bin/sh+Hello.bat:echo "Hello World!" Binary file Hello.class matches-Hello.java:import java.lang.*;-Hello.java:-Hello.java:public class Hello // prints a Hello World! greeting-Hello.java:{ public static void main(String[] arg)-Hello.java:  { System.out.println("Hello World!");-Hello.java:  }-Hello.java:}-Hello.pdf:%PDF-1.3+Hello.java:import java.lang.*;+Hello.java:+Hello.java:public class Hello // prints a Hello World! greeting+Hello.java:{ public static void main(String[] arg)+Hello.java:  { System.out.println("Hello World!");+Hello.java:  }+Hello.java:}+Hello.pdf:%PDF-1.3 Binary file Hello.pdf matches-Hello.sh:#!/bin/sh-Hello.sh:echo "Hello World!"+Hello.sh:#!/bin/sh+Hello.sh:echo "Hello World!" Hello.txt:Hello

tests/out/Hello_-Fw.out

@@ -1,15 +1,15 @@-Hello.bat:#!/bin/sh-Hello.bat:echo "Hello World!"+Hello.bat:#!/bin/sh+Hello.bat:echo "Hello World!" Binary file Hello.class matches-Hello.java:import java.lang.*;-Hello.java:-Hello.java:public class Hello // prints a Hello World! greeting-Hello.java:{ public static void main(String[] arg)-Hello.java:  { System.out.println("Hello World!");-Hello.java:  }-Hello.java:}-Hello.pdf:%PDF-1.3+Hello.java:import java.lang.*;+Hello.java:+Hello.java:public class Hello // prints a Hello World! greeting+Hello.java:{ public static void main(String[] arg)+Hello.java:  { System.out.println("Hello World!");+Hello.java:  }+Hello.java:}+Hello.pdf:%PDF-1.3 Binary file Hello.pdf matches-Hello.sh:#!/bin/sh-Hello.sh:echo "Hello World!"+Hello.sh:#!/bin/sh+Hello.sh:echo "Hello World!" Hello.txt:Hello

tests/out/Hello_-Fx.out

@@ -1 +1,2 @@-Hello.java:+Hello.java:+Hello.java:}

tests/out/Hello_-G.out

@@ -1,15 +1,15 @@-Hello.bat:#!/bin/sh-Hello.bat:echo "Hello World!"+Hello.bat:#!/bin/sh+Hello.bat:echo "Hello World!" Binary file Hello.class matches-Hello.java:import java.lang.*;-Hello.java:-Hello.java:public class Hello // prints a Hello World! greeting-Hello.java:{ public static void main(String[] arg)-Hello.java:  { System.out.println("Hello World!");-Hello.java:  }-Hello.java:}-Hello.pdf:%PDF-1.3+Hello.java:import java.lang.*;+Hello.java:+Hello.java:public class Hello // prints a Hello World! greeting+Hello.java:{ public static void main(String[] arg)+Hello.java:  { System.out.println("Hello World!");+Hello.java:  }+Hello.java:}+Hello.pdf:%PDF-1.3 Binary file Hello.pdf matches-Hello.sh:#!/bin/sh-Hello.sh:echo "Hello World!"+Hello.sh:#!/bin/sh+Hello.sh:echo "Hello World!" Hello.txt:Hello

tests/out/Hello_-I-C2.out

new file mode 100644@@ -0,0 +1,13 @@+Hello.bat:#!/bin/sh+Hello.bat:echo "Hello World!"+Hello.java:import java.lang.*;+Hello.java:+Hello.java:public class Hello // prints a Hello World! greeting+Hello.java:{ public static void main(String[] arg)+Hello.java:  { System.out.println("Hello World!");+Hello.java:  }+Hello.java:}+Hello.pdf:%PDF-1.3+Hello.sh:#!/bin/sh+Hello.sh:echo "Hello World!"+Hello.txt:Hello

tests/out/Hello_-I-n.out

@@ -1,13 +1,13 @@-Hello.bat:1:#!/bin/sh-Hello.bat:2:echo "Hello World!"-Hello.java:1:import java.lang.*;-Hello.java:2:-Hello.java:3:public class Hello // prints a Hello World! greeting-Hello.java:4:{ public static void main(String[] arg)-Hello.java:5:  { System.out.println("Hello World!");-Hello.java:6:  }-Hello.java:7:}-Hello.pdf:1:%PDF-1.3-Hello.sh:1:#!/bin/sh-Hello.sh:2:echo "Hello World!"+Hello.bat:1:#!/bin/sh+Hello.bat:2:echo "Hello World!"+Hello.java:1:import java.lang.*;+Hello.java:2:+Hello.java:3:public class Hello // prints a Hello World! greeting+Hello.java:4:{ public static void main(String[] arg)+Hello.java:5:  { System.out.println("Hello World!");+Hello.java:6:  }+Hello.java:7:}+Hello.pdf:1:%PDF-1.3+Hello.sh:1:#!/bin/sh+Hello.sh:2:echo "Hello World!" Hello.txt:1:Hello

tests/out/Hello_-I-nC1.out

deleted file mode 100644@@ -1,13 +0,0 @@-Hello.bat:1:#!/bin/sh-Hello.bat:2:echo "Hello World!"-Hello.java:1:import java.lang.*;-Hello.java:2:-Hello.java:3:public class Hello // prints a Hello World! greeting-Hello.java:4:{ public static void main(String[] arg)-Hello.java:5:  { System.out.println("Hello World!");-Hello.java:6:  }-Hello.java:7:}-Hello.pdf:1:%PDF-1.3-Hello.sh:1:#!/bin/sh-Hello.sh:2:echo "Hello World!"-Hello.txt:1:Hello\ No newline at end of file

tests/out/Hello_-I-nC2.out

new file mode 100644@@ -0,0 +1,13 @@+Hello.bat:1:#!/bin/sh+Hello.bat:2:echo "Hello World!"+Hello.java:1:import java.lang.*;+Hello.java:2:+Hello.java:3:public class Hello // prints a Hello World! greeting+Hello.java:4:{ public static void main(String[] arg)+Hello.java:5:  { System.out.println("Hello World!");+Hello.java:6:  }+Hello.java:7:}+Hello.pdf:1:%PDF-1.3+Hello.sh:1:#!/bin/sh+Hello.sh:2:echo "Hello World!"+Hello.txt:1:Hello

tests/out/Hello_-I-nkbT.out

@@ -1,13 +1,13 @@-Hello.bat:     1:  1:      0:	#!/bin/sh-Hello.bat:     2:  1:     10:	echo "Hello World!"-Hello.java:     1:  1:      0:	import java.lang.*;-Hello.java:     2:  1:     20:	-Hello.java:     3:  1:     21:	public class Hello // prints a Hello World! greeting-Hello.java:     4:  1:     74:	{ public static void main(String[] arg)-Hello.java:     5:  1:    114:	  { System.out.println("Hello World!");-Hello.java:     6:  1:    154:	  }-Hello.java:     7:  1:    158:	}-Hello.pdf:     1:  1:      0:	%PDF-1.3-Hello.sh:     1:  1:      0:	#!/bin/sh-Hello.sh:     2:  1:     10:	echo "Hello World!"+Hello.bat:     1:  1:      0:	#!/bin/sh+Hello.bat:     2:  1:     10:	echo "Hello World!"+Hello.java:     1:  1:      0:	import java.lang.*;+Hello.java:     2:  1:     20:	+Hello.java:     3:  1:     21:	public class Hello // prints a Hello World! greeting+Hello.java:     4:  1:     74:	{ public static void main(String[] arg)+Hello.java:     5:  1:    114:	  { System.out.println("Hello World!");+Hello.java:     6:  1:    154:	  }+Hello.java:     7:  1:    158:	}+Hello.pdf:     1:  1:      0:	%PDF-1.3+Hello.sh:     1:  1:      0:	#!/bin/sh+Hello.sh:     2:  1:     10:	echo "Hello World!" Hello.txt:     1:  1:      0:	Hello

tests/out/Hello_-I-nvC1.out

deleted file mode 100644

tests/out/Hello_-I-nvC2.out

new file mode 100644

tests/out/Hello_-I-nvy.out

@@ -1,13 +1,13 @@-Hello.bat-1-#!/bin/sh-Hello.bat-2-echo "Hello World!"-Hello.java-1-import java.lang.*;+Hello.bat-1-#!/bin/sh+Hello.bat-2-echo "Hello World!"+Hello.java-1-import java.lang.*; Hello.java-2--Hello.java-3-public class Hello // prints a Hello World! greeting-Hello.java-4-{ public static void main(String[] arg)-Hello.java-5-  { System.out.println("Hello World!");-Hello.java-6-  }-Hello.java-7-}-Hello.pdf-1-%PDF-1.3-Hello.sh-1-#!/bin/sh-Hello.sh-2-echo "Hello World!"-Hello.txt-1-Hello\ No newline at end of file+Hello.java-3-public class Hello // prints a Hello World! greeting+Hello.java-4-{ public static void main(String[] arg)+Hello.java-5-  { System.out.println("Hello World!");+Hello.java-6-  }+Hello.java-7-}+Hello.pdf-1-%PDF-1.3+Hello.sh-1-#!/bin/sh+Hello.sh-2-echo "Hello World!"+Hello.txt-1-Hello

tests/out/Hello_-I-ny.out

@@ -1,13 +1,13 @@-Hello.bat:1:#!/bin/sh-Hello.bat:2:echo "Hello World!"-Hello.java:1:import java.lang.*;-Hello.java:2:-Hello.java:3:public class Hello // prints a Hello World! greeting-Hello.java:4:{ public static void main(String[] arg)-Hello.java:5:  { System.out.println("Hello World!");-Hello.java:6:  }-Hello.java:7:}-Hello.pdf:1:%PDF-1.3-Hello.sh:1:#!/bin/sh-Hello.sh:2:echo "Hello World!"-Hello.txt:1:Hello\ No newline at end of file+Hello.bat:1:#!/bin/sh+Hello.bat:2:echo "Hello World!"+Hello.java:1:import java.lang.*;+Hello.java:2:+Hello.java:3:public class Hello // prints a Hello World! greeting+Hello.java:4:{ public static void main(String[] arg)+Hello.java:5:  { System.out.println("Hello World!");+Hello.java:6:  }+Hello.java:7:}+Hello.pdf:1:%PDF-1.3+Hello.sh:1:#!/bin/sh+Hello.sh:2:echo "Hello World!"+Hello.txt:1:Hello

tests/out/Hello_-I-o.out

@@ -1,7 +1,7 @@ Hello.bat:#!/bin/sh Hello.bat:echo "Hello World!" Hello.java:import java.lang.*;-Hello.java:+Hello.java: Hello.java:public class Hello // prints a Hello World! greeting Hello.java:{ public static void main(String[] arg) Hello.java:  { System.out.println("Hello World!");

tests/out/Hello_-I-on.out

@@ -1,7 +1,7 @@ Hello.bat:1:#!/bin/sh Hello.bat:2:echo "Hello World!" Hello.java:1:import java.lang.*;-Hello.java:2:+Hello.java:2: Hello.java:3:public class Hello // prints a Hello World! greeting Hello.java:4:{ public static void main(String[] arg) Hello.java:5:  { System.out.println("Hello World!");

tests/out/Hello_-I-onkbT.out

@@ -1,7 +1,7 @@ Hello.bat:     1:  1:      0:	#!/bin/sh Hello.bat:     2:  1:     10:	echo "Hello World!" Hello.java:     1:  1:      0:	import java.lang.*;-Hello.java:     2:  1:     20:	+Hello.java:     2:  1:     20:	 Hello.java:     3:  1:     21:	public class Hello // prints a Hello World! greeting Hello.java:     4:  1:     74:	{ public static void main(String[] arg) Hello.java:     5:  1:    114:	  { System.out.println("Hello World!");

tests/out/Hello_-I-ounkbT.out

@@ -1,7 +1,7 @@ Hello.bat:     1:  1:      0:	#!/bin/sh Hello.bat:     2:  1:     10:	echo "Hello World!" Hello.java:     1:  1:      0:	import java.lang.*;-Hello.java:     2:  1:     20:	+Hello.java:     2:  1:     20:	 Hello.java:     3:  1:     21:	public class Hello // prints a Hello World! greeting Hello.java:     4:  1:     74:	{ public static void main(String[] arg) Hello.java:     5:  1:    114:	  { System.out.println("Hello World!");

tests/out/Hello_-I-unkbT.out

@@ -1,13 +1,13 @@-Hello.bat:     1:  1:      0:	#!/bin/sh-Hello.bat:     2:  1:     10:	echo "Hello World!"-Hello.java:     1:  1:      0:	import java.lang.*;-Hello.java:     2:  1:     20:	-Hello.java:     3:  1:     21:	public class Hello // prints a Hello World! greeting-Hello.java:     4:  1:     74:	{ public static void main(String[] arg)-Hello.java:     5:  1:    114:	  { System.out.println("Hello World!");-Hello.java:     6:  1:    154:	  }-Hello.java:     7:  1:    158:	}-Hello.pdf:     1:  1:      0:	%PDF-1.3-Hello.sh:     1:  1:      0:	#!/bin/sh-Hello.sh:     2:  1:     10:	echo "Hello World!"+Hello.bat:     1:  1:      0:	#!/bin/sh+Hello.bat:     2:  1:     10:	echo "Hello World!"+Hello.java:     1:  1:      0:	import java.lang.*;+Hello.java:     2:  1:     20:	+Hello.java:     3:  1:     21:	public class Hello // prints a Hello World! greeting+Hello.java:     4:  1:     74:	{ public static void main(String[] arg)+Hello.java:     5:  1:    114:	  { System.out.println("Hello World!");+Hello.java:     6:  1:    154:	  }+Hello.java:     7:  1:    158:	}+Hello.pdf:     1:  1:      0:	%PDF-1.3+Hello.sh:     1:  1:      0:	#!/bin/sh+Hello.sh:     2:  1:     10:	echo "Hello World!" Hello.txt:     1:  1:      0:	Hello

tests/out/Hello_-I-v.out

new file mode 100644

tests/out/Hello_-I-vC2.out

new file mode 100644

tests/out/Hello_-I-vy.out

new file mode 100644@@ -0,0 +1,13 @@+Hello.bat-#!/bin/sh+Hello.bat-echo "Hello World!"+Hello.java-import java.lang.*;+Hello.java-+Hello.java-public class Hello // prints a Hello World! greeting+Hello.java-{ public static void main(String[] arg)+Hello.java-  { System.out.println("Hello World!");+Hello.java-  }+Hello.java-}+Hello.pdf-%PDF-1.3+Hello.sh-#!/bin/sh+Hello.sh-echo "Hello World!"+Hello.txt-Hello

tests/out/Hello_-I-y.out

new file mode 100644@@ -0,0 +1,13 @@+Hello.bat:#!/bin/sh+Hello.bat:echo "Hello World!"+Hello.java:import java.lang.*;+Hello.java:+Hello.java:public class Hello // prints a Hello World! greeting+Hello.java:{ public static void main(String[] arg)+Hello.java:  { System.out.println("Hello World!");+Hello.java:  }+Hello.java:}+Hello.pdf:%PDF-1.3+Hello.sh:#!/bin/sh+Hello.sh:echo "Hello World!"+Hello.txt:Hello

tests/out/Hello_-I.out

@@ -1,13 +1,13 @@-Hello.bat:#!/bin/sh-Hello.bat:echo "Hello World!"-Hello.java:import java.lang.*;-Hello.java:-Hello.java:public class Hello // prints a Hello World! greeting-Hello.java:{ public static void main(String[] arg)-Hello.java:  { System.out.println("Hello World!");-Hello.java:  }-Hello.java:}-Hello.pdf:%PDF-1.3-Hello.sh:#!/bin/sh-Hello.sh:echo "Hello World!"+Hello.bat:#!/bin/sh+Hello.bat:echo "Hello World!"+Hello.java:import java.lang.*;+Hello.java:+Hello.java:public class Hello // prints a Hello World! greeting+Hello.java:{ public static void main(String[] arg)+Hello.java:  { System.out.println("Hello World!");+Hello.java:  }+Hello.java:}+Hello.pdf:%PDF-1.3+Hello.sh:#!/bin/sh+Hello.sh:echo "Hello World!" Hello.txt:Hello

tests/out/Hello_-IP.out

@@ -1,13 +1,13 @@-Hello.bat:#!/bin/sh-Hello.bat:echo "Hello World!"-Hello.java:import java.lang.*;-Hello.java:-Hello.java:public class Hello // prints a Hello World! greeting-Hello.java:{ public static void main(String[] arg)-Hello.java:  { System.out.println("Hello World!");-Hello.java:  }-Hello.java:}-Hello.pdf:%PDF-1.3-Hello.sh:#!/bin/sh-Hello.sh:echo "Hello World!"+Hello.bat:#!/bin/sh+Hello.bat:echo "Hello World!"+Hello.java:import java.lang.*;+Hello.java:+Hello.java:public class Hello // prints a Hello World! greeting+Hello.java:{ public static void main(String[] arg)+Hello.java:  { System.out.println("Hello World!");+Hello.java:  }+Hello.java:}+Hello.pdf:%PDF-1.3+Hello.sh:#!/bin/sh+Hello.sh:echo "Hello World!" Hello.txt:Hello

tests/out/Hello_-IPw.out

@@ -1,13 +1,13 @@-Hello.bat:#!/bin/sh-Hello.bat:echo "Hello World!"-Hello.java:import java.lang.*;-Hello.java:-Hello.java:public class Hello // prints a Hello World! greeting-Hello.java:{ public static void main(String[] arg)-Hello.java:  { System.out.println("Hello World!");-Hello.java:  }-Hello.java:}-Hello.pdf:%PDF-1.3-Hello.sh:#!/bin/sh-Hello.sh:echo "Hello World!"+Hello.bat:#!/bin/sh+Hello.bat:echo "Hello World!"+Hello.java:import java.lang.*;+Hello.java:+Hello.java:public class Hello // prints a Hello World! greeting+Hello.java:{ public static void main(String[] arg)+Hello.java:  { System.out.println("Hello World!");+Hello.java:  }+Hello.java:}+Hello.pdf:%PDF-1.3+Hello.sh:#!/bin/sh+Hello.sh:echo "Hello World!" Hello.txt:Hello

tests/out/Hello_-IPx.out

@@ -1 +1 @@-Hello.java:+Hello.java:

tests/out/Hello_-Iw.out

@@ -1,13 +1,13 @@-Hello.bat:#!/bin/sh-Hello.bat:echo "Hello World!"-Hello.java:import java.lang.*;-Hello.java:-Hello.java:public class Hello // prints a Hello World! greeting-Hello.java:{ public static void main(String[] arg)-Hello.java:  { System.out.println("Hello World!");-Hello.java:  }-Hello.java:}-Hello.pdf:%PDF-1.3-Hello.sh:#!/bin/sh-Hello.sh:echo "Hello World!"+Hello.bat:#!/bin/sh+Hello.bat:echo "Hello World!"+Hello.java:import java.lang.*;+Hello.java:+Hello.java:public class Hello // prints a Hello World! greeting+Hello.java:{ public static void main(String[] arg)+Hello.java:  { System.out.println("Hello World!");+Hello.java:  }+Hello.java:}+Hello.pdf:%PDF-1.3+Hello.sh:#!/bin/sh+Hello.sh:echo "Hello World!" Hello.txt:Hello

tests/out/Hello_-Ix.out

@@ -1 +1,2 @@-Hello.java:+Hello.java:+Hello.java:}

tests/out/Hello_-W-C2.out

new file mode 100644@@ -0,0 +1,466 @@+Hello.bat:#!/bin/sh+Hello.bat:echo "Hello World!"+Hello.class:+00000000  ca fe ba be 00 00 00 34  00 1d 0a -- -- -- -- --  |....@@@4@]J-----|+Hello.class:+00000000  -- -- -- -- -- -- -- --  -- -- -- 00 06 00 0f 09  |-----------@F@OI|+00000010  00 10 00 11 08 00 12 0a  -- -- -- -- -- -- -- --  |@P@QH@RJ--------|+Hello.class:+00000010  -- -- -- -- -- -- -- --  00 13 00 14 07 00 15 07  |--------@S@TG@UG|+00000020  00 16 01 00 06 3c 69 6e  69 74 3e 01 00 03 28 29  |@VA@F<init>A@C()|+00000030  56 01 00 04 43 6f 64 65  01 00 0f 4c 69 6e 65 4e  |VA@DCodeA@OLineN|+00000040  75 6d 62 65 72 54 61 62  6c 65 01 00 04 6d 61 69  |umberTableA@Dmai|+00000050  6e 01 00 16 28 5b 4c 6a  61 76 61 2f 6c 61 6e 67  |nA@V([Ljava/lang|+00000060  2f 53 74 72 69 6e 67 3b  29 56 01 00 0a -- -- --  |/String;)VA@J---|+Hello.class:+00000060  -- -- -- -- -- -- -- --  -- -- -- -- -- 53 6f 75  |-------------Sou|+00000070  72 63 65 46 69 6c 65 01  00 0a -- -- -- -- -- --  |rceFileA@J------|+Hello.class:+00000070  -- -- -- -- -- -- -- --  -- -- 48 65 6c 6c 6f 2e  |----------Hello.|+00000080  6a 61 76 61 0c 00 07 00  08 07 00 17 0c 00 18 00  |javaL@G@HG@WL@X@|+00000090  19 01 00 0c 48 65 6c 6c  6f 20 57 6f 72 6c 64 21  |YA@LHello World!|+000000a0  07 00 1a 0c 00 1b 00 1c  01 00 05 48 65 6c 6c 6f  |G@ZL@[@\A@EHello|+000000b0  01 00 10 6a 61 76 61 2f  6c 61 6e 67 2f 4f 62 6a  |A@Pjava/lang/Obj|+000000c0  65 63 74 01 00 10 6a 61  76 61 2f 6c 61 6e 67 2f  |ectA@Pjava/lang/|+000000d0  53 79 73 74 65 6d 01 00  03 6f 75 74 01 00 15 4c  |SystemA@CoutA@UL|+000000e0  6a 61 76 61 2f 69 6f 2f  50 72 69 6e 74 53 74 72  |java/io/PrintStr|+000000f0  65 61 6d 3b 01 00 13 6a  61 76 61 2f 69 6f 2f 50  |eam;A@Sjava/io/P|+00000100  72 69 6e 74 53 74 72 65  61 6d 01 00 07 70 72 69  |rintStreamA@Gpri|+00000110  6e 74 6c 6e 01 00 15 28  4c 6a 61 76 61 2f 6c 61  |ntlnA@U(Ljava/la|+00000120  6e 67 2f 53 74 72 69 6e  67 3b 29 56 00 21 00 05  |ng/String;)V@!@E|+00000130  00 06 00 00 00 00 00 02  00 01 00 07 00 08 00 01  |@F@@@@@B@A@G@H@A|+00000140  00 09 00 00 00 1d 00 01  00 01 00 00 00 05 2a b7  |@I@@@]@A@A@@@E*.|+00000150  00 01 b1 00 00 00 01 00  0a -- -- -- -- -- -- --  |@A.@@@A@J-------|+Hello.class:+00000150  -- -- -- -- -- -- -- --  -- 00 00 00 06 00 01 00  |---------@@@F@A@|+00000160  00 00 02 00 09 00 0b 00  0c 00 01 00 09 00 00 00  |@@B@I@K@L@A@I@@@|+00000170  25 00 02 00 01 00 00 00  09 b2 00 02 12 03 b6 00  |%@B@A@@@I.@BRC.@|+00000180  04 b1 00 00 00 01 00 0a  -- -- -- -- -- -- -- --  |D.@@@A@J--------|+Hello.class:+00000180  -- -- -- -- -- -- -- --  00 00 00 0a -- -- -- --  |--------@@@J----|+Hello.class:+00000180  -- -- -- -- -- -- -- --  -- -- -- -- 00 02 00 00  |------------@B@@|+00000190  00 04 00 08 00 05 00 01  00 0d 00 00 00 02 00 0e  |@D@H@E@A@M@@@B@N|+Hello.java:import java.lang.*;+Hello.java:+Hello.java:public class Hello // prints a Hello World! greeting+Hello.java:{ public static void main(String[] arg)+Hello.java:  { System.out.println("Hello World!");+Hello.java:  }+Hello.java:}+Hello.pdf:%PDF-1.3+Hello.pdf:+00000000  -- -- -- -- -- -- -- --  -- 25 c4 e5 f2 e5 eb a7  |---------%......|+00000010  f3 a0 d0 c4 c6 0a -- --  -- -- -- -- -- -- -- --  |.....J----------|+Hello.pdf:4 0 obj+Hello.pdf:<< /Length 5 0 R /Filter /FlateDecode >>+Hello.pdf:stream+Hello.pdf:+00000040  -- -- -- -- -- -- -- --  -- -- -- -- -- -- 78 01  |--------------xA|+00000050  45 8e bb 0a -- -- -- --  -- -- -- -- -- -- -- --  |E..J------------|+Hello.pdf:+00000050  -- -- -- -- 02 31 14 44  7b bf e2 94 5a 98 bd 89  |----B1TD{...Z...|+00000060  79 98 56 11 6c 17 2e f8  01 61 2d 64 d7 65 cd ff  |y.VQlW..Aa-d.e..|+00000070  83 17 2c ac 86 99 39 0c  b3 31 b2 51 02 b9 46 97  |.W,...9L.1.QB.F.|+00000080  e2 a9 12 f3 99 90 5c 4c  59 0a -- -- -- -- -- --  |..R...\LYJ------|+Hello.pdf:+00000080  -- -- -- -- -- -- -- --  -- -- 9f 89 07 6f 86 6b  |----------..Go.k|+00000090  f7 b4 8e d0 9b e1 e2 6a  a9 52 6a b2 40 38 fe ad  |.......j.Rj.@8..|+000000a0  ed 94 20 bb b6 70 51 a3  44 c4 a3 0d ef 7f a0 69  |.. ..pQ.D..M.~.i|+000000b0  c2 0b ba 30 a8 7a ac 7c  b2 bf 4f f3 bc 1e d0 17  |.K.0.z.|..O..^.W|+000000c0  37 b5 37 e3 17 4e ff 20  a5 0a -- -- -- -- -- --  |7.7.WN. .J------|+Hello.pdf:endstream+Hello.pdf:endobj+Hello.pdf:5 0 obj+Hello.pdf:123+Hello.pdf:endobj+Hello.pdf:2 0 obj+Hello.pdf:<< /Type /Page /Parent 3 0 R /Resources 6 0 R /Contents 4 0 R /MediaBox [0 0 612 792]+Hello.pdf:>>+Hello.pdf:endobj+Hello.pdf:6 0 obj+Hello.pdf:<< /ProcSet [ /PDF /Text ] /ColorSpace << /Cs1 7 0 R >> /Font << /TT1 8 0 R+Hello.pdf:>> >>+Hello.pdf:endobj+Hello.pdf:9 0 obj+Hello.pdf:<< /Length 10 0 R /N 1 /Alternate /DeviceGray /Filter /FlateDecode >>+Hello.pdf:stream+Hello.pdf:+00000200  -- -- -- -- -- -- -- --  -- -- -- -- 78 01 85 55  |------------xA.U|+00000210  5d 68 1c 55 14 3e bb 73  67 03 12 07 1f b4 0d 2d  |]h\UT>.sgCRG_.M-|+00000220  b4 83 3f 6d 09 e9 32 89  56 13 8b b5 db 4d ba 49  |..?mI.2.VS...M.I|+00000230  13 b7 eb 66 53 9b 2a ca  74 76 36 3b cd 64 66 9c  |S..fS.*.tv6;.df.|+00000240  99 dd 26 a1 4f a5 e0 9b  16 04 e9 ab a0 3e c6 82  |..&.O...VD...>..|+00000250  08 b6 2a 36 2f f6 a5 a5  c5 92 4a 35 0f 0a -- --  |H.*6/.....J5OJ--|+Hello.pdf:+00000250  -- -- -- -- -- -- -- --  -- -- -- -- -- -- 11 5a  |--------------QZ|+00000260  8c 20 28 7d 52 f0 3b 33  db 64 76 41 32 c3 9d f9  |. (}R.;3.dvA2...|+00000270  ee b9 e7 9e 7b ce 77 ee  b9 97 a8 eb 6f dd f3 ec  |....{.w.....o...|+00000280  b4 4a 34 e7 84 7e a1 9c  9b 3e 39 7d 4a ed ba 4d  |.J4..~...>9}J..M|+00000290  69 52 a8 9b f0 e8 46 e0  e5 4a a5 09 c6 8e eb 98  |iR....F..J.I....|+000002a0  fc 6f 7f 1e de a5 14 4b  ee ec 67 5b ed 63 5b f6  |.o~^..TK..g[.c[.|+000002b0  e4 aa 19 18 d0 ba 86 e6  56 03 63 8e 28 a5 11 65  |..YX....VCc.(.Qe|+000002c0  6a 86 e7 87 44 5d 97 20  1f 3c 1b 7a 8c 6f 03 3f  |j...D]. _<[z.oC?|+000002d0  39 5b 29 e7 81 d7 80 95  d6 5c 40 7a aa 60 3a a6  |9[)......\@z.`:.|+000002e0  6f 19 6a c1 d7 17 d4 92  ef d6 2c 3b e9 eb 56 e3  |oYj..W....,;..V.|+000002f0  6c 63 cb 67 ce 6e b0 af  fc ec 46 eb 0e 66 27 c7  |lc.g.n....F.Nf'.|+00000300  f1 ef 85 cf 17 4c 67 6a  12 78 1f f0 92 a1 8f 30  |....WLgjRx_....0|+00000310  ee 03 be db b4 4e 14 63  9c 4e 7b e1 91 72 ac 9f  |.C...NTc.N{..r..|+00000320  ce 36 66 a7 72 2d f9 c9  9a 7f 74 aa 25 bf 50 6f  |.6f.r-...~t.%.Po|+00000330  8c 32 ce 12 a5 97 16 eb  95 37 80 9f 00 5e 75 4e  |.2.R..V..7..@^uN|+00000340  17 8f b7 f4 d7 67 dd 71  b6 d3 43 24 f5 18 41 fe  |W....g.q..C$.XA.|+00000350  14 f0 b3 c0 5a dd 1c e3  3c a9 c0 15 df 2d b3 3e  |T...Z.\.<..U.-.>|+00000360  cb c3 aa 39 3c 02 fc 32  f0 25 2b 1c ab 00 c3 be  |...9<B.2.%+\.@..|+00000370  f4 43 d0 9c 64 39 b0 a0  c5 7a 9e fd c4 5a 22 7b  |.C..d9...z...Z"{|+00000380  46 3f 56 02 de 06 7c c8  b4 0b bc 16 ec 88 8a 17  |F?VB.F|..K.V...W|+00000390  96 d8 e6 20 f0 bc 63 17  79 2d c4 2e 2e 9b 41 14  |... ..cWy-....AT|+000003a0  2f 62 17 3f 85 f5 ca 68  ac 2f a7 43 bf c2 73 9f  |/bW?...h./.C..s.|+000003b0  26 92 f7 d4 ac a3 63 c0  e0 44 1e ad fb a3 2c 87  |&.....c..D^...,.|+000003c0  3f 72 e8 d9 d1 de 7a 11  78 c9 6f 94 39 f6 3d c0  |?r....zQx.o.9.=.|+000003d0  6b ba 3f 52 00 86 cd cc  63 55 7d 98 79 7e 01 78  |k.?R@...cU}.y~Ax|+000003e0  80 4e a4 74 32 c9 a5 d3  f8 1a e4 d0 bf 88 37 20  |.N.t2....Z....7 |+000003f0  8b 9a 11 f2 c8 c7 58 0d  7d 9b 0a -- -- -- -- --  |..Q...XM}.J-----|+Hello.pdf:+000003f0  -- -- -- -- -- -- -- --  -- -- -- d0 70 d0 7c f4  |-----------.p.|.|+00000400  0c 68 15 80 74 5a 00 2a  25 b4 4c f4 58 27 9e a3  |LhU.tZ@*%.L.X'..|+00000410  52 15 3d 95 66 a2 59 41  84 d8 ca fd a8 6f 50 7e  |RU=.f.YA.....oP~|+00000420  d7 a7 d4 80 b4 4e eb 90  d6 81 5e a3 5f 22 c9 3c  |.....N....^._".<|+00000430  fd 4a 73 e8 e7 21 6d 60  6c a6 c3 6e 1e 5e 38 b4  |.Js..!m`l..n^^8.|+00000440  08 0f d8 13 b6 f9 a0 65  d3 15 db 85 26 9e 47 3b  |HO.S...e.U..&.G;|+00000450  28 26 c4 2b 62 50 0c 91  2a 5e 15 87 c5 21 31 0c  |(&.+bPL.*^U..!1L|+00000460  e9 90 38 18 cd 89 bd 4f  fa ce 7e 3e d8 b0 f4 2e  |..8X...O..~>....|+00000470  d6 4d fa be 0c 0e 42 ac  67 c3 33 07 ac 70 34 01  |.M..LNB.g.3G.p4A|+00000480  3c f8 07 eb ce 46 9a 09  b6 2e ee 68 ec f3 bc 8f  |<.G..F.I...h....|+00000490  de 3f ef bf 63 19 b7 3e  f8 b3 8d bd 00 fa 31 27  |.?..cY.>....@.1'|+000004a0  bf c1 a2 0b 6b 26 25 e6  5e 3f f7 4d 4f c2 43 75  |...Kk&%.^?.MO.Cu|+000004b0  45 7c f5 d6 9d ee eb e7  e8 78 32 4b 51 de aa 9d  |E|.......x2KQ...|+000004c0  59 92 d7 e4 fb f2 0a --  -- -- -- -- -- -- -- --  |Y.....J---------|+Hello.pdf:+000004c0  -- -- -- -- -- -- -- be  f7 e4 d5 a4 0d f9 67 79  |-------.....M.gy|+000004d0  15 ef bd b6 5c 3d ca 0b  ff 93 b9 cd 21 46 3b 92  |U...\=.K....!F;.|+000004e0  cd 41 ce 3c 9b 51 b4 71  c6 1b c0 21 b8 a9 45 73  |.A.<.Q.q.[.!..Es|+000004f0  f6 b7 59 4c b2 e9 b6 62  b4 60 c9 42 94 9d ab b8  |..YL...b.`.B....|+00000500  ff cb 09 f3 c3 3c b7 b1  52 73 2e ee f0 bc b7 3f  |..I..<..Rs.....?|+00000510  63 36 cd f7 8a 0f 8b 74  be 4f bb ac ad 6b 9f 68  |c6...O.t.O...k.h|+00000520  3f 6a 7f 68 2b da c7 40  bf 4b 1f 4a 5f 4a df 4a  |?j~h+..@.K_J_J.J|+00000530  57 a4 ab d2 0d 52 a5 6b  d2 b2 f4 9d f4 bd f4 b9  |W...MR.k........|+00000540  f4 35 7a 5f 40 ba 2c 5d  e9 d8 49 71 ec 1b bb 07  |.5z_@.,]..Iq.[.G|+00000550  7e c6 7b d6 68 ed 30 66  86 b3 14 10 f3 c2 da cc  |~.{.h.0f..TP....|+00000560  0a -- -- -- -- -- -- --  -- -- -- -- -- -- -- --  |J---------------|+Hello.pdf:+00000560  -- 4b 1f f1 77 06 63 9b  f9 33 a1 d5 5e 03 9d bb  |-K_.wFc..3..^C..|+00000570  7f 63 2d e5 88 b2 53 79  46 19 56 76 2b cf 29 13  |~c-...SyFYVv+.)S|+00000580  4a af 72 40 39 ac 6c 57  06 d0 fa 95 51 65 2f 46  |J.r@9.lWF...Qe/F|+00000590  76 6e b0 64 63 3d ce 80  85 7f 92 67 8b a6 23 ae  |vn.dc=...~.g..#.|+000005a0  e2 3c b1 57 75 b0 e7 c3  4b 1d ef a6 5f 5c c3 d6  |.<.Wu...K].._\..|+000005b0  86 35 d8 49 3d 0e 9e d9  da a6 0e af 11 57 bf 15  |.5.I=N....N.QW.U|+000005c0  55 63 bc 3b 5d 9c 06 3a  4d 21 62 8b ce 22 72 1f  |Uc.;].F:M!b.."r_|+000005d0  3a 9c 1f 27 aa fe ce d9  5c 93 38 35 52 6f e2 94  |:._'....\.85Ro..|+000005e0  b0 c4 2e d1 2f c6 5a 35  98 13 07 50 85 e3 6d f5  |..../.Z5.SGP..m.|+000005f0  38 c8 55 9a 19 c9 0c 67  72 a4 66 7a 33 43 99 fe  |8.U.Y.Lgr.fz3C..|+00000600  cc 31 c6 51 ac d1 f9 92  d9 8b d1 21 7c 47 12 de  |.1.Q.......!|GR.|+00000610  33 cb 31 ff 9b 35 c4 67  18 ef 1d e6 a8 09 6c a3  |3.1..5.gX.]..Il.|+00000620  87 5b 2b 34 e7 71 df 11  e5 5d 6f c1 b7 66 ea a1  |.[+4.q.Q.]o..f..|+00000630  3a a0 69 2f a9 39 5c af  a6 3a e6 18 d9 3e 55 b7  |:.i/.9\..:.X.>U.|+00000640  6d 35 1a 0a -- -- -- --  -- -- -- -- -- -- -- --  |m5ZJ------------|+Hello.pdf:+00000640  -- -- -- -- 54 df 0c 4c  bf 69 56 b3 c4 77 37 cf  |----T.LL.iV..w7.|+00000650  23 fa eb f5 e8 4e 4e 6d  bb 61 34 fc 66 2c a3 54  |#....NNm.a4.f,.T|+00000660  ea 26 d1 7f b7 8f 93 34  0a -- -- -- -- -- -- --  |.&.~...4J-------|+Hello.pdf:endstream+Hello.pdf:endobj+Hello.pdf:10 0 obj+Hello.pdf:1116+Hello.pdf:endobj+Hello.pdf:7 0 obj+Hello.pdf:[ /ICCBased 9 0 R ]+Hello.pdf:endobj+Hello.pdf:3 0 obj+Hello.pdf:<< /Type /Pages /MediaBox [0 0 612 792] /Count 1 /Kids [ 2 0 R ] >>+Hello.pdf:endobj+Hello.pdf:11 0 obj+Hello.pdf:<< /Type /Catalog /Pages 3 0 R >>+Hello.pdf:endobj+Hello.pdf:8 0 obj+Hello.pdf:<< /Type /Font /Subtype /TrueType /BaseFont /GQTMZF+Menlo-Regular /FontDescriptor+Hello.pdf:12 0 R /Encoding /MacRomanEncoding /FirstChar 72 /LastChar 111 /Widths [ 602+Hello.pdf:0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 602 0 0 0 0 0 0 602+Hello.pdf:0 0 602 ] >>+Hello.pdf:endobj+Hello.pdf:12 0 obj+Hello.pdf:<< /Type /FontDescriptor /FontName /GQTMZF+Menlo-Regular /Flags 33 /FontBBox+Hello.pdf:[-558 -375 718 1041] /ItalicAngle 0 /Ascent 928 /Descent -236 /CapHeight 729+Hello.pdf:/StemV 99 /XHeight 547 /StemH 83 /AvgWidth 602 /MaxWidth 602 /FontFile2 13 0 R+Hello.pdf:>>+Hello.pdf:endobj+Hello.pdf:13 0 obj+Hello.pdf:<< /Length 14 0 R /Length1 4064 /Filter /FlateDecode >>+Hello.pdf:stream+Hello.pdf:+00000980  -- -- 78 01 dd 57 7b 78  54 c5 15 3f 73 7f 77 36  |--xA.W{xT.U?s~w6|+00000990  af cd 3e 92 4d 48 48 80  5d d6 e5 95 2c 81 84 b7  |..>.MHH.]...,...|+000009a0  52 16 48 78 88 20 2f eb  2e 88 f2 48 20 28 21 08  |RVHx. /....H (!H|+000009b0  41 b4 31 90 4a 51 09 c1  40 85 08 48 7d 15 51 a9  |A.1.JQI.@.HH}UQ.|+000009c0  b5 2b 45 5d 09 c4 54 a4  62 23 45 84 a0 02 0a --  |.+E]I.T.b#E..BJ-|+Hello.pdf:+000009c0  -- -- -- -- -- -- -- --  -- -- -- -- -- -- -- f8  |---------------.|+000009d0  a2 68 8a 14 21 d8 00 43  cf bd 1b fd 3e ed d7 ef  |.h.T!.@C..[.>...|+000009e0  eb bf ed dc 9d 33 e7 fc  e6 cc 79 dd bb f7 ce 94  |.....3....y.....|+000009f0  2d 5c 5c 44 56 aa 24 50  60 56 c9 8c 05 64 36 eb  |-\\DV.$P`V..Ed6.|+00000a00  49 1e 8a 67 dd 53 e6 36  45 8a bd 97 48 cb 9d bd  |I^.g.S.6E...H...|+00000a10  60 4e 49 54 8e 7f 91 e5  4e 73 e6 dd 37 3b 2a 27  |`NIT.~..Ns..7;*'|+00000a20  4e 66 79 40 71 d1 8c c2  a8 4c 57 78 ec 57 cc 40  |Nfy@q....LWx.W.@|+00000a30  54 16 7d 78 bc ae b8 a4  8c ed 18 cd fa 2e 13 d7  |TV}x......X...S.|+00000a40  bc d2 59 6d f3 89 a3 0c  b0 64 c6 bd 6d fe e9 38  |..Ym...L.d..m..8|+00000a50  cb ee f9 33 4a 8a 78 e4  66 8f 30 e9 b6 a0 74 51  |...3J.x.f.0...tQ|+00000a60  99 29 92 bd 9a c7 ec 05  0b 8b da f4 45 90 28 a6  |.).....EK...E.(.|+00000a70  53 74 ae 8d 1a 96 05 77  a9 59 29 8b ee 22 0b 69  |St..Z.Ew.Y).."Ki|+00000a80  e4 a0 8d 94 c4 d0 ad ac  2b 79 d6 98 d7 62 b2 96  |........+y...b..|+00000a90  3e 7d f6 8d 3b ec 37 5c  a4 4e b1 e6 e2 bd 65 e9  |>}..;.7\.N....e.|+00000aa0  79 06 73 28 b8 a4 df e5  95 57 85 ac 8f bd 85 c5  |yFs(.....W......|+00000ab0  e8 a4 31 c1 eb 62 4a 54  07 22 fd e0 e5 95 d7 92  |..1..bJTG"......|+00000ac0  65 bd 69 c9 98 f9 be c9  08 c5 66 bd ae 55 8a 94  |e.i.....H.f..U..|+00000ad0  ed eb a6 c9 a1 99 22 85  6a 09 4c 2b 49 17 2e 52  |......".jIL+IW.R|+00000ae0  cc 27 9b 34 89 03 82 70  9a bc c3 a4 76 da c4 88  |.'.4.C.p....v...|+00000af0  cd e4 13 b7 7f 3d 52 0e  f5 89 44 aa 60 cc 4a 3e  |..S.~=RN..D.`.J>|+00000b00  a6 09 94 cb 34 de b4 17  67 6a c5 92 8d 91 18 93  |.I..4..Wgj....X.|+00000b10  b7 98 3a d2 e4 75 13 87  89 68 26 22 02 21 05 a5  |..:..uS..h&"B!E.|+00000b20  70 b5 02 57 14 2e 2b b4  e6 e2 9f 75 f8 ae 02 97  |p.BWT.+....u..B.|+00000b30  5a aa e5 25 85 4b 0d 7a  cb c5 90 6c a9 46 4b a5  |Z..%.KMz...l.FK.|+00000b40  7e f1 42 17 79 31 84 8b  01 fd 42 17 7c 7b 3e 47  |~.BWy1..A.BW|{>G|+00000b50  7e db 8a f3 39 f8 87 c2  39 85 6f 72 71 d6 85 bf  |~...9...9.orq...|+00000b60  d7 a2 99 43 6c 56 68 8e  5c 3b 18 b8 a6 7f 3d 12  |...ClVh.\;X..~=R|+00000b70  5f 9d 29 94 5f d5 e2 4c  21 fe a6 70 fa cb 0c 79  |_.)._..L!..p..Ly|+00000b80  5a e1 cb 0c 7c a1 f0 f9  5d f8 4c e1 d3 3a 9c 3a  |Z..L|...].L..:.:|+00000b90  99 2e 4f b5 e2 64 3a 4e  d4 e2 13 85 8f 15 8e 1f  |..O..d:N..S..U._|+00000ba0  4b 91 c7 15 8e a5 e0 68  2d 3e fa 30 45 7e a4 f0  |K..U...h->.0E~..|+00000bb0  e1 ea 04 f9 61 0a -- --  -- -- -- -- -- -- -- --  |..D.aJ----------|+Hello.pdf:+00000bb0  -- -- -- -- -- -- 3e a8  c0 91 41 68 62 a1 69 10  |------>...Ahb.iP|+00000bc0  0e 2b 1c 7a 3f 5e 1e 52  78 3f 1e 07 15 de 53 38  |N+\z?^^Rx?^GU.S8|+00000bd0  50 e5 94 07 32 f1 d7 54  ec 57 78 b7 16 8d ab 7c  |P..G2..T.Wx.V..||+00000be0  b2 51 e1 2f 0a -- -- --  -- -- -- -- -- -- -- --  |.Q./J-----------|+Hello.pdf:+00000be0  -- -- -- -- -- ef 54 60  9f c2 db 0a -- -- -- --  |-----.T`...J----|+Hello.pdf:+00000be0  -- -- -- -- -- -- -- --  -- -- -- -- 7f 56 d8 bb  |------------~V..|+00000bf0  29 51 be a5 b0 47 e1 4d  85 3f 29 34 b0 bd 06 17  |)Q...G.M.?)4..FW|+00000c00  de b0 a2 7e 77 9d ac 57  d8 bd 6b 9a dc 5d 87 dd  |...~w..W..k..]..|+00000c10  95 fa ae 3a 9f dc 35 0d  bb 02 7a 9d 0f 3b 15 5e  |...:..5M.Bz.O;U^|+00000c20  af 45 a4 66 a8 7c 4d e1  55 1e 5e 6d c5 2b 6c 6b  |.E.f.|M.U^^m.+lk|+00000c30  87 c2 1f 0b b1 bd 10 2f  db 10 4e c2 1f 14 5e 52  |.._K..P/.PN._T^R|+00000c40  81 ab f8 bd c2 8b 0a --  -- -- -- -- -- -- -- --  |......J---------|+Hello.pdf:+00000c40  -- -- -- -- -- -- -- bf  4b c2 36 85 17 9e b7 c9  |-------.K.6.W...|+00000c50  17 72 f1 bc 0d cf 6d 75  ca e7 ba 61 ab 13 cf 6e  |Wr..M.mu...a.S.n|+00000c60  f1 cb 67 2b b0 c5 8f df  2a 3c a3 f0 b4 c2 53 4f  |..g+....*<....SO|+00000c70  a6 cb a7 0a -- -- -- --  -- -- -- -- -- -- -- --  |...J------------|+Hello.pdf:+00000c70  -- -- -- -- f1 e4 13 0e  f9 64 3a 9e 70 e0 37 f1  |----..SN.d:.p.7.|+00000c80  d8 ac f0 38 3b 79 5c 61  53 22 36 6e e8 29 37 2a  |...8;y\aS"6n.)7*|+00000c90  6c e8 89 c7 d8 ff 63 b5  a8 5d 5f 27 6b 15 d6 f3  |l.....c..]_'kU..|+00000ca0  b3 b5 be 0e eb 2b f5 75  6b 7c 72 dd 34 ac 0b e8  |...N.+.uk|r.4.K.|+00000cb0  8f 2a fc 5a 61 2d cb 6b  eb b0 c6 87 1a 2e 46 cd  |.*.Za-.k....Z.F.|+00000cc0  50 3c c2 d9 3e e2 c2 ea  04 54 33 50 5d 88 55 5c  |P<..>...DT3P].U\|+00000cd0  b4 55 3e 54 39 b1 52 e1  61 85 87 14 1e 5c e1 94  |.U>T9.R.a..T^\..|+00000ce0  0f 2a ac 70 e2 57 0a --  -- -- -- -- -- -- -- --  |O*.p.WJ---------|+Hello.pdf:+00000ce0  -- -- -- -- -- -- -- cb  15 1e 70 0e 93 0f 4c c2  |-------.U^pN.OL.|+00000cf0  2f 15 2a ef c5 b2 a5 15  72 99 c2 d2 0a -- -- --  |/U*....Ur...J---|+Hello.pdf:+00000cf0  -- -- -- -- -- -- -- --  -- -- -- -- -- 54 74 c4  |-------------Tt.|+00000d00  fd 0a -- -- -- -- -- --  -- -- -- -- -- -- -- --  |.J--------------|+Hello.pdf:+00000d00  -- -- e5 36 fc 42 61 89  c2 3d 0a -- -- -- -- --  |--.6.Ba..=J-----|+Hello.pdf:+00000d00  -- -- -- -- -- -- -- --  -- -- -- 8b cb ac 72 b1  |-----------...r.|+00000d10  1d 8b 23 82 02 47 f5 32  2b ca 1a f4 45 49 58 14  |].#.BG.2+.Z.EIXT|+00000d20  d0 17 2a dc ad b0 40 a1  74 fe 24 59 5a 8b f9 25  |.W*...@.t.$YZ..%|+00000d30  dd e4 fc 49 28 e9 86 79  0a -- -- -- -- -- -- --  |...I(..yJ-------|+Hello.pdf:+00000d30  -- -- -- -- -- -- -- --  -- 77 e5 e2 4e 85 b9 b9  |---------w..N...|+00000d40  28 6e c5 9c 3a cc 56 28  52 28 54 98 35 b3 a3 9c  |(n..:.V(R(T.5...|+00000d50  a5 30 93 1c 72 66 47 cc  50 98 ae 70 87 c2 ed 53  |.0.\rfG.P..p...S|+00000d60  12 e4 ed 36 4c 2b c4 6d  fb 30 95 85 a9 2e 4c 49  |R..6L+.m.0....LI|+00000d70  00 3f d1 41 17 6e 55 f8  b9 c2 2d 19 e9 f2 96 5c  |@?.AWnU...-Y...\|+00000d80  4c 56 98 a4 30 51 61 42  05 c6 2b dc ec c2 38 85  |LV..0QaBE.+...8.|+00000d90  b1 c2 2f c7 2a dc 54 87  31 dd 70 e3 e8 34 79 63  |../.*.T.1.p..4yc|+00000da0  7f 8c 1e 9e 24 47 a7 61  54 41 9a 1c a5 30 92 a5  |~.^.$G.aTA.\.0..|+00000db0  91 85 18 c1 d2 88 3a 14  a4 21 9f 81 fc fe 18 3e  |..X...:T.!....X>|+00000dc0  cc 29 87 27 61 78 44 0b  04 e2 f4 61 43 ed 72 98  |.).'axDKD..aC.r.|+00000dd0  13 c3 22 1a b1 34 34 60  93 43 ed 18 1a 11 0d 2c  |S."Z.44`.C.XZQM,|+00000de0  05 86 58 65 c0 86 40 44  54 b2 34 c4 1a 27 87 58  |E.Xe..@DT.4.Z'.X|+00000df0  31 24 22 02 81 42 fd 67  0a -- -- -- -- -- -- --  |1$"B.B.gJ-------|+Hello.pdf:+00000df0  -- -- -- -- -- -- -- --  -- 83 39 84 c1 ad b8 41  |---------.9....A|+00000e00  e1 fa 6e 18 a4 30 90 0b  3c b0 10 03 7a b7 97 03  |..nX.0.K<.PCz..C|+00000e10  c6 a0 bf 42 3f bf 4b f6  53 e8 3b 06 7d 7a b5 97  |...B?.K.S.;F}z..|+00000e20  7d c6 20 8f 87 3c 85 5c  56 cc 55 e8 cd d3 bd db  |}. ..<.\V.U.....|+00000e30  a3 57 7b e4 30 97 93 86  9e 71 a9 b2 67 1d fc d9  |.W{.0....q..g]..|+00000e40  c9 d2 ef 82 3f a2 19 6e  b3 1d 4e 99 9d 8c 6c 23  |....?.Yn.]N...l#|+00000e50  dc 5a 3d ab 87 4f 66 29  f4 60 cd 1e 3e 74 d7 06  |.Z=..Of).`.^>t.F|+00000e60  c9 ee 0a -- -- -- -- --  -- -- -- -- -- -- -- --  |..J-------------|+Hello.pdf:+00000e60  -- -- -- dd 14 ba 2a 74  b1 c3 97 3a 4c fa 0a --  |---.T.*t...:L.J-|+Hello.pdf:+00000e60  -- -- -- -- -- -- -- --  -- -- -- -- -- -- -- 70  |---------------p|+00000e70  9d 1d 5e 85 ce 76 bb ec  ac e0 71 fb a5 a7 02 6e  |.]^..v....q...Bn|+00000e80  3f 3a 8d 41 47 f6 dc 51  a1 83 42 26 d7 36 53 21  |?:.AG..Q..B&.6S!|+00000e90  83 ef 4a 46 3a da 2b a4  2b a4 29 b4 63 0b ed 46  |..JF:.+.+.).cK.F|+00000ea0  20 35 c5 2f 53 87 21 c5  e5 90 29 7e b8 1c 48 66  | 5./S.!...)~.\Hf|+00000eb0  bd 64 17 92 78 7d 92 82  93 33 77 0e 83 83 3d 38  |.dW.x}...3wN..=8|+00000ec0  9c 70 44 6b 67 b7 59 a5  dd 0e 7b b4 76 b6 c4 78  |.pDkg.Y..N{.v..x|+00000ed0  69 b3 c2 16 ad 5d 22 d7  2e 31 1e 89 5c bb 1d ba  |i..V.]"..1^.\.].|+00000ee0  35 0e 56 e3 d9 ea af 27  28 c4 73 26 f1 0a -- --  |5NV....'(.s&.J--|+Hello.pdf:+00000ee0  -- -- -- -- -- -- -- --  -- -- -- -- -- -- 71 a9  |--------------q.|+00000ef0  88 75 20 46 c1 c2 a6 2d  0a -- -- -- -- -- -- --  |.u F...-J-------|+Hello.pdf:+00000ef0  -- -- -- -- -- -- -- --  -- d2 05 70 72 68 85 c6  |---------.Eprh..|+00000f00  80 36 08 82 03 10 7e 90  03 22 22 0a -- -- -- --  |.6H.CP~.C""J----|+Hello.pdf:+00000f00  -- -- -- -- -- -- -- --  -- -- -- -- 57 ac 16 59  |------------W.VY|+00000f10  ff 3f 8d fe c7 53 e1 4f  67 84 1a cd be 4d ac e5  |.?...S.Og.Z..M..|+00000f20  d1 d8 47 44 e8 21 6d 19  7f a5 bf bf 22 b4 87 75  |..GD.!mY~..."..u|+00000f30  34 53 2f 22 1a c5 4a b1  93 f9 ad bc b7 68 a4 e5  |4S/"Z.J......h..|+00000f40  74 5e c4 e3 6d d1 9f b9  7a 5e 1b d4 3d 8c d6 d0  |t^..m...z^[.=...|+00000f50  66 73 75 0d 4e d3 62 ec  a2 43 f4 0e 1d 63 ee b4  |fsuMN.b..C.N]c..|+00000f60  18 08 5e 2b 0e 91 47 9c  60 3f 2b 7f f0 a1 a1 9e  |XH^+N.G.`?+~....|+00000f70  a5 3d 4c cb 51 8f a0 e8  24 4a 68 8b 78 89 2d 96  |.=L.Q...$Jh.x.-.|+00000f80  53 44 94 d2 32 8d 47 6d  22 5b de af 1f 64 74 3f  |SD..2.Gm"[.._dt?|+00000f90  3d c4 d7 a3 b4 85 4a 99  37 32 58 ce f1 7f 4c 3b  |=.....J.72X..~L;|+00000fa0  68 15 5d a0 0d da 19 9a  c2 fc 4e da cb f1 28 fe  |hU].M.Y...N...(.|+00000fb0  fc 9a b9 88 26 6a 61 4b  db b4 c1 da 6c d6 db cb  |....&jaK....l...|+00000fc0  d6 36 d1 26 b1 9c 9a 68  91 4e fc 29 57 74 4a 36  |.6.&...h.N.)WtJ6|+00000fd0  69 59 6c 75 07 67 40 34  93 36 cb 26 b9 c1 a8 07  |iYluGg@4.6.&...G|+00000fe0  8f 4d f2 1c cf 10 75 b0  44 2c ae 18 2f 67 61 d4  |.M.\.Pu.D,.X/ga.|+00000ff0  6e ab d8 25 7a 6b e3 e8  10 af 2f a7 c9 b8 0d 77  |n..%zk..P./...Mw|+00001000  e3 98 58 a1 7b f5 25 38  43 35 1a 61 3a dd 49 07  |..X.{.%8C5Za:.IG|+00001010  64 93 c5 45 35 31 5e aa  b1 cc 16 f7 e9 d3 cd ab  |d..E51^...V.....|+00001020  9c ad 95 6b 4b f4 e9 62  1b 9d 61 9b 33 f1 1d cb  |...kK..b[.a.3.].|+00001030  1e 8e 6c b3 99 31 d1 0e  6d a2 1c 27 c7 71 ce b3  |^.l..1.Nm.\'.q..|+00001040  19 db 6c d2 9a 28 b5 38  68 3f 5a b9 ee 6b 35 25  |Y.l..(.8h?Z..k5%|+00001050  46 e9 23 30 84 f3 29 d7  6f a2 0d f4 0c db ed ca  |F.#0..).o.M.L...|+00001060  95 21 2a 45 5f f6 5e 4a  e5 72 75 f4 a2 6d 7c f9  |.!*E_.^J.ru..m|.|+00001070  e5 6a d4 72 45 cd 6a 88  3c 6d 30 6d d6 66 8b 55  |.j.rE.j.<m0m.f.U|+00001080  1c 6d 0b 57 b3 14 f9 d4  9f 7d 74 90 67 69 85 d8  |\mKW.T...}t.gi..|+00001090  c1 71 53 4c 05 2d 92 4d  bc 55 24 ea 41 f4 5a 8c  |.qSLE-.M.U$.A.Z.|+000010a0  45 ea fc f7 a6 6c b7 23  ac f9 46 17 86 03 13 82  |E....l.#..FW.CS.|+000010b0  ee 7d 21 8f 3f fb 27 a2  db 11 e3 0e d3 f8 70 e2  |.}!.?.'..Q.N..p.|+000010c0  7d ee c8 b5 6b e3 83 7a  86 0c 85 65 66 18 be d8  |}...k..z.L.efX..|+000010d0  b0 ee f3 9e fa 4f 93 a7  fc d9 63 c6 07 dd 11 d1  |.....O....c.G.Q.|+000010e0  ae 20 bf cd 6c c1 f4 7c  06 27 05 d9 03 ff 0c 98  |. ..l..|F'E.C.L.|+000010f0  dd 15 30 16 05 46 87 a5  8f 7f a3 a7 87 dd b3 8a  |.U0VEF...~......|+00001100  dd 55 8e 2a ef a0 2a 47  d1 20 3f ef ff b2 c7 30  |.U.*..*G. ?....0|+00001110  19 1f 7c 59 88 47 42 11  71 6d 45 84 f2 3b bc ce  |Y_|Y.GBQqmE..;..|+00001120  bb 48 dc 71 3b 4f c7 65  bb dd 05 73 f3 c3 62 3a  |.H.q;O.e..Es..b:|+00001130  0b f1 d9 0c f4 f0 30 97  90 ed 1e c1 61 8e 98 18  |K..L..0...^.a..X|+00001140  f4 86 dc 55 ee aa d1 85  55 ee 11 ee e2 19 85 1c  |...U....U.Q..Y.\|+00001150  b7 39 f2 44 51 55 28 87  33 98 14 9c cb 74 72 d0  |.9.DQU(.3.T..tr.|+00001160  13 0e 84 32 7e 60 8b 42  21 c3 bb d5 b0 c3 4b 58  |SN.2~`.B!.....KX|+00001170  bd 2a c4 16 ee 6c b3 c0  a3 09 e5 5c 65 a5 c4 ec  |.*.V.l...I.\e...|+00001180  31 ee 30 ba 8c 0f 4e 08  86 2b f3 33 c2 81 fc 50  |1.0..ONH.+.3...P|+00001190  86 c7 e3 2e 08 37 8c 0f  86 1b f2 33 3c a1 10 6b  |....H7.O.[.3<.Pk|+000011a0  d9 7e 88 94 23 ae 98 9b  d6 16 b3 9d 63 b6 f5 e0  |.~..#....V..c...|+000011b0  79 47 d4 0a -- -- -- --  -- -- -- -- -- -- -- --  |yG.J------------|+Hello.pdf:+000011b0  -- -- -- -- 97 28 90 11  a6 50 55 95 61 73 52 d0  |----.(.Q.PU.asR.|+000011c0  eb 09 57 56 55 65 54 71  1e 6d 72 84 1a 7e 02 08  |.IWVUeTq^mr.Z~BH|+000011d0  fa 29 10 68 03 22 64 d8  e0 4a 14 f0 f7 60 3c 1b  |.)PhC"d..JT..`<[|+000011e0  e3 c1 eb c9 30 00 af c7  eb e1 38 43 f9 ec db 69  |....0@....8C...i|+000011f0  dc 9a 02 8e d4 13 f2 f3  6e 9c 8a b9 af e4 5e ce  |..B..S..n.....^.|+00001200  fd 9c c1 f3 b3 18 dd e7  f3 f9 82 cf 00 53 58 1e  |.....X......@SX^|+00001210  45 dd fe 6d bf ce f0 7f  d9 b4 1f e9 c1 94 74 93  |E..m...~.._...t.|+00001220  76 e1 67 77 3b 9d 14 99  fc af 2f 56 b5 7a b1 dc  |v.gw;.T.../V.z..|+00001230  c2 a7 aa 18 ea b4 cb dc  f3 13 59 84 eb 55 11 2b  |...X.....SY..UQ+|+00001240  97 6b 3a e5 bc 75 b8 b9  37 39 0e 37 1f 6e ee 95  |.k:..u..79N7_n..|+00001250  ec f4 38 7d 1e a7 a7 58  a7 2b 8b 90 71 e5 0b 55  |..8}^..X.+..q.KU|+00001260  1b 63 fb ee fc 42 4b 77  c3 ac 30 72 d0 47 f1 bf  |[c...BKw..0r.G..|+00001270  20 81 6e 36 4e 15 7c 6f  73 f8 d6 71 b7 3a f8 58  | .n6NU|os..q.:.X|+00001280  f4 1e 77 e6 c5 71 c6 58  96 3c ea dc 63 18 17 2c  |.^w..q.X.<..cXW,|+00001290  c7 bd c7 6f 0b 43 41 e7  6e e1 1e 9f b3 93 a3 8a  |...oKCA.n.^.....|+000012a0  a5 84 ac 5e bd 93 f3 d8  75 9e d3 cb d4 bb b2 51  |...^....u......Q|+000012b0  eb de d8 78 f5 83 46 d9  74 f5 2d ed 86 d6 2c ed  |...x..F.t.-...,.|+000012c0  9b ab 4e f6 af 51 f9 b5  cf f8 ad 51 4e 29 94 49  |..N..Q.....QN).I|+000012d0  79 46 04 3b 19 74 b0 81  08 69 ec 21 93 3d 65 e6  |yFD;Yt..Hi.!.=e.|+000012e0  f0 3b cf 42 89 0c ee a4  64 4a 37 47 a3 0e 86 17  |.;.B.L..dJ7G.N.W|+000012f0  91 e2 49 b1 a4 e6 e5 f6  eb 9f 62 13 5e 37 39 1d  |..I.......bS^79]|+00001300  94 97 9b 14 d3 53 78 3b  5b 62 f4 e9 57 3e 8b 7d  |...T.Sx;[b..W>.}|+00001310  e3 a5 60 43 c9 dc 3d 53  d5 65 75 54 b8 cf 1d b9  |..`C..=S.euT..].|+00001320  14 b6 ae 7d 78 c5 8b b1  5a f5 14 cb 17 fb 06 0c  |T..}x...Z.T.W.FL|+00001330  7c 2d 2b 4b 0c 14 c9 c2  2a 02 ea 93 c7 ca 5e 08  ||-+KLT..*B....^H|+00001340  cf 37 ea 72 8e eb 32 c5  d2 9e bd 76 8d 46 95 c8  |.7.r..2....v.F..|+00001350  b7 d8 88 ca a8 43 dc 71  8e 48 e7 53 9e 11 51 22  |.....C.q.H.S.QQ"|+00001360  c5 47 23 71 a5 5e 2f 52  bc 9d bb f4 75 7a fa 7a  |.G#q.^/R....uz.z|+00001370  b4 03 53 43 1f 9c 79 f6  15 f5 91 38 21 d6 df bf  |.CSC_.y.U..8!...|+00001380  f4 f1 43 6f e2 e2 1a a3  e6 1a ad e4 9c 47 71 ce  |..Co..Z..Z...Gq.|+00001390  09 d4 8e bc 81 64 4b 75  12 55 5b eb 93 36 a6 c5  |I....dKuRU[..6..|+000013a0  25 d9 f3 91 94 f2 b3 34  c7 85 e6 2b c6 2d fc fc  |%......4...+.-..|+000013b0  42 b3 e3 6c 2f d1 d9 92  e2 32 72 ec db a7 4b d7  |B..l/....2r...K.|+000013c0  dc 24 a7 43 f3 76 d6 9c  8e 24 ad b8 7a cd 9a ea  |.$.C.v...$..z...|+000013d0  d5 6b d6 ac 3e 73 a9 e5  ab 33 2d 2d 38 71 f4 48  |.k..>s...3--8q.H|+000013e0  d3 b1 63 4d 47 8e 6e 56  ef ab 4f d5 29 75 48 f8  |..cMG.nV..O.)uH.|+000013f0  f9 b3 d3 51 f4 34 fc 9a  ed da 52 f3 39 35 4e a7  |...Q.4....R.95N.|+00001400  3f 6e 92 c5 2c 7e 7e 6f  a6 89 cc 09 3e 3a 46 75  |?n..,~~o...I>:Fu|+00001410  2c c6 0b 72 e4 84 c9 63  a7 8c c8 1a 5b 34 7f 5e  |,.Kr...c...Z[4~^|+00001420  a9 7f 62 d1 9c c5 f3 66  2c 24 fa 17 20 2d 06 e4  |.~b....f,$.W -F.|+00001430  0a -- -- -- -- -- -- --  -- -- -- -- -- -- -- --  |J---------------|+Hello.pdf:endstream+Hello.pdf:endobj+Hello.pdf:14 0 obj+Hello.pdf:2734+Hello.pdf:endobj+Hello.pdf:15 0 obj+Hello.pdf:(Hello)+Hello.pdf:endobj+Hello.pdf:16 0 obj+Hello.pdf:(Mac OS X 10.12.6 Quartz PDFContext)+Hello.pdf:endobj+Hello.pdf:17 0 obj+Hello.pdf:(TextEdit)+Hello.pdf:endobj+Hello.pdf:18 0 obj+Hello.pdf:(D:20200124010711Z00'00')+Hello.pdf:endobj+Hello.pdf:19 0 obj+Hello.pdf:()+Hello.pdf:endobj+Hello.pdf:20 0 obj+Hello.pdf:[ ]+Hello.pdf:endobj+Hello.pdf:1 0 obj+Hello.pdf:<< /Title 15 0 R /Producer 16 0 R /Creator 17 0 R /CreationDate 18 0 R /ModDate+Hello.pdf:18 0 R /Keywords 19 0 R /AAPL:Keywords 20 0 R >>+Hello.pdf:endobj+Hello.pdf:xref+Hello.pdf:0 21+Hello.pdf:0000000000 65535 f +Hello.pdf:0000005392 00000 n +Hello.pdf:0000000238 00000 n +Hello.pdf:0000001714 00000 n +Hello.pdf:0000000022 00000 n +Hello.pdf:0000000219 00000 n +Hello.pdf:0000000342 00000 n +Hello.pdf:0000001679 00000 n +Hello.pdf:0000001847 00000 n +Hello.pdf:0000000439 00000 n +Hello.pdf:0000001658 00000 n +Hello.pdf:0000001797 00000 n +Hello.pdf:0000002110 00000 n +Hello.pdf:0000002362 00000 n +Hello.pdf:0000005186 00000 n +Hello.pdf:0000005207 00000 n +Hello.pdf:0000005231 00000 n +Hello.pdf:0000005284 00000 n +Hello.pdf:0000005311 00000 n +Hello.pdf:0000005353 00000 n +Hello.pdf:0000005372 00000 n +Hello.pdf:trailer+Hello.pdf:<< /Size 21 /Root 11 0 R /Info 1 0 R /ID [ <8db88d3335070bd9583341583cf769a3>+Hello.pdf:<8db88d3335070bd9583341583cf769a3> ] >>+Hello.pdf:startxref+Hello.pdf:5536+Hello.pdf:%%EOF+Hello.sh:#!/bin/sh+Hello.sh:echo "Hello World!"+Hello.txt:Hello

tests/out/Hello_-W-n.out

@@ -1,466 +1,466 @@-Hello.bat:1:#!/bin/sh-Hello.bat:2:echo "Hello World!"+Hello.bat:1:#!/bin/sh+Hello.bat:2:echo "Hello World!" Hello.class:1:-00000000:  ca fe ba be 00 00 00 34  00 1d 0a -- -- -- -- --  |....@@@4@]J-----|+00000000  ca fe ba be 00 00 00 34  00 1d 0a -- -- -- -- --  |....@@@4@]J-----| Hello.class:2:-00000000:  -- -- -- -- -- -- -- --  -- -- -- 00 06 00 0f 09  |-----------@F@OI|-00000010:  00 10 00 11 08 00 12 0a  -- -- -- -- -- -- -- --  |@P@QH@RJ--------|+00000000  -- -- -- -- -- -- -- --  -- -- -- 00 06 00 0f 09  |-----------@F@OI|+00000010  00 10 00 11 08 00 12 0a  -- -- -- -- -- -- -- --  |@P@QH@RJ--------| Hello.class:3:-00000010:  -- -- -- -- -- -- -- --  00 13 00 14 07 00 15 07  |--------@S@TG@UG|-00000020:  00 16 01 00 06 3c 69 6e  69 74 3e 01 00 03 28 29  |@VA@F<init>A@C()|-00000030:  56 01 00 04 43 6f 64 65  01 00 0f 4c 69 6e 65 4e  |VA@DCodeA@OLineN|-00000040:  75 6d 62 65 72 54 61 62  6c 65 01 00 04 6d 61 69  |umberTableA@Dmai|-00000050:  6e 01 00 16 28 5b 4c 6a  61 76 61 2f 6c 61 6e 67  |nA@V([Ljava/lang|-00000060:  2f 53 74 72 69 6e 67 3b  29 56 01 00 0a -- -- --  |/String;)VA@J---|+00000010  -- -- -- -- -- -- -- --  00 13 00 14 07 00 15 07  |--------@S@TG@UG|+00000020  00 16 01 00 06 3c 69 6e  69 74 3e 01 00 03 28 29  |@VA@F<init>A@C()|+00000030  56 01 00 04 43 6f 64 65  01 00 0f 4c 69 6e 65 4e  |VA@DCodeA@OLineN|+00000040  75 6d 62 65 72 54 61 62  6c 65 01 00 04 6d 61 69  |umberTableA@Dmai|+00000050  6e 01 00 16 28 5b 4c 6a  61 76 61 2f 6c 61 6e 67  |nA@V([Ljava/lang|+00000060  2f 53 74 72 69 6e 67 3b  29 56 01 00 0a -- -- --  |/String;)VA@J---| Hello.class:4:-00000060:  -- -- -- -- -- -- -- --  -- -- -- -- -- 53 6f 75  |-------------Sou|-00000070:  72 63 65 46 69 6c 65 01  00 0a -- -- -- -- -- --  |rceFileA@J------|+00000060  -- -- -- -- -- -- -- --  -- -- -- -- -- 53 6f 75  |-------------Sou|+00000070  72 63 65 46 69 6c 65 01  00 0a -- -- -- -- -- --  |rceFileA@J------| Hello.class:5:-00000070:  -- -- -- -- -- -- -- --  -- -- 48 65 6c 6c 6f 2e  |----------Hello.|-00000080:  6a 61 76 61 0c 00 07 00  08 07 00 17 0c 00 18 00  |javaL@G@HG@WL@X@|-00000090:  19 01 00 0c 48 65 6c 6c  6f 20 57 6f 72 6c 64 21  |YA@LHello World!|-000000a0:  07 00 1a 0c 00 1b 00 1c  01 00 05 48 65 6c 6c 6f  |G@ZL@[@\A@EHello|-000000b0:  01 00 10 6a 61 76 61 2f  6c 61 6e 67 2f 4f 62 6a  |A@Pjava/lang/Obj|-000000c0:  65 63 74 01 00 10 6a 61  76 61 2f 6c 61 6e 67 2f  |ectA@Pjava/lang/|-000000d0:  53 79 73 74 65 6d 01 00  03 6f 75 74 01 00 15 4c  |SystemA@CoutA@UL|-000000e0:  6a 61 76 61 2f 69 6f 2f  50 72 69 6e 74 53 74 72  |java/io/PrintStr|-000000f0:  65 61 6d 3b 01 00 13 6a  61 76 61 2f 69 6f 2f 50  |eam;A@Sjava/io/P|-00000100:  72 69 6e 74 53 74 72 65  61 6d 01 00 07 70 72 69  |rintStreamA@Gpri|-00000110:  6e 74 6c 6e 01 00 15 28  4c 6a 61 76 61 2f 6c 61  |ntlnA@U(Ljava/la|-00000120:  6e 67 2f 53 74 72 69 6e  67 3b 29 56 00 21 00 05  |ng/String;)V@!@E|-00000130:  00 06 00 00 00 00 00 02  00 01 00 07 00 08 00 01  |@F@@@@@B@A@G@H@A|-00000140:  00 09 00 00 00 1d 00 01  00 01 00 00 00 05 2a b7  |@I@@@]@A@A@@@E*.|-00000150:  00 01 b1 00 00 00 01 00  0a -- -- -- -- -- -- --  |@A.@@@A@J-------|+00000070  -- -- -- -- -- -- -- --  -- -- 48 65 6c 6c 6f 2e  |----------Hello.|+00000080  6a 61 76 61 0c 00 07 00  08 07 00 17 0c 00 18 00  |javaL@G@HG@WL@X@|+00000090  19 01 00 0c 48 65 6c 6c  6f 20 57 6f 72 6c 64 21  |YA@LHello World!|+000000a0  07 00 1a 0c 00 1b 00 1c  01 00 05 48 65 6c 6c 6f  |G@ZL@[@\A@EHello|+000000b0  01 00 10 6a 61 76 61 2f  6c 61 6e 67 2f 4f 62 6a  |A@Pjava/lang/Obj|+000000c0  65 63 74 01 00 10 6a 61  76 61 2f 6c 61 6e 67 2f  |ectA@Pjava/lang/|+000000d0  53 79 73 74 65 6d 01 00  03 6f 75 74 01 00 15 4c  |SystemA@CoutA@UL|+000000e0  6a 61 76 61 2f 69 6f 2f  50 72 69 6e 74 53 74 72  |java/io/PrintStr|+000000f0  65 61 6d 3b 01 00 13 6a  61 76 61 2f 69 6f 2f 50  |eam;A@Sjava/io/P|+00000100  72 69 6e 74 53 74 72 65  61 6d 01 00 07 70 72 69  |rintStreamA@Gpri|+00000110  6e 74 6c 6e 01 00 15 28  4c 6a 61 76 61 2f 6c 61  |ntlnA@U(Ljava/la|+00000120  6e 67 2f 53 74 72 69 6e  67 3b 29 56 00 21 00 05  |ng/String;)V@!@E|+00000130  00 06 00 00 00 00 00 02  00 01 00 07 00 08 00 01  |@F@@@@@B@A@G@H@A|+00000140  00 09 00 00 00 1d 00 01  00 01 00 00 00 05 2a b7  |@I@@@]@A@A@@@E*.|+00000150  00 01 b1 00 00 00 01 00  0a -- -- -- -- -- -- --  |@A.@@@A@J-------| Hello.class:6:-00000150:  -- -- -- -- -- -- -- --  -- 00 00 00 06 00 01 00  |---------@@@F@A@|-00000160:  00 00 02 00 09 00 0b 00  0c 00 01 00 09 00 00 00  |@@B@I@K@L@A@I@@@|-00000170:  25 00 02 00 01 00 00 00  09 b2 00 02 12 03 b6 00  |%@B@A@@@I.@BRC.@|-00000180:  04 b1 00 00 00 01 00 0a  -- -- -- -- -- -- -- --  |D.@@@A@J--------|+00000150  -- -- -- -- -- -- -- --  -- 00 00 00 06 00 01 00  |---------@@@F@A@|+00000160  00 00 02 00 09 00 0b 00  0c 00 01 00 09 00 00 00  |@@B@I@K@L@A@I@@@|+00000170  25 00 02 00 01 00 00 00  09 b2 00 02 12 03 b6 00  |%@B@A@@@I.@BRC.@|+00000180  04 b1 00 00 00 01 00 0a  -- -- -- -- -- -- -- --  |D.@@@A@J--------| Hello.class:7:-00000180:  -- -- -- -- -- -- -- --  00 00 00 0a -- -- -- --  |--------@@@J----|+00000180  -- -- -- -- -- -- -- --  00 00 00 0a -- -- -- --  |--------@@@J----| Hello.class:8:-00000180:  -- -- -- -- -- -- -- --  -- -- -- -- 00 02 00 00  |------------@B@@|-00000190:  00 04 00 08 00 05 00 01  00 0d 00 00 00 02 00 0e  |@D@H@E@A@M@@@B@N|-Hello.java:1:import java.lang.*;-Hello.java:2:-Hello.java:3:public class Hello // prints a Hello World! greeting-Hello.java:4:{ public static void main(String[] arg)-Hello.java:5:  { System.out.println("Hello World!");-Hello.java:6:  }-Hello.java:7:}-Hello.pdf:1:%PDF-1.3+00000180  -- -- -- -- -- -- -- --  -- -- -- -- 00 02 00 00  |------------@B@@|+00000190  00 04 00 08 00 05 00 01  00 0d 00 00 00 02 00 0e  |@D@H@E@A@M@@@B@N|+Hello.java:1:import java.lang.*;+Hello.java:2:+Hello.java:3:public class Hello // prints a Hello World! greeting+Hello.java:4:{ public static void main(String[] arg)+Hello.java:5:  { System.out.println("Hello World!");+Hello.java:6:  }+Hello.java:7:}+Hello.pdf:1:%PDF-1.3 Hello.pdf:2:-00000000:  -- -- -- -- -- -- -- --  -- 25 c4 e5 f2 e5 eb a7  |---------%......|-00000010:  f3 a0 d0 c4 c6 0a -- --  -- -- -- -- -- -- -- --  |.....J----------|-Hello.pdf:3:4 0 obj-Hello.pdf:4:<< /Length 5 0 R /Filter /FlateDecode >>-Hello.pdf:5:stream+00000000  -- -- -- -- -- -- -- --  -- 25 c4 e5 f2 e5 eb a7  |---------%......|+00000010  f3 a0 d0 c4 c6 0a -- --  -- -- -- -- -- -- -- --  |.....J----------|+Hello.pdf:3:4 0 obj+Hello.pdf:4:<< /Length 5 0 R /Filter /FlateDecode >>+Hello.pdf:5:stream Hello.pdf:6:-00000040:  -- -- -- -- -- -- -- --  -- -- -- -- -- -- 78 01  |--------------xA|-00000050:  45 8e bb 0a -- -- -- --  -- -- -- -- -- -- -- --  |E..J------------|+00000040  -- -- -- -- -- -- -- --  -- -- -- -- -- -- 78 01  |--------------xA|+00000050  45 8e bb 0a -- -- -- --  -- -- -- -- -- -- -- --  |E..J------------| Hello.pdf:7:-00000050:  -- -- -- -- 02 31 14 44  7b bf e2 94 5a 98 bd 89  |----B1TD{...Z...|-00000060:  79 98 56 11 6c 17 2e f8  01 61 2d 64 d7 65 cd ff  |y.VQlW..Aa-d.e..|-00000070:  83 17 2c ac 86 99 39 0c  b3 31 b2 51 02 b9 46 97  |.W,...9L.1.QB.F.|-00000080:  e2 a9 12 f3 99 90 5c 4c  59 0a -- -- -- -- -- --  |..R...\LYJ------|+00000050  -- -- -- -- 02 31 14 44  7b bf e2 94 5a 98 bd 89  |----B1TD{...Z...|+00000060  79 98 56 11 6c 17 2e f8  01 61 2d 64 d7 65 cd ff  |y.VQlW..Aa-d.e..|+00000070  83 17 2c ac 86 99 39 0c  b3 31 b2 51 02 b9 46 97  |.W,...9L.1.QB.F.|+00000080  e2 a9 12 f3 99 90 5c 4c  59 0a -- -- -- -- -- --  |..R...\LYJ------| Hello.pdf:8:-00000080:  -- -- -- -- -- -- -- --  -- -- 9f 89 07 6f 86 6b  |----------..Go.k|-00000090:  f7 b4 8e d0 9b e1 e2 6a  a9 52 6a b2 40 38 fe ad  |.......j.Rj.@8..|-000000a0:  ed 94 20 bb b6 70 51 a3  44 c4 a3 0d ef 7f a0 69  |.. ..pQ.D..M.~.i|-000000b0:  c2 0b ba 30 a8 7a ac 7c  b2 bf 4f f3 bc 1e d0 17  |.K.0.z.|..O..^.W|-000000c0:  37 b5 37 e3 17 4e ff 20  a5 0a -- -- -- -- -- --  |7.7.WN. .J------|-Hello.pdf:9:endstream-Hello.pdf:10:endobj-Hello.pdf:11:5 0 obj-Hello.pdf:12:123-Hello.pdf:13:endobj-Hello.pdf:14:2 0 obj-Hello.pdf:15:<< /Type /Page /Parent 3 0 R /Resources 6 0 R /Contents 4 0 R /MediaBox [0 0 612 792]-Hello.pdf:16:>>-Hello.pdf:17:endobj-Hello.pdf:18:6 0 obj-Hello.pdf:19:<< /ProcSet [ /PDF /Text ] /ColorSpace << /Cs1 7 0 R >> /Font << /TT1 8 0 R-Hello.pdf:20:>> >>-Hello.pdf:21:endobj-Hello.pdf:22:9 0 obj-Hello.pdf:23:<< /Length 10 0 R /N 1 /Alternate /DeviceGray /Filter /FlateDecode >>-Hello.pdf:24:stream+00000080  -- -- -- -- -- -- -- --  -- -- 9f 89 07 6f 86 6b  |----------..Go.k|+00000090  f7 b4 8e d0 9b e1 e2 6a  a9 52 6a b2 40 38 fe ad  |.......j.Rj.@8..|+000000a0  ed 94 20 bb b6 70 51 a3  44 c4 a3 0d ef 7f a0 69  |.. ..pQ.D..M.~.i|+000000b0  c2 0b ba 30 a8 7a ac 7c  b2 bf 4f f3 bc 1e d0 17  |.K.0.z.|..O..^.W|+000000c0  37 b5 37 e3 17 4e ff 20  a5 0a -- -- -- -- -- --  |7.7.WN. .J------|+Hello.pdf:9:endstream+Hello.pdf:10:endobj+Hello.pdf:11:5 0 obj+Hello.pdf:12:123+Hello.pdf:13:endobj+Hello.pdf:14:2 0 obj+Hello.pdf:15:<< /Type /Page /Parent 3 0 R /Resources 6 0 R /Contents 4 0 R /MediaBox [0 0 612 792]+Hello.pdf:16:>>+Hello.pdf:17:endobj+Hello.pdf:18:6 0 obj+Hello.pdf:19:<< /ProcSet [ /PDF /Text ] /ColorSpace << /Cs1 7 0 R >> /Font << /TT1 8 0 R+Hello.pdf:20:>> >>+Hello.pdf:21:endobj+Hello.pdf:22:9 0 obj+Hello.pdf:23:<< /Length 10 0 R /N 1 /Alternate /DeviceGray /Filter /FlateDecode >>+Hello.pdf:24:stream Hello.pdf:25:-00000200:  -- -- -- -- -- -- -- --  -- -- -- -- 78 01 85 55  |------------xA.U|-00000210:  5d 68 1c 55 14 3e bb 73  67 03 12 07 1f b4 0d 2d  |]h\UT>.sgCRG_.M-|-00000220:  b4 83 3f 6d 09 e9 32 89  56 13 8b b5 db 4d ba 49  |..?mI.2.VS...M.I|-00000230:  13 b7 eb 66 53 9b 2a ca  74 76 36 3b cd 64 66 9c  |S..fS.*.tv6;.df.|-00000240:  99 dd 26 a1 4f a5 e0 9b  16 04 e9 ab a0 3e c6 82  |..&.O...VD...>..|-00000250:  08 b6 2a 36 2f f6 a5 a5  c5 92 4a 35 0f 0a -- --  |H.*6/.....J5OJ--|+00000200  -- -- -- -- -- -- -- --  -- -- -- -- 78 01 85 55  |------------xA.U|+00000210  5d 68 1c 55 14 3e bb 73  67 03 12 07 1f b4 0d 2d  |]h\UT>.sgCRG_.M-|+00000220  b4 83 3f 6d 09 e9 32 89  56 13 8b b5 db 4d ba 49  |..?mI.2.VS...M.I|+00000230  13 b7 eb 66 53 9b 2a ca  74 76 36 3b cd 64 66 9c  |S..fS.*.tv6;.df.|+00000240  99 dd 26 a1 4f a5 e0 9b  16 04 e9 ab a0 3e c6 82  |..&.O...VD...>..|+00000250  08 b6 2a 36 2f f6 a5 a5  c5 92 4a 35 0f 0a -- --  |H.*6/.....J5OJ--| Hello.pdf:26:-00000250:  -- -- -- -- -- -- -- --  -- -- -- -- -- -- 11 5a  |--------------QZ|-00000260:  8c 20 28 7d 52 f0 3b 33  db 64 76 41 32 c3 9d f9  |. (}R.;3.dvA2...|-00000270:  ee b9 e7 9e 7b ce 77 ee  b9 97 a8 eb 6f dd f3 ec  |....{.w.....o...|-00000280:  b4 4a 34 e7 84 7e a1 9c  9b 3e 39 7d 4a ed ba 4d  |.J4..~...>9}J..M|-00000290:  69 52 a8 9b f0 e8 46 e0  e5 4a a5 09 c6 8e eb 98  |iR....F..J.I....|-000002a0:  fc 6f 7f 1e de a5 14 4b  ee ec 67 5b ed 63 5b f6  |.o~^..TK..g[.c[.|-000002b0:  e4 aa 19 18 d0 ba 86 e6  56 03 63 8e 28 a5 11 65  |..YX....VCc.(.Qe|-000002c0:  6a 86 e7 87 44 5d 97 20  1f 3c 1b 7a 8c 6f 03 3f  |j...D]. _<[z.oC?|-000002d0:  39 5b 29 e7 81 d7 80 95  d6 5c 40 7a aa 60 3a a6  |9[)......\@z.`:.|-000002e0:  6f 19 6a c1 d7 17 d4 92  ef d6 2c 3b e9 eb 56 e3  |oYj..W....,;..V.|-000002f0:  6c 63 cb 67 ce 6e b0 af  fc ec 46 eb 0e 66 27 c7  |lc.g.n....F.Nf'.|-00000300:  f1 ef 85 cf 17 4c 67 6a  12 78 1f f0 92 a1 8f 30  |....WLgjRx_....0|-00000310:  ee 03 be db b4 4e 14 63  9c 4e 7b e1 91 72 ac 9f  |.C...NTc.N{..r..|-00000320:  ce 36 66 a7 72 2d f9 c9  9a 7f 74 aa 25 bf 50 6f  |.6f.r-...~t.%.Po|-00000330:  8c 32 ce 12 a5 97 16 eb  95 37 80 9f 00 5e 75 4e  |.2.R..V..7..@^uN|-00000340:  17 8f b7 f4 d7 67 dd 71  b6 d3 43 24 f5 18 41 fe  |W....g.q..C$.XA.|-00000350:  14 f0 b3 c0 5a dd 1c e3  3c a9 c0 15 df 2d b3 3e  |T...Z.\.<..U.-.>|-00000360:  cb c3 aa 39 3c 02 fc 32  f0 25 2b 1c ab 00 c3 be  |...9<B.2.%+\.@..|-00000370:  f4 43 d0 9c 64 39 b0 a0  c5 7a 9e fd c4 5a 22 7b  |.C..d9...z...Z"{|-00000380:  46 3f 56 02 de 06 7c c8  b4 0b bc 16 ec 88 8a 17  |F?VB.F|..K.V...W|-00000390:  96 d8 e6 20 f0 bc 63 17  79 2d c4 2e 2e 9b 41 14  |... ..cWy-....AT|-000003a0:  2f 62 17 3f 85 f5 ca 68  ac 2f a7 43 bf c2 73 9f  |/bW?...h./.C..s.|-000003b0:  26 92 f7 d4 ac a3 63 c0  e0 44 1e ad fb a3 2c 87  |&.....c..D^...,.|-000003c0:  3f 72 e8 d9 d1 de 7a 11  78 c9 6f 94 39 f6 3d c0  |?r....zQx.o.9.=.|-000003d0:  6b ba 3f 52 00 86 cd cc  63 55 7d 98 79 7e 01 78  |k.?R@...cU}.y~Ax|-000003e0:  80 4e a4 74 32 c9 a5 d3  f8 1a e4 d0 bf 88 37 20  |.N.t2....Z....7 |-000003f0:  8b 9a 11 f2 c8 c7 58 0d  7d 9b 0a -- -- -- -- --  |..Q...XM}.J-----|+00000250  -- -- -- -- -- -- -- --  -- -- -- -- -- -- 11 5a  |--------------QZ|+00000260  8c 20 28 7d 52 f0 3b 33  db 64 76 41 32 c3 9d f9  |. (}R.;3.dvA2...|+00000270  ee b9 e7 9e 7b ce 77 ee  b9 97 a8 eb 6f dd f3 ec  |....{.w.....o...|+00000280  b4 4a 34 e7 84 7e a1 9c  9b 3e 39 7d 4a ed ba 4d  |.J4..~...>9}J..M|+00000290  69 52 a8 9b f0 e8 46 e0  e5 4a a5 09 c6 8e eb 98  |iR....F..J.I....|+000002a0  fc 6f 7f 1e de a5 14 4b  ee ec 67 5b ed 63 5b f6  |.o~^..TK..g[.c[.|+000002b0  e4 aa 19 18 d0 ba 86 e6  56 03 63 8e 28 a5 11 65  |..YX....VCc.(.Qe|+000002c0  6a 86 e7 87 44 5d 97 20  1f 3c 1b 7a 8c 6f 03 3f  |j...D]. _<[z.oC?|+000002d0  39 5b 29 e7 81 d7 80 95  d6 5c 40 7a aa 60 3a a6  |9[)......\@z.`:.|+000002e0  6f 19 6a c1 d7 17 d4 92  ef d6 2c 3b e9 eb 56 e3  |oYj..W....,;..V.|+000002f0  6c 63 cb 67 ce 6e b0 af  fc ec 46 eb 0e 66 27 c7  |lc.g.n....F.Nf'.|+00000300  f1 ef 85 cf 17 4c 67 6a  12 78 1f f0 92 a1 8f 30  |....WLgjRx_....0|+00000310  ee 03 be db b4 4e 14 63  9c 4e 7b e1 91 72 ac 9f  |.C...NTc.N{..r..|+00000320  ce 36 66 a7 72 2d f9 c9  9a 7f 74 aa 25 bf 50 6f  |.6f.r-...~t.%.Po|+00000330  8c 32 ce 12 a5 97 16 eb  95 37 80 9f 00 5e 75 4e  |.2.R..V..7..@^uN|+00000340  17 8f b7 f4 d7 67 dd 71  b6 d3 43 24 f5 18 41 fe  |W....g.q..C$.XA.|+00000350  14 f0 b3 c0 5a dd 1c e3  3c a9 c0 15 df 2d b3 3e  |T...Z.\.<..U.-.>|+00000360  cb c3 aa 39 3c 02 fc 32  f0 25 2b 1c ab 00 c3 be  |...9<B.2.%+\.@..|+00000370  f4 43 d0 9c 64 39 b0 a0  c5 7a 9e fd c4 5a 22 7b  |.C..d9...z...Z"{|+00000380  46 3f 56 02 de 06 7c c8  b4 0b bc 16 ec 88 8a 17  |F?VB.F|..K.V...W|+00000390  96 d8 e6 20 f0 bc 63 17  79 2d c4 2e 2e 9b 41 14  |... ..cWy-....AT|+000003a0  2f 62 17 3f 85 f5 ca 68  ac 2f a7 43 bf c2 73 9f  |/bW?...h./.C..s.|+000003b0  26 92 f7 d4 ac a3 63 c0  e0 44 1e ad fb a3 2c 87  |&.....c..D^...,.|+000003c0  3f 72 e8 d9 d1 de 7a 11  78 c9 6f 94 39 f6 3d c0  |?r....zQx.o.9.=.|+000003d0  6b ba 3f 52 00 86 cd cc  63 55 7d 98 79 7e 01 78  |k.?R@...cU}.y~Ax|+000003e0  80 4e a4 74 32 c9 a5 d3  f8 1a e4 d0 bf 88 37 20  |.N.t2....Z....7 |+000003f0  8b 9a 11 f2 c8 c7 58 0d  7d 9b 0a -- -- -- -- --  |..Q...XM}.J-----| Hello.pdf:27:-000003f0:  -- -- -- -- -- -- -- --  -- -- -- d0 70 d0 7c f4  |-----------.p.|.|-00000400:  0c 68 15 80 74 5a 00 2a  25 b4 4c f4 58 27 9e a3  |LhU.tZ@*%.L.X'..|-00000410:  52 15 3d 95 66 a2 59 41  84 d8 ca fd a8 6f 50 7e  |RU=.f.YA.....oP~|-00000420:  d7 a7 d4 80 b4 4e eb 90  d6 81 5e a3 5f 22 c9 3c  |.....N....^._".<|-00000430:  fd 4a 73 e8 e7 21 6d 60  6c a6 c3 6e 1e 5e 38 b4  |.Js..!m`l..n^^8.|-00000440:  08 0f d8 13 b6 f9 a0 65  d3 15 db 85 26 9e 47 3b  |HO.S...e.U..&.G;|-00000450:  28 26 c4 2b 62 50 0c 91  2a 5e 15 87 c5 21 31 0c  |(&.+bPL.*^U..!1L|-00000460:  e9 90 38 18 cd 89 bd 4f  fa ce 7e 3e d8 b0 f4 2e  |..8X...O..~>....|-00000470:  d6 4d fa be 0c 0e 42 ac  67 c3 33 07 ac 70 34 01  |.M..LNB.g.3G.p4A|-00000480:  3c f8 07 eb ce 46 9a 09  b6 2e ee 68 ec f3 bc 8f  |<.G..F.I...h....|-00000490:  de 3f ef bf 63 19 b7 3e  f8 b3 8d bd 00 fa 31 27  |.?..cY.>....@.1'|-000004a0:  bf c1 a2 0b 6b 26 25 e6  5e 3f f7 4d 4f c2 43 75  |...Kk&%.^?.MO.Cu|-000004b0:  45 7c f5 d6 9d ee eb e7  e8 78 32 4b 51 de aa 9d  |E|.......x2KQ...|-000004c0:  59 92 d7 e4 fb f2 0a --  -- -- -- -- -- -- -- --  |Y.....J---------|+000003f0  -- -- -- -- -- -- -- --  -- -- -- d0 70 d0 7c f4  |-----------.p.|.|+00000400  0c 68 15 80 74 5a 00 2a  25 b4 4c f4 58 27 9e a3  |LhU.tZ@*%.L.X'..|+00000410  52 15 3d 95 66 a2 59 41  84 d8 ca fd a8 6f 50 7e  |RU=.f.YA.....oP~|+00000420  d7 a7 d4 80 b4 4e eb 90  d6 81 5e a3 5f 22 c9 3c  |.....N....^._".<|+00000430  fd 4a 73 e8 e7 21 6d 60  6c a6 c3 6e 1e 5e 38 b4  |.Js..!m`l..n^^8.|+00000440  08 0f d8 13 b6 f9 a0 65  d3 15 db 85 26 9e 47 3b  |HO.S...e.U..&.G;|+00000450  28 26 c4 2b 62 50 0c 91  2a 5e 15 87 c5 21 31 0c  |(&.+bPL.*^U..!1L|+00000460  e9 90 38 18 cd 89 bd 4f  fa ce 7e 3e d8 b0 f4 2e  |..8X...O..~>....|+00000470  d6 4d fa be 0c 0e 42 ac  67 c3 33 07 ac 70 34 01  |.M..LNB.g.3G.p4A|+00000480  3c f8 07 eb ce 46 9a 09  b6 2e ee 68 ec f3 bc 8f  |<.G..F.I...h....|+00000490  de 3f ef bf 63 19 b7 3e  f8 b3 8d bd 00 fa 31 27  |.?..cY.>....@.1'|+000004a0  bf c1 a2 0b 6b 26 25 e6  5e 3f f7 4d 4f c2 43 75  |...Kk&%.^?.MO.Cu|+000004b0  45 7c f5 d6 9d ee eb e7  e8 78 32 4b 51 de aa 9d  |E|.......x2KQ...|+000004c0  59 92 d7 e4 fb f2 0a --  -- -- -- -- -- -- -- --  |Y.....J---------| Hello.pdf:28:-000004c0:  -- -- -- -- -- -- -- be  f7 e4 d5 a4 0d f9 67 79  |-------.....M.gy|-000004d0:  15 ef bd b6 5c 3d ca 0b  ff 93 b9 cd 21 46 3b 92  |U...\=.K....!F;.|-000004e0:  cd 41 ce 3c 9b 51 b4 71  c6 1b c0 21 b8 a9 45 73  |.A.<.Q.q.[.!..Es|-000004f0:  f6 b7 59 4c b2 e9 b6 62  b4 60 c9 42 94 9d ab b8  |..YL...b.`.B....|-00000500:  ff cb 09 f3 c3 3c b7 b1  52 73 2e ee f0 bc b7 3f  |..I..<..Rs.....?|-00000510:  63 36 cd f7 8a 0f 8b 74  be 4f bb ac ad 6b 9f 68  |c6...O.t.O...k.h|-00000520:  3f 6a 7f 68 2b da c7 40  bf 4b 1f 4a 5f 4a df 4a  |?j~h+..@.K_J_J.J|-00000530:  57 a4 ab d2 0d 52 a5 6b  d2 b2 f4 9d f4 bd f4 b9  |W...MR.k........|-00000540:  f4 35 7a 5f 40 ba 2c 5d  e9 d8 49 71 ec 1b bb 07  |.5z_@.,]..Iq.[.G|-00000550:  7e c6 7b d6 68 ed 30 66  86 b3 14 10 f3 c2 da cc  |~.{.h.0f..TP....|-00000560:  0a -- -- -- -- -- -- --  -- -- -- -- -- -- -- --  |J---------------|+000004c0  -- -- -- -- -- -- -- be  f7 e4 d5 a4 0d f9 67 79  |-------.....M.gy|+000004d0  15 ef bd b6 5c 3d ca 0b  ff 93 b9 cd 21 46 3b 92  |U...\=.K....!F;.|+000004e0  cd 41 ce 3c 9b 51 b4 71  c6 1b c0 21 b8 a9 45 73  |.A.<.Q.q.[.!..Es|+000004f0  f6 b7 59 4c b2 e9 b6 62  b4 60 c9 42 94 9d ab b8  |..YL...b.`.B....|+00000500  ff cb 09 f3 c3 3c b7 b1  52 73 2e ee f0 bc b7 3f  |..I..<..Rs.....?|+00000510  63 36 cd f7 8a 0f 8b 74  be 4f bb ac ad 6b 9f 68  |c6...O.t.O...k.h|+00000520  3f 6a 7f 68 2b da c7 40  bf 4b 1f 4a 5f 4a df 4a  |?j~h+..@.K_J_J.J|+00000530  57 a4 ab d2 0d 52 a5 6b  d2 b2 f4 9d f4 bd f4 b9  |W...MR.k........|+00000540  f4 35 7a 5f 40 ba 2c 5d  e9 d8 49 71 ec 1b bb 07  |.5z_@.,]..Iq.[.G|+00000550  7e c6 7b d6 68 ed 30 66  86 b3 14 10 f3 c2 da cc  |~.{.h.0f..TP....|+00000560  0a -- -- -- -- -- -- --  -- -- -- -- -- -- -- --  |J---------------| Hello.pdf:29:-00000560:  -- 4b 1f f1 77 06 63 9b  f9 33 a1 d5 5e 03 9d bb  |-K_.wFc..3..^C..|-00000570:  7f 63 2d e5 88 b2 53 79  46 19 56 76 2b cf 29 13  |~c-...SyFYVv+.)S|-00000580:  4a af 72 40 39 ac 6c 57  06 d0 fa 95 51 65 2f 46  |J.r@9.lWF...Qe/F|-00000590:  76 6e b0 64 63 3d ce 80  85 7f 92 67 8b a6 23 ae  |vn.dc=...~.g..#.|-000005a0:  e2 3c b1 57 75 b0 e7 c3  4b 1d ef a6 5f 5c c3 d6  |.<.Wu...K].._\..|-000005b0:  86 35 d8 49 3d 0e 9e d9  da a6 0e af 11 57 bf 15  |.5.I=N....N.QW.U|-000005c0:  55 63 bc 3b 5d 9c 06 3a  4d 21 62 8b ce 22 72 1f  |Uc.;].F:M!b.."r_|-000005d0:  3a 9c 1f 27 aa fe ce d9  5c 93 38 35 52 6f e2 94  |:._'....\.85Ro..|-000005e0:  b0 c4 2e d1 2f c6 5a 35  98 13 07 50 85 e3 6d f5  |..../.Z5.SGP..m.|-000005f0:  38 c8 55 9a 19 c9 0c 67  72 a4 66 7a 33 43 99 fe  |8.U.Y.Lgr.fz3C..|-00000600:  cc 31 c6 51 ac d1 f9 92  d9 8b d1 21 7c 47 12 de  |.1.Q.......!|GR.|-00000610:  33 cb 31 ff 9b 35 c4 67  18 ef 1d e6 a8 09 6c a3  |3.1..5.gX.]..Il.|-00000620:  87 5b 2b 34 e7 71 df 11  e5 5d 6f c1 b7 66 ea a1  |.[+4.q.Q.]o..f..|-00000630:  3a a0 69 2f a9 39 5c af  a6 3a e6 18 d9 3e 55 b7  |:.i/.9\..:.X.>U.|-00000640:  6d 35 1a 0a -- -- -- --  -- -- -- -- -- -- -- --  |m5ZJ------------|+00000560  -- 4b 1f f1 77 06 63 9b  f9 33 a1 d5 5e 03 9d bb  |-K_.wFc..3..^C..|+00000570  7f 63 2d e5 88 b2 53 79  46 19 56 76 2b cf 29 13  |~c-...SyFYVv+.)S|+00000580  4a af 72 40 39 ac 6c 57  06 d0 fa 95 51 65 2f 46  |J.r@9.lWF...Qe/F|+00000590  76 6e b0 64 63 3d ce 80  85 7f 92 67 8b a6 23 ae  |vn.dc=...~.g..#.|+000005a0  e2 3c b1 57 75 b0 e7 c3  4b 1d ef a6 5f 5c c3 d6  |.<.Wu...K].._\..|+000005b0  86 35 d8 49 3d 0e 9e d9  da a6 0e af 11 57 bf 15  |.5.I=N....N.QW.U|+000005c0  55 63 bc 3b 5d 9c 06 3a  4d 21 62 8b ce 22 72 1f  |Uc.;].F:M!b.."r_|+000005d0  3a 9c 1f 27 aa fe ce d9  5c 93 38 35 52 6f e2 94  |:._'....\.85Ro..|+000005e0  b0 c4 2e d1 2f c6 5a 35  98 13 07 50 85 e3 6d f5  |..../.Z5.SGP..m.|+000005f0  38 c8 55 9a 19 c9 0c 67  72 a4 66 7a 33 43 99 fe  |8.U.Y.Lgr.fz3C..|+00000600  cc 31 c6 51 ac d1 f9 92  d9 8b d1 21 7c 47 12 de  |.1.Q.......!|GR.|+00000610  33 cb 31 ff 9b 35 c4 67  18 ef 1d e6 a8 09 6c a3  |3.1..5.gX.]..Il.|+00000620  87 5b 2b 34 e7 71 df 11  e5 5d 6f c1 b7 66 ea a1  |.[+4.q.Q.]o..f..|+00000630  3a a0 69 2f a9 39 5c af  a6 3a e6 18 d9 3e 55 b7  |:.i/.9\..:.X.>U.|+00000640  6d 35 1a 0a -- -- -- --  -- -- -- -- -- -- -- --  |m5ZJ------------| Hello.pdf:30:-00000640:  -- -- -- -- 54 df 0c 4c  bf 69 56 b3 c4 77 37 cf  |----T.LL.iV..w7.|-00000650:  23 fa eb f5 e8 4e 4e 6d  bb 61 34 fc 66 2c a3 54  |#....NNm.a4.f,.T|-00000660:  ea 26 d1 7f b7 8f 93 34  0a -- -- -- -- -- -- --  |.&.~...4J-------|-Hello.pdf:31:endstream-Hello.pdf:32:endobj-Hello.pdf:33:10 0 obj-Hello.pdf:34:1116-Hello.pdf:35:endobj-Hello.pdf:36:7 0 obj-Hello.pdf:37:[ /ICCBased 9 0 R ]-Hello.pdf:38:endobj-Hello.pdf:39:3 0 obj-Hello.pdf:40:<< /Type /Pages /MediaBox [0 0 612 792] /Count 1 /Kids [ 2 0 R ] >>-Hello.pdf:41:endobj-Hello.pdf:42:11 0 obj-Hello.pdf:43:<< /Type /Catalog /Pages 3 0 R >>-Hello.pdf:44:endobj-Hello.pdf:45:8 0 obj-Hello.pdf:46:<< /Type /Font /Subtype /TrueType /BaseFont /GQTMZF+Menlo-Regular /FontDescriptor-Hello.pdf:47:12 0 R /Encoding /MacRomanEncoding /FirstChar 72 /LastChar 111 /Widths [ 602-Hello.pdf:48:0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 602 0 0 0 0 0 0 602-Hello.pdf:49:0 0 602 ] >>-Hello.pdf:50:endobj-Hello.pdf:51:12 0 obj-Hello.pdf:52:<< /Type /FontDescriptor /FontName /GQTMZF+Menlo-Regular /Flags 33 /FontBBox-Hello.pdf:53:[-558 -375 718 1041] /ItalicAngle 0 /Ascent 928 /Descent -236 /CapHeight 729-Hello.pdf:54:/StemV 99 /XHeight 547 /StemH 83 /AvgWidth 602 /MaxWidth 602 /FontFile2 13 0 R-Hello.pdf:55:>>-Hello.pdf:56:endobj-Hello.pdf:57:13 0 obj-Hello.pdf:58:<< /Length 14 0 R /Length1 4064 /Filter /FlateDecode >>-Hello.pdf:59:stream+00000640  -- -- -- -- 54 df 0c 4c  bf 69 56 b3 c4 77 37 cf  |----T.LL.iV..w7.|+00000650  23 fa eb f5 e8 4e 4e 6d  bb 61 34 fc 66 2c a3 54  |#....NNm.a4.f,.T|+00000660  ea 26 d1 7f b7 8f 93 34  0a -- -- -- -- -- -- --  |.&.~...4J-------|+Hello.pdf:31:endstream+Hello.pdf:32:endobj+Hello.pdf:33:10 0 obj+Hello.pdf:34:1116+Hello.pdf:35:endobj+Hello.pdf:36:7 0 obj+Hello.pdf:37:[ /ICCBased 9 0 R ]+Hello.pdf:38:endobj+Hello.pdf:39:3 0 obj+Hello.pdf:40:<< /Type /Pages /MediaBox [0 0 612 792] /Count 1 /Kids [ 2 0 R ] >>+Hello.pdf:41:endobj+Hello.pdf:42:11 0 obj+Hello.pdf:43:<< /Type /Catalog /Pages 3 0 R >>+Hello.pdf:44:endobj+Hello.pdf:45:8 0 obj+Hello.pdf:46:<< /Type /Font /Subtype /TrueType /BaseFont /GQTMZF+Menlo-Regular /FontDescriptor+Hello.pdf:47:12 0 R /Encoding /MacRomanEncoding /FirstChar 72 /LastChar 111 /Widths [ 602+Hello.pdf:48:0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 602 0 0 0 0 0 0 602+Hello.pdf:49:0 0 602 ] >>+Hello.pdf:50:endobj+Hello.pdf:51:12 0 obj+Hello.pdf:52:<< /Type /FontDescriptor /FontName /GQTMZF+Menlo-Regular /Flags 33 /FontBBox+Hello.pdf:53:[-558 -375 718 1041] /ItalicAngle 0 /Ascent 928 /Descent -236 /CapHeight 729+Hello.pdf:54:/StemV 99 /XHeight 547 /StemH 83 /AvgWidth 602 /MaxWidth 602 /FontFile2 13 0 R+Hello.pdf:55:>>+Hello.pdf:56:endobj+Hello.pdf:57:13 0 obj+Hello.pdf:58:<< /Length 14 0 R /Length1 4064 /Filter /FlateDecode >>+Hello.pdf:59:stream Hello.pdf:60:-00000980:  -- -- 78 01 dd 57 7b 78  54 c5 15 3f 73 7f 77 36  |--xA.W{xT.U?s~w6|-00000990:  af cd 3e 92 4d 48 48 80  5d d6 e5 95 2c 81 84 b7  |..>.MHH.]...,...|-000009a0:  52 16 48 78 88 20 2f eb  2e 88 f2 48 20 28 21 08  |RVHx. /....H (!H|-000009b0:  41 b4 31 90 4a 51 09 c1  40 85 08 48 7d 15 51 a9  |A.1.JQI.@.HH}UQ.|-000009c0:  b5 2b 45 5d 09 c4 54 a4  62 23 45 84 a0 02 0a --  |.+E]I.T.b#E..BJ-|+00000980  -- -- 78 01 dd 57 7b 78  54 c5 15 3f 73 7f 77 36  |--xA.W{xT.U?s~w6|+00000990  af cd 3e 92 4d 48 48 80  5d d6 e5 95 2c 81 84 b7  |..>.MHH.]...,...|+000009a0  52 16 48 78 88 20 2f eb  2e 88 f2 48 20 28 21 08  |RVHx. /....H (!H|+000009b0  41 b4 31 90 4a 51 09 c1  40 85 08 48 7d 15 51 a9  |A.1.JQI.@.HH}UQ.|+000009c0  b5 2b 45 5d 09 c4 54 a4  62 23 45 84 a0 02 0a --  |.+E]I.T.b#E..BJ-| Hello.pdf:61:-000009c0:  -- -- -- -- -- -- -- --  -- -- -- -- -- -- -- f8  |---------------.|-000009d0:  a2 68 8a 14 21 d8 00 43  cf bd 1b fd 3e ed d7 ef  |.h.T!.@C..[.>...|-000009e0:  eb bf ed dc 9d 33 e7 fc  e6 cc 79 dd bb f7 ce 94  |.....3....y.....|-000009f0:  2d 5c 5c 44 56 aa 24 50  60 56 c9 8c 05 64 36 eb  |-\\DV.$P`V..Ed6.|-00000a00:  49 1e 8a 67 dd 53 e6 36  45 8a bd 97 48 cb 9d bd  |I^.g.S.6E...H...|-00000a10:  60 4e 49 54 8e 7f 91 e5  4e 73 e6 dd 37 3b 2a 27  |`NIT.~..Ns..7;*'|-00000a20:  4e 66 79 40 71 d1 8c c2  a8 4c 57 78 ec 57 cc 40  |Nfy@q....LWx.W.@|-00000a30:  54 16 7d 78 bc ae b8 a4  8c ed 18 cd fa 2e 13 d7  |TV}x......X...S.|-00000a40:  bc d2 59 6d f3 89 a3 0c  b0 64 c6 bd 6d fe e9 38  |..Ym...L.d..m..8|-00000a50:  cb ee f9 33 4a 8a 78 e4  66 8f 30 e9 b6 a0 74 51  |...3J.x.f.0...tQ|-00000a60:  99 29 92 bd 9a c7 ec 05  0b 8b da f4 45 90 28 a6  |.).....EK...E.(.|-00000a70:  53 74 ae 8d 1a 96 05 77  a9 59 29 8b ee 22 0b 69  |St..Z.Ew.Y).."Ki|-00000a80:  e4 a0 8d 94 c4 d0 ad ac  2b 79 d6 98 d7 62 b2 96  |........+y...b..|-00000a90:  3e 7d f6 8d 3b ec 37 5c  a4 4e b1 e6 e2 bd 65 e9  |>}..;.7\.N....e.|-00000aa0:  79 06 73 28 b8 a4 df e5  95 57 85 ac 8f bd 85 c5  |yFs(.....W......|-00000ab0:  e8 a4 31 c1 eb 62 4a 54  07 22 fd e0 e5 95 d7 92  |..1..bJTG"......|-00000ac0:  65 bd 69 c9 98 f9 be c9  08 c5 66 bd ae 55 8a 94  |e.i.....H.f..U..|-00000ad0:  ed eb a6 c9 a1 99 22 85  6a 09 4c 2b 49 17 2e 52  |......".jIL+IW.R|-00000ae0:  cc 27 9b 34 89 03 82 70  9a bc c3 a4 76 da c4 88  |.'.4.C.p....v...|-00000af0:  cd e4 13 b7 7f 3d 52 0e  f5 89 44 aa 60 cc 4a 3e  |..S.~=RN..D.`.J>|-00000b00:  a6 09 94 cb 34 de b4 17  67 6a c5 92 8d 91 18 93  |.I..4..Wgj....X.|-00000b10:  b7 98 3a d2 e4 75 13 87  89 68 26 22 02 21 05 a5  |..:..uS..h&"B!E.|-00000b20:  70 b5 02 57 14 2e 2b b4  e6 e2 9f 75 f8 ae 02 97  |p.BWT.+....u..B.|-00000b30:  5a aa e5 25 85 4b 0d 7a  cb c5 90 6c a9 46 4b a5  |Z..%.KMz...l.FK.|-00000b40:  7e f1 42 17 79 31 84 8b  01 fd 42 17 7c 7b 3e 47  |~.BWy1..A.BW|{>G|-00000b50:  7e db 8a f3 39 f8 87 c2  39 85 6f 72 71 d6 85 bf  |~...9...9.orq...|-00000b60:  d7 a2 99 43 6c 56 68 8e  5c 3b 18 b8 a6 7f 3d 12  |...ClVh.\;X..~=R|-00000b70:  5f 9d 29 94 5f d5 e2 4c  21 fe a6 70 fa cb 0c 79  |_.)._..L!..p..Ly|-00000b80:  5a e1 cb 0c 7c a1 f0 f9  5d f8 4c e1 d3 3a 9c 3a  |Z..L|...].L..:.:|-00000b90:  99 2e 4f b5 e2 64 3a 4e  d4 e2 13 85 8f 15 8e 1f  |..O..d:N..S..U._|-00000ba0:  4b 91 c7 15 8e a5 e0 68  2d 3e fa 30 45 7e a4 f0  |K..U...h->.0E~..|-00000bb0:  e1 ea 04 f9 61 0a -- --  -- -- -- -- -- -- -- --  |..D.aJ----------|+000009c0  -- -- -- -- -- -- -- --  -- -- -- -- -- -- -- f8  |---------------.|+000009d0  a2 68 8a 14 21 d8 00 43  cf bd 1b fd 3e ed d7 ef  |.h.T!.@C..[.>...|+000009e0  eb bf ed dc 9d 33 e7 fc  e6 cc 79 dd bb f7 ce 94  |.....3....y.....|+000009f0  2d 5c 5c 44 56 aa 24 50  60 56 c9 8c 05 64 36 eb  |-\\DV.$P`V..Ed6.|+00000a00  49 1e 8a 67 dd 53 e6 36  45 8a bd 97 48 cb 9d bd  |I^.g.S.6E...H...|+00000a10  60 4e 49 54 8e 7f 91 e5  4e 73 e6 dd 37 3b 2a 27  |`NIT.~..Ns..7;*'|+00000a20  4e 66 79 40 71 d1 8c c2  a8 4c 57 78 ec 57 cc 40  |Nfy@q....LWx.W.@|+00000a30  54 16 7d 78 bc ae b8 a4  8c ed 18 cd fa 2e 13 d7  |TV}x......X...S.|+00000a40  bc d2 59 6d f3 89 a3 0c  b0 64 c6 bd 6d fe e9 38  |..Ym...L.d..m..8|+00000a50  cb ee f9 33 4a 8a 78 e4  66 8f 30 e9 b6 a0 74 51  |...3J.x.f.0...tQ|+00000a60  99 29 92 bd 9a c7 ec 05  0b 8b da f4 45 90 28 a6  |.).....EK...E.(.|+00000a70  53 74 ae 8d 1a 96 05 77  a9 59 29 8b ee 22 0b 69  |St..Z.Ew.Y).."Ki|+00000a80  e4 a0 8d 94 c4 d0 ad ac  2b 79 d6 98 d7 62 b2 96  |........+y...b..|+00000a90  3e 7d f6 8d 3b ec 37 5c  a4 4e b1 e6 e2 bd 65 e9  |>}..;.7\.N....e.|+00000aa0  79 06 73 28 b8 a4 df e5  95 57 85 ac 8f bd 85 c5  |yFs(.....W......|+00000ab0  e8 a4 31 c1 eb 62 4a 54  07 22 fd e0 e5 95 d7 92  |..1..bJTG"......|+00000ac0  65 bd 69 c9 98 f9 be c9  08 c5 66 bd ae 55 8a 94  |e.i.....H.f..U..|+00000ad0  ed eb a6 c9 a1 99 22 85  6a 09 4c 2b 49 17 2e 52  |......".jIL+IW.R|+00000ae0  cc 27 9b 34 89 03 82 70  9a bc c3 a4 76 da c4 88  |.'.4.C.p....v...|+00000af0  cd e4 13 b7 7f 3d 52 0e  f5 89 44 aa 60 cc 4a 3e  |..S.~=RN..D.`.J>|+00000b00  a6 09 94 cb 34 de b4 17  67 6a c5 92 8d 91 18 93  |.I..4..Wgj....X.|+00000b10  b7 98 3a d2 e4 75 13 87  89 68 26 22 02 21 05 a5  |..:..uS..h&"B!E.|+00000b20  70 b5 02 57 14 2e 2b b4  e6 e2 9f 75 f8 ae 02 97  |p.BWT.+....u..B.|+00000b30  5a aa e5 25 85 4b 0d 7a  cb c5 90 6c a9 46 4b a5  |Z..%.KMz...l.FK.|+00000b40  7e f1 42 17 79 31 84 8b  01 fd 42 17 7c 7b 3e 47  |~.BWy1..A.BW|{>G|+00000b50  7e db 8a f3 39 f8 87 c2  39 85 6f 72 71 d6 85 bf  |~...9...9.orq...|+00000b60  d7 a2 99 43 6c 56 68 8e  5c 3b 18 b8 a6 7f 3d 12  |...ClVh.\;X..~=R|+00000b70  5f 9d 29 94 5f d5 e2 4c  21 fe a6 70 fa cb 0c 79  |_.)._..L!..p..Ly|+00000b80  5a e1 cb 0c 7c a1 f0 f9  5d f8 4c e1 d3 3a 9c 3a  |Z..L|...].L..:.:|+00000b90  99 2e 4f b5 e2 64 3a 4e  d4 e2 13 85 8f 15 8e 1f  |..O..d:N..S..U._|+00000ba0  4b 91 c7 15 8e a5 e0 68  2d 3e fa 30 45 7e a4 f0  |K..U...h->.0E~..|+00000bb0  e1 ea 04 f9 61 0a -- --  -- -- -- -- -- -- -- --  |..D.aJ----------| Hello.pdf:62:-00000bb0:  -- -- -- -- -- -- 3e a8  c0 91 41 68 62 a1 69 10  |------>...Ahb.iP|-00000bc0:  0e 2b 1c 7a 3f 5e 1e 52  78 3f 1e 07 15 de 53 38  |N+\z?^^Rx?^GU.S8|-00000bd0:  50 e5 94 07 32 f1 d7 54  ec 57 78 b7 16 8d ab 7c  |P..G2..T.Wx.V..||-00000be0:  b2 51 e1 2f 0a -- -- --  -- -- -- -- -- -- -- --  |.Q./J-----------|+00000bb0  -- -- -- -- -- -- 3e a8  c0 91 41 68 62 a1 69 10  |------>...Ahb.iP|+00000bc0  0e 2b 1c 7a 3f 5e 1e 52  78 3f 1e 07 15 de 53 38  |N+\z?^^Rx?^GU.S8|+00000bd0  50 e5 94 07 32 f1 d7 54  ec 57 78 b7 16 8d ab 7c  |P..G2..T.Wx.V..||+00000be0  b2 51 e1 2f 0a -- -- --  -- -- -- -- -- -- -- --  |.Q./J-----------| Hello.pdf:63:-00000be0:  -- -- -- -- -- ef 54 60  9f c2 db 0a -- -- -- --  |-----.T`...J----|+00000be0  -- -- -- -- -- ef 54 60  9f c2 db 0a -- -- -- --  |-----.T`...J----| Hello.pdf:64:-00000be0:  -- -- -- -- -- -- -- --  -- -- -- -- 7f 56 d8 bb  |------------~V..|-00000bf0:  29 51 be a5 b0 47 e1 4d  85 3f 29 34 b0 bd 06 17  |)Q...G.M.?)4..FW|-00000c00:  de b0 a2 7e 77 9d ac 57  d8 bd 6b 9a dc 5d 87 dd  |...~w..W..k..]..|-00000c10:  95 fa ae 3a 9f dc 35 0d  bb 02 7a 9d 0f 3b 15 5e  |...:..5M.Bz.O;U^|-00000c20:  af 45 a4 66 a8 7c 4d e1  55 1e 5e 6d c5 2b 6c 6b  |.E.f.|M.U^^m.+lk|-00000c30:  87 c2 1f 0b b1 bd 10 2f  db 10 4e c2 1f 14 5e 52  |.._K..P/.PN._T^R|-00000c40:  81 ab f8 bd c2 8b 0a --  -- -- -- -- -- -- -- --  |......J---------|+00000be0  -- -- -- -- -- -- -- --  -- -- -- -- 7f 56 d8 bb  |------------~V..|+00000bf0  29 51 be a5 b0 47 e1 4d  85 3f 29 34 b0 bd 06 17  |)Q...G.M.?)4..FW|+00000c00  de b0 a2 7e 77 9d ac 57  d8 bd 6b 9a dc 5d 87 dd  |...~w..W..k..]..|+00000c10  95 fa ae 3a 9f dc 35 0d  bb 02 7a 9d 0f 3b 15 5e  |...:..5M.Bz.O;U^|+00000c20  af 45 a4 66 a8 7c 4d e1  55 1e 5e 6d c5 2b 6c 6b  |.E.f.|M.U^^m.+lk|+00000c30  87 c2 1f 0b b1 bd 10 2f  db 10 4e c2 1f 14 5e 52  |.._K..P/.PN._T^R|+00000c40  81 ab f8 bd c2 8b 0a --  -- -- -- -- -- -- -- --  |......J---------| Hello.pdf:65:-00000c40:  -- -- -- -- -- -- -- bf  4b c2 36 85 17 9e b7 c9  |-------.K.6.W...|-00000c50:  17 72 f1 bc 0d cf 6d 75  ca e7 ba 61 ab 13 cf 6e  |Wr..M.mu...a.S.n|-00000c60:  f1 cb 67 2b b0 c5 8f df  2a 3c a3 f0 b4 c2 53 4f  |..g+....*<....SO|-00000c70:  a6 cb a7 0a -- -- -- --  -- -- -- -- -- -- -- --  |...J------------|+00000c40  -- -- -- -- -- -- -- bf  4b c2 36 85 17 9e b7 c9  |-------.K.6.W...|+00000c50  17 72 f1 bc 0d cf 6d 75  ca e7 ba 61 ab 13 cf 6e  |Wr..M.mu...a.S.n|+00000c60  f1 cb 67 2b b0 c5 8f df  2a 3c a3 f0 b4 c2 53 4f  |..g+....*<....SO|+00000c70  a6 cb a7 0a -- -- -- --  -- -- -- -- -- -- -- --  |...J------------| Hello.pdf:66:-00000c70:  -- -- -- -- f1 e4 13 0e  f9 64 3a 9e 70 e0 37 f1  |----..SN.d:.p.7.|-00000c80:  d8 ac f0 38 3b 79 5c 61  53 22 36 6e e8 29 37 2a  |...8;y\aS"6n.)7*|-00000c90:  6c e8 89 c7 d8 ff 63 b5  a8 5d 5f 27 6b 15 d6 f3  |l.....c..]_'kU..|-00000ca0:  b3 b5 be 0e eb 2b f5 75  6b 7c 72 dd 34 ac 0b e8  |...N.+.uk|r.4.K.|-00000cb0:  8f 2a fc 5a 61 2d cb 6b  eb b0 c6 87 1a 2e 46 cd  |.*.Za-.k....Z.F.|-00000cc0:  50 3c c2 d9 3e e2 c2 ea  04 54 33 50 5d 88 55 5c  |P<..>...DT3P].U\|-00000cd0:  b4 55 3e 54 39 b1 52 e1  61 85 87 14 1e 5c e1 94  |.U>T9.R.a..T^\..|-00000ce0:  0f 2a ac 70 e2 57 0a --  -- -- -- -- -- -- -- --  |O*.p.WJ---------|+00000c70  -- -- -- -- f1 e4 13 0e  f9 64 3a 9e 70 e0 37 f1  |----..SN.d:.p.7.|+00000c80  d8 ac f0 38 3b 79 5c 61  53 22 36 6e e8 29 37 2a  |...8;y\aS"6n.)7*|+00000c90  6c e8 89 c7 d8 ff 63 b5  a8 5d 5f 27 6b 15 d6 f3  |l.....c..]_'kU..|+00000ca0  b3 b5 be 0e eb 2b f5 75  6b 7c 72 dd 34 ac 0b e8  |...N.+.uk|r.4.K.|+00000cb0  8f 2a fc 5a 61 2d cb 6b  eb b0 c6 87 1a 2e 46 cd  |.*.Za-.k....Z.F.|+00000cc0  50 3c c2 d9 3e e2 c2 ea  04 54 33 50 5d 88 55 5c  |P<..>...DT3P].U\|+00000cd0  b4 55 3e 54 39 b1 52 e1  61 85 87 14 1e 5c e1 94  |.U>T9.R.a..T^\..|+00000ce0  0f 2a ac 70 e2 57 0a --  -- -- -- -- -- -- -- --  |O*.p.WJ---------| Hello.pdf:67:-00000ce0:  -- -- -- -- -- -- -- cb  15 1e 70 0e 93 0f 4c c2  |-------.U^pN.OL.|-00000cf0:  2f 15 2a ef c5 b2 a5 15  72 99 c2 d2 0a -- -- --  |/U*....Ur...J---|+00000ce0  -- -- -- -- -- -- -- cb  15 1e 70 0e 93 0f 4c c2  |-------.U^pN.OL.|+00000cf0  2f 15 2a ef c5 b2 a5 15  72 99 c2 d2 0a -- -- --  |/U*....Ur...J---| Hello.pdf:68:-00000cf0:  -- -- -- -- -- -- -- --  -- -- -- -- -- 54 74 c4  |-------------Tt.|-00000d00:  fd 0a -- -- -- -- -- --  -- -- -- -- -- -- -- --  |.J--------------|+00000cf0  -- -- -- -- -- -- -- --  -- -- -- -- -- 54 74 c4  |-------------Tt.|+00000d00  fd 0a -- -- -- -- -- --  -- -- -- -- -- -- -- --  |.J--------------| Hello.pdf:69:-00000d00:  -- -- e5 36 fc 42 61 89  c2 3d 0a -- -- -- -- --  |--.6.Ba..=J-----|+00000d00  -- -- e5 36 fc 42 61 89  c2 3d 0a -- -- -- -- --  |--.6.Ba..=J-----| Hello.pdf:70:-00000d00:  -- -- -- -- -- -- -- --  -- -- -- 8b cb ac 72 b1  |-----------...r.|-00000d10:  1d 8b 23 82 02 47 f5 32  2b ca 1a f4 45 49 58 14  |].#.BG.2+.Z.EIXT|-00000d20:  d0 17 2a dc ad b0 40 a1  74 fe 24 59 5a 8b f9 25  |.W*...@.t.$YZ..%|-00000d30:  dd e4 fc 49 28 e9 86 79  0a -- -- -- -- -- -- --  |...I(..yJ-------|+00000d00  -- -- -- -- -- -- -- --  -- -- -- 8b cb ac 72 b1  |-----------...r.|+00000d10  1d 8b 23 82 02 47 f5 32  2b ca 1a f4 45 49 58 14  |].#.BG.2+.Z.EIXT|+00000d20  d0 17 2a dc ad b0 40 a1  74 fe 24 59 5a 8b f9 25  |.W*...@.t.$YZ..%|+00000d30  dd e4 fc 49 28 e9 86 79  0a -- -- -- -- -- -- --  |...I(..yJ-------| Hello.pdf:71:-00000d30:  -- -- -- -- -- -- -- --  -- 77 e5 e2 4e 85 b9 b9  |---------w..N...|-00000d40:  28 6e c5 9c 3a cc 56 28  52 28 54 98 35 b3 a3 9c  |(n..:.V(R(T.5...|-00000d50:  a5 30 93 1c 72 66 47 cc  50 98 ae 70 87 c2 ed 53  |.0.\rfG.P..p...S|-00000d60:  12 e4 ed 36 4c 2b c4 6d  fb 30 95 85 a9 2e 4c 49  |R..6L+.m.0....LI|-00000d70:  00 3f d1 41 17 6e 55 f8  b9 c2 2d 19 e9 f2 96 5c  |@?.AWnU...-Y...\|-00000d80:  4c 56 98 a4 30 51 61 42  05 c6 2b dc ec c2 38 85  |LV..0QaBE.+...8.|-00000d90:  b1 c2 2f c7 2a dc 54 87  31 dd 70 e3 e8 34 79 63  |../.*.T.1.p..4yc|-00000da0:  7f 8c 1e 9e 24 47 a7 61  54 41 9a 1c a5 30 92 a5  |~.^.$G.aTA.\.0..|-00000db0:  91 85 18 c1 d2 88 3a 14  a4 21 9f 81 fc fe 18 3e  |..X...:T.!....X>|-00000dc0:  cc 29 87 27 61 78 44 0b  04 e2 f4 61 43 ed 72 98  |.).'axDKD..aC.r.|-00000dd0:  13 c3 22 1a b1 34 34 60  93 43 ed 18 1a 11 0d 2c  |S."Z.44`.C.XZQM,|-00000de0:  05 86 58 65 c0 86 40 44  54 b2 34 c4 1a 27 87 58  |E.Xe..@DT.4.Z'.X|-00000df0:  31 24 22 02 81 42 fd 67  0a -- -- -- -- -- -- --  |1$"B.B.gJ-------|+00000d30  -- -- -- -- -- -- -- --  -- 77 e5 e2 4e 85 b9 b9  |---------w..N...|+00000d40  28 6e c5 9c 3a cc 56 28  52 28 54 98 35 b3 a3 9c  |(n..:.V(R(T.5...|+00000d50  a5 30 93 1c 72 66 47 cc  50 98 ae 70 87 c2 ed 53  |.0.\rfG.P..p...S|+00000d60  12 e4 ed 36 4c 2b c4 6d  fb 30 95 85 a9 2e 4c 49  |R..6L+.m.0....LI|+00000d70  00 3f d1 41 17 6e 55 f8  b9 c2 2d 19 e9 f2 96 5c  |@?.AWnU...-Y...\|+00000d80  4c 56 98 a4 30 51 61 42  05 c6 2b dc ec c2 38 85  |LV..0QaBE.+...8.|+00000d90  b1 c2 2f c7 2a dc 54 87  31 dd 70 e3 e8 34 79 63  |../.*.T.1.p..4yc|+00000da0  7f 8c 1e 9e 24 47 a7 61  54 41 9a 1c a5 30 92 a5  |~.^.$G.aTA.\.0..|+00000db0  91 85 18 c1 d2 88 3a 14  a4 21 9f 81 fc fe 18 3e  |..X...:T.!....X>|+00000dc0  cc 29 87 27 61 78 44 0b  04 e2 f4 61 43 ed 72 98  |.).'axDKD..aC.r.|+00000dd0  13 c3 22 1a b1 34 34 60  93 43 ed 18 1a 11 0d 2c  |S."Z.44`.C.XZQM,|+00000de0  05 86 58 65 c0 86 40 44  54 b2 34 c4 1a 27 87 58  |E.Xe..@DT.4.Z'.X|+00000df0  31 24 22 02 81 42 fd 67  0a -- -- -- -- -- -- --  |1$"B.B.gJ-------| Hello.pdf:72:-00000df0:  -- -- -- -- -- -- -- --  -- 83 39 84 c1 ad b8 41  |---------.9....A|-00000e00:  e1 fa 6e 18 a4 30 90 0b  3c b0 10 03 7a b7 97 03  |..nX.0.K<.PCz..C|-00000e10:  c6 a0 bf 42 3f bf 4b f6  53 e8 3b 06 7d 7a b5 97  |...B?.K.S.;F}z..|-00000e20:  7d c6 20 8f 87 3c 85 5c  56 cc 55 e8 cd d3 bd db  |}. ..<.\V.U.....|-00000e30:  a3 57 7b e4 30 97 93 86  9e 71 a9 b2 67 1d fc d9  |.W{.0....q..g]..|-00000e40:  c9 d2 ef 82 3f a2 19 6e  b3 1d 4e 99 9d 8c 6c 23  |....?.Yn.]N...l#|-00000e50:  dc 5a 3d ab 87 4f 66 29  f4 60 cd 1e 3e 74 d7 06  |.Z=..Of).`.^>t.F|-00000e60:  c9 ee 0a -- -- -- -- --  -- -- -- -- -- -- -- --  |..J-------------|+00000df0  -- -- -- -- -- -- -- --  -- 83 39 84 c1 ad b8 41  |---------.9....A|+00000e00  e1 fa 6e 18 a4 30 90 0b  3c b0 10 03 7a b7 97 03  |..nX.0.K<.PCz..C|+00000e10  c6 a0 bf 42 3f bf 4b f6  53 e8 3b 06 7d 7a b5 97  |...B?.K.S.;F}z..|+00000e20  7d c6 20 8f 87 3c 85 5c  56 cc 55 e8 cd d3 bd db  |}. ..<.\V.U.....|+00000e30  a3 57 7b e4 30 97 93 86  9e 71 a9 b2 67 1d fc d9  |.W{.0....q..g]..|+00000e40  c9 d2 ef 82 3f a2 19 6e  b3 1d 4e 99 9d 8c 6c 23  |....?.Yn.]N...l#|+00000e50  dc 5a 3d ab 87 4f 66 29  f4 60 cd 1e 3e 74 d7 06  |.Z=..Of).`.^>t.F|+00000e60  c9 ee 0a -- -- -- -- --  -- -- -- -- -- -- -- --  |..J-------------| Hello.pdf:73:-00000e60:  -- -- -- dd 14 ba 2a 74  b1 c3 97 3a 4c fa 0a --  |---.T.*t...:L.J-|+00000e60  -- -- -- dd 14 ba 2a 74  b1 c3 97 3a 4c fa 0a --  |---.T.*t...:L.J-| Hello.pdf:74:-00000e60:  -- -- -- -- -- -- -- --  -- -- -- -- -- -- -- 70  |---------------p|-00000e70:  9d 1d 5e 85 ce 76 bb ec  ac e0 71 fb a5 a7 02 6e  |.]^..v....q...Bn|-00000e80:  3f 3a 8d 41 47 f6 dc 51  a1 83 42 26 d7 36 53 21  |?:.AG..Q..B&.6S!|-00000e90:  83 ef 4a 46 3a da 2b a4  2b a4 29 b4 63 0b ed 46  |..JF:.+.+.).cK.F|-00000ea0:  20 35 c5 2f 53 87 21 c5  e5 90 29 7e b8 1c 48 66  | 5./S.!...)~.\Hf|-00000eb0:  bd 64 17 92 78 7d 92 82  93 33 77 0e 83 83 3d 38  |.dW.x}...3wN..=8|-00000ec0:  9c 70 44 6b 67 b7 59 a5  dd 0e 7b b4 76 b6 c4 78  |.pDkg.Y..N{.v..x|-00000ed0:  69 b3 c2 16 ad 5d 22 d7  2e 31 1e 89 5c bb 1d ba  |i..V.]"..1^.\.].|-00000ee0:  35 0e 56 e3 d9 ea af 27  28 c4 73 26 f1 0a -- --  |5NV....'(.s&.J--|+00000e60  -- -- -- -- -- -- -- --  -- -- -- -- -- -- -- 70  |---------------p|+00000e70  9d 1d 5e 85 ce 76 bb ec  ac e0 71 fb a5 a7 02 6e  |.]^..v....q...Bn|+00000e80  3f 3a 8d 41 47 f6 dc 51  a1 83 42 26 d7 36 53 21  |?:.AG..Q..B&.6S!|+00000e90  83 ef 4a 46 3a da 2b a4  2b a4 29 b4 63 0b ed 46  |..JF:.+.+.).cK.F|+00000ea0  20 35 c5 2f 53 87 21 c5  e5 90 29 7e b8 1c 48 66  | 5./S.!...)~.\Hf|+00000eb0  bd 64 17 92 78 7d 92 82  93 33 77 0e 83 83 3d 38  |.dW.x}...3wN..=8|+00000ec0  9c 70 44 6b 67 b7 59 a5  dd 0e 7b b4 76 b6 c4 78  |.pDkg.Y..N{.v..x|+00000ed0  69 b3 c2 16 ad 5d 22 d7  2e 31 1e 89 5c bb 1d ba  |i..V.]"..1^.\.].|+00000ee0  35 0e 56 e3 d9 ea af 27  28 c4 73 26 f1 0a -- --  |5NV....'(.s&.J--| Hello.pdf:75:-00000ee0:  -- -- -- -- -- -- -- --  -- -- -- -- -- -- 71 a9  |--------------q.|-00000ef0:  88 75 20 46 c1 c2 a6 2d  0a -- -- -- -- -- -- --  |.u F...-J-------|+00000ee0  -- -- -- -- -- -- -- --  -- -- -- -- -- -- 71 a9  |--------------q.|+00000ef0  88 75 20 46 c1 c2 a6 2d  0a -- -- -- -- -- -- --  |.u F...-J-------| Hello.pdf:76:-00000ef0:  -- -- -- -- -- -- -- --  -- d2 05 70 72 68 85 c6  |---------.Eprh..|-00000f00:  80 36 08 82 03 10 7e 90  03 22 22 0a -- -- -- --  |.6H.CP~.C""J----|+00000ef0  -- -- -- -- -- -- -- --  -- d2 05 70 72 68 85 c6  |---------.Eprh..|+00000f00  80 36 08 82 03 10 7e 90  03 22 22 0a -- -- -- --  |.6H.CP~.C""J----| Hello.pdf:77:-00000f00:  -- -- -- -- -- -- -- --  -- -- -- -- 57 ac 16 59  |------------W.VY|-00000f10:  ff 3f 8d fe c7 53 e1 4f  67 84 1a cd be 4d ac e5  |.?...S.Og.Z..M..|-00000f20:  d1 d8 47 44 e8 21 6d 19  7f a5 bf bf 22 b4 87 75  |..GD.!mY~..."..u|-00000f30:  34 53 2f 22 1a c5 4a b1  93 f9 ad bc b7 68 a4 e5  |4S/"Z.J......h..|-00000f40:  74 5e c4 e3 6d d1 9f b9  7a 5e 1b d4 3d 8c d6 d0  |t^..m...z^[.=...|-00000f50:  66 73 75 0d 4e d3 62 ec  a2 43 f4 0e 1d 63 ee b4  |fsuMN.b..C.N]c..|-00000f60:  18 08 5e 2b 0e 91 47 9c  60 3f 2b 7f f0 a1 a1 9e  |XH^+N.G.`?+~....|-00000f70:  a5 3d 4c cb 51 8f a0 e8  24 4a 68 8b 78 89 2d 96  |.=L.Q...$Jh.x.-.|-00000f80:  53 44 94 d2 32 8d 47 6d  22 5b de af 1f 64 74 3f  |SD..2.Gm"[.._dt?|-00000f90:  3d c4 d7 a3 b4 85 4a 99  37 32 58 ce f1 7f 4c 3b  |=.....J.72X..~L;|-00000fa0:  68 15 5d a0 0d da 19 9a  c2 fc 4e da cb f1 28 fe  |hU].M.Y...N...(.|-00000fb0:  fc 9a b9 88 26 6a 61 4b  db b4 c1 da 6c d6 db cb  |....&jaK....l...|-00000fc0:  d6 36 d1 26 b1 9c 9a 68  91 4e fc 29 57 74 4a 36  |.6.&...h.N.)WtJ6|-00000fd0:  69 59 6c 75 07 67 40 34  93 36 cb 26 b9 c1 a8 07  |iYluGg@4.6.&...G|-00000fe0:  8f 4d f2 1c cf 10 75 b0  44 2c ae 18 2f 67 61 d4  |.M.\.Pu.D,.X/ga.|-00000ff0:  6e ab d8 25 7a 6b e3 e8  10 af 2f a7 c9 b8 0d 77  |n..%zk..P./...Mw|-00001000:  e3 98 58 a1 7b f5 25 38  43 35 1a 61 3a dd 49 07  |..X.{.%8C5Za:.IG|-00001010:  64 93 c5 45 35 31 5e aa  b1 cc 16 f7 e9 d3 cd ab  |d..E51^...V.....|-00001020:  9c ad 95 6b 4b f4 e9 62  1b 9d 61 9b 33 f1 1d cb  |...kK..b[.a.3.].|-00001030:  1e 8e 6c b3 99 31 d1 0e  6d a2 1c 27 c7 71 ce b3  |^.l..1.Nm.\'.q..|-00001040:  19 db 6c d2 9a 28 b5 38  68 3f 5a b9 ee 6b 35 25  |Y.l..(.8h?Z..k5%|-00001050:  46 e9 23 30 84 f3 29 d7  6f a2 0d f4 0c db ed ca  |F.#0..).o.M.L...|-00001060:  95 21 2a 45 5f f6 5e 4a  e5 72 75 f4 a2 6d 7c f9  |.!*E_.^J.ru..m|.|-00001070:  e5 6a d4 72 45 cd 6a 88  3c 6d 30 6d d6 66 8b 55  |.j.rE.j.<m0m.f.U|-00001080:  1c 6d 0b 57 b3 14 f9 d4  9f 7d 74 90 67 69 85 d8  |\mKW.T...}t.gi..|-00001090:  c1 71 53 4c 05 2d 92 4d  bc 55 24 ea 41 f4 5a 8c  |.qSLE-.M.U$.A.Z.|-000010a0:  45 ea fc f7 a6 6c b7 23  ac f9 46 17 86 03 13 82  |E....l.#..FW.CS.|-000010b0:  ee 7d 21 8f 3f fb 27 a2  db 11 e3 0e d3 f8 70 e2  |.}!.?.'..Q.N..p.|-000010c0:  7d ee c8 b5 6b e3 83 7a  86 0c 85 65 66 18 be d8  |}...k..z.L.efX..|-000010d0:  b0 ee f3 9e fa 4f 93 a7  fc d9 63 c6 07 dd 11 d1  |.....O....c.G.Q.|-000010e0:  ae 20 bf cd 6c c1 f4 7c  06 27 05 d9 03 ff 0c 98  |. ..l..|F'E.C.L.|-000010f0:  dd 15 30 16 05 46 87 a5  8f 7f a3 a7 87 dd b3 8a  |.U0VEF...~......|-00001100:  dd 55 8e 2a ef a0 2a 47  d1 20 3f ef ff b2 c7 30  |.U.*..*G. ?....0|-00001110:  19 1f 7c 59 88 47 42 11  71 6d 45 84 f2 3b bc ce  |Y_|Y.GBQqmE..;..|-00001120:  bb 48 dc 71 3b 4f c7 65  bb dd 05 73 f3 c3 62 3a  |.H.q;O.e..Es..b:|-00001130:  0b f1 d9 0c f4 f0 30 97  90 ed 1e c1 61 8e 98 18  |K..L..0...^.a..X|-00001140:  f4 86 dc 55 ee aa d1 85  55 ee 11 ee e2 19 85 1c  |...U....U.Q..Y.\|-00001150:  b7 39 f2 44 51 55 28 87  33 98 14 9c cb 74 72 d0  |.9.DQU(.3.T..tr.|-00001160:  13 0e 84 32 7e 60 8b 42  21 c3 bb d5 b0 c3 4b 58  |SN.2~`.B!.....KX|-00001170:  bd 2a c4 16 ee 6c b3 c0  a3 09 e5 5c 65 a5 c4 ec  |.*.V.l...I.\e...|-00001180:  31 ee 30 ba 8c 0f 4e 08  86 2b f3 33 c2 81 fc 50  |1.0..ONH.+.3...P|-00001190:  86 c7 e3 2e 08 37 8c 0f  86 1b f2 33 3c a1 10 6b  |....H7.O.[.3<.Pk|-000011a0:  d9 7e 88 94 23 ae 98 9b  d6 16 b3 9d 63 b6 f5 e0  |.~..#....V..c...|-000011b0:  79 47 d4 0a -- -- -- --  -- -- -- -- -- -- -- --  |yG.J------------|+00000f00  -- -- -- -- -- -- -- --  -- -- -- -- 57 ac 16 59  |------------W.VY|+00000f10  ff 3f 8d fe c7 53 e1 4f  67 84 1a cd be 4d ac e5  |.?...S.Og.Z..M..|+00000f20  d1 d8 47 44 e8 21 6d 19  7f a5 bf bf 22 b4 87 75  |..GD.!mY~..."..u|+00000f30  34 53 2f 22 1a c5 4a b1  93 f9 ad bc b7 68 a4 e5  |4S/"Z.J......h..|+00000f40  74 5e c4 e3 6d d1 9f b9  7a 5e 1b d4 3d 8c d6 d0  |t^..m...z^[.=...|+00000f50  66 73 75 0d 4e d3 62 ec  a2 43 f4 0e 1d 63 ee b4  |fsuMN.b..C.N]c..|+00000f60  18 08 5e 2b 0e 91 47 9c  60 3f 2b 7f f0 a1 a1 9e  |XH^+N.G.`?+~....|+00000f70  a5 3d 4c cb 51 8f a0 e8  24 4a 68 8b 78 89 2d 96  |.=L.Q...$Jh.x.-.|+00000f80  53 44 94 d2 32 8d 47 6d  22 5b de af 1f 64 74 3f  |SD..2.Gm"[.._dt?|+00000f90  3d c4 d7 a3 b4 85 4a 99  37 32 58 ce f1 7f 4c 3b  |=.....J.72X..~L;|+00000fa0  68 15 5d a0 0d da 19 9a  c2 fc 4e da cb f1 28 fe  |hU].M.Y...N...(.|+00000fb0  fc 9a b9 88 26 6a 61 4b  db b4 c1 da 6c d6 db cb  |....&jaK....l...|+00000fc0  d6 36 d1 26 b1 9c 9a 68  91 4e fc 29 57 74 4a 36  |.6.&...h.N.)WtJ6|+00000fd0  69 59 6c 75 07 67 40 34  93 36 cb 26 b9 c1 a8 07  |iYluGg@4.6.&...G|+00000fe0  8f 4d f2 1c cf 10 75 b0  44 2c ae 18 2f 67 61 d4  |.M.\.Pu.D,.X/ga.|+00000ff0  6e ab d8 25 7a 6b e3 e8  10 af 2f a7 c9 b8 0d 77  |n..%zk..P./...Mw|+00001000  e3 98 58 a1 7b f5 25 38  43 35 1a 61 3a dd 49 07  |..X.{.%8C5Za:.IG|+00001010  64 93 c5 45 35 31 5e aa  b1 cc 16 f7 e9 d3 cd ab  |d..E51^...V.....|+00001020  9c ad 95 6b 4b f4 e9 62  1b 9d 61 9b 33 f1 1d cb  |...kK..b[.a.3.].|+00001030  1e 8e 6c b3 99 31 d1 0e  6d a2 1c 27 c7 71 ce b3  |^.l..1.Nm.\'.q..|+00001040  19 db 6c d2 9a 28 b5 38  68 3f 5a b9 ee 6b 35 25  |Y.l..(.8h?Z..k5%|+00001050  46 e9 23 30 84 f3 29 d7  6f a2 0d f4 0c db ed ca  |F.#0..).o.M.L...|+00001060  95 21 2a 45 5f f6 5e 4a  e5 72 75 f4 a2 6d 7c f9  |.!*E_.^J.ru..m|.|+00001070  e5 6a d4 72 45 cd 6a 88  3c 6d 30 6d d6 66 8b 55  |.j.rE.j.<m0m.f.U|+00001080  1c 6d 0b 57 b3 14 f9 d4  9f 7d 74 90 67 69 85 d8  |\mKW.T...}t.gi..|+00001090  c1 71 53 4c 05 2d 92 4d  bc 55 24 ea 41 f4 5a 8c  |.qSLE-.M.U$.A.Z.|+000010a0  45 ea fc f7 a6 6c b7 23  ac f9 46 17 86 03 13 82  |E....l.#..FW.CS.|+000010b0  ee 7d 21 8f 3f fb 27 a2  db 11 e3 0e d3 f8 70 e2  |.}!.?.'..Q.N..p.|+000010c0  7d ee c8 b5 6b e3 83 7a  86 0c 85 65 66 18 be d8  |}...k..z.L.efX..|+000010d0  b0 ee f3 9e fa 4f 93 a7  fc d9 63 c6 07 dd 11 d1  |.....O....c.G.Q.|+000010e0  ae 20 bf cd 6c c1 f4 7c  06 27 05 d9 03 ff 0c 98  |. ..l..|F'E.C.L.|+000010f0  dd 15 30 16 05 46 87 a5  8f 7f a3 a7 87 dd b3 8a  |.U0VEF...~......|+00001100  dd 55 8e 2a ef a0 2a 47  d1 20 3f ef ff b2 c7 30  |.U.*..*G. ?....0|+00001110  19 1f 7c 59 88 47 42 11  71 6d 45 84 f2 3b bc ce  |Y_|Y.GBQqmE..;..|+00001120  bb 48 dc 71 3b 4f c7 65  bb dd 05 73 f3 c3 62 3a  |.H.q;O.e..Es..b:|+00001130  0b f1 d9 0c f4 f0 30 97  90 ed 1e c1 61 8e 98 18  |K..L..0...^.a..X|+00001140  f4 86 dc 55 ee aa d1 85  55 ee 11 ee e2 19 85 1c  |...U....U.Q..Y.\|+00001150  b7 39 f2 44 51 55 28 87  33 98 14 9c cb 74 72 d0  |.9.DQU(.3.T..tr.|+00001160  13 0e 84 32 7e 60 8b 42  21 c3 bb d5 b0 c3 4b 58  |SN.2~`.B!.....KX|+00001170  bd 2a c4 16 ee 6c b3 c0  a3 09 e5 5c 65 a5 c4 ec  |.*.V.l...I.\e...|+00001180  31 ee 30 ba 8c 0f 4e 08  86 2b f3 33 c2 81 fc 50  |1.0..ONH.+.3...P|+00001190  86 c7 e3 2e 08 37 8c 0f  86 1b f2 33 3c a1 10 6b  |....H7.O.[.3<.Pk|+000011a0  d9 7e 88 94 23 ae 98 9b  d6 16 b3 9d 63 b6 f5 e0  |.~..#....V..c...|+000011b0  79 47 d4 0a -- -- -- --  -- -- -- -- -- -- -- --  |yG.J------------| Hello.pdf:78:-000011b0:  -- -- -- -- 97 28 90 11  a6 50 55 95 61 73 52 d0  |----.(.Q.PU.asR.|-000011c0:  eb 09 57 56 55 65 54 71  1e 6d 72 84 1a 7e 02 08  |.IWVUeTq^mr.Z~BH|-000011d0:  fa 29 10 68 03 22 64 d8  e0 4a 14 f0 f7 60 3c 1b  |.)PhC"d..JT..`<[|-000011e0:  e3 c1 eb c9 30 00 af c7  eb e1 38 43 f9 ec db 69  |....0@....8C...i|-000011f0:  dc 9a 02 8e d4 13 f2 f3  6e 9c 8a b9 af e4 5e ce  |..B..S..n.....^.|-00001200:  fd 9c c1 f3 b3 18 dd e7  f3 f9 82 cf 00 53 58 1e  |.....X......@SX^|-00001210:  45 dd fe 6d bf ce f0 7f  d9 b4 1f e9 c1 94 74 93  |E..m...~.._...t.|-00001220:  76 e1 67 77 3b 9d 14 99  fc af 2f 56 b5 7a b1 dc  |v.gw;.T.../V.z..|-00001230:  c2 a7 aa 18 ea b4 cb dc  f3 13 59 84 eb 55 11 2b  |...X.....SY..UQ+|-00001240:  97 6b 3a e5 bc 75 b8 b9  37 39 0e 37 1f 6e ee 95  |.k:..u..79N7_n..|-00001250:  ec f4 38 7d 1e a7 a7 58  a7 2b 8b 90 71 e5 0b 55  |..8}^..X.+..q.KU|-00001260:  1b 63 fb ee fc 42 4b 77  c3 ac 30 72 d0 47 f1 bf  |[c...BKw..0r.G..|-00001270:  20 81 6e 36 4e 15 7c 6f  73 f8 d6 71 b7 3a f8 58  | .n6NU|os..q.:.X|-00001280:  f4 1e 77 e6 c5 71 c6 58  96 3c ea dc 63 18 17 2c  |.^w..q.X.<..cXW,|-00001290:  c7 bd c7 6f 0b 43 41 e7  6e e1 1e 9f b3 93 a3 8a  |...oKCA.n.^.....|-000012a0:  a5 84 ac 5e bd 93 f3 d8  75 9e d3 cb d4 bb b2 51  |...^....u......Q|-000012b0:  eb de d8 78 f5 83 46 d9  74 f5 2d ed 86 d6 2c ed  |...x..F.t.-...,.|-000012c0:  9b ab 4e f6 af 51 f9 b5  cf f8 ad 51 4e 29 94 49  |..N..Q.....QN).I|-000012d0:  79 46 04 3b 19 74 b0 81  08 69 ec 21 93 3d 65 e6  |yFD;Yt..Hi.!.=e.|-000012e0:  f0 3b cf 42 89 0c ee a4  64 4a 37 47 a3 0e 86 17  |.;.B.L..dJ7G.N.W|-000012f0:  91 e2 49 b1 a4 e6 e5 f6  eb 9f 62 13 5e 37 39 1d  |..I.......bS^79]|-00001300:  94 97 9b 14 d3 53 78 3b  5b 62 f4 e9 57 3e 8b 7d  |...T.Sx;[b..W>.}|-00001310:  e3 a5 60 43 c9 dc 3d 53  d5 65 75 54 b8 cf 1d b9  |..`C..=S.euT..].|-00001320:  14 b6 ae 7d 78 c5 8b b1  5a f5 14 cb 17 fb 06 0c  |T..}x...Z.T.W.FL|-00001330:  7c 2d 2b 4b 0c 14 c9 c2  2a 02 ea 93 c7 ca 5e 08  ||-+KLT..*B....^H|-00001340:  cf 37 ea 72 8e eb 32 c5  d2 9e bd 76 8d 46 95 c8  |.7.r..2....v.F..|-00001350:  b7 d8 88 ca a8 43 dc 71  8e 48 e7 53 9e 11 51 22  |.....C.q.H.S.QQ"|-00001360:  c5 47 23 71 a5 5e 2f 52  bc 9d bb f4 75 7a fa 7a  |.G#q.^/R....uz.z|-00001370:  b4 03 53 43 1f 9c 79 f6  15 f5 91 38 21 d6 df bf  |.CSC_.y.U..8!...|-00001380:  f4 f1 43 6f e2 e2 1a a3  e6 1a ad e4 9c 47 71 ce  |..Co..Z..Z...Gq.|-00001390:  09 d4 8e bc 81 64 4b 75  12 55 5b eb 93 36 a6 c5  |I....dKuRU[..6..|-000013a0:  25 d9 f3 91 94 f2 b3 34  c7 85 e6 2b c6 2d fc fc  |%......4...+.-..|-000013b0:  42 b3 e3 6c 2f d1 d9 92  e2 32 72 ec db a7 4b d7  |B..l/....2r...K.|-000013c0:  dc 24 a7 43 f3 76 d6 9c  8e 24 ad b8 7a cd 9a ea  |.$.C.v...$..z...|-000013d0:  d5 6b d6 ac 3e 73 a9 e5  ab 33 2d 2d 38 71 f4 48  |.k..>s...3--8q.H|-000013e0:  d3 b1 63 4d 47 8e 6e 56  ef ab 4f d5 29 75 48 f8  |..cMG.nV..O.)uH.|-000013f0:  f9 b3 d3 51 f4 34 fc 9a  ed da 52 f3 39 35 4e a7  |...Q.4....R.95N.|-00001400:  3f 6e 92 c5 2c 7e 7e 6f  a6 89 cc 09 3e 3a 46 75  |?n..,~~o...I>:Fu|-00001410:  2c c6 0b 72 e4 84 c9 63  a7 8c c8 1a 5b 34 7f 5e  |,.Kr...c...Z[4~^|-00001420:  a9 7f 62 d1 9c c5 f3 66  2c 24 fa 17 20 2d 06 e4  |.~b....f,$.W -F.|-00001430:  0a -- -- -- -- -- -- --  -- -- -- -- -- -- -- --  |J---------------|-Hello.pdf:79:endstream-Hello.pdf:80:endobj-Hello.pdf:81:14 0 obj-Hello.pdf:82:2734-Hello.pdf:83:endobj-Hello.pdf:84:15 0 obj-Hello.pdf:85:(Hello)-Hello.pdf:86:endobj-Hello.pdf:87:16 0 obj-Hello.pdf:88:(Mac OS X 10.12.6 Quartz PDFContext)-Hello.pdf:89:endobj-Hello.pdf:90:17 0 obj-Hello.pdf:91:(TextEdit)-Hello.pdf:92:endobj-Hello.pdf:93:18 0 obj-Hello.pdf:94:(D:20200124010711Z00'00')-Hello.pdf:95:endobj-Hello.pdf:96:19 0 obj-Hello.pdf:97:()-Hello.pdf:98:endobj-Hello.pdf:99:20 0 obj-Hello.pdf:100:[ ]-Hello.pdf:101:endobj-Hello.pdf:102:1 0 obj-Hello.pdf:103:<< /Title 15 0 R /Producer 16 0 R /Creator 17 0 R /CreationDate 18 0 R /ModDate-Hello.pdf:104:18 0 R /Keywords 19 0 R /AAPL:Keywords 20 0 R >>-Hello.pdf:105:endobj-Hello.pdf:106:xref-Hello.pdf:107:0 21-Hello.pdf:108:0000000000 65535 f -Hello.pdf:109:0000005392 00000 n -Hello.pdf:110:0000000238 00000 n -Hello.pdf:111:0000001714 00000 n -Hello.pdf:112:0000000022 00000 n -Hello.pdf:113:0000000219 00000 n -Hello.pdf:114:0000000342 00000 n -Hello.pdf:115:0000001679 00000 n -Hello.pdf:116:0000001847 00000 n -Hello.pdf:117:0000000439 00000 n -Hello.pdf:118:0000001658 00000 n -Hello.pdf:119:0000001797 00000 n -Hello.pdf:120:0000002110 00000 n -Hello.pdf:121:0000002362 00000 n -Hello.pdf:122:0000005186 00000 n -Hello.pdf:123:0000005207 00000 n -Hello.pdf:124:0000005231 00000 n -Hello.pdf:125:0000005284 00000 n -Hello.pdf:126:0000005311 00000 n -Hello.pdf:127:0000005353 00000 n -Hello.pdf:128:0000005372 00000 n -Hello.pdf:129:trailer-Hello.pdf:130:<< /Size 21 /Root 11 0 R /Info 1 0 R /ID [ <8db88d3335070bd9583341583cf769a3>-Hello.pdf:131:<8db88d3335070bd9583341583cf769a3> ] >>-Hello.pdf:132:startxref-Hello.pdf:133:5536-Hello.pdf:134:%%EOF-Hello.sh:1:#!/bin/sh-Hello.sh:2:echo "Hello World!"+000011b0  -- -- -- -- 97 28 90 11  a6 50 55 95 61 73 52 d0  |----.(.Q.PU.asR.|+000011c0  eb 09 57 56 55 65 54 71  1e 6d 72 84 1a 7e 02 08  |.IWVUeTq^mr.Z~BH|+000011d0  fa 29 10 68 03 22 64 d8  e0 4a 14 f0 f7 60 3c 1b  |.)PhC"d..JT..`<[|+000011e0  e3 c1 eb c9 30 00 af c7  eb e1 38 43 f9 ec db 69  |....0@....8C...i|+000011f0  dc 9a 02 8e d4 13 f2 f3  6e 9c 8a b9 af e4 5e ce  |..B..S..n.....^.|+00001200  fd 9c c1 f3 b3 18 dd e7  f3 f9 82 cf 00 53 58 1e  |.....X......@SX^|+00001210  45 dd fe 6d bf ce f0 7f  d9 b4 1f e9 c1 94 74 93  |E..m...~.._...t.|+00001220  76 e1 67 77 3b 9d 14 99  fc af 2f 56 b5 7a b1 dc  |v.gw;.T.../V.z..|+00001230  c2 a7 aa 18 ea b4 cb dc  f3 13 59 84 eb 55 11 2b  |...X.....SY..UQ+|+00001240  97 6b 3a e5 bc 75 b8 b9  37 39 0e 37 1f 6e ee 95  |.k:..u..79N7_n..|+00001250  ec f4 38 7d 1e a7 a7 58  a7 2b 8b 90 71 e5 0b 55  |..8}^..X.+..q.KU|+00001260  1b 63 fb ee fc 42 4b 77  c3 ac 30 72 d0 47 f1 bf  |[c...BKw..0r.G..|+00001270  20 81 6e 36 4e 15 7c 6f  73 f8 d6 71 b7 3a f8 58  | .n6NU|os..q.:.X|+00001280  f4 1e 77 e6 c5 71 c6 58  96 3c ea dc 63 18 17 2c  |.^w..q.X.<..cXW,|+00001290  c7 bd c7 6f 0b 43 41 e7  6e e1 1e 9f b3 93 a3 8a  |...oKCA.n.^.....|+000012a0  a5 84 ac 5e bd 93 f3 d8  75 9e d3 cb d4 bb b2 51  |...^....u......Q|+000012b0  eb de d8 78 f5 83 46 d9  74 f5 2d ed 86 d6 2c ed  |...x..F.t.-...,.|+000012c0  9b ab 4e f6 af 51 f9 b5  cf f8 ad 51 4e 29 94 49  |..N..Q.....QN).I|+000012d0  79 46 04 3b 19 74 b0 81  08 69 ec 21 93 3d 65 e6  |yFD;Yt..Hi.!.=e.|+000012e0  f0 3b cf 42 89 0c ee a4  64 4a 37 47 a3 0e 86 17  |.;.B.L..dJ7G.N.W|+000012f0  91 e2 49 b1 a4 e6 e5 f6  eb 9f 62 13 5e 37 39 1d  |..I.......bS^79]|+00001300  94 97 9b 14 d3 53 78 3b  5b 62 f4 e9 57 3e 8b 7d  |...T.Sx;[b..W>.}|+00001310  e3 a5 60 43 c9 dc 3d 53  d5 65 75 54 b8 cf 1d b9  |..`C..=S.euT..].|+00001320  14 b6 ae 7d 78 c5 8b b1  5a f5 14 cb 17 fb 06 0c  |T..}x...Z.T.W.FL|+00001330  7c 2d 2b 4b 0c 14 c9 c2  2a 02 ea 93 c7 ca 5e 08  ||-+KLT..*B....^H|+00001340  cf 37 ea 72 8e eb 32 c5  d2 9e bd 76 8d 46 95 c8  |.7.r..2....v.F..|+00001350  b7 d8 88 ca a8 43 dc 71  8e 48 e7 53 9e 11 51 22  |.....C.q.H.S.QQ"|+00001360  c5 47 23 71 a5 5e 2f 52  bc 9d bb f4 75 7a fa 7a  |.G#q.^/R....uz.z|+00001370  b4 03 53 43 1f 9c 79 f6  15 f5 91 38 21 d6 df bf  |.CSC_.y.U..8!...|+00001380  f4 f1 43 6f e2 e2 1a a3  e6 1a ad e4 9c 47 71 ce  |..Co..Z..Z...Gq.|+00001390  09 d4 8e bc 81 64 4b 75  12 55 5b eb 93 36 a6 c5  |I....dKuRU[..6..|+000013a0  25 d9 f3 91 94 f2 b3 34  c7 85 e6 2b c6 2d fc fc  |%......4...+.-..|+000013b0  42 b3 e3 6c 2f d1 d9 92  e2 32 72 ec db a7 4b d7  |B..l/....2r...K.|+000013c0  dc 24 a7 43 f3 76 d6 9c  8e 24 ad b8 7a cd 9a ea  |.$.C.v...$..z...|+000013d0  d5 6b d6 ac 3e 73 a9 e5  ab 33 2d 2d 38 71 f4 48  |.k..>s...3--8q.H|+000013e0  d3 b1 63 4d 47 8e 6e 56  ef ab 4f d5 29 75 48 f8  |..cMG.nV..O.)uH.|+000013f0  f9 b3 d3 51 f4 34 fc 9a  ed da 52 f3 39 35 4e a7  |...Q.4....R.95N.|+00001400  3f 6e 92 c5 2c 7e 7e 6f  a6 89 cc 09 3e 3a 46 75  |?n..,~~o...I>:Fu|+00001410  2c c6 0b 72 e4 84 c9 63  a7 8c c8 1a 5b 34 7f 5e  |,.Kr...c...Z[4~^|+00001420  a9 7f 62 d1 9c c5 f3 66  2c 24 fa 17 20 2d 06 e4  |.~b....f,$.W -F.|+00001430  0a -- -- -- -- -- -- --  -- -- -- -- -- -- -- --  |J---------------|+Hello.pdf:79:endstream+Hello.pdf:80:endobj+Hello.pdf:81:14 0 obj+Hello.pdf:82:2734+Hello.pdf:83:endobj+Hello.pdf:84:15 0 obj+Hello.pdf:85:(Hello)+Hello.pdf:86:endobj+Hello.pdf:87:16 0 obj+Hello.pdf:88:(Mac OS X 10.12.6 Quartz PDFContext)+Hello.pdf:89:endobj+Hello.pdf:90:17 0 obj+Hello.pdf:91:(TextEdit)+Hello.pdf:92:endobj+Hello.pdf:93:18 0 obj+Hello.pdf:94:(D:20200124010711Z00'00')+Hello.pdf:95:endobj+Hello.pdf:96:19 0 obj+Hello.pdf:97:()+Hello.pdf:98:endobj+Hello.pdf:99:20 0 obj+Hello.pdf:100:[ ]+Hello.pdf:101:endobj+Hello.pdf:102:1 0 obj+Hello.pdf:103:<< /Title 15 0 R /Producer 16 0 R /Creator 17 0 R /CreationDate 18 0 R /ModDate+Hello.pdf:104:18 0 R /Keywords 19 0 R /AAPL:Keywords 20 0 R >>+Hello.pdf:105:endobj+Hello.pdf:106:xref+Hello.pdf:107:0 21+Hello.pdf:108:0000000000 65535 f +Hello.pdf:109:0000005392 00000 n +Hello.pdf:110:0000000238 00000 n +Hello.pdf:111:0000001714 00000 n +Hello.pdf:112:0000000022 00000 n +Hello.pdf:113:0000000219 00000 n +Hello.pdf:114:0000000342 00000 n +Hello.pdf:115:0000001679 00000 n +Hello.pdf:116:0000001847 00000 n +Hello.pdf:117:0000000439 00000 n +Hello.pdf:118:0000001658 00000 n +Hello.pdf:119:0000001797 00000 n +Hello.pdf:120:0000002110 00000 n +Hello.pdf:121:0000002362 00000 n +Hello.pdf:122:0000005186 00000 n +Hello.pdf:123:0000005207 00000 n +Hello.pdf:124:0000005231 00000 n +Hello.pdf:125:0000005284 00000 n +Hello.pdf:126:0000005311 00000 n +Hello.pdf:127:0000005353 00000 n +Hello.pdf:128:0000005372 00000 n +Hello.pdf:129:trailer+Hello.pdf:130:<< /Size 21 /Root 11 0 R /Info 1 0 R /ID [ <8db88d3335070bd9583341583cf769a3>+Hello.pdf:131:<8db88d3335070bd9583341583cf769a3> ] >>+Hello.pdf:132:startxref+Hello.pdf:133:5536+Hello.pdf:134:%%EOF+Hello.sh:1:#!/bin/sh+Hello.sh:2:echo "Hello World!" Hello.txt:1:Hello

tests/out/Hello_-W-nC1.out

deleted file mode 100644@@ -1,466 +0,0 @@-Hello.bat:1:#!/bin/sh-Hello.bat:2:echo "Hello World!"-Hello.class:1:-00000000:  ca fe ba be 00 00 00 34  00 1d 0a -- -- -- -- --  |....@@@4@]J-----|-Hello.class:2:-00000000:  -- -- -- -- -- -- -- --  -- -- -- 00 06 00 0f 09  |-----------@F@OI|-00000010:  00 10 00 11 08 00 12 0a  -- -- -- -- -- -- -- --  |@P@QH@RJ--------|-Hello.class:3:-00000010:  -- -- -- -- -- -- -- --  00 13 00 14 07 00 15 07  |--------@S@TG@UG|-00000020:  00 16 01 00 06 3c 69 6e  69 74 3e 01 00 03 28 29  |@VA@F<init>A@C()|-00000030:  56 01 00 04 43 6f 64 65  01 00 0f 4c 69 6e 65 4e  |VA@DCodeA@OLineN|-00000040:  75 6d 62 65 72 54 61 62  6c 65 01 00 04 6d 61 69  |umberTableA@Dmai|-00000050:  6e 01 00 16 28 5b 4c 6a  61 76 61 2f 6c 61 6e 67  |nA@V([Ljava/lang|-00000060:  2f 53 74 72 69 6e 67 3b  29 56 01 00 0a -- -- --  |/String;)VA@J---|-Hello.class:4:-00000060:  -- -- -- -- -- -- -- --  -- -- -- -- -- 53 6f 75  |-------------Sou|-00000070:  72 63 65 46 69 6c 65 01  00 0a -- -- -- -- -- --  |rceFileA@J------|-Hello.class:5:-00000070:  -- -- -- -- -- -- -- --  -- -- 48 65 6c 6c 6f 2e  |----------Hello.|-00000080:  6a 61 76 61 0c 00 07 00  08 07 00 17 0c 00 18 00  |javaL@G@HG@WL@X@|-00000090:  19 01 00 0c 48 65 6c 6c  6f 20 57 6f 72 6c 64 21  |YA@LHello World!|-000000a0:  07 00 1a 0c 00 1b 00 1c  01 00 05 48 65 6c 6c 6f  |G@ZL@[@\A@EHello|-000000b0:  01 00 10 6a 61 76 61 2f  6c 61 6e 67 2f 4f 62 6a  |A@Pjava/lang/Obj|-000000c0:  65 63 74 01 00 10 6a 61  76 61 2f 6c 61 6e 67 2f  |ectA@Pjava/lang/|-000000d0:  53 79 73 74 65 6d 01 00  03 6f 75 74 01 00 15 4c  |SystemA@CoutA@UL|-000000e0:  6a 61 76 61 2f 69 6f 2f  50 72 69 6e 74 53 74 72  |java/io/PrintStr|-000000f0:  65 61 6d 3b 01 00 13 6a  61 76 61 2f 69 6f 2f 50  |eam;A@Sjava/io/P|-00000100:  72 69 6e 74 53 74 72 65  61 6d 01 00 07 70 72 69  |rintStreamA@Gpri|-00000110:  6e 74 6c 6e 01 00 15 28  4c 6a 61 76 61 2f 6c 61  |ntlnA@U(Ljava/la|-00000120:  6e 67 2f 53 74 72 69 6e  67 3b 29 56 00 21 00 05  |ng/String;)V@!@E|-00000130:  00 06 00 00 00 00 00 02  00 01 00 07 00 08 00 01  |@F@@@@@B@A@G@H@A|-00000140:  00 09 00 00 00 1d 00 01  00 01 00 00 00 05 2a b7  |@I@@@]@A@A@@@E*.|-00000150:  00 01 b1 00 00 00 01 00  0a -- -- -- -- -- -- --  |@A.@@@A@J-------|-Hello.class:6:-00000150:  -- -- -- -- -- -- -- --  -- 00 00 00 06 00 01 00  |---------@@@F@A@|-00000160:  00 00 02 00 09 00 0b 00  0c 00 01 00 09 00 00 00  |@@B@I@K@L@A@I@@@|-00000170:  25 00 02 00 01 00 00 00  09 b2 00 02 12 03 b6 00  |%@B@A@@@I.@BRC.@|-00000180:  04 b1 00 00 00 01 00 0a  -- -- -- -- -- -- -- --  |D.@@@A@J--------|-Hello.class:7:-00000180:  -- -- -- -- -- -- -- --  00 00 00 0a -- -- -- --  |--------@@@J----|-Hello.class:8:-00000180:  -- -- -- -- -- -- -- --  -- -- -- -- 00 02 00 00  |------------@B@@|-00000190:  00 04 00 08 00 05 00 01  00 0d 00 00 00 02 00 0e  |@D@H@E@A@M@@@B@N|-Hello.java:1:import java.lang.*;-Hello.java:2:-Hello.java:3:public class Hello // prints a Hello World! greeting-Hello.java:4:{ public static void main(String[] arg)-Hello.java:5:  { System.out.println("Hello World!");-Hello.java:6:  }-Hello.java:7:}-Hello.pdf:1:%PDF-1.3-Hello.pdf:2:-00000000:  -- -- -- -- -- -- -- --  -- 25 c4 e5 f2 e5 eb a7  |---------%......|-00000010:  f3 a0 d0 c4 c6 0a -- --  -- -- -- -- -- -- -- --  |.....J----------|-Hello.pdf:3:4 0 obj-Hello.pdf:4:<< /Length 5 0 R /Filter /FlateDecode >>-Hello.pdf:5:stream-Hello.pdf:6:-00000040:  -- -- -- -- -- -- -- --  -- -- -- -- -- -- 78 01  |--------------xA|-00000050:  45 8e bb 0a -- -- -- --  -- -- -- -- -- -- -- --  |E..J------------|-Hello.pdf:7:-00000050:  -- -- -- -- 02 31 14 44  7b bf e2 94 5a 98 bd 89  |----B1TD{...Z...|-00000060:  79 98 56 11 6c 17 2e f8  01 61 2d 64 d7 65 cd ff  |y.VQlW..Aa-d.e..|-00000070:  83 17 2c ac 86 99 39 0c  b3 31 b2 51 02 b9 46 97  |.W,...9L.1.QB.F.|-00000080:  e2 a9 12 f3 99 90 5c 4c  59 0a -- -- -- -- -- --  |..R...\LYJ------|-Hello.pdf:8:-00000080:  -- -- -- -- -- -- -- --  -- -- 9f 89 07 6f 86 6b  |----------..Go.k|-00000090:  f7 b4 8e d0 9b e1 e2 6a  a9 52 6a b2 40 38 fe ad  |.......j.Rj.@8..|-000000a0:  ed 94 20 bb b6 70 51 a3  44 c4 a3 0d ef 7f a0 69  |.. ..pQ.D..M.~.i|-000000b0:  c2 0b ba 30 a8 7a ac 7c  b2 bf 4f f3 bc 1e d0 17  |.K.0.z.|..O..^.W|-000000c0:  37 b5 37 e3 17 4e ff 20  a5 0a -- -- -- -- -- --  |7.7.WN. .J------|-Hello.pdf:9:endstream-Hello.pdf:10:endobj-Hello.pdf:11:5 0 obj-Hello.pdf:12:123-Hello.pdf:13:endobj-Hello.pdf:14:2 0 obj-Hello.pdf:15:<< /Type /Page /Parent 3 0 R /Resources 6 0 R /Contents 4 0 R /MediaBox [0 0 612 792]-Hello.pdf:16:>>-Hello.pdf:17:endobj-Hello.pdf:18:6 0 obj-Hello.pdf:19:<< /ProcSet [ /PDF /Text ] /ColorSpace << /Cs1 7 0 R >> /Font << /TT1 8 0 R-Hello.pdf:20:>> >>-Hello.pdf:21:endobj-Hello.pdf:22:9 0 obj-Hello.pdf:23:<< /Length 10 0 R /N 1 /Alternate /DeviceGray /Filter /FlateDecode >>-Hello.pdf:24:stream-Hello.pdf:25:-00000200:  -- -- -- -- -- -- -- --  -- -- -- -- 78 01 85 55  |------------xA.U|-00000210:  5d 68 1c 55 14 3e bb 73  67 03 12 07 1f b4 0d 2d  |]h\UT>.sgCRG_.M-|-00000220:  b4 83 3f 6d 09 e9 32 89  56 13 8b b5 db 4d ba 49  |..?mI.2.VS...M.I|-00000230:  13 b7 eb 66 53 9b 2a ca  74 76 36 3b cd 64 66 9c  |S..fS.*.tv6;.df.|-00000240:  99 dd 26 a1 4f a5 e0 9b  16 04 e9 ab a0 3e c6 82  |..&.O...VD...>..|-00000250:  08 b6 2a 36 2f f6 a5 a5  c5 92 4a 35 0f 0a -- --  |H.*6/.....J5OJ--|-Hello.pdf:26:-00000250:  -- -- -- -- -- -- -- --  -- -- -- -- -- -- 11 5a  |--------------QZ|-00000260:  8c 20 28 7d 52 f0 3b 33  db 64 76 41 32 c3 9d f9  |. (}R.;3.dvA2...|-00000270:  ee b9 e7 9e 7b ce 77 ee  b9 97 a8 eb 6f dd f3 ec  |....{.w.....o...|-00000280:  b4 4a 34 e7 84 7e a1 9c  9b 3e 39 7d 4a ed ba 4d  |.J4..~...>9}J..M|-00000290:  69 52 a8 9b f0 e8 46 e0  e5 4a a5 09 c6 8e eb 98  |iR....F..J.I....|-000002a0:  fc 6f 7f 1e de a5 14 4b  ee ec 67 5b ed 63 5b f6  |.o~^..TK..g[.c[.|-000002b0:  e4 aa 19 18 d0 ba 86 e6  56 03 63 8e 28 a5 11 65  |..YX....VCc.(.Qe|-000002c0:  6a 86 e7 87 44 5d 97 20  1f 3c 1b 7a 8c 6f 03 3f  |j...D]. _<[z.oC?|-000002d0:  39 5b 29 e7 81 d7 80 95  d6 5c 40 7a aa 60 3a a6  |9[)......\@z.`:.|-000002e0:  6f 19 6a c1 d7 17 d4 92  ef d6 2c 3b e9 eb 56 e3  |oYj..W....,;..V.|-000002f0:  6c 63 cb 67 ce 6e b0 af  fc ec 46 eb 0e 66 27 c7  |lc.g.n....F.Nf'.|-00000300:  f1 ef 85 cf 17 4c 67 6a  12 78 1f f0 92 a1 8f 30  |....WLgjRx_....0|-00000310:  ee 03 be db b4 4e 14 63  9c 4e 7b e1 91 72 ac 9f  |.C...NTc.N{..r..|-00000320:  ce 36 66 a7 72 2d f9 c9  9a 7f 74 aa 25 bf 50 6f  |.6f.r-...~t.%.Po|-00000330:  8c 32 ce 12 a5 97 16 eb  95 37 80 9f 00 5e 75 4e  |.2.R..V..7..@^uN|-00000340:  17 8f b7 f4 d7 67 dd 71  b6 d3 43 24 f5 18 41 fe  |W....g.q..C$.XA.|-00000350:  14 f0 b3 c0 5a dd 1c e3  3c a9 c0 15 df 2d b3 3e  |T...Z.\.<..U.-.>|-00000360:  cb c3 aa 39 3c 02 fc 32  f0 25 2b 1c ab 00 c3 be  |...9<B.2.%+\.@..|-00000370:  f4 43 d0 9c 64 39 b0 a0  c5 7a 9e fd c4 5a 22 7b  |.C..d9...z...Z"{|-00000380:  46 3f 56 02 de 06 7c c8  b4 0b bc 16 ec 88 8a 17  |F?VB.F|..K.V...W|-00000390:  96 d8 e6 20 f0 bc 63 17  79 2d c4 2e 2e 9b 41 14  |... ..cWy-....AT|-000003a0:  2f 62 17 3f 85 f5 ca 68  ac 2f a7 43 bf c2 73 9f  |/bW?...h./.C..s.|-000003b0:  26 92 f7 d4 ac a3 63 c0  e0 44 1e ad fb a3 2c 87  |&.....c..D^...,.|-000003c0:  3f 72 e8 d9 d1 de 7a 11  78 c9 6f 94 39 f6 3d c0  |?r....zQx.o.9.=.|-000003d0:  6b ba 3f 52 00 86 cd cc  63 55 7d 98 79 7e 01 78  |k.?R@...cU}.y~Ax|-000003e0:  80 4e a4 74 32 c9 a5 d3  f8 1a e4 d0 bf 88 37 20  |.N.t2....Z....7 |-000003f0:  8b 9a 11 f2 c8 c7 58 0d  7d 9b 0a -- -- -- -- --  |..Q...XM}.J-----|-Hello.pdf:27:-000003f0:  -- -- -- -- -- -- -- --  -- -- -- d0 70 d0 7c f4  |-----------.p.|.|-00000400:  0c 68 15 80 74 5a 00 2a  25 b4 4c f4 58 27 9e a3  |LhU.tZ@*%.L.X'..|-00000410:  52 15 3d 95 66 a2 59 41  84 d8 ca fd a8 6f 50 7e  |RU=.f.YA.....oP~|-00000420:  d7 a7 d4 80 b4 4e eb 90  d6 81 5e a3 5f 22 c9 3c  |.....N....^._".<|-00000430:  fd 4a 73 e8 e7 21 6d 60  6c a6 c3 6e 1e 5e 38 b4  |.Js..!m`l..n^^8.|-00000440:  08 0f d8 13 b6 f9 a0 65  d3 15 db 85 26 9e 47 3b  |HO.S...e.U..&.G;|-00000450:  28 26 c4 2b 62 50 0c 91  2a 5e 15 87 c5 21 31 0c  |(&.+bPL.*^U..!1L|-00000460:  e9 90 38 18 cd 89 bd 4f  fa ce 7e 3e d8 b0 f4 2e  |..8X...O..~>....|-00000470:  d6 4d fa be 0c 0e 42 ac  67 c3 33 07 ac 70 34 01  |.M..LNB.g.3G.p4A|-00000480:  3c f8 07 eb ce 46 9a 09  b6 2e ee 68 ec f3 bc 8f  |<.G..F.I...h....|-00000490:  de 3f ef bf 63 19 b7 3e  f8 b3 8d bd 00 fa 31 27  |.?..cY.>....@.1'|-000004a0:  bf c1 a2 0b 6b 26 25 e6  5e 3f f7 4d 4f c2 43 75  |...Kk&%.^?.MO.Cu|-000004b0:  45 7c f5 d6 9d ee eb e7  e8 78 32 4b 51 de aa 9d  |E|.......x2KQ...|-000004c0:  59 92 d7 e4 fb f2 0a --  -- -- -- -- -- -- -- --  |Y.....J---------|-Hello.pdf:28:-000004c0:  -- -- -- -- -- -- -- be  f7 e4 d5 a4 0d f9 67 79  |-------.....M.gy|-000004d0:  15 ef bd b6 5c 3d ca 0b  ff 93 b9 cd 21 46 3b 92  |U...\=.K....!F;.|-000004e0:  cd 41 ce 3c 9b 51 b4 71  c6 1b c0 21 b8 a9 45 73  |.A.<.Q.q.[.!..Es|-000004f0:  f6 b7 59 4c b2 e9 b6 62  b4 60 c9 42 94 9d ab b8  |..YL...b.`.B....|-00000500:  ff cb 09 f3 c3 3c b7 b1  52 73 2e ee f0 bc b7 3f  |..I..<..Rs.....?|-00000510:  63 36 cd f7 8a 0f 8b 74  be 4f bb ac ad 6b 9f 68  |c6...O.t.O...k.h|-00000520:  3f 6a 7f 68 2b da c7 40  bf 4b 1f 4a 5f 4a df 4a  |?j~h+..@.K_J_J.J|-00000530:  57 a4 ab d2 0d 52 a5 6b  d2 b2 f4 9d f4 bd f4 b9  |W...MR.k........|-00000540:  f4 35 7a 5f 40 ba 2c 5d  e9 d8 49 71 ec 1b bb 07  |.5z_@.,]..Iq.[.G|-00000550:  7e c6 7b d6 68 ed 30 66  86 b3 14 10 f3 c2 da cc  |~.{.h.0f..TP....|-00000560:  0a -- -- -- -- -- -- --  -- -- -- -- -- -- -- --  |J---------------|-Hello.pdf:29:-00000560:  -- 4b 1f f1 77 06 63 9b  f9 33 a1 d5 5e 03 9d bb  |-K_.wFc..3..^C..|-00000570:  7f 63 2d e5 88 b2 53 79  46 19 56 76 2b cf 29 13  |~c-...SyFYVv+.)S|-00000580:  4a af 72 40 39 ac 6c 57  06 d0 fa 95 51 65 2f 46  |J.r@9.lWF...Qe/F|-00000590:  76 6e b0 64 63 3d ce 80  85 7f 92 67 8b a6 23 ae  |vn.dc=...~.g..#.|-000005a0:  e2 3c b1 57 75 b0 e7 c3  4b 1d ef a6 5f 5c c3 d6  |.<.Wu...K].._\..|-000005b0:  86 35 d8 49 3d 0e 9e d9  da a6 0e af 11 57 bf 15  |.5.I=N....N.QW.U|-000005c0:  55 63 bc 3b 5d 9c 06 3a  4d 21 62 8b ce 22 72 1f  |Uc.;].F:M!b.."r_|-000005d0:  3a 9c 1f 27 aa fe ce d9  5c 93 38 35 52 6f e2 94  |:._'....\.85Ro..|-000005e0:  b0 c4 2e d1 2f c6 5a 35  98 13 07 50 85 e3 6d f5  |..../.Z5.SGP..m.|-000005f0:  38 c8 55 9a 19 c9 0c 67  72 a4 66 7a 33 43 99 fe  |8.U.Y.Lgr.fz3C..|-00000600:  cc 31 c6 51 ac d1 f9 92  d9 8b d1 21 7c 47 12 de  |.1.Q.......!|GR.|-00000610:  33 cb 31 ff 9b 35 c4 67  18 ef 1d e6 a8 09 6c a3  |3.1..5.gX.]..Il.|-00000620:  87 5b 2b 34 e7 71 df 11  e5 5d 6f c1 b7 66 ea a1  |.[+4.q.Q.]o..f..|-00000630:  3a a0 69 2f a9 39 5c af  a6 3a e6 18 d9 3e 55 b7  |:.i/.9\..:.X.>U.|-00000640:  6d 35 1a 0a -- -- -- --  -- -- -- -- -- -- -- --  |m5ZJ------------|-Hello.pdf:30:-00000640:  -- -- -- -- 54 df 0c 4c  bf 69 56 b3 c4 77 37 cf  |----T.LL.iV..w7.|-00000650:  23 fa eb f5 e8 4e 4e 6d  bb 61 34 fc 66 2c a3 54  |#....NNm.a4.f,.T|-00000660:  ea 26 d1 7f b7 8f 93 34  0a -- -- -- -- -- -- --  |.&.~...4J-------|-Hello.pdf:31:endstream-Hello.pdf:32:endobj-Hello.pdf:33:10 0 obj-Hello.pdf:34:1116-Hello.pdf:35:endobj-Hello.pdf:36:7 0 obj-Hello.pdf:37:[ /ICCBased 9 0 R ]-Hello.pdf:38:endobj-Hello.pdf:39:3 0 obj-Hello.pdf:40:<< /Type /Pages /MediaBox [0 0 612 792] /Count 1 /Kids [ 2 0 R ] >>-Hello.pdf:41:endobj-Hello.pdf:42:11 0 obj-Hello.pdf:43:<< /Type /Catalog /Pages 3 0 R >>-Hello.pdf:44:endobj-Hello.pdf:45:8 0 obj-Hello.pdf:46:<< /Type /Font /Subtype /TrueType /BaseFont /GQTMZF+Menlo-Regular /FontDescriptor-Hello.pdf:47:12 0 R /Encoding /MacRomanEncoding /FirstChar 72 /LastChar 111 /Widths [ 602-Hello.pdf:48:0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 602 0 0 0 0 0 0 602-Hello.pdf:49:0 0 602 ] >>-Hello.pdf:50:endobj-Hello.pdf:51:12 0 obj-Hello.pdf:52:<< /Type /FontDescriptor /FontName /GQTMZF+Menlo-Regular /Flags 33 /FontBBox-Hello.pdf:53:[-558 -375 718 1041] /ItalicAngle 0 /Ascent 928 /Descent -236 /CapHeight 729-Hello.pdf:54:/StemV 99 /XHeight 547 /StemH 83 /AvgWidth 602 /MaxWidth 602 /FontFile2 13 0 R-Hello.pdf:55:>>-Hello.pdf:56:endobj-Hello.pdf:57:13 0 obj-Hello.pdf:58:<< /Length 14 0 R /Length1 4064 /Filter /FlateDecode >>-Hello.pdf:59:stream-Hello.pdf:60:-00000980:  -- -- 78 01 dd 57 7b 78  54 c5 15 3f 73 7f 77 36  |--xA.W{xT.U?s~w6|-00000990:  af cd 3e 92 4d 48 48 80  5d d6 e5 95 2c 81 84 b7  |..>.MHH.]...,...|-000009a0:  52 16 48 78 88 20 2f eb  2e 88 f2 48 20 28 21 08  |RVHx. /....H (!H|-000009b0:  41 b4 31 90 4a 51 09 c1  40 85 08 48 7d 15 51 a9  |A.1.JQI.@.HH}UQ.|-000009c0:  b5 2b 45 5d 09 c4 54 a4  62 23 45 84 a0 02 0a --  |.+E]I.T.b#E..BJ-|-Hello.pdf:61:-000009c0:  -- -- -- -- -- -- -- --  -- -- -- -- -- -- -- f8  |---------------.|-000009d0:  a2 68 8a 14 21 d8 00 43  cf bd 1b fd 3e ed d7 ef  |.h.T!.@C..[.>...|-000009e0:  eb bf ed dc 9d 33 e7 fc  e6 cc 79 dd bb f7 ce 94  |.....3....y.....|-000009f0:  2d 5c 5c 44 56 aa 24 50  60 56 c9 8c 05 64 36 eb  |-\\DV.$P`V..Ed6.|-00000a00:  49 1e 8a 67 dd 53 e6 36  45 8a bd 97 48 cb 9d bd  |I^.g.S.6E...H...|-00000a10:  60 4e 49 54 8e 7f 91 e5  4e 73 e6 dd 37 3b 2a 27  |`NIT.~..Ns..7;*'|-00000a20:  4e 66 79 40 71 d1 8c c2  a8 4c 57 78 ec 57 cc 40  |Nfy@q....LWx.W.@|-00000a30:  54 16 7d 78 bc ae b8 a4  8c ed 18 cd fa 2e 13 d7  |TV}x......X...S.|-00000a40:  bc d2 59 6d f3 89 a3 0c  b0 64 c6 bd 6d fe e9 38  |..Ym...L.d..m..8|-00000a50:  cb ee f9 33 4a 8a 78 e4  66 8f 30 e9 b6 a0 74 51  |...3J.x.f.0...tQ|-00000a60:  99 29 92 bd 9a c7 ec 05  0b 8b da f4 45 90 28 a6  |.).....EK...E.(.|-00000a70:  53 74 ae 8d 1a 96 05 77  a9 59 29 8b ee 22 0b 69  |St..Z.Ew.Y).."Ki|-00000a80:  e4 a0 8d 94 c4 d0 ad ac  2b 79 d6 98 d7 62 b2 96  |........+y...b..|-00000a90:  3e 7d f6 8d 3b ec 37 5c  a4 4e b1 e6 e2 bd 65 e9  |>}..;.7\.N....e.|-00000aa0:  79 06 73 28 b8 a4 df e5  95 57 85 ac 8f bd 85 c5  |yFs(.....W......|-00000ab0:  e8 a4 31 c1 eb 62 4a 54  07 22 fd e0 e5 95 d7 92  |..1..bJTG"......|-00000ac0:  65 bd 69 c9 98 f9 be c9  08 c5 66 bd ae 55 8a 94  |e.i.....H.f..U..|-00000ad0:  ed eb a6 c9 a1 99 22 85  6a 09 4c 2b 49 17 2e 52  |......".jIL+IW.R|-00000ae0:  cc 27 9b 34 89 03 82 70  9a bc c3 a4 76 da c4 88  |.'.4.C.p....v...|-00000af0:  cd e4 13 b7 7f 3d 52 0e  f5 89 44 aa 60 cc 4a 3e  |..S.~=RN..D.`.J>|-00000b00:  a6 09 94 cb 34 de b4 17  67 6a c5 92 8d 91 18 93  |.I..4..Wgj....X.|-00000b10:  b7 98 3a d2 e4 75 13 87  89 68 26 22 02 21 05 a5  |..:..uS..h&"B!E.|-00000b20:  70 b5 02 57 14 2e 2b b4  e6 e2 9f 75 f8 ae 02 97  |p.BWT.+....u..B.|-00000b30:  5a aa e5 25 85 4b 0d 7a  cb c5 90 6c a9 46 4b a5  |Z..%.KMz...l.FK.|-00000b40:  7e f1 42 17 79 31 84 8b  01 fd 42 17 7c 7b 3e 47  |~.BWy1..A.BW|{>G|-00000b50:  7e db 8a f3 39 f8 87 c2  39 85 6f 72 71 d6 85 bf  |~...9...9.orq...|-00000b60:  d7 a2 99 43 6c 56 68 8e  5c 3b 18 b8 a6 7f 3d 12  |...ClVh.\;X..~=R|-00000b70:  5f 9d 29 94 5f d5 e2 4c  21 fe a6 70 fa cb 0c 79  |_.)._..L!..p..Ly|-00000b80:  5a e1 cb 0c 7c a1 f0 f9  5d f8 4c e1 d3 3a 9c 3a  |Z..L|...].L..:.:|-00000b90:  99 2e 4f b5 e2 64 3a 4e  d4 e2 13 85 8f 15 8e 1f  |..O..d:N..S..U._|-00000ba0:  4b 91 c7 15 8e a5 e0 68  2d 3e fa 30 45 7e a4 f0  |K..U...h->.0E~..|-00000bb0:  e1 ea 04 f9 61 0a -- --  -- -- -- -- -- -- -- --  |..D.aJ----------|-Hello.pdf:62:-00000bb0:  -- -- -- -- -- -- 3e a8  c0 91 41 68 62 a1 69 10  |------>...Ahb.iP|-00000bc0:  0e 2b 1c 7a 3f 5e 1e 52  78 3f 1e 07 15 de 53 38  |N+\z?^^Rx?^GU.S8|-00000bd0:  50 e5 94 07 32 f1 d7 54  ec 57 78 b7 16 8d ab 7c  |P..G2..T.Wx.V..||-00000be0:  b2 51 e1 2f 0a -- -- --  -- -- -- -- -- -- -- --  |.Q./J-----------|-Hello.pdf:63:-00000be0:  -- -- -- -- -- ef 54 60  9f c2 db 0a -- -- -- --  |-----.T`...J----|-Hello.pdf:64:-00000be0:  -- -- -- -- -- -- -- --  -- -- -- -- 7f 56 d8 bb  |------------~V..|-00000bf0:  29 51 be a5 b0 47 e1 4d  85 3f 29 34 b0 bd 06 17  |)Q...G.M.?)4..FW|-00000c00:  de b0 a2 7e 77 9d ac 57  d8 bd 6b 9a dc 5d 87 dd  |...~w..W..k..]..|-00000c10:  95 fa ae 3a 9f dc 35 0d  bb 02 7a 9d 0f 3b 15 5e  |...:..5M.Bz.O;U^|-00000c20:  af 45 a4 66 a8 7c 4d e1  55 1e 5e 6d c5 2b 6c 6b  |.E.f.|M.U^^m.+lk|-00000c30:  87 c2 1f 0b b1 bd 10 2f  db 10 4e c2 1f 14 5e 52  |.._K..P/.PN._T^R|-00000c40:  81 ab f8 bd c2 8b 0a --  -- -- -- -- -- -- -- --  |......J---------|-Hello.pdf:65:-00000c40:  -- -- -- -- -- -- -- bf  4b c2 36 85 17 9e b7 c9  |-------.K.6.W...|-00000c50:  17 72 f1 bc 0d cf 6d 75  ca e7 ba 61 ab 13 cf 6e  |Wr..M.mu...a.S.n|-00000c60:  f1 cb 67 2b b0 c5 8f df  2a 3c a3 f0 b4 c2 53 4f  |..g+....*<....SO|-00000c70:  a6 cb a7 0a -- -- -- --  -- -- -- -- -- -- -- --  |...J------------|-Hello.pdf:66:-00000c70:  -- -- -- -- f1 e4 13 0e  f9 64 3a 9e 70 e0 37 f1  |----..SN.d:.p.7.|-00000c80:  d8 ac f0 38 3b 79 5c 61  53 22 36 6e e8 29 37 2a  |...8;y\aS"6n.)7*|-00000c90:  6c e8 89 c7 d8 ff 63 b5  a8 5d 5f 27 6b 15 d6 f3  |l.....c..]_'kU..|-00000ca0:  b3 b5 be 0e eb 2b f5 75  6b 7c 72 dd 34 ac 0b e8  |...N.+.uk|r.4.K.|-00000cb0:  8f 2a fc 5a 61 2d cb 6b  eb b0 c6 87 1a 2e 46 cd  |.*.Za-.k....Z.F.|-00000cc0:  50 3c c2 d9 3e e2 c2 ea  04 54 33 50 5d 88 55 5c  |P<..>...DT3P].U\|-00000cd0:  b4 55 3e 54 39 b1 52 e1  61 85 87 14 1e 5c e1 94  |.U>T9.R.a..T^\..|-00000ce0:  0f 2a ac 70 e2 57 0a --  -- -- -- -- -- -- -- --  |O*.p.WJ---------|-Hello.pdf:67:-00000ce0:  -- -- -- -- -- -- -- cb  15 1e 70 0e 93 0f 4c c2  |-------.U^pN.OL.|-00000cf0:  2f 15 2a ef c5 b2 a5 15  72 99 c2 d2 0a -- -- --  |/U*....Ur...J---|-Hello.pdf:68:-00000cf0:  -- -- -- -- -- -- -- --  -- -- -- -- -- 54 74 c4  |-------------Tt.|-00000d00:  fd 0a -- -- -- -- -- --  -- -- -- -- -- -- -- --  |.J--------------|-Hello.pdf:69:-00000d00:  -- -- e5 36 fc 42 61 89  c2 3d 0a -- -- -- -- --  |--.6.Ba..=J-----|-Hello.pdf:70:-00000d00:  -- -- -- -- -- -- -- --  -- -- -- 8b cb ac 72 b1  |-----------...r.|-00000d10:  1d 8b 23 82 02 47 f5 32  2b ca 1a f4 45 49 58 14  |].#.BG.2+.Z.EIXT|-00000d20:  d0 17 2a dc ad b0 40 a1  74 fe 24 59 5a 8b f9 25  |.W*...@.t.$YZ..%|-00000d30:  dd e4 fc 49 28 e9 86 79  0a -- -- -- -- -- -- --  |...I(..yJ-------|-Hello.pdf:71:-00000d30:  -- -- -- -- -- -- -- --  -- 77 e5 e2 4e 85 b9 b9  |---------w..N...|-00000d40:  28 6e c5 9c 3a cc 56 28  52 28 54 98 35 b3 a3 9c  |(n..:.V(R(T.5...|-00000d50:  a5 30 93 1c 72 66 47 cc  50 98 ae 70 87 c2 ed 53  |.0.\rfG.P..p...S|-00000d60:  12 e4 ed 36 4c 2b c4 6d  fb 30 95 85 a9 2e 4c 49  |R..6L+.m.0....LI|-00000d70:  00 3f d1 41 17 6e 55 f8  b9 c2 2d 19 e9 f2 96 5c  |@?.AWnU...-Y...\|-00000d80:  4c 56 98 a4 30 51 61 42  05 c6 2b dc ec c2 38 85  |LV..0QaBE.+...8.|-00000d90:  b1 c2 2f c7 2a dc 54 87  31 dd 70 e3 e8 34 79 63  |../.*.T.1.p..4yc|-00000da0:  7f 8c 1e 9e 24 47 a7 61  54 41 9a 1c a5 30 92 a5  |~.^.$G.aTA.\.0..|-00000db0:  91 85 18 c1 d2 88 3a 14  a4 21 9f 81 fc fe 18 3e  |..X...:T.!....X>|-00000dc0:  cc 29 87 27 61 78 44 0b  04 e2 f4 61 43 ed 72 98  |.).'axDKD..aC.r.|-00000dd0:  13 c3 22 1a b1 34 34 60  93 43 ed 18 1a 11 0d 2c  |S."Z.44`.C.XZQM,|-00000de0:  05 86 58 65 c0 86 40 44  54 b2 34 c4 1a 27 87 58  |E.Xe..@DT.4.Z'.X|-00000df0:  31 24 22 02 81 42 fd 67  0a -- -- -- -- -- -- --  |1$"B.B.gJ-------|-Hello.pdf:72:-00000df0:  -- -- -- -- -- -- -- --  -- 83 39 84 c1 ad b8 41  |---------.9....A|-00000e00:  e1 fa 6e 18 a4 30 90 0b  3c b0 10 03 7a b7 97 03  |..nX.0.K<.PCz..C|-00000e10:  c6 a0 bf 42 3f bf 4b f6  53 e8 3b 06 7d 7a b5 97  |...B?.K.S.;F}z..|-00000e20:  7d c6 20 8f 87 3c 85 5c  56 cc 55 e8 cd d3 bd db  |}. ..<.\V.U.....|-00000e30:  a3 57 7b e4 30 97 93 86  9e 71 a9 b2 67 1d fc d9  |.W{.0....q..g]..|-00000e40:  c9 d2 ef 82 3f a2 19 6e  b3 1d 4e 99 9d 8c 6c 23  |....?.Yn.]N...l#|-00000e50:  dc 5a 3d ab 87 4f 66 29  f4 60 cd 1e 3e 74 d7 06  |.Z=..Of).`.^>t.F|-00000e60:  c9 ee 0a -- -- -- -- --  -- -- -- -- -- -- -- --  |..J-------------|-Hello.pdf:73:-00000e60:  -- -- -- dd 14 ba 2a 74  b1 c3 97 3a 4c fa 0a --  |---.T.*t...:L.J-|-Hello.pdf:74:-00000e60:  -- -- -- -- -- -- -- --  -- -- -- -- -- -- -- 70  |---------------p|-00000e70:  9d 1d 5e 85 ce 76 bb ec  ac e0 71 fb a5 a7 02 6e  |.]^..v....q...Bn|-00000e80:  3f 3a 8d 41 47 f6 dc 51  a1 83 42 26 d7 36 53 21  |?:.AG..Q..B&.6S!|-00000e90:  83 ef 4a 46 3a da 2b a4  2b a4 29 b4 63 0b ed 46  |..JF:.+.+.).cK.F|-00000ea0:  20 35 c5 2f 53 87 21 c5  e5 90 29 7e b8 1c 48 66  | 5./S.!...)~.\Hf|-00000eb0:  bd 64 17 92 78 7d 92 82  93 33 77 0e 83 83 3d 38  |.dW.x}...3wN..=8|-00000ec0:  9c 70 44 6b 67 b7 59 a5  dd 0e 7b b4 76 b6 c4 78  |.pDkg.Y..N{.v..x|-00000ed0:  69 b3 c2 16 ad 5d 22 d7  2e 31 1e 89 5c bb 1d ba  |i..V.]"..1^.\.].|-00000ee0:  35 0e 56 e3 d9 ea af 27  28 c4 73 26 f1 0a -- --  |5NV....'(.s&.J--|-Hello.pdf:75:-00000ee0:  -- -- -- -- -- -- -- --  -- -- -- -- -- -- 71 a9  |--------------q.|-00000ef0:  88 75 20 46 c1 c2 a6 2d  0a -- -- -- -- -- -- --  |.u F...-J-------|-Hello.pdf:76:-00000ef0:  -- -- -- -- -- -- -- --  -- d2 05 70 72 68 85 c6  |---------.Eprh..|-00000f00:  80 36 08 82 03 10 7e 90  03 22 22 0a -- -- -- --  |.6H.CP~.C""J----|-Hello.pdf:77:-00000f00:  -- -- -- -- -- -- -- --  -- -- -- -- 57 ac 16 59  |------------W.VY|-00000f10:  ff 3f 8d fe c7 53 e1 4f  67 84 1a cd be 4d ac e5  |.?...S.Og.Z..M..|-00000f20:  d1 d8 47 44 e8 21 6d 19  7f a5 bf bf 22 b4 87 75  |..GD.!mY~..."..u|-00000f30:  34 53 2f 22 1a c5 4a b1  93 f9 ad bc b7 68 a4 e5  |4S/"Z.J......h..|-00000f40:  74 5e c4 e3 6d d1 9f b9  7a 5e 1b d4 3d 8c d6 d0  |t^..m...z^[.=...|-00000f50:  66 73 75 0d 4e d3 62 ec  a2 43 f4 0e 1d 63 ee b4  |fsuMN.b..C.N]c..|-00000f60:  18 08 5e 2b 0e 91 47 9c  60 3f 2b 7f f0 a1 a1 9e  |XH^+N.G.`?+~....|-00000f70:  a5 3d 4c cb 51 8f a0 e8  24 4a 68 8b 78 89 2d 96  |.=L.Q...$Jh.x.-.|-00000f80:  53 44 94 d2 32 8d 47 6d  22 5b de af 1f 64 74 3f  |SD..2.Gm"[.._dt?|-00000f90:  3d c4 d7 a3 b4 85 4a 99  37 32 58 ce f1 7f 4c 3b  |=.....J.72X..~L;|-00000fa0:  68 15 5d a0 0d da 19 9a  c2 fc 4e da cb f1 28 fe  |hU].M.Y...N...(.|-00000fb0:  fc 9a b9 88 26 6a 61 4b  db b4 c1 da 6c d6 db cb  |....&jaK....l...|-00000fc0:  d6 36 d1 26 b1 9c 9a 68  91 4e fc 29 57 74 4a 36  |.6.&...h.N.)WtJ6|-00000fd0:  69 59 6c 75 07 67 40 34  93 36 cb 26 b9 c1 a8 07  |iYluGg@4.6.&...G|-00000fe0:  8f 4d f2 1c cf 10 75 b0  44 2c ae 18 2f 67 61 d4  |.M.\.Pu.D,.X/ga.|-00000ff0:  6e ab d8 25 7a 6b e3 e8  10 af 2f a7 c9 b8 0d 77  |n..%zk..P./...Mw|-00001000:  e3 98 58 a1 7b f5 25 38  43 35 1a 61 3a dd 49 07  |..X.{.%8C5Za:.IG|-00001010:  64 93 c5 45 35 31 5e aa  b1 cc 16 f7 e9 d3 cd ab  |d..E51^...V.....|-00001020:  9c ad 95 6b 4b f4 e9 62  1b 9d 61 9b 33 f1 1d cb  |...kK..b[.a.3.].|-00001030:  1e 8e 6c b3 99 31 d1 0e  6d a2 1c 27 c7 71 ce b3  |^.l..1.Nm.\'.q..|-00001040:  19 db 6c d2 9a 28 b5 38  68 3f 5a b9 ee 6b 35 25  |Y.l..(.8h?Z..k5%|-00001050:  46 e9 23 30 84 f3 29 d7  6f a2 0d f4 0c db ed ca  |F.#0..).o.M.L...|-00001060:  95 21 2a 45 5f f6 5e 4a  e5 72 75 f4 a2 6d 7c f9  |.!*E_.^J.ru..m|.|-00001070:  e5 6a d4 72 45 cd 6a 88  3c 6d 30 6d d6 66 8b 55  |.j.rE.j.<m0m.f.U|-00001080:  1c 6d 0b 57 b3 14 f9 d4  9f 7d 74 90 67 69 85 d8  |\mKW.T...}t.gi..|-00001090:  c1 71 53 4c 05 2d 92 4d  bc 55 24 ea 41 f4 5a 8c  |.qSLE-.M.U$.A.Z.|-000010a0:  45 ea fc f7 a6 6c b7 23  ac f9 46 17 86 03 13 82  |E....l.#..FW.CS.|-000010b0:  ee 7d 21 8f 3f fb 27 a2  db 11 e3 0e d3 f8 70 e2  |.}!.?.'..Q.N..p.|-000010c0:  7d ee c8 b5 6b e3 83 7a  86 0c 85 65 66 18 be d8  |}...k..z.L.efX..|-000010d0:  b0 ee f3 9e fa 4f 93 a7  fc d9 63 c6 07 dd 11 d1  |.....O....c.G.Q.|-000010e0:  ae 20 bf cd 6c c1 f4 7c  06 27 05 d9 03 ff 0c 98  |. ..l..|F'E.C.L.|-000010f0:  dd 15 30 16 05 46 87 a5  8f 7f a3 a7 87 dd b3 8a  |.U0VEF...~......|-00001100:  dd 55 8e 2a ef a0 2a 47  d1 20 3f ef ff b2 c7 30  |.U.*..*G. ?....0|-00001110:  19 1f 7c 59 88 47 42 11  71 6d 45 84 f2 3b bc ce  |Y_|Y.GBQqmE..;..|-00001120:  bb 48 dc 71 3b 4f c7 65  bb dd 05 73 f3 c3 62 3a  |.H.q;O.e..Es..b:|-00001130:  0b f1 d9 0c f4 f0 30 97  90 ed 1e c1 61 8e 98 18  |K..L..0...^.a..X|-00001140:  f4 86 dc 55 ee aa d1 85  55 ee 11 ee e2 19 85 1c  |...U....U.Q..Y.\|-00001150:  b7 39 f2 44 51 55 28 87  33 98 14 9c cb 74 72 d0  |.9.DQU(.3.T..tr.|-00001160:  13 0e 84 32 7e 60 8b 42  21 c3 bb d5 b0 c3 4b 58  |SN.2~`.B!.....KX|-00001170:  bd 2a c4 16 ee 6c b3 c0  a3 09 e5 5c 65 a5 c4 ec  |.*.V.l...I.\e...|-00001180:  31 ee 30 ba 8c 0f 4e 08  86 2b f3 33 c2 81 fc 50  |1.0..ONH.+.3...P|-00001190:  86 c7 e3 2e 08 37 8c 0f  86 1b f2 33 3c a1 10 6b  |....H7.O.[.3<.Pk|-000011a0:  d9 7e 88 94 23 ae 98 9b  d6 16 b3 9d 63 b6 f5 e0  |.~..#....V..c...|-000011b0:  79 47 d4 0a -- -- -- --  -- -- -- -- -- -- -- --  |yG.J------------|-Hello.pdf:78:-000011b0:  -- -- -- -- 97 28 90 11  a6 50 55 95 61 73 52 d0  |----.(.Q.PU.asR.|-000011c0:  eb 09 57 56 55 65 54 71  1e 6d 72 84 1a 7e 02 08  |.IWVUeTq^mr.Z~BH|-000011d0:  fa 29 10 68 03 22 64 d8  e0 4a 14 f0 f7 60 3c 1b  |.)PhC"d..JT..`<[|-000011e0:  e3 c1 eb c9 30 00 af c7  eb e1 38 43 f9 ec db 69  |....0@....8C...i|-000011f0:  dc 9a 02 8e d4 13 f2 f3  6e 9c 8a b9 af e4 5e ce  |..B..S..n.....^.|-00001200:  fd 9c c1 f3 b3 18 dd e7  f3 f9 82 cf 00 53 58 1e  |.....X......@SX^|-00001210:  45 dd fe 6d bf ce f0 7f  d9 b4 1f e9 c1 94 74 93  |E..m...~.._...t.|-00001220:  76 e1 67 77 3b 9d 14 99  fc af 2f 56 b5 7a b1 dc  |v.gw;.T.../V.z..|-00001230:  c2 a7 aa 18 ea b4 cb dc  f3 13 59 84 eb 55 11 2b  |...X.....SY..UQ+|-00001240:  97 6b 3a e5 bc 75 b8 b9  37 39 0e 37 1f 6e ee 95  |.k:..u..79N7_n..|-00001250:  ec f4 38 7d 1e a7 a7 58  a7 2b 8b 90 71 e5 0b 55  |..8}^..X.+..q.KU|-00001260:  1b 63 fb ee fc 42 4b 77  c3 ac 30 72 d0 47 f1 bf  |[c...BKw..0r.G..|-00001270:  20 81 6e 36 4e 15 7c 6f  73 f8 d6 71 b7 3a f8 58  | .n6NU|os..q.:.X|-00001280:  f4 1e 77 e6 c5 71 c6 58  96 3c ea dc 63 18 17 2c  |.^w..q.X.<..cXW,|-00001290:  c7 bd c7 6f 0b 43 41 e7  6e e1 1e 9f b3 93 a3 8a  |...oKCA.n.^.....|-000012a0:  a5 84 ac 5e bd 93 f3 d8  75 9e d3 cb d4 bb b2 51  |...^....u......Q|-000012b0:  eb de d8 78 f5 83 46 d9  74 f5 2d ed 86 d6 2c ed  |...x..F.t.-...,.|-000012c0:  9b ab 4e f6 af 51 f9 b5  cf f8 ad 51 4e 29 94 49  |..N..Q.....QN).I|-000012d0:  79 46 04 3b 19 74 b0 81  08 69 ec 21 93 3d 65 e6  |yFD;Yt..Hi.!.=e.|-000012e0:  f0 3b cf 42 89 0c ee a4  64 4a 37 47 a3 0e 86 17  |.;.B.L..dJ7G.N.W|-000012f0:  91 e2 49 b1 a4 e6 e5 f6  eb 9f 62 13 5e 37 39 1d  |..I.......bS^79]|-00001300:  94 97 9b 14 d3 53 78 3b  5b 62 f4 e9 57 3e 8b 7d  |...T.Sx;[b..W>.}|-00001310:  e3 a5 60 43 c9 dc 3d 53  d5 65 75 54 b8 cf 1d b9  |..`C..=S.euT..].|-00001320:  14 b6 ae 7d 78 c5 8b b1  5a f5 14 cb 17 fb 06 0c  |T..}x...Z.T.W.FL|-00001330:  7c 2d 2b 4b 0c 14 c9 c2  2a 02 ea 93 c7 ca 5e 08  ||-+KLT..*B....^H|-00001340:  cf 37 ea 72 8e eb 32 c5  d2 9e bd 76 8d 46 95 c8  |.7.r..2....v.F..|-00001350:  b7 d8 88 ca a8 43 dc 71  8e 48 e7 53 9e 11 51 22  |.....C.q.H.S.QQ"|-00001360:  c5 47 23 71 a5 5e 2f 52  bc 9d bb f4 75 7a fa 7a  |.G#q.^/R....uz.z|-00001370:  b4 03 53 43 1f 9c 79 f6  15 f5 91 38 21 d6 df bf  |.CSC_.y.U..8!...|-00001380:  f4 f1 43 6f e2 e2 1a a3  e6 1a ad e4 9c 47 71 ce  |..Co..Z..Z...Gq.|-00001390:  09 d4 8e bc 81 64 4b 75  12 55 5b eb 93 36 a6 c5  |I....dKuRU[..6..|-000013a0:  25 d9 f3 91 94 f2 b3 34  c7 85 e6 2b c6 2d fc fc  |%......4...+.-..|-000013b0:  42 b3 e3 6c 2f d1 d9 92  e2 32 72 ec db a7 4b d7  |B..l/....2r...K.|-000013c0:  dc 24 a7 43 f3 76 d6 9c  8e 24 ad b8 7a cd 9a ea  |.$.C.v...$..z...|-000013d0:  d5 6b d6 ac 3e 73 a9 e5  ab 33 2d 2d 38 71 f4 48  |.k..>s...3--8q.H|-000013e0:  d3 b1 63 4d 47 8e 6e 56  ef ab 4f d5 29 75 48 f8  |..cMG.nV..O.)uH.|-000013f0:  f9 b3 d3 51 f4 34 fc 9a  ed da 52 f3 39 35 4e a7  |...Q.4....R.95N.|-00001400:  3f 6e 92 c5 2c 7e 7e 6f  a6 89 cc 09 3e 3a 46 75  |?n..,~~o...I>:Fu|-00001410:  2c c6 0b 72 e4 84 c9 63  a7 8c c8 1a 5b 34 7f 5e  |,.Kr...c...Z[4~^|-00001420:  a9 7f 62 d1 9c c5 f3 66  2c 24 fa 17 20 2d 06 e4  |.~b....f,$.W -F.|-00001430:  0a -- -- -- -- -- -- --  -- -- -- -- -- -- -- --  |J---------------|-Hello.pdf:79:endstream-Hello.pdf:80:endobj-Hello.pdf:81:14 0 obj-Hello.pdf:82:2734-Hello.pdf:83:endobj-Hello.pdf:84:15 0 obj-Hello.pdf:85:(Hello)-Hello.pdf:86:endobj-Hello.pdf:87:16 0 obj-Hello.pdf:88:(Mac OS X 10.12.6 Quartz PDFContext)-Hello.pdf:89:endobj-Hello.pdf:90:17 0 obj-Hello.pdf:91:(TextEdit)-Hello.pdf:92:endobj-Hello.pdf:93:18 0 obj-Hello.pdf:94:(D:20200124010711Z00'00')-Hello.pdf:95:endobj-Hello.pdf:96:19 0 obj-Hello.pdf:97:()-Hello.pdf:98:endobj-Hello.pdf:99:20 0 obj-Hello.pdf:100:[ ]-Hello.pdf:101:endobj-Hello.pdf:102:1 0 obj-Hello.pdf:103:<< /Title 15 0 R /Producer 16 0 R /Creator 17 0 R /CreationDate 18 0 R /ModDate-Hello.pdf:104:18 0 R /Keywords 19 0 R /AAPL:Keywords 20 0 R >>-Hello.pdf:105:endobj-Hello.pdf:106:xref-Hello.pdf:107:0 21-Hello.pdf:108:0000000000 65535 f -Hello.pdf:109:0000005392 00000 n -Hello.pdf:110:0000000238 00000 n -Hello.pdf:111:0000001714 00000 n -Hello.pdf:112:0000000022 00000 n -Hello.pdf:113:0000000219 00000 n -Hello.pdf:114:0000000342 00000 n -Hello.pdf:115:0000001679 00000 n -Hello.pdf:116:0000001847 00000 n -Hello.pdf:117:0000000439 00000 n -Hello.pdf:118:0000001658 00000 n -Hello.pdf:119:0000001797 00000 n -Hello.pdf:120:0000002110 00000 n -Hello.pdf:121:0000002362 00000 n -Hello.pdf:122:0000005186 00000 n -Hello.pdf:123:0000005207 00000 n -Hello.pdf:124:0000005231 00000 n -Hello.pdf:125:0000005284 00000 n -Hello.pdf:126:0000005311 00000 n -Hello.pdf:127:0000005353 00000 n -Hello.pdf:128:0000005372 00000 n -Hello.pdf:129:trailer-Hello.pdf:130:<< /Size 21 /Root 11 0 R /Info 1 0 R /ID [ <8db88d3335070bd9583341583cf769a3>-Hello.pdf:131:<8db88d3335070bd9583341583cf769a3> ] >>-Hello.pdf:132:startxref-Hello.pdf:133:5536-Hello.pdf:134:%%EOF-Hello.sh:1:#!/bin/sh-Hello.sh:2:echo "Hello World!"-Hello.txt:1:Hello\ No newline at end of file

tests/out/Hello_-W-nC2.out

new file mode 100644@@ -0,0 +1,466 @@+Hello.bat:1:#!/bin/sh+Hello.bat:2:echo "Hello World!"+Hello.class:1:+00000000  ca fe ba be 00 00 00 34  00 1d 0a -- -- -- -- --  |....@@@4@]J-----|+Hello.class:2:+00000000  -- -- -- -- -- -- -- --  -- -- -- 00 06 00 0f 09  |-----------@F@OI|+00000010  00 10 00 11 08 00 12 0a  -- -- -- -- -- -- -- --  |@P@QH@RJ--------|+Hello.class:3:+00000010  -- -- -- -- -- -- -- --  00 13 00 14 07 00 15 07  |--------@S@TG@UG|+00000020  00 16 01 00 06 3c 69 6e  69 74 3e 01 00 03 28 29  |@VA@F<init>A@C()|+00000030  56 01 00 04 43 6f 64 65  01 00 0f 4c 69 6e 65 4e  |VA@DCodeA@OLineN|+00000040  75 6d 62 65 72 54 61 62  6c 65 01 00 04 6d 61 69  |umberTableA@Dmai|+00000050  6e 01 00 16 28 5b 4c 6a  61 76 61 2f 6c 61 6e 67  |nA@V([Ljava/lang|+00000060  2f 53 74 72 69 6e 67 3b  29 56 01 00 0a -- -- --  |/String;)VA@J---|+Hello.class:4:+00000060  -- -- -- -- -- -- -- --  -- -- -- -- -- 53 6f 75  |-------------Sou|+00000070  72 63 65 46 69 6c 65 01  00 0a -- -- -- -- -- --  |rceFileA@J------|+Hello.class:5:+00000070  -- -- -- -- -- -- -- --  -- -- 48 65 6c 6c 6f 2e  |----------Hello.|+00000080  6a 61 76 61 0c 00 07 00  08 07 00 17 0c 00 18 00  |javaL@G@HG@WL@X@|+00000090  19 01 00 0c 48 65 6c 6c  6f 20 57 6f 72 6c 64 21  |YA@LHello World!|+000000a0  07 00 1a 0c 00 1b 00 1c  01 00 05 48 65 6c 6c 6f  |G@ZL@[@\A@EHello|+000000b0  01 00 10 6a 61 76 61 2f  6c 61 6e 67 2f 4f 62 6a  |A@Pjava/lang/Obj|+000000c0  65 63 74 01 00 10 6a 61  76 61 2f 6c 61 6e 67 2f  |ectA@Pjava/lang/|+000000d0  53 79 73 74 65 6d 01 00  03 6f 75 74 01 00 15 4c  |SystemA@CoutA@UL|+000000e0  6a 61 76 61 2f 69 6f 2f  50 72 69 6e 74 53 74 72  |java/io/PrintStr|+000000f0  65 61 6d 3b 01 00 13 6a  61 76 61 2f 69 6f 2f 50  |eam;A@Sjava/io/P|+00000100  72 69 6e 74 53 74 72 65  61 6d 01 00 07 70 72 69  |rintStreamA@Gpri|+00000110  6e 74 6c 6e 01 00 15 28  4c 6a 61 76 61 2f 6c 61  |ntlnA@U(Ljava/la|+00000120  6e 67 2f 53 74 72 69 6e  67 3b 29 56 00 21 00 05  |ng/String;)V@!@E|+00000130  00 06 00 00 00 00 00 02  00 01 00 07 00 08 00 01  |@F@@@@@B@A@G@H@A|+00000140  00 09 00 00 00 1d 00 01  00 01 00 00 00 05 2a b7  |@I@@@]@A@A@@@E*.|+00000150  00 01 b1 00 00 00 01 00  0a -- -- -- -- -- -- --  |@A.@@@A@J-------|+Hello.class:6:+00000150  -- -- -- -- -- -- -- --  -- 00 00 00 06 00 01 00  |---------@@@F@A@|+00000160  00 00 02 00 09 00 0b 00  0c 00 01 00 09 00 00 00  |@@B@I@K@L@A@I@@@|+00000170  25 00 02 00 01 00 00 00  09 b2 00 02 12 03 b6 00  |%@B@A@@@I.@BRC.@|+00000180  04 b1 00 00 00 01 00 0a  -- -- -- -- -- -- -- --  |D.@@@A@J--------|+Hello.class:7:+00000180  -- -- -- -- -- -- -- --  00 00 00 0a -- -- -- --  |--------@@@J----|+Hello.class:8:+00000180  -- -- -- -- -- -- -- --  -- -- -- -- 00 02 00 00  |------------@B@@|+00000190  00 04 00 08 00 05 00 01  00 0d 00 00 00 02 00 0e  |@D@H@E@A@M@@@B@N|+Hello.java:1:import java.lang.*;+Hello.java:2:+Hello.java:3:public class Hello // prints a Hello World! greeting+Hello.java:4:{ public static void main(String[] arg)+Hello.java:5:  { System.out.println("Hello World!");+Hello.java:6:  }+Hello.java:7:}+Hello.pdf:1:%PDF-1.3+Hello.pdf:2:+00000000  -- -- -- -- -- -- -- --  -- 25 c4 e5 f2 e5 eb a7  |---------%......|+00000010  f3 a0 d0 c4 c6 0a -- --  -- -- -- -- -- -- -- --  |.....J----------|+Hello.pdf:3:4 0 obj+Hello.pdf:4:<< /Length 5 0 R /Filter /FlateDecode >>+Hello.pdf:5:stream+Hello.pdf:6:+00000040  -- -- -- -- -- -- -- --  -- -- -- -- -- -- 78 01  |--------------xA|+00000050  45 8e bb 0a -- -- -- --  -- -- -- -- -- -- -- --  |E..J------------|+Hello.pdf:7:+00000050  -- -- -- -- 02 31 14 44  7b bf e2 94 5a 98 bd 89  |----B1TD{...Z...|+00000060  79 98 56 11 6c 17 2e f8  01 61 2d 64 d7 65 cd ff  |y.VQlW..Aa-d.e..|+00000070  83 17 2c ac 86 99 39 0c  b3 31 b2 51 02 b9 46 97  |.W,...9L.1.QB.F.|+00000080  e2 a9 12 f3 99 90 5c 4c  59 0a -- -- -- -- -- --  |..R...\LYJ------|+Hello.pdf:8:+00000080  -- -- -- -- -- -- -- --  -- -- 9f 89 07 6f 86 6b  |----------..Go.k|+00000090  f7 b4 8e d0 9b e1 e2 6a  a9 52 6a b2 40 38 fe ad  |.......j.Rj.@8..|+000000a0  ed 94 20 bb b6 70 51 a3  44 c4 a3 0d ef 7f a0 69  |.. ..pQ.D..M.~.i|+000000b0  c2 0b ba 30 a8 7a ac 7c  b2 bf 4f f3 bc 1e d0 17  |.K.0.z.|..O..^.W|+000000c0  37 b5 37 e3 17 4e ff 20  a5 0a -- -- -- -- -- --  |7.7.WN. .J------|+Hello.pdf:9:endstream+Hello.pdf:10:endobj+Hello.pdf:11:5 0 obj+Hello.pdf:12:123+Hello.pdf:13:endobj+Hello.pdf:14:2 0 obj+Hello.pdf:15:<< /Type /Page /Parent 3 0 R /Resources 6 0 R /Contents 4 0 R /MediaBox [0 0 612 792]+Hello.pdf:16:>>+Hello.pdf:17:endobj+Hello.pdf:18:6 0 obj+Hello.pdf:19:<< /ProcSet [ /PDF /Text ] /ColorSpace << /Cs1 7 0 R >> /Font << /TT1 8 0 R+Hello.pdf:20:>> >>+Hello.pdf:21:endobj+Hello.pdf:22:9 0 obj+Hello.pdf:23:<< /Length 10 0 R /N 1 /Alternate /DeviceGray /Filter /FlateDecode >>+Hello.pdf:24:stream+Hello.pdf:25:+00000200  -- -- -- -- -- -- -- --  -- -- -- -- 78 01 85 55  |------------xA.U|+00000210  5d 68 1c 55 14 3e bb 73  67 03 12 07 1f b4 0d 2d  |]h\UT>.sgCRG_.M-|+00000220  b4 83 3f 6d 09 e9 32 89  56 13 8b b5 db 4d ba 49  |..?mI.2.VS...M.I|+00000230  13 b7 eb 66 53 9b 2a ca  74 76 36 3b cd 64 66 9c  |S..fS.*.tv6;.df.|+00000240  99 dd 26 a1 4f a5 e0 9b  16 04 e9 ab a0 3e c6 82  |..&.O...VD...>..|+00000250  08 b6 2a 36 2f f6 a5 a5  c5 92 4a 35 0f 0a -- --  |H.*6/.....J5OJ--|+Hello.pdf:26:+00000250  -- -- -- -- -- -- -- --  -- -- -- -- -- -- 11 5a  |--------------QZ|+00000260  8c 20 28 7d 52 f0 3b 33  db 64 76 41 32 c3 9d f9  |. (}R.;3.dvA2...|+00000270  ee b9 e7 9e 7b ce 77 ee  b9 97 a8 eb 6f dd f3 ec  |....{.w.....o...|+00000280  b4 4a 34 e7 84 7e a1 9c  9b 3e 39 7d 4a ed ba 4d  |.J4..~...>9}J..M|+00000290  69 52 a8 9b f0 e8 46 e0  e5 4a a5 09 c6 8e eb 98  |iR....F..J.I....|+000002a0  fc 6f 7f 1e de a5 14 4b  ee ec 67 5b ed 63 5b f6  |.o~^..TK..g[.c[.|+000002b0  e4 aa 19 18 d0 ba 86 e6  56 03 63 8e 28 a5 11 65  |..YX....VCc.(.Qe|+000002c0  6a 86 e7 87 44 5d 97 20  1f 3c 1b 7a 8c 6f 03 3f  |j...D]. _<[z.oC?|+000002d0  39 5b 29 e7 81 d7 80 95  d6 5c 40 7a aa 60 3a a6  |9[)......\@z.`:.|+000002e0  6f 19 6a c1 d7 17 d4 92  ef d6 2c 3b e9 eb 56 e3  |oYj..W....,;..V.|+000002f0  6c 63 cb 67 ce 6e b0 af  fc ec 46 eb 0e 66 27 c7  |lc.g.n....F.Nf'.|+00000300  f1 ef 85 cf 17 4c 67 6a  12 78 1f f0 92 a1 8f 30  |....WLgjRx_....0|+00000310  ee 03 be db b4 4e 14 63  9c 4e 7b e1 91 72 ac 9f  |.C...NTc.N{..r..|+00000320  ce 36 66 a7 72 2d f9 c9  9a 7f 74 aa 25 bf 50 6f  |.6f.r-...~t.%.Po|+00000330  8c 32 ce 12 a5 97 16 eb  95 37 80 9f 00 5e 75 4e  |.2.R..V..7..@^uN|+00000340  17 8f b7 f4 d7 67 dd 71  b6 d3 43 24 f5 18 41 fe  |W....g.q..C$.XA.|+00000350  14 f0 b3 c0 5a dd 1c e3  3c a9 c0 15 df 2d b3 3e  |T...Z.\.<..U.-.>|+00000360  cb c3 aa 39 3c 02 fc 32  f0 25 2b 1c ab 00 c3 be  |...9<B.2.%+\.@..|+00000370  f4 43 d0 9c 64 39 b0 a0  c5 7a 9e fd c4 5a 22 7b  |.C..d9...z...Z"{|+00000380  46 3f 56 02 de 06 7c c8  b4 0b bc 16 ec 88 8a 17  |F?VB.F|..K.V...W|+00000390  96 d8 e6 20 f0 bc 63 17  79 2d c4 2e 2e 9b 41 14  |... ..cWy-....AT|+000003a0  2f 62 17 3f 85 f5 ca 68  ac 2f a7 43 bf c2 73 9f  |/bW?...h./.C..s.|+000003b0  26 92 f7 d4 ac a3 63 c0  e0 44 1e ad fb a3 2c 87  |&.....c..D^...,.|+000003c0  3f 72 e8 d9 d1 de 7a 11  78 c9 6f 94 39 f6 3d c0  |?r....zQx.o.9.=.|+000003d0  6b ba 3f 52 00 86 cd cc  63 55 7d 98 79 7e 01 78  |k.?R@...cU}.y~Ax|+000003e0  80 4e a4 74 32 c9 a5 d3  f8 1a e4 d0 bf 88 37 20  |.N.t2....Z....7 |+000003f0  8b 9a 11 f2 c8 c7 58 0d  7d 9b 0a -- -- -- -- --  |..Q...XM}.J-----|+Hello.pdf:27:+000003f0  -- -- -- -- -- -- -- --  -- -- -- d0 70 d0 7c f4  |-----------.p.|.|+00000400  0c 68 15 80 74 5a 00 2a  25 b4 4c f4 58 27 9e a3  |LhU.tZ@*%.L.X'..|+00000410  52 15 3d 95 66 a2 59 41  84 d8 ca fd a8 6f 50 7e  |RU=.f.YA.....oP~|+00000420  d7 a7 d4 80 b4 4e eb 90  d6 81 5e a3 5f 22 c9 3c  |.....N....^._".<|+00000430  fd 4a 73 e8 e7 21 6d 60  6c a6 c3 6e 1e 5e 38 b4  |.Js..!m`l..n^^8.|+00000440  08 0f d8 13 b6 f9 a0 65  d3 15 db 85 26 9e 47 3b  |HO.S...e.U..&.G;|+00000450  28 26 c4 2b 62 50 0c 91  2a 5e 15 87 c5 21 31 0c  |(&.+bPL.*^U..!1L|+00000460  e9 90 38 18 cd 89 bd 4f  fa ce 7e 3e d8 b0 f4 2e  |..8X...O..~>....|+00000470  d6 4d fa be 0c 0e 42 ac  67 c3 33 07 ac 70 34 01  |.M..LNB.g.3G.p4A|+00000480  3c f8 07 eb ce 46 9a 09  b6 2e ee 68 ec f3 bc 8f  |<.G..F.I...h....|+00000490  de 3f ef bf 63 19 b7 3e  f8 b3 8d bd 00 fa 31 27  |.?..cY.>....@.1'|+000004a0  bf c1 a2 0b 6b 26 25 e6  5e 3f f7 4d 4f c2 43 75  |...Kk&%.^?.MO.Cu|+000004b0  45 7c f5 d6 9d ee eb e7  e8 78 32 4b 51 de aa 9d  |E|.......x2KQ...|+000004c0  59 92 d7 e4 fb f2 0a --  -- -- -- -- -- -- -- --  |Y.....J---------|+Hello.pdf:28:+000004c0  -- -- -- -- -- -- -- be  f7 e4 d5 a4 0d f9 67 79  |-------.....M.gy|+000004d0  15 ef bd b6 5c 3d ca 0b  ff 93 b9 cd 21 46 3b 92  |U...\=.K....!F;.|+000004e0  cd 41 ce 3c 9b 51 b4 71  c6 1b c0 21 b8 a9 45 73  |.A.<.Q.q.[.!..Es|+000004f0  f6 b7 59 4c b2 e9 b6 62  b4 60 c9 42 94 9d ab b8  |..YL...b.`.B....|+00000500  ff cb 09 f3 c3 3c b7 b1  52 73 2e ee f0 bc b7 3f  |..I..<..Rs.....?|+00000510  63 36 cd f7 8a 0f 8b 74  be 4f bb ac ad 6b 9f 68  |c6...O.t.O...k.h|+00000520  3f 6a 7f 68 2b da c7 40  bf 4b 1f 4a 5f 4a df 4a  |?j~h+..@.K_J_J.J|+00000530  57 a4 ab d2 0d 52 a5 6b  d2 b2 f4 9d f4 bd f4 b9  |W...MR.k........|+00000540  f4 35 7a 5f 40 ba 2c 5d  e9 d8 49 71 ec 1b bb 07  |.5z_@.,]..Iq.[.G|+00000550  7e c6 7b d6 68 ed 30 66  86 b3 14 10 f3 c2 da cc  |~.{.h.0f..TP....|+00000560  0a -- -- -- -- -- -- --  -- -- -- -- -- -- -- --  |J---------------|+Hello.pdf:29:+00000560  -- 4b 1f f1 77 06 63 9b  f9 33 a1 d5 5e 03 9d bb  |-K_.wFc..3..^C..|+00000570  7f 63 2d e5 88 b2 53 79  46 19 56 76 2b cf 29 13  |~c-...SyFYVv+.)S|+00000580  4a af 72 40 39 ac 6c 57  06 d0 fa 95 51 65 2f 46  |J.r@9.lWF...Qe/F|+00000590  76 6e b0 64 63 3d ce 80  85 7f 92 67 8b a6 23 ae  |vn.dc=...~.g..#.|+000005a0  e2 3c b1 57 75 b0 e7 c3  4b 1d ef a6 5f 5c c3 d6  |.<.Wu...K].._\..|+000005b0  86 35 d8 49 3d 0e 9e d9  da a6 0e af 11 57 bf 15  |.5.I=N....N.QW.U|+000005c0  55 63 bc 3b 5d 9c 06 3a  4d 21 62 8b ce 22 72 1f  |Uc.;].F:M!b.."r_|+000005d0  3a 9c 1f 27 aa fe ce d9  5c 93 38 35 52 6f e2 94  |:._'....\.85Ro..|+000005e0  b0 c4 2e d1 2f c6 5a 35  98 13 07 50 85 e3 6d f5  |..../.Z5.SGP..m.|+000005f0  38 c8 55 9a 19 c9 0c 67  72 a4 66 7a 33 43 99 fe  |8.U.Y.Lgr.fz3C..|+00000600  cc 31 c6 51 ac d1 f9 92  d9 8b d1 21 7c 47 12 de  |.1.Q.......!|GR.|+00000610  33 cb 31 ff 9b 35 c4 67  18 ef 1d e6 a8 09 6c a3  |3.1..5.gX.]..Il.|+00000620  87 5b 2b 34 e7 71 df 11  e5 5d 6f c1 b7 66 ea a1  |.[+4.q.Q.]o..f..|+00000630  3a a0 69 2f a9 39 5c af  a6 3a e6 18 d9 3e 55 b7  |:.i/.9\..:.X.>U.|+00000640  6d 35 1a 0a -- -- -- --  -- -- -- -- -- -- -- --  |m5ZJ------------|+Hello.pdf:30:+00000640  -- -- -- -- 54 df 0c 4c  bf 69 56 b3 c4 77 37 cf  |----T.LL.iV..w7.|+00000650  23 fa eb f5 e8 4e 4e 6d  bb 61 34 fc 66 2c a3 54  |#....NNm.a4.f,.T|+00000660  ea 26 d1 7f b7 8f 93 34  0a -- -- -- -- -- -- --  |.&.~...4J-------|+Hello.pdf:31:endstream+Hello.pdf:32:endobj+Hello.pdf:33:10 0 obj+Hello.pdf:34:1116+Hello.pdf:35:endobj+Hello.pdf:36:7 0 obj+Hello.pdf:37:[ /ICCBased 9 0 R ]+Hello.pdf:38:endobj+Hello.pdf:39:3 0 obj+Hello.pdf:40:<< /Type /Pages /MediaBox [0 0 612 792] /Count 1 /Kids [ 2 0 R ] >>+Hello.pdf:41:endobj+Hello.pdf:42:11 0 obj+Hello.pdf:43:<< /Type /Catalog /Pages 3 0 R >>+Hello.pdf:44:endobj+Hello.pdf:45:8 0 obj+Hello.pdf:46:<< /Type /Font /Subtype /TrueType /BaseFont /GQTMZF+Menlo-Regular /FontDescriptor+Hello.pdf:47:12 0 R /Encoding /MacRomanEncoding /FirstChar 72 /LastChar 111 /Widths [ 602+Hello.pdf:48:0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 602 0 0 0 0 0 0 602+Hello.pdf:49:0 0 602 ] >>+Hello.pdf:50:endobj+Hello.pdf:51:12 0 obj+Hello.pdf:52:<< /Type /FontDescriptor /FontName /GQTMZF+Menlo-Regular /Flags 33 /FontBBox+Hello.pdf:53:[-558 -375 718 1041] /ItalicAngle 0 /Ascent 928 /Descent -236 /CapHeight 729+Hello.pdf:54:/StemV 99 /XHeight 547 /StemH 83 /AvgWidth 602 /MaxWidth 602 /FontFile2 13 0 R+Hello.pdf:55:>>+Hello.pdf:56:endobj+Hello.pdf:57:13 0 obj+Hello.pdf:58:<< /Length 14 0 R /Length1 4064 /Filter /FlateDecode >>+Hello.pdf:59:stream+Hello.pdf:60:+00000980  -- -- 78 01 dd 57 7b 78  54 c5 15 3f 73 7f 77 36  |--xA.W{xT.U?s~w6|+00000990  af cd 3e 92 4d 48 48 80  5d d6 e5 95 2c 81 84 b7  |..>.MHH.]...,...|+000009a0  52 16 48 78 88 20 2f eb  2e 88 f2 48 20 28 21 08  |RVHx. /....H (!H|+000009b0  41 b4 31 90 4a 51 09 c1  40 85 08 48 7d 15 51 a9  |A.1.JQI.@.HH}UQ.|+000009c0  b5 2b 45 5d 09 c4 54 a4  62 23 45 84 a0 02 0a --  |.+E]I.T.b#E..BJ-|+Hello.pdf:61:+000009c0  -- -- -- -- -- -- -- --  -- -- -- -- -- -- -- f8  |---------------.|+000009d0  a2 68 8a 14 21 d8 00 43  cf bd 1b fd 3e ed d7 ef  |.h.T!.@C..[.>...|+000009e0  eb bf ed dc 9d 33 e7 fc  e6 cc 79 dd bb f7 ce 94  |.....3....y.....|+000009f0  2d 5c 5c 44 56 aa 24 50  60 56 c9 8c 05 64 36 eb  |-\\DV.$P`V..Ed6.|+00000a00  49 1e 8a 67 dd 53 e6 36  45 8a bd 97 48 cb 9d bd  |I^.g.S.6E...H...|+00000a10  60 4e 49 54 8e 7f 91 e5  4e 73 e6 dd 37 3b 2a 27  |`NIT.~..Ns..7;*'|+00000a20  4e 66 79 40 71 d1 8c c2  a8 4c 57 78 ec 57 cc 40  |Nfy@q....LWx.W.@|+00000a30  54 16 7d 78 bc ae b8 a4  8c ed 18 cd fa 2e 13 d7  |TV}x......X...S.|+00000a40  bc d2 59 6d f3 89 a3 0c  b0 64 c6 bd 6d fe e9 38  |..Ym...L.d..m..8|+00000a50  cb ee f9 33 4a 8a 78 e4  66 8f 30 e9 b6 a0 74 51  |...3J.x.f.0...tQ|+00000a60  99 29 92 bd 9a c7 ec 05  0b 8b da f4 45 90 28 a6  |.).....EK...E.(.|+00000a70  53 74 ae 8d 1a 96 05 77  a9 59 29 8b ee 22 0b 69  |St..Z.Ew.Y).."Ki|+00000a80  e4 a0 8d 94 c4 d0 ad ac  2b 79 d6 98 d7 62 b2 96  |........+y...b..|+00000a90  3e 7d f6 8d 3b ec 37 5c  a4 4e b1 e6 e2 bd 65 e9  |>}..;.7\.N....e.|+00000aa0  79 06 73 28 b8 a4 df e5  95 57 85 ac 8f bd 85 c5  |yFs(.....W......|+00000ab0  e8 a4 31 c1 eb 62 4a 54  07 22 fd e0 e5 95 d7 92  |..1..bJTG"......|+00000ac0  65 bd 69 c9 98 f9 be c9  08 c5 66 bd ae 55 8a 94  |e.i.....H.f..U..|+00000ad0  ed eb a6 c9 a1 99 22 85  6a 09 4c 2b 49 17 2e 52  |......".jIL+IW.R|+00000ae0  cc 27 9b 34 89 03 82 70  9a bc c3 a4 76 da c4 88  |.'.4.C.p....v...|+00000af0  cd e4 13 b7 7f 3d 52 0e  f5 89 44 aa 60 cc 4a 3e  |..S.~=RN..D.`.J>|+00000b00  a6 09 94 cb 34 de b4 17  67 6a c5 92 8d 91 18 93  |.I..4..Wgj....X.|+00000b10  b7 98 3a d2 e4 75 13 87  89 68 26 22 02 21 05 a5  |..:..uS..h&"B!E.|+00000b20  70 b5 02 57 14 2e 2b b4  e6 e2 9f 75 f8 ae 02 97  |p.BWT.+....u..B.|+00000b30  5a aa e5 25 85 4b 0d 7a  cb c5 90 6c a9 46 4b a5  |Z..%.KMz...l.FK.|+00000b40  7e f1 42 17 79 31 84 8b  01 fd 42 17 7c 7b 3e 47  |~.BWy1..A.BW|{>G|+00000b50  7e db 8a f3 39 f8 87 c2  39 85 6f 72 71 d6 85 bf  |~...9...9.orq...|+00000b60  d7 a2 99 43 6c 56 68 8e  5c 3b 18 b8 a6 7f 3d 12  |...ClVh.\;X..~=R|+00000b70  5f 9d 29 94 5f d5 e2 4c  21 fe a6 70 fa cb 0c 79  |_.)._..L!..p..Ly|+00000b80  5a e1 cb 0c 7c a1 f0 f9  5d f8 4c e1 d3 3a 9c 3a  |Z..L|...].L..:.:|+00000b90  99 2e 4f b5 e2 64 3a 4e  d4 e2 13 85 8f 15 8e 1f  |..O..d:N..S..U._|+00000ba0  4b 91 c7 15 8e a5 e0 68  2d 3e fa 30 45 7e a4 f0  |K..U...h->.0E~..|+00000bb0  e1 ea 04 f9 61 0a -- --  -- -- -- -- -- -- -- --  |..D.aJ----------|+Hello.pdf:62:+00000bb0  -- -- -- -- -- -- 3e a8  c0 91 41 68 62 a1 69 10  |------>...Ahb.iP|+00000bc0  0e 2b 1c 7a 3f 5e 1e 52  78 3f 1e 07 15 de 53 38  |N+\z?^^Rx?^GU.S8|+00000bd0  50 e5 94 07 32 f1 d7 54  ec 57 78 b7 16 8d ab 7c  |P..G2..T.Wx.V..||+00000be0  b2 51 e1 2f 0a -- -- --  -- -- -- -- -- -- -- --  |.Q./J-----------|+Hello.pdf:63:+00000be0  -- -- -- -- -- ef 54 60  9f c2 db 0a -- -- -- --  |-----.T`...J----|+Hello.pdf:64:+00000be0  -- -- -- -- -- -- -- --  -- -- -- -- 7f 56 d8 bb  |------------~V..|+00000bf0  29 51 be a5 b0 47 e1 4d  85 3f 29 34 b0 bd 06 17  |)Q...G.M.?)4..FW|+00000c00  de b0 a2 7e 77 9d ac 57  d8 bd 6b 9a dc 5d 87 dd  |...~w..W..k..]..|+00000c10  95 fa ae 3a 9f dc 35 0d  bb 02 7a 9d 0f 3b 15 5e  |...:..5M.Bz.O;U^|+00000c20  af 45 a4 66 a8 7c 4d e1  55 1e 5e 6d c5 2b 6c 6b  |.E.f.|M.U^^m.+lk|+00000c30  87 c2 1f 0b b1 bd 10 2f  db 10 4e c2 1f 14 5e 52  |.._K..P/.PN._T^R|+00000c40  81 ab f8 bd c2 8b 0a --  -- -- -- -- -- -- -- --  |......J---------|+Hello.pdf:65:+00000c40  -- -- -- -- -- -- -- bf  4b c2 36 85 17 9e b7 c9  |-------.K.6.W...|+00000c50  17 72 f1 bc 0d cf 6d 75  ca e7 ba 61 ab 13 cf 6e  |Wr..M.mu...a.S.n|+00000c60  f1 cb 67 2b b0 c5 8f df  2a 3c a3 f0 b4 c2 53 4f  |..g+....*<....SO|+00000c70  a6 cb a7 0a -- -- -- --  -- -- -- -- -- -- -- --  |...J------------|+Hello.pdf:66:+00000c70  -- -- -- -- f1 e4 13 0e  f9 64 3a 9e 70 e0 37 f1  |----..SN.d:.p.7.|+00000c80  d8 ac f0 38 3b 79 5c 61  53 22 36 6e e8 29 37 2a  |...8;y\aS"6n.)7*|+00000c90  6c e8 89 c7 d8 ff 63 b5  a8 5d 5f 27 6b 15 d6 f3  |l.....c..]_'kU..|+00000ca0  b3 b5 be 0e eb 2b f5 75  6b 7c 72 dd 34 ac 0b e8  |...N.+.uk|r.4.K.|+00000cb0  8f 2a fc 5a 61 2d cb 6b  eb b0 c6 87 1a 2e 46 cd  |.*.Za-.k....Z.F.|+00000cc0  50 3c c2 d9 3e e2 c2 ea  04 54 33 50 5d 88 55 5c  |P<..>...DT3P].U\|+00000cd0  b4 55 3e 54 39 b1 52 e1  61 85 87 14 1e 5c e1 94  |.U>T9.R.a..T^\..|+00000ce0  0f 2a ac 70 e2 57 0a --  -- -- -- -- -- -- -- --  |O*.p.WJ---------|+Hello.pdf:67:+00000ce0  -- -- -- -- -- -- -- cb  15 1e 70 0e 93 0f 4c c2  |-------.U^pN.OL.|+00000cf0  2f 15 2a ef c5 b2 a5 15  72 99 c2 d2 0a -- -- --  |/U*....Ur...J---|+Hello.pdf:68:+00000cf0  -- -- -- -- -- -- -- --  -- -- -- -- -- 54 74 c4  |-------------Tt.|+00000d00  fd 0a -- -- -- -- -- --  -- -- -- -- -- -- -- --  |.J--------------|+Hello.pdf:69:+00000d00  -- -- e5 36 fc 42 61 89  c2 3d 0a -- -- -- -- --  |--.6.Ba..=J-----|+Hello.pdf:70:+00000d00  -- -- -- -- -- -- -- --  -- -- -- 8b cb ac 72 b1  |-----------...r.|+00000d10  1d 8b 23 82 02 47 f5 32  2b ca 1a f4 45 49 58 14  |].#.BG.2+.Z.EIXT|+00000d20  d0 17 2a dc ad b0 40 a1  74 fe 24 59 5a 8b f9 25  |.W*...@.t.$YZ..%|+00000d30  dd e4 fc 49 28 e9 86 79  0a -- -- -- -- -- -- --  |...I(..yJ-------|+Hello.pdf:71:+00000d30  -- -- -- -- -- -- -- --  -- 77 e5 e2 4e 85 b9 b9  |---------w..N...|+00000d40  28 6e c5 9c 3a cc 56 28  52 28 54 98 35 b3 a3 9c  |(n..:.V(R(T.5...|+00000d50  a5 30 93 1c 72 66 47 cc  50 98 ae 70 87 c2 ed 53  |.0.\rfG.P..p...S|+00000d60  12 e4 ed 36 4c 2b c4 6d  fb 30 95 85 a9 2e 4c 49  |R..6L+.m.0....LI|+00000d70  00 3f d1 41 17 6e 55 f8  b9 c2 2d 19 e9 f2 96 5c  |@?.AWnU...-Y...\|+00000d80  4c 56 98 a4 30 51 61 42  05 c6 2b dc ec c2 38 85  |LV..0QaBE.+...8.|+00000d90  b1 c2 2f c7 2a dc 54 87  31 dd 70 e3 e8 34 79 63  |../.*.T.1.p..4yc|+00000da0  7f 8c 1e 9e 24 47 a7 61  54 41 9a 1c a5 30 92 a5  |~.^.$G.aTA.\.0..|+00000db0  91 85 18 c1 d2 88 3a 14  a4 21 9f 81 fc fe 18 3e  |..X...:T.!....X>|+00000dc0  cc 29 87 27 61 78 44 0b  04 e2 f4 61 43 ed 72 98  |.).'axDKD..aC.r.|+00000dd0  13 c3 22 1a b1 34 34 60  93 43 ed 18 1a 11 0d 2c  |S."Z.44`.C.XZQM,|+00000de0  05 86 58 65 c0 86 40 44  54 b2 34 c4 1a 27 87 58  |E.Xe..@DT.4.Z'.X|+00000df0  31 24 22 02 81 42 fd 67  0a -- -- -- -- -- -- --  |1$"B.B.gJ-------|+Hello.pdf:72:+00000df0  -- -- -- -- -- -- -- --  -- 83 39 84 c1 ad b8 41  |---------.9....A|+00000e00  e1 fa 6e 18 a4 30 90 0b  3c b0 10 03 7a b7 97 03  |..nX.0.K<.PCz..C|+00000e10  c6 a0 bf 42 3f bf 4b f6  53 e8 3b 06 7d 7a b5 97  |...B?.K.S.;F}z..|+00000e20  7d c6 20 8f 87 3c 85 5c  56 cc 55 e8 cd d3 bd db  |}. ..<.\V.U.....|+00000e30  a3 57 7b e4 30 97 93 86  9e 71 a9 b2 67 1d fc d9  |.W{.0....q..g]..|+00000e40  c9 d2 ef 82 3f a2 19 6e  b3 1d 4e 99 9d 8c 6c 23  |....?.Yn.]N...l#|+00000e50  dc 5a 3d ab 87 4f 66 29  f4 60 cd 1e 3e 74 d7 06  |.Z=..Of).`.^>t.F|+00000e60  c9 ee 0a -- -- -- -- --  -- -- -- -- -- -- -- --  |..J-------------|+Hello.pdf:73:+00000e60  -- -- -- dd 14 ba 2a 74  b1 c3 97 3a 4c fa 0a --  |---.T.*t...:L.J-|+Hello.pdf:74:+00000e60  -- -- -- -- -- -- -- --  -- -- -- -- -- -- -- 70  |---------------p|+00000e70  9d 1d 5e 85 ce 76 bb ec  ac e0 71 fb a5 a7 02 6e  |.]^..v....q...Bn|+00000e80  3f 3a 8d 41 47 f6 dc 51  a1 83 42 26 d7 36 53 21  |?:.AG..Q..B&.6S!|+00000e90  83 ef 4a 46 3a da 2b a4  2b a4 29 b4 63 0b ed 46  |..JF:.+.+.).cK.F|+00000ea0  20 35 c5 2f 53 87 21 c5  e5 90 29 7e b8 1c 48 66  | 5./S.!...)~.\Hf|+00000eb0  bd 64 17 92 78 7d 92 82  93 33 77 0e 83 83 3d 38  |.dW.x}...3wN..=8|+00000ec0  9c 70 44 6b 67 b7 59 a5  dd 0e 7b b4 76 b6 c4 78  |.pDkg.Y..N{.v..x|+00000ed0  69 b3 c2 16 ad 5d 22 d7  2e 31 1e 89 5c bb 1d ba  |i..V.]"..1^.\.].|+00000ee0  35 0e 56 e3 d9 ea af 27  28 c4 73 26 f1 0a -- --  |5NV....'(.s&.J--|+Hello.pdf:75:+00000ee0  -- -- -- -- -- -- -- --  -- -- -- -- -- -- 71 a9  |--------------q.|+00000ef0  88 75 20 46 c1 c2 a6 2d  0a -- -- -- -- -- -- --  |.u F...-J-------|+Hello.pdf:76:+00000ef0  -- -- -- -- -- -- -- --  -- d2 05 70 72 68 85 c6  |---------.Eprh..|+00000f00  80 36 08 82 03 10 7e 90  03 22 22 0a -- -- -- --  |.6H.CP~.C""J----|+Hello.pdf:77:+00000f00  -- -- -- -- -- -- -- --  -- -- -- -- 57 ac 16 59  |------------W.VY|+00000f10  ff 3f 8d fe c7 53 e1 4f  67 84 1a cd be 4d ac e5  |.?...S.Og.Z..M..|+00000f20  d1 d8 47 44 e8 21 6d 19  7f a5 bf bf 22 b4 87 75  |..GD.!mY~..."..u|+00000f30  34 53 2f 22 1a c5 4a b1  93 f9 ad bc b7 68 a4 e5  |4S/"Z.J......h..|+00000f40  74 5e c4 e3 6d d1 9f b9  7a 5e 1b d4 3d 8c d6 d0  |t^..m...z^[.=...|+00000f50  66 73 75 0d 4e d3 62 ec  a2 43 f4 0e 1d 63 ee b4  |fsuMN.b..C.N]c..|+00000f60  18 08 5e 2b 0e 91 47 9c  60 3f 2b 7f f0 a1 a1 9e  |XH^+N.G.`?+~....|+00000f70  a5 3d 4c cb 51 8f a0 e8  24 4a 68 8b 78 89 2d 96  |.=L.Q...$Jh.x.-.|+00000f80  53 44 94 d2 32 8d 47 6d  22 5b de af 1f 64 74 3f  |SD..2.Gm"[.._dt?|+00000f90  3d c4 d7 a3 b4 85 4a 99  37 32 58 ce f1 7f 4c 3b  |=.....J.72X..~L;|+00000fa0  68 15 5d a0 0d da 19 9a  c2 fc 4e da cb f1 28 fe  |hU].M.Y...N...(.|+00000fb0  fc 9a b9 88 26 6a 61 4b  db b4 c1 da 6c d6 db cb  |....&jaK....l...|+00000fc0  d6 36 d1 26 b1 9c 9a 68  91 4e fc 29 57 74 4a 36  |.6.&...h.N.)WtJ6|+00000fd0  69 59 6c 75 07 67 40 34  93 36 cb 26 b9 c1 a8 07  |iYluGg@4.6.&...G|+00000fe0  8f 4d f2 1c cf 10 75 b0  44 2c ae 18 2f 67 61 d4  |.M.\.Pu.D,.X/ga.|+00000ff0  6e ab d8 25 7a 6b e3 e8  10 af 2f a7 c9 b8 0d 77  |n..%zk..P./...Mw|+00001000  e3 98 58 a1 7b f5 25 38  43 35 1a 61 3a dd 49 07  |..X.{.%8C5Za:.IG|+00001010  64 93 c5 45 35 31 5e aa  b1 cc 16 f7 e9 d3 cd ab  |d..E51^...V.....|+00001020  9c ad 95 6b 4b f4 e9 62  1b 9d 61 9b 33 f1 1d cb  |...kK..b[.a.3.].|+00001030  1e 8e 6c b3 99 31 d1 0e  6d a2 1c 27 c7 71 ce b3  |^.l..1.Nm.\'.q..|+00001040  19 db 6c d2 9a 28 b5 38  68 3f 5a b9 ee 6b 35 25  |Y.l..(.8h?Z..k5%|+00001050  46 e9 23 30 84 f3 29 d7  6f a2 0d f4 0c db ed ca  |F.#0..).o.M.L...|+00001060  95 21 2a 45 5f f6 5e 4a  e5 72 75 f4 a2 6d 7c f9  |.!*E_.^J.ru..m|.|+00001070  e5 6a d4 72 45 cd 6a 88  3c 6d 30 6d d6 66 8b 55  |.j.rE.j.<m0m.f.U|+00001080  1c 6d 0b 57 b3 14 f9 d4  9f 7d 74 90 67 69 85 d8  |\mKW.T...}t.gi..|+00001090  c1 71 53 4c 05 2d 92 4d  bc 55 24 ea 41 f4 5a 8c  |.qSLE-.M.U$.A.Z.|+000010a0  45 ea fc f7 a6 6c b7 23  ac f9 46 17 86 03 13 82  |E....l.#..FW.CS.|+000010b0  ee 7d 21 8f 3f fb 27 a2  db 11 e3 0e d3 f8 70 e2  |.}!.?.'..Q.N..p.|+000010c0  7d ee c8 b5 6b e3 83 7a  86 0c 85 65 66 18 be d8  |}...k..z.L.efX..|+000010d0  b0 ee f3 9e fa 4f 93 a7  fc d9 63 c6 07 dd 11 d1  |.....O....c.G.Q.|+000010e0  ae 20 bf cd 6c c1 f4 7c  06 27 05 d9 03 ff 0c 98  |. ..l..|F'E.C.L.|+000010f0  dd 15 30 16 05 46 87 a5  8f 7f a3 a7 87 dd b3 8a  |.U0VEF...~......|+00001100  dd 55 8e 2a ef a0 2a 47  d1 20 3f ef ff b2 c7 30  |.U.*..*G. ?....0|+00001110  19 1f 7c 59 88 47 42 11  71 6d 45 84 f2 3b bc ce  |Y_|Y.GBQqmE..;..|+00001120  bb 48 dc 71 3b 4f c7 65  bb dd 05 73 f3 c3 62 3a  |.H.q;O.e..Es..b:|+00001130  0b f1 d9 0c f4 f0 30 97  90 ed 1e c1 61 8e 98 18  |K..L..0...^.a..X|+00001140  f4 86 dc 55 ee aa d1 85  55 ee 11 ee e2 19 85 1c  |...U....U.Q..Y.\|+00001150  b7 39 f2 44 51 55 28 87  33 98 14 9c cb 74 72 d0  |.9.DQU(.3.T..tr.|+00001160  13 0e 84 32 7e 60 8b 42  21 c3 bb d5 b0 c3 4b 58  |SN.2~`.B!.....KX|+00001170  bd 2a c4 16 ee 6c b3 c0  a3 09 e5 5c 65 a5 c4 ec  |.*.V.l...I.\e...|+00001180  31 ee 30 ba 8c 0f 4e 08  86 2b f3 33 c2 81 fc 50  |1.0..ONH.+.3...P|+00001190  86 c7 e3 2e 08 37 8c 0f  86 1b f2 33 3c a1 10 6b  |....H7.O.[.3<.Pk|+000011a0  d9 7e 88 94 23 ae 98 9b  d6 16 b3 9d 63 b6 f5 e0  |.~..#....V..c...|+000011b0  79 47 d4 0a -- -- -- --  -- -- -- -- -- -- -- --  |yG.J------------|+Hello.pdf:78:+000011b0  -- -- -- -- 97 28 90 11  a6 50 55 95 61 73 52 d0  |----.(.Q.PU.asR.|+000011c0  eb 09 57 56 55 65 54 71  1e 6d 72 84 1a 7e 02 08  |.IWVUeTq^mr.Z~BH|+000011d0  fa 29 10 68 03 22 64 d8  e0 4a 14 f0 f7 60 3c 1b  |.)PhC"d..JT..`<[|+000011e0  e3 c1 eb c9 30 00 af c7  eb e1 38 43 f9 ec db 69  |....0@....8C...i|+000011f0  dc 9a 02 8e d4 13 f2 f3  6e 9c 8a b9 af e4 5e ce  |..B..S..n.....^.|+00001200  fd 9c c1 f3 b3 18 dd e7  f3 f9 82 cf 00 53 58 1e  |.....X......@SX^|+00001210  45 dd fe 6d bf ce f0 7f  d9 b4 1f e9 c1 94 74 93  |E..m...~.._...t.|+00001220  76 e1 67 77 3b 9d 14 99  fc af 2f 56 b5 7a b1 dc  |v.gw;.T.../V.z..|+00001230  c2 a7 aa 18 ea b4 cb dc  f3 13 59 84 eb 55 11 2b  |...X.....SY..UQ+|+00001240  97 6b 3a e5 bc 75 b8 b9  37 39 0e 37 1f 6e ee 95  |.k:..u..79N7_n..|+00001250  ec f4 38 7d 1e a7 a7 58  a7 2b 8b 90 71 e5 0b 55  |..8}^..X.+..q.KU|+00001260  1b 63 fb ee fc 42 4b 77  c3 ac 30 72 d0 47 f1 bf  |[c...BKw..0r.G..|+00001270  20 81 6e 36 4e 15 7c 6f  73 f8 d6 71 b7 3a f8 58  | .n6NU|os..q.:.X|+00001280  f4 1e 77 e6 c5 71 c6 58  96 3c ea dc 63 18 17 2c  |.^w..q.X.<..cXW,|+00001290  c7 bd c7 6f 0b 43 41 e7  6e e1 1e 9f b3 93 a3 8a  |...oKCA.n.^.....|+000012a0  a5 84 ac 5e bd 93 f3 d8  75 9e d3 cb d4 bb b2 51  |...^....u......Q|+000012b0  eb de d8 78 f5 83 46 d9  74 f5 2d ed 86 d6 2c ed  |...x..F.t.-...,.|+000012c0  9b ab 4e f6 af 51 f9 b5  cf f8 ad 51 4e 29 94 49  |..N..Q.....QN).I|+000012d0  79 46 04 3b 19 74 b0 81  08 69 ec 21 93 3d 65 e6  |yFD;Yt..Hi.!.=e.|+000012e0  f0 3b cf 42 89 0c ee a4  64 4a 37 47 a3 0e 86 17  |.;.B.L..dJ7G.N.W|+000012f0  91 e2 49 b1 a4 e6 e5 f6  eb 9f 62 13 5e 37 39 1d  |..I.......bS^79]|+00001300  94 97 9b 14 d3 53 78 3b  5b 62 f4 e9 57 3e 8b 7d  |...T.Sx;[b..W>.}|+00001310  e3 a5 60 43 c9 dc 3d 53  d5 65 75 54 b8 cf 1d b9  |..`C..=S.euT..].|+00001320  14 b6 ae 7d 78 c5 8b b1  5a f5 14 cb 17 fb 06 0c  |T..}x...Z.T.W.FL|+00001330  7c 2d 2b 4b 0c 14 c9 c2  2a 02 ea 93 c7 ca 5e 08  ||-+KLT..*B....^H|+00001340  cf 37 ea 72 8e eb 32 c5  d2 9e bd 76 8d 46 95 c8  |.7.r..2....v.F..|+00001350  b7 d8 88 ca a8 43 dc 71  8e 48 e7 53 9e 11 51 22  |.....C.q.H.S.QQ"|+00001360  c5 47 23 71 a5 5e 2f 52  bc 9d bb f4 75 7a fa 7a  |.G#q.^/R....uz.z|+00001370  b4 03 53 43 1f 9c 79 f6  15 f5 91 38 21 d6 df bf  |.CSC_.y.U..8!...|+00001380  f4 f1 43 6f e2 e2 1a a3  e6 1a ad e4 9c 47 71 ce  |..Co..Z..Z...Gq.|+00001390  09 d4 8e bc 81 64 4b 75  12 55 5b eb 93 36 a6 c5  |I....dKuRU[..6..|+000013a0  25 d9 f3 91 94 f2 b3 34  c7 85 e6 2b c6 2d fc fc  |%......4...+.-..|+000013b0  42 b3 e3 6c 2f d1 d9 92  e2 32 72 ec db a7 4b d7  |B..l/....2r...K.|+000013c0  dc 24 a7 43 f3 76 d6 9c  8e 24 ad b8 7a cd 9a ea  |.$.C.v...$..z...|+000013d0  d5 6b d6 ac 3e 73 a9 e5  ab 33 2d 2d 38 71 f4 48  |.k..>s...3--8q.H|+000013e0  d3 b1 63 4d 47 8e 6e 56  ef ab 4f d5 29 75 48 f8  |..cMG.nV..O.)uH.|+000013f0  f9 b3 d3 51 f4 34 fc 9a  ed da 52 f3 39 35 4e a7  |...Q.4....R.95N.|+00001400  3f 6e 92 c5 2c 7e 7e 6f  a6 89 cc 09 3e 3a 46 75  |?n..,~~o...I>:Fu|+00001410  2c c6 0b 72 e4 84 c9 63  a7 8c c8 1a 5b 34 7f 5e  |,.Kr...c...Z[4~^|+00001420  a9 7f 62 d1 9c c5 f3 66  2c 24 fa 17 20 2d 06 e4  |.~b....f,$.W -F.|+00001430  0a -- -- -- -- -- -- --  -- -- -- -- -- -- -- --  |J---------------|+Hello.pdf:79:endstream+Hello.pdf:80:endobj+Hello.pdf:81:14 0 obj+Hello.pdf:82:2734+Hello.pdf:83:endobj+Hello.pdf:84:15 0 obj+Hello.pdf:85:(Hello)+Hello.pdf:86:endobj+Hello.pdf:87:16 0 obj+Hello.pdf:88:(Mac OS X 10.12.6 Quartz PDFContext)+Hello.pdf:89:endobj+Hello.pdf:90:17 0 obj+Hello.pdf:91:(TextEdit)+Hello.pdf:92:endobj+Hello.pdf:93:18 0 obj+Hello.pdf:94:(D:20200124010711Z00'00')+Hello.pdf:95:endobj+Hello.pdf:96:19 0 obj+Hello.pdf:97:()+Hello.pdf:98:endobj+Hello.pdf:99:20 0 obj+Hello.pdf:100:[ ]+Hello.pdf:101:endobj+Hello.pdf:102:1 0 obj+Hello.pdf:103:<< /Title 15 0 R /Producer 16 0 R /Creator 17 0 R /CreationDate 18 0 R /ModDate+Hello.pdf:104:18 0 R /Keywords 19 0 R /AAPL:Keywords 20 0 R >>+Hello.pdf:105:endobj+Hello.pdf:106:xref+Hello.pdf:107:0 21+Hello.pdf:108:0000000000 65535 f +Hello.pdf:109:0000005392 00000 n +Hello.pdf:110:0000000238 00000 n +Hello.pdf:111:0000001714 00000 n +Hello.pdf:112:0000000022 00000 n +Hello.pdf:113:0000000219 00000 n +Hello.pdf:114:0000000342 00000 n +Hello.pdf:115:0000001679 00000 n +Hello.pdf:116:0000001847 00000 n +Hello.pdf:117:0000000439 00000 n +Hello.pdf:118:0000001658 00000 n +Hello.pdf:119:0000001797 00000 n +Hello.pdf:120:0000002110 00000 n +Hello.pdf:121:0000002362 00000 n +Hello.pdf:122:0000005186 00000 n +Hello.pdf:123:0000005207 00000 n +Hello.pdf:124:0000005231 00000 n +Hello.pdf:125:0000005284 00000 n +Hello.pdf:126:0000005311 00000 n +Hello.pdf:127:0000005353 00000 n +Hello.pdf:128:0000005372 00000 n +Hello.pdf:129:trailer+Hello.pdf:130:<< /Size 21 /Root 11 0 R /Info 1 0 R /ID [ <8db88d3335070bd9583341583cf769a3>+Hello.pdf:131:<8db88d3335070bd9583341583cf769a3> ] >>+Hello.pdf:132:startxref+Hello.pdf:133:5536+Hello.pdf:134:%%EOF+Hello.sh:1:#!/bin/sh+Hello.sh:2:echo "Hello World!"+Hello.txt:1:Hello

tests/out/Hello_-W-nkbT.out

@@ -1,466 +1,466 @@-Hello.bat:     1:  1:      0:	#!/bin/sh-Hello.bat:     2:  1:     10:	echo "Hello World!"+Hello.bat:     1:  1:      0:	#!/bin/sh+Hello.bat:     2:  1:     10:	echo "Hello World!" Hello.class:     1:  1:      0:	-00000000:  ca fe ba be 00 00 00 34  00 1d 0a -- -- -- -- --  |....@@@4@]J-----|+00000000  ca fe ba be 00 00 00 34  00 1d 0a -- -- -- -- --  |....@@@4@]J-----| Hello.class:     2:  1:     11:	-00000000:  -- -- -- -- -- -- -- --  -- -- -- 00 06 00 0f 09  |-----------@F@OI|-00000010:  00 10 00 11 08 00 12 0a  -- -- -- -- -- -- -- --  |@P@QH@RJ--------|+00000000  -- -- -- -- -- -- -- --  -- -- -- 00 06 00 0f 09  |-----------@F@OI|+00000010  00 10 00 11 08 00 12 0a  -- -- -- -- -- -- -- --  |@P@QH@RJ--------| Hello.class:     3:  1:     24:	-00000010:  -- -- -- -- -- -- -- --  00 13 00 14 07 00 15 07  |--------@S@TG@UG|-00000020:  00 16 01 00 06 3c 69 6e  69 74 3e 01 00 03 28 29  |@VA@F<init>A@C()|-00000030:  56 01 00 04 43 6f 64 65  01 00 0f 4c 69 6e 65 4e  |VA@DCodeA@OLineN|-00000040:  75 6d 62 65 72 54 61 62  6c 65 01 00 04 6d 61 69  |umberTableA@Dmai|-00000050:  6e 01 00 16 28 5b 4c 6a  61 76 61 2f 6c 61 6e 67  |nA@V([Ljava/lang|-00000060:  2f 53 74 72 69 6e 67 3b  29 56 01 00 0a -- -- --  |/String;)VA@J---|+00000010  -- -- -- -- -- -- -- --  00 13 00 14 07 00 15 07  |--------@S@TG@UG|+00000020  00 16 01 00 06 3c 69 6e  69 74 3e 01 00 03 28 29  |@VA@F<init>A@C()|+00000030  56 01 00 04 43 6f 64 65  01 00 0f 4c 69 6e 65 4e  |VA@DCodeA@OLineN|+00000040  75 6d 62 65 72 54 61 62  6c 65 01 00 04 6d 61 69  |umberTableA@Dmai|+00000050  6e 01 00 16 28 5b 4c 6a  61 76 61 2f 6c 61 6e 67  |nA@V([Ljava/lang|+00000060  2f 53 74 72 69 6e 67 3b  29 56 01 00 0a -- -- --  |/String;)VA@J---| Hello.class:     4:  1:    109:	-00000060:  -- -- -- -- -- -- -- --  -- -- -- -- -- 53 6f 75  |-------------Sou|-00000070:  72 63 65 46 69 6c 65 01  00 0a -- -- -- -- -- --  |rceFileA@J------|+00000060  -- -- -- -- -- -- -- --  -- -- -- -- -- 53 6f 75  |-------------Sou|+00000070  72 63 65 46 69 6c 65 01  00 0a -- -- -- -- -- --  |rceFileA@J------| Hello.class:     5:  1:    122:	-00000070:  -- -- -- -- -- -- -- --  -- -- 48 65 6c 6c 6f 2e  |----------Hello.|-00000080:  6a 61 76 61 0c 00 07 00  08 07 00 17 0c 00 18 00  |javaL@G@HG@WL@X@|-00000090:  19 01 00 0c 48 65 6c 6c  6f 20 57 6f 72 6c 64 21  |YA@LHello World!|-000000a0:  07 00 1a 0c 00 1b 00 1c  01 00 05 48 65 6c 6c 6f  |G@ZL@[@\A@EHello|-000000b0:  01 00 10 6a 61 76 61 2f  6c 61 6e 67 2f 4f 62 6a  |A@Pjava/lang/Obj|-000000c0:  65 63 74 01 00 10 6a 61  76 61 2f 6c 61 6e 67 2f  |ectA@Pjava/lang/|-000000d0:  53 79 73 74 65 6d 01 00  03 6f 75 74 01 00 15 4c  |SystemA@CoutA@UL|-000000e0:  6a 61 76 61 2f 69 6f 2f  50 72 69 6e 74 53 74 72  |java/io/PrintStr|-000000f0:  65 61 6d 3b 01 00 13 6a  61 76 61 2f 69 6f 2f 50  |eam;A@Sjava/io/P|-00000100:  72 69 6e 74 53 74 72 65  61 6d 01 00 07 70 72 69  |rintStreamA@Gpri|-00000110:  6e 74 6c 6e 01 00 15 28  4c 6a 61 76 61 2f 6c 61  |ntlnA@U(Ljava/la|-00000120:  6e 67 2f 53 74 72 69 6e  67 3b 29 56 00 21 00 05  |ng/String;)V@!@E|-00000130:  00 06 00 00 00 00 00 02  00 01 00 07 00 08 00 01  |@F@@@@@B@A@G@H@A|-00000140:  00 09 00 00 00 1d 00 01  00 01 00 00 00 05 2a b7  |@I@@@]@A@A@@@E*.|-00000150:  00 01 b1 00 00 00 01 00  0a -- -- -- -- -- -- --  |@A.@@@A@J-------|+00000070  -- -- -- -- -- -- -- --  -- -- 48 65 6c 6c 6f 2e  |----------Hello.|+00000080  6a 61 76 61 0c 00 07 00  08 07 00 17 0c 00 18 00  |javaL@G@HG@WL@X@|+00000090  19 01 00 0c 48 65 6c 6c  6f 20 57 6f 72 6c 64 21  |YA@LHello World!|+000000a0  07 00 1a 0c 00 1b 00 1c  01 00 05 48 65 6c 6c 6f  |G@ZL@[@\A@EHello|+000000b0  01 00 10 6a 61 76 61 2f  6c 61 6e 67 2f 4f 62 6a  |A@Pjava/lang/Obj|+000000c0  65 63 74 01 00 10 6a 61  76 61 2f 6c 61 6e 67 2f  |ectA@Pjava/lang/|+000000d0  53 79 73 74 65 6d 01 00  03 6f 75 74 01 00 15 4c  |SystemA@CoutA@UL|+000000e0  6a 61 76 61 2f 69 6f 2f  50 72 69 6e 74 53 74 72  |java/io/PrintStr|+000000f0  65 61 6d 3b 01 00 13 6a  61 76 61 2f 69 6f 2f 50  |eam;A@Sjava/io/P|+00000100  72 69 6e 74 53 74 72 65  61 6d 01 00 07 70 72 69  |rintStreamA@Gpri|+00000110  6e 74 6c 6e 01 00 15 28  4c 6a 61 76 61 2f 6c 61  |ntlnA@U(Ljava/la|+00000120  6e 67 2f 53 74 72 69 6e  67 3b 29 56 00 21 00 05  |ng/String;)V@!@E|+00000130  00 06 00 00 00 00 00 02  00 01 00 07 00 08 00 01  |@F@@@@@B@A@G@H@A|+00000140  00 09 00 00 00 1d 00 01  00 01 00 00 00 05 2a b7  |@I@@@]@A@A@@@E*.|+00000150  00 01 b1 00 00 00 01 00  0a -- -- -- -- -- -- --  |@A.@@@A@J-------| Hello.class:     6:  1:    345:	-00000150:  -- -- -- -- -- -- -- --  -- 00 00 00 06 00 01 00  |---------@@@F@A@|-00000160:  00 00 02 00 09 00 0b 00  0c 00 01 00 09 00 00 00  |@@B@I@K@L@A@I@@@|-00000170:  25 00 02 00 01 00 00 00  09 b2 00 02 12 03 b6 00  |%@B@A@@@I.@BRC.@|-00000180:  04 b1 00 00 00 01 00 0a  -- -- -- -- -- -- -- --  |D.@@@A@J--------|+00000150  -- -- -- -- -- -- -- --  -- 00 00 00 06 00 01 00  |---------@@@F@A@|+00000160  00 00 02 00 09 00 0b 00  0c 00 01 00 09 00 00 00  |@@B@I@K@L@A@I@@@|+00000170  25 00 02 00 01 00 00 00  09 b2 00 02 12 03 b6 00  |%@B@A@@@I.@BRC.@|+00000180  04 b1 00 00 00 01 00 0a  -- -- -- -- -- -- -- --  |D.@@@A@J--------| Hello.class:     7:  1:    392:	-00000180:  -- -- -- -- -- -- -- --  00 00 00 0a -- -- -- --  |--------@@@J----|+00000180  -- -- -- -- -- -- -- --  00 00 00 0a -- -- -- --  |--------@@@J----| Hello.class:     8:  1:    396:	-00000180:  -- -- -- -- -- -- -- --  -- -- -- -- 00 02 00 00  |------------@B@@|-00000190:  00 04 00 08 00 05 00 01  00 0d 00 00 00 02 00 0e  |@D@H@E@A@M@@@B@N|-Hello.java:     1:  1:      0:	import java.lang.*;-Hello.java:     2:  1:     20:	-Hello.java:     3:  1:     21:	public class Hello // prints a Hello World! greeting-Hello.java:     4:  1:     74:	{ public static void main(String[] arg)-Hello.java:     5:  1:    114:	  { System.out.println("Hello World!");-Hello.java:     6:  1:    154:	  }-Hello.java:     7:  1:    158:	}-Hello.pdf:     1:  1:      0:	%PDF-1.3+00000180  -- -- -- -- -- -- -- --  -- -- -- -- 00 02 00 00  |------------@B@@|+00000190  00 04 00 08 00 05 00 01  00 0d 00 00 00 02 00 0e  |@D@H@E@A@M@@@B@N|+Hello.java:     1:  1:      0:	import java.lang.*;+Hello.java:     2:  1:     20:	+Hello.java:     3:  1:     21:	public class Hello // prints a Hello World! greeting+Hello.java:     4:  1:     74:	{ public static void main(String[] arg)+Hello.java:     5:  1:    114:	  { System.out.println("Hello World!");+Hello.java:     6:  1:    154:	  }+Hello.java:     7:  1:    158:	}+Hello.pdf:     1:  1:      0:	%PDF-1.3 Hello.pdf:     2:  1:      9:	-00000000:  -- -- -- -- -- -- -- --  -- 25 c4 e5 f2 e5 eb a7  |---------%......|-00000010:  f3 a0 d0 c4 c6 0a -- --  -- -- -- -- -- -- -- --  |.....J----------|-Hello.pdf:     3:  1:     22:	4 0 obj-Hello.pdf:     4:  1:     30:	<< /Length 5 0 R /Filter /FlateDecode >>-Hello.pdf:     5:  1:     71:	stream+00000000  -- -- -- -- -- -- -- --  -- 25 c4 e5 f2 e5 eb a7  |---------%......|+00000010  f3 a0 d0 c4 c6 0a -- --  -- -- -- -- -- -- -- --  |.....J----------|+Hello.pdf:     3:  1:     22:	4 0 obj+Hello.pdf:     4:  1:     30:	<< /Length 5 0 R /Filter /FlateDecode >>+Hello.pdf:     5:  1:     71:	stream Hello.pdf:     6:  1:     78:	-00000040:  -- -- -- -- -- -- -- --  -- -- -- -- -- -- 78 01  |--------------xA|-00000050:  45 8e bb 0a -- -- -- --  -- -- -- -- -- -- -- --  |E..J------------|+00000040  -- -- -- -- -- -- -- --  -- -- -- -- -- -- 78 01  |--------------xA|+00000050  45 8e bb 0a -- -- -- --  -- -- -- -- -- -- -- --  |E..J------------| Hello.pdf:     7:  1:     84:	-00000050:  -- -- -- -- 02 31 14 44  7b bf e2 94 5a 98 bd 89  |----B1TD{...Z...|-00000060:  79 98 56 11 6c 17 2e f8  01 61 2d 64 d7 65 cd ff  |y.VQlW..Aa-d.e..|-00000070:  83 17 2c ac 86 99 39 0c  b3 31 b2 51 02 b9 46 97  |.W,...9L.1.QB.F.|-00000080:  e2 a9 12 f3 99 90 5c 4c  59 0a -- -- -- -- -- --  |..R...\LYJ------|+00000050  -- -- -- -- 02 31 14 44  7b bf e2 94 5a 98 bd 89  |----B1TD{...Z...|+00000060  79 98 56 11 6c 17 2e f8  01 61 2d 64 d7 65 cd ff  |y.VQlW..Aa-d.e..|+00000070  83 17 2c ac 86 99 39 0c  b3 31 b2 51 02 b9 46 97  |.W,...9L.1.QB.F.|+00000080  e2 a9 12 f3 99 90 5c 4c  59 0a -- -- -- -- -- --  |..R...\LYJ------| Hello.pdf:     8:  1:    138:	-00000080:  -- -- -- -- -- -- -- --  -- -- 9f 89 07 6f 86 6b  |----------..Go.k|-00000090:  f7 b4 8e d0 9b e1 e2 6a  a9 52 6a b2 40 38 fe ad  |.......j.Rj.@8..|-000000a0:  ed 94 20 bb b6 70 51 a3  44 c4 a3 0d ef 7f a0 69  |.. ..pQ.D..M.~.i|-000000b0:  c2 0b ba 30 a8 7a ac 7c  b2 bf 4f f3 bc 1e d0 17  |.K.0.z.|..O..^.W|-000000c0:  37 b5 37 e3 17 4e ff 20  a5 0a -- -- -- -- -- --  |7.7.WN. .J------|-Hello.pdf:     9:  1:    202:	endstream-Hello.pdf:    10:  1:    212:	endobj-Hello.pdf:    11:  1:    219:	5 0 obj-Hello.pdf:    12:  1:    227:	123-Hello.pdf:    13:  1:    231:	endobj-Hello.pdf:    14:  1:    238:	2 0 obj-Hello.pdf:    15:  1:    246:	<< /Type /Page /Parent 3 0 R /Resources 6 0 R /Contents 4 0 R /MediaBox [0 0 612 792]-Hello.pdf:    16:  1:    332:	>>-Hello.pdf:    17:  1:    335:	endobj-Hello.pdf:    18:  1:    342:	6 0 obj-Hello.pdf:    19:  1:    350:	<< /ProcSet [ /PDF /Text ] /ColorSpace << /Cs1 7 0 R >> /Font << /TT1 8 0 R-Hello.pdf:    20:  1:    426:	>> >>-Hello.pdf:    21:  1:    432:	endobj-Hello.pdf:    22:  1:    439:	9 0 obj-Hello.pdf:    23:  1:    447:	<< /Length 10 0 R /N 1 /Alternate /DeviceGray /Filter /FlateDecode >>-Hello.pdf:    24:  1:    517:	stream+00000080  -- -- -- -- -- -- -- --  -- -- 9f 89 07 6f 86 6b  |----------..Go.k|+00000090  f7 b4 8e d0 9b e1 e2 6a  a9 52 6a b2 40 38 fe ad  |.......j.Rj.@8..|+000000a0  ed 94 20 bb b6 70 51 a3  44 c4 a3 0d ef 7f a0 69  |.. ..pQ.D..M.~.i|+000000b0  c2 0b ba 30 a8 7a ac 7c  b2 bf 4f f3 bc 1e d0 17  |.K.0.z.|..O..^.W|+000000c0  37 b5 37 e3 17 4e ff 20  a5 0a -- -- -- -- -- --  |7.7.WN. .J------|+Hello.pdf:     9:  1:    202:	endstream+Hello.pdf:    10:  1:    212:	endobj+Hello.pdf:    11:  1:    219:	5 0 obj+Hello.pdf:    12:  1:    227:	123+Hello.pdf:    13:  1:    231:	endobj+Hello.pdf:    14:  1:    238:	2 0 obj+Hello.pdf:    15:  1:    246:	<< /Type /Page /Parent 3 0 R /Resources 6 0 R /Contents 4 0 R /MediaBox [0 0 612 792]+Hello.pdf:    16:  1:    332:	>>+Hello.pdf:    17:  1:    335:	endobj+Hello.pdf:    18:  1:    342:	6 0 obj+Hello.pdf:    19:  1:    350:	<< /ProcSet [ /PDF /Text ] /ColorSpace << /Cs1 7 0 R >> /Font << /TT1 8 0 R+Hello.pdf:    20:  1:    426:	>> >>+Hello.pdf:    21:  1:    432:	endobj+Hello.pdf:    22:  1:    439:	9 0 obj+Hello.pdf:    23:  1:    447:	<< /Length 10 0 R /N 1 /Alternate /DeviceGray /Filter /FlateDecode >>+Hello.pdf:    24:  1:    517:	stream Hello.pdf:    25:  1:    524:	-00000200:  -- -- -- -- -- -- -- --  -- -- -- -- 78 01 85 55  |------------xA.U|-00000210:  5d 68 1c 55 14 3e bb 73  67 03 12 07 1f b4 0d 2d  |]h\UT>.sgCRG_.M-|-00000220:  b4 83 3f 6d 09 e9 32 89  56 13 8b b5 db 4d ba 49  |..?mI.2.VS...M.I|-00000230:  13 b7 eb 66 53 9b 2a ca  74 76 36 3b cd 64 66 9c  |S..fS.*.tv6;.df.|-00000240:  99 dd 26 a1 4f a5 e0 9b  16 04 e9 ab a0 3e c6 82  |..&.O...VD...>..|-00000250:  08 b6 2a 36 2f f6 a5 a5  c5 92 4a 35 0f 0a -- --  |H.*6/.....J5OJ--|+00000200  -- -- -- -- -- -- -- --  -- -- -- -- 78 01 85 55  |------------xA.U|+00000210  5d 68 1c 55 14 3e bb 73  67 03 12 07 1f b4 0d 2d  |]h\UT>.sgCRG_.M-|+00000220  b4 83 3f 6d 09 e9 32 89  56 13 8b b5 db 4d ba 49  |..?mI.2.VS...M.I|+00000230  13 b7 eb 66 53 9b 2a ca  74 76 36 3b cd 64 66 9c  |S..fS.*.tv6;.df.|+00000240  99 dd 26 a1 4f a5 e0 9b  16 04 e9 ab a0 3e c6 82  |..&.O...VD...>..|+00000250  08 b6 2a 36 2f f6 a5 a5  c5 92 4a 35 0f 0a -- --  |H.*6/.....J5OJ--| Hello.pdf:    26:  1:    606:	-00000250:  -- -- -- -- -- -- -- --  -- -- -- -- -- -- 11 5a  |--------------QZ|-00000260:  8c 20 28 7d 52 f0 3b 33  db 64 76 41 32 c3 9d f9  |. (}R.;3.dvA2...|-00000270:  ee b9 e7 9e 7b ce 77 ee  b9 97 a8 eb 6f dd f3 ec  |....{.w.....o...|-00000280:  b4 4a 34 e7 84 7e a1 9c  9b 3e 39 7d 4a ed ba 4d  |.J4..~...>9}J..M|-00000290:  69 52 a8 9b f0 e8 46 e0  e5 4a a5 09 c6 8e eb 98  |iR....F..J.I....|-000002a0:  fc 6f 7f 1e de a5 14 4b  ee ec 67 5b ed 63 5b f6  |.o~^..TK..g[.c[.|-000002b0:  e4 aa 19 18 d0 ba 86 e6  56 03 63 8e 28 a5 11 65  |..YX....VCc.(.Qe|-000002c0:  6a 86 e7 87 44 5d 97 20  1f 3c 1b 7a 8c 6f 03 3f  |j...D]. _<[z.oC?|-000002d0:  39 5b 29 e7 81 d7 80 95  d6 5c 40 7a aa 60 3a a6  |9[)......\@z.`:.|-000002e0:  6f 19 6a c1 d7 17 d4 92  ef d6 2c 3b e9 eb 56 e3  |oYj..W....,;..V.|-000002f0:  6c 63 cb 67 ce 6e b0 af  fc ec 46 eb 0e 66 27 c7  |lc.g.n....F.Nf'.|-00000300:  f1 ef 85 cf 17 4c 67 6a  12 78 1f f0 92 a1 8f 30  |....WLgjRx_....0|-00000310:  ee 03 be db b4 4e 14 63  9c 4e 7b e1 91 72 ac 9f  |.C...NTc.N{..r..|-00000320:  ce 36 66 a7 72 2d f9 c9  9a 7f 74 aa 25 bf 50 6f  |.6f.r-...~t.%.Po|-00000330:  8c 32 ce 12 a5 97 16 eb  95 37 80 9f 00 5e 75 4e  |.2.R..V..7..@^uN|-00000340:  17 8f b7 f4 d7 67 dd 71  b6 d3 43 24 f5 18 41 fe  |W....g.q..C$.XA.|-00000350:  14 f0 b3 c0 5a dd 1c e3  3c a9 c0 15 df 2d b3 3e  |T...Z.\.<..U.-.>|-00000360:  cb c3 aa 39 3c 02 fc 32  f0 25 2b 1c ab 00 c3 be  |...9<B.2.%+\.@..|-00000370:  f4 43 d0 9c 64 39 b0 a0  c5 7a 9e fd c4 5a 22 7b  |.C..d9...z...Z"{|-00000380:  46 3f 56 02 de 06 7c c8  b4 0b bc 16 ec 88 8a 17  |F?VB.F|..K.V...W|-00000390:  96 d8 e6 20 f0 bc 63 17  79 2d c4 2e 2e 9b 41 14  |... ..cWy-....AT|-000003a0:  2f 62 17 3f 85 f5 ca 68  ac 2f a7 43 bf c2 73 9f  |/bW?...h./.C..s.|-000003b0:  26 92 f7 d4 ac a3 63 c0  e0 44 1e ad fb a3 2c 87  |&.....c..D^...,.|-000003c0:  3f 72 e8 d9 d1 de 7a 11  78 c9 6f 94 39 f6 3d c0  |?r....zQx.o.9.=.|-000003d0:  6b ba 3f 52 00 86 cd cc  63 55 7d 98 79 7e 01 78  |k.?R@...cU}.y~Ax|-000003e0:  80 4e a4 74 32 c9 a5 d3  f8 1a e4 d0 bf 88 37 20  |.N.t2....Z....7 |-000003f0:  8b 9a 11 f2 c8 c7 58 0d  7d 9b 0a -- -- -- -- --  |..Q...XM}.J-----|+00000250  -- -- -- -- -- -- -- --  -- -- -- -- -- -- 11 5a  |--------------QZ|+00000260  8c 20 28 7d 52 f0 3b 33  db 64 76 41 32 c3 9d f9  |. (}R.;3.dvA2...|+00000270  ee b9 e7 9e 7b ce 77 ee  b9 97 a8 eb 6f dd f3 ec  |....{.w.....o...|+00000280  b4 4a 34 e7 84 7e a1 9c  9b 3e 39 7d 4a ed ba 4d  |.J4..~...>9}J..M|+00000290  69 52 a8 9b f0 e8 46 e0  e5 4a a5 09 c6 8e eb 98  |iR....F..J.I....|+000002a0  fc 6f 7f 1e de a5 14 4b  ee ec 67 5b ed 63 5b f6  |.o~^..TK..g[.c[.|+000002b0  e4 aa 19 18 d0 ba 86 e6  56 03 63 8e 28 a5 11 65  |..YX....VCc.(.Qe|+000002c0  6a 86 e7 87 44 5d 97 20  1f 3c 1b 7a 8c 6f 03 3f  |j...D]. _<[z.oC?|+000002d0  39 5b 29 e7 81 d7 80 95  d6 5c 40 7a aa 60 3a a6  |9[)......\@z.`:.|+000002e0  6f 19 6a c1 d7 17 d4 92  ef d6 2c 3b e9 eb 56 e3  |oYj..W....,;..V.|+000002f0  6c 63 cb 67 ce 6e b0 af  fc ec 46 eb 0e 66 27 c7  |lc.g.n....F.Nf'.|+00000300  f1 ef 85 cf 17 4c 67 6a  12 78 1f f0 92 a1 8f 30  |....WLgjRx_....0|+00000310  ee 03 be db b4 4e 14 63  9c 4e 7b e1 91 72 ac 9f  |.C...NTc.N{..r..|+00000320  ce 36 66 a7 72 2d f9 c9  9a 7f 74 aa 25 bf 50 6f  |.6f.r-...~t.%.Po|+00000330  8c 32 ce 12 a5 97 16 eb  95 37 80 9f 00 5e 75 4e  |.2.R..V..7..@^uN|+00000340  17 8f b7 f4 d7 67 dd 71  b6 d3 43 24 f5 18 41 fe  |W....g.q..C$.XA.|+00000350  14 f0 b3 c0 5a dd 1c e3  3c a9 c0 15 df 2d b3 3e  |T...Z.\.<..U.-.>|+00000360  cb c3 aa 39 3c 02 fc 32  f0 25 2b 1c ab 00 c3 be  |...9<B.2.%+\.@..|+00000370  f4 43 d0 9c 64 39 b0 a0  c5 7a 9e fd c4 5a 22 7b  |.C..d9...z...Z"{|+00000380  46 3f 56 02 de 06 7c c8  b4 0b bc 16 ec 88 8a 17  |F?VB.F|..K.V...W|+00000390  96 d8 e6 20 f0 bc 63 17  79 2d c4 2e 2e 9b 41 14  |... ..cWy-....AT|+000003a0  2f 62 17 3f 85 f5 ca 68  ac 2f a7 43 bf c2 73 9f  |/bW?...h./.C..s.|+000003b0  26 92 f7 d4 ac a3 63 c0  e0 44 1e ad fb a3 2c 87  |&.....c..D^...,.|+000003c0  3f 72 e8 d9 d1 de 7a 11  78 c9 6f 94 39 f6 3d c0  |?r....zQx.o.9.=.|+000003d0  6b ba 3f 52 00 86 cd cc  63 55 7d 98 79 7e 01 78  |k.?R@...cU}.y~Ax|+000003e0  80 4e a4 74 32 c9 a5 d3  f8 1a e4 d0 bf 88 37 20  |.N.t2....Z....7 |+000003f0  8b 9a 11 f2 c8 c7 58 0d  7d 9b 0a -- -- -- -- --  |..Q...XM}.J-----| Hello.pdf:    27:  1:   1019:	-000003f0:  -- -- -- -- -- -- -- --  -- -- -- d0 70 d0 7c f4  |-----------.p.|.|-00000400:  0c 68 15 80 74 5a 00 2a  25 b4 4c f4 58 27 9e a3  |LhU.tZ@*%.L.X'..|-00000410:  52 15 3d 95 66 a2 59 41  84 d8 ca fd a8 6f 50 7e  |RU=.f.YA.....oP~|-00000420:  d7 a7 d4 80 b4 4e eb 90  d6 81 5e a3 5f 22 c9 3c  |.....N....^._".<|-00000430:  fd 4a 73 e8 e7 21 6d 60  6c a6 c3 6e 1e 5e 38 b4  |.Js..!m`l..n^^8.|-00000440:  08 0f d8 13 b6 f9 a0 65  d3 15 db 85 26 9e 47 3b  |HO.S...e.U..&.G;|-00000450:  28 26 c4 2b 62 50 0c 91  2a 5e 15 87 c5 21 31 0c  |(&.+bPL.*^U..!1L|-00000460:  e9 90 38 18 cd 89 bd 4f  fa ce 7e 3e d8 b0 f4 2e  |..8X...O..~>....|-00000470:  d6 4d fa be 0c 0e 42 ac  67 c3 33 07 ac 70 34 01  |.M..LNB.g.3G.p4A|-00000480:  3c f8 07 eb ce 46 9a 09  b6 2e ee 68 ec f3 bc 8f  |<.G..F.I...h....|-00000490:  de 3f ef bf 63 19 b7 3e  f8 b3 8d bd 00 fa 31 27  |.?..cY.>....@.1'|-000004a0:  bf c1 a2 0b 6b 26 25 e6  5e 3f f7 4d 4f c2 43 75  |...Kk&%.^?.MO.Cu|-000004b0:  45 7c f5 d6 9d ee eb e7  e8 78 32 4b 51 de aa 9d  |E|.......x2KQ...|-000004c0:  59 92 d7 e4 fb f2 0a --  -- -- -- -- -- -- -- --  |Y.....J---------|+000003f0  -- -- -- -- -- -- -- --  -- -- -- d0 70 d0 7c f4  |-----------.p.|.|+00000400  0c 68 15 80 74 5a 00 2a  25 b4 4c f4 58 27 9e a3  |LhU.tZ@*%.L.X'..|+00000410  52 15 3d 95 66 a2 59 41  84 d8 ca fd a8 6f 50 7e  |RU=.f.YA.....oP~|+00000420  d7 a7 d4 80 b4 4e eb 90  d6 81 5e a3 5f 22 c9 3c  |.....N....^._".<|+00000430  fd 4a 73 e8 e7 21 6d 60  6c a6 c3 6e 1e 5e 38 b4  |.Js..!m`l..n^^8.|+00000440  08 0f d8 13 b6 f9 a0 65  d3 15 db 85 26 9e 47 3b  |HO.S...e.U..&.G;|+00000450  28 26 c4 2b 62 50 0c 91  2a 5e 15 87 c5 21 31 0c  |(&.+bPL.*^U..!1L|+00000460  e9 90 38 18 cd 89 bd 4f  fa ce 7e 3e d8 b0 f4 2e  |..8X...O..~>....|+00000470  d6 4d fa be 0c 0e 42 ac  67 c3 33 07 ac 70 34 01  |.M..LNB.g.3G.p4A|+00000480  3c f8 07 eb ce 46 9a 09  b6 2e ee 68 ec f3 bc 8f  |<.G..F.I...h....|+00000490  de 3f ef bf 63 19 b7 3e  f8 b3 8d bd 00 fa 31 27  |.?..cY.>....@.1'|+000004a0  bf c1 a2 0b 6b 26 25 e6  5e 3f f7 4d 4f c2 43 75  |...Kk&%.^?.MO.Cu|+000004b0  45 7c f5 d6 9d ee eb e7  e8 78 32 4b 51 de aa 9d  |E|.......x2KQ...|+000004c0  59 92 d7 e4 fb f2 0a --  -- -- -- -- -- -- -- --  |Y.....J---------| Hello.pdf:    28:  1:   1223:	-000004c0:  -- -- -- -- -- -- -- be  f7 e4 d5 a4 0d f9 67 79  |-------.....M.gy|-000004d0:  15 ef bd b6 5c 3d ca 0b  ff 93 b9 cd 21 46 3b 92  |U...\=.K....!F;.|-000004e0:  cd 41 ce 3c 9b 51 b4 71  c6 1b c0 21 b8 a9 45 73  |.A.<.Q.q.[.!..Es|-000004f0:  f6 b7 59 4c b2 e9 b6 62  b4 60 c9 42 94 9d ab b8  |..YL...b.`.B....|-00000500:  ff cb 09 f3 c3 3c b7 b1  52 73 2e ee f0 bc b7 3f  |..I..<..Rs.....?|-00000510:  63 36 cd f7 8a 0f 8b 74  be 4f bb ac ad 6b 9f 68  |c6...O.t.O...k.h|-00000520:  3f 6a 7f 68 2b da c7 40  bf 4b 1f 4a 5f 4a df 4a  |?j~h+..@.K_J_J.J|-00000530:  57 a4 ab d2 0d 52 a5 6b  d2 b2 f4 9d f4 bd f4 b9  |W...MR.k........|-00000540:  f4 35 7a 5f 40 ba 2c 5d  e9 d8 49 71 ec 1b bb 07  |.5z_@.,]..Iq.[.G|-00000550:  7e c6 7b d6 68 ed 30 66  86 b3 14 10 f3 c2 da cc  |~.{.h.0f..TP....|-00000560:  0a -- -- -- -- -- -- --  -- -- -- -- -- -- -- --  |J---------------|+000004c0  -- -- -- -- -- -- -- be  f7 e4 d5 a4 0d f9 67 79  |-------.....M.gy|+000004d0  15 ef bd b6 5c 3d ca 0b  ff 93 b9 cd 21 46 3b 92  |U...\=.K....!F;.|+000004e0  cd 41 ce 3c 9b 51 b4 71  c6 1b c0 21 b8 a9 45 73  |.A.<.Q.q.[.!..Es|+000004f0  f6 b7 59 4c b2 e9 b6 62  b4 60 c9 42 94 9d ab b8  |..YL...b.`.B....|+00000500  ff cb 09 f3 c3 3c b7 b1  52 73 2e ee f0 bc b7 3f  |..I..<..Rs.....?|+00000510  63 36 cd f7 8a 0f 8b 74  be 4f bb ac ad 6b 9f 68  |c6...O.t.O...k.h|+00000520  3f 6a 7f 68 2b da c7 40  bf 4b 1f 4a 5f 4a df 4a  |?j~h+..@.K_J_J.J|+00000530  57 a4 ab d2 0d 52 a5 6b  d2 b2 f4 9d f4 bd f4 b9  |W...MR.k........|+00000540  f4 35 7a 5f 40 ba 2c 5d  e9 d8 49 71 ec 1b bb 07  |.5z_@.,]..Iq.[.G|+00000550  7e c6 7b d6 68 ed 30 66  86 b3 14 10 f3 c2 da cc  |~.{.h.0f..TP....|+00000560  0a -- -- -- -- -- -- --  -- -- -- -- -- -- -- --  |J---------------| Hello.pdf:    29:  1:   1377:	-00000560:  -- 4b 1f f1 77 06 63 9b  f9 33 a1 d5 5e 03 9d bb  |-K_.wFc..3..^C..|-00000570:  7f 63 2d e5 88 b2 53 79  46 19 56 76 2b cf 29 13  |~c-...SyFYVv+.)S|-00000580:  4a af 72 40 39 ac 6c 57  06 d0 fa 95 51 65 2f 46  |J.r@9.lWF...Qe/F|-00000590:  76 6e b0 64 63 3d ce 80  85 7f 92 67 8b a6 23 ae  |vn.dc=...~.g..#.|-000005a0:  e2 3c b1 57 75 b0 e7 c3  4b 1d ef a6 5f 5c c3 d6  |.<.Wu...K].._\..|-000005b0:  86 35 d8 49 3d 0e 9e d9  da a6 0e af 11 57 bf 15  |.5.I=N....N.QW.U|-000005c0:  55 63 bc 3b 5d 9c 06 3a  4d 21 62 8b ce 22 72 1f  |Uc.;].F:M!b.."r_|-000005d0:  3a 9c 1f 27 aa fe ce d9  5c 93 38 35 52 6f e2 94  |:._'....\.85Ro..|-000005e0:  b0 c4 2e d1 2f c6 5a 35  98 13 07 50 85 e3 6d f5  |..../.Z5.SGP..m.|-000005f0:  38 c8 55 9a 19 c9 0c 67  72 a4 66 7a 33 43 99 fe  |8.U.Y.Lgr.fz3C..|-00000600:  cc 31 c6 51 ac d1 f9 92  d9 8b d1 21 7c 47 12 de  |.1.Q.......!|GR.|-00000610:  33 cb 31 ff 9b 35 c4 67  18 ef 1d e6 a8 09 6c a3  |3.1..5.gX.]..Il.|-00000620:  87 5b 2b 34 e7 71 df 11  e5 5d 6f c1 b7 66 ea a1  |.[+4.q.Q.]o..f..|-00000630:  3a a0 69 2f a9 39 5c af  a6 3a e6 18 d9 3e 55 b7  |:.i/.9\..:.X.>U.|-00000640:  6d 35 1a 0a -- -- -- --  -- -- -- -- -- -- -- --  |m5ZJ------------|+00000560  -- 4b 1f f1 77 06 63 9b  f9 33 a1 d5 5e 03 9d bb  |-K_.wFc..3..^C..|+00000570  7f 63 2d e5 88 b2 53 79  46 19 56 76 2b cf 29 13  |~c-...SyFYVv+.)S|+00000580  4a af 72 40 39 ac 6c 57  06 d0 fa 95 51 65 2f 46  |J.r@9.lWF...Qe/F|+00000590  76 6e b0 64 63 3d ce 80  85 7f 92 67 8b a6 23 ae  |vn.dc=...~.g..#.|+000005a0  e2 3c b1 57 75 b0 e7 c3  4b 1d ef a6 5f 5c c3 d6  |.<.Wu...K].._\..|+000005b0  86 35 d8 49 3d 0e 9e d9  da a6 0e af 11 57 bf 15  |.5.I=N....N.QW.U|+000005c0  55 63 bc 3b 5d 9c 06 3a  4d 21 62 8b ce 22 72 1f  |Uc.;].F:M!b.."r_|+000005d0  3a 9c 1f 27 aa fe ce d9  5c 93 38 35 52 6f e2 94  |:._'....\.85Ro..|+000005e0  b0 c4 2e d1 2f c6 5a 35  98 13 07 50 85 e3 6d f5  |..../.Z5.SGP..m.|+000005f0  38 c8 55 9a 19 c9 0c 67  72 a4 66 7a 33 43 99 fe  |8.U.Y.Lgr.fz3C..|+00000600  cc 31 c6 51 ac d1 f9 92  d9 8b d1 21 7c 47 12 de  |.1.Q.......!|GR.|+00000610  33 cb 31 ff 9b 35 c4 67  18 ef 1d e6 a8 09 6c a3  |3.1..5.gX.]..Il.|+00000620  87 5b 2b 34 e7 71 df 11  e5 5d 6f c1 b7 66 ea a1  |.[+4.q.Q.]o..f..|+00000630  3a a0 69 2f a9 39 5c af  a6 3a e6 18 d9 3e 55 b7  |:.i/.9\..:.X.>U.|+00000640  6d 35 1a 0a -- -- -- --  -- -- -- -- -- -- -- --  |m5ZJ------------| Hello.pdf:    30:  1:   1604:	-00000640:  -- -- -- -- 54 df 0c 4c  bf 69 56 b3 c4 77 37 cf  |----T.LL.iV..w7.|-00000650:  23 fa eb f5 e8 4e 4e 6d  bb 61 34 fc 66 2c a3 54  |#....NNm.a4.f,.T|-00000660:  ea 26 d1 7f b7 8f 93 34  0a -- -- -- -- -- -- --  |.&.~...4J-------|-Hello.pdf:    31:  1:   1641:	endstream-Hello.pdf:    32:  1:   1651:	endobj-Hello.pdf:    33:  1:   1658:	10 0 obj-Hello.pdf:    34:  1:   1667:	1116-Hello.pdf:    35:  1:   1672:	endobj-Hello.pdf:    36:  1:   1679:	7 0 obj-Hello.pdf:    37:  1:   1687:	[ /ICCBased 9 0 R ]-Hello.pdf:    38:  1:   1707:	endobj-Hello.pdf:    39:  1:   1714:	3 0 obj-Hello.pdf:    40:  1:   1722:	<< /Type /Pages /MediaBox [0 0 612 792] /Count 1 /Kids [ 2 0 R ] >>-Hello.pdf:    41:  1:   1790:	endobj-Hello.pdf:    42:  1:   1797:	11 0 obj-Hello.pdf:    43:  1:   1806:	<< /Type /Catalog /Pages 3 0 R >>-Hello.pdf:    44:  1:   1840:	endobj-Hello.pdf:    45:  1:   1847:	8 0 obj-Hello.pdf:    46:  1:   1855:	<< /Type /Font /Subtype /TrueType /BaseFont /GQTMZF+Menlo-Regular /FontDescriptor-Hello.pdf:    47:  1:   1937:	12 0 R /Encoding /MacRomanEncoding /FirstChar 72 /LastChar 111 /Widths [ 602-Hello.pdf:    48:  1:   2014:	0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 602 0 0 0 0 0 0 602-Hello.pdf:    49:  1:   2090:	0 0 602 ] >>-Hello.pdf:    50:  1:   2103:	endobj-Hello.pdf:    51:  1:   2110:	12 0 obj-Hello.pdf:    52:  1:   2119:	<< /Type /FontDescriptor /FontName /GQTMZF+Menlo-Regular /Flags 33 /FontBBox-Hello.pdf:    53:  1:   2196:	[-558 -375 718 1041] /ItalicAngle 0 /Ascent 928 /Descent -236 /CapHeight 729-Hello.pdf:    54:  1:   2273:	/StemV 99 /XHeight 547 /StemH 83 /AvgWidth 602 /MaxWidth 602 /FontFile2 13 0 R-Hello.pdf:    55:  1:   2352:	>>-Hello.pdf:    56:  1:   2355:	endobj-Hello.pdf:    57:  1:   2362:	13 0 obj-Hello.pdf:    58:  1:   2371:	<< /Length 14 0 R /Length1 4064 /Filter /FlateDecode >>-Hello.pdf:    59:  1:   2427:	stream+00000640  -- -- -- -- 54 df 0c 4c  bf 69 56 b3 c4 77 37 cf  |----T.LL.iV..w7.|+00000650  23 fa eb f5 e8 4e 4e 6d  bb 61 34 fc 66 2c a3 54  |#....NNm.a4.f,.T|+00000660  ea 26 d1 7f b7 8f 93 34  0a -- -- -- -- -- -- --  |.&.~...4J-------|+Hello.pdf:    31:  1:   1641:	endstream+Hello.pdf:    32:  1:   1651:	endobj+Hello.pdf:    33:  1:   1658:	10 0 obj+Hello.pdf:    34:  1:   1667:	1116+Hello.pdf:    35:  1:   1672:	endobj+Hello.pdf:    36:  1:   1679:	7 0 obj+Hello.pdf:    37:  1:   1687:	[ /ICCBased 9 0 R ]+Hello.pdf:    38:  1:   1707:	endobj+Hello.pdf:    39:  1:   1714:	3 0 obj+Hello.pdf:    40:  1:   1722:	<< /Type /Pages /MediaBox [0 0 612 792] /Count 1 /Kids [ 2 0 R ] >>+Hello.pdf:    41:  1:   1790:	endobj+Hello.pdf:    42:  1:   1797:	11 0 obj+Hello.pdf:    43:  1:   1806:	<< /Type /Catalog /Pages 3 0 R >>+Hello.pdf:    44:  1:   1840:	endobj+Hello.pdf:    45:  1:   1847:	8 0 obj+Hello.pdf:    46:  1:   1855:	<< /Type /Font /Subtype /TrueType /BaseFont /GQTMZF+Menlo-Regular /FontDescriptor+Hello.pdf:    47:  1:   1937:	12 0 R /Encoding /MacRomanEncoding /FirstChar 72 /LastChar 111 /Widths [ 602+Hello.pdf:    48:  1:   2014:	0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 602 0 0 0 0 0 0 602+Hello.pdf:    49:  1:   2090:	0 0 602 ] >>+Hello.pdf:    50:  1:   2103:	endobj+Hello.pdf:    51:  1:   2110:	12 0 obj+Hello.pdf:    52:  1:   2119:	<< /Type /FontDescriptor /FontName /GQTMZF+Menlo-Regular /Flags 33 /FontBBox+Hello.pdf:    53:  1:   2196:	[-558 -375 718 1041] /ItalicAngle 0 /Ascent 928 /Descent -236 /CapHeight 729+Hello.pdf:    54:  1:   2273:	/StemV 99 /XHeight 547 /StemH 83 /AvgWidth 602 /MaxWidth 602 /FontFile2 13 0 R+Hello.pdf:    55:  1:   2352:	>>+Hello.pdf:    56:  1:   2355:	endobj+Hello.pdf:    57:  1:   2362:	13 0 obj+Hello.pdf:    58:  1:   2371:	<< /Length 14 0 R /Length1 4064 /Filter /FlateDecode >>+Hello.pdf:    59:  1:   2427:	stream Hello.pdf:    60:  1:   2434:	-00000980:  -- -- 78 01 dd 57 7b 78  54 c5 15 3f 73 7f 77 36  |--xA.W{xT.U?s~w6|-00000990:  af cd 3e 92 4d 48 48 80  5d d6 e5 95 2c 81 84 b7  |..>.MHH.]...,...|-000009a0:  52 16 48 78 88 20 2f eb  2e 88 f2 48 20 28 21 08  |RVHx. /....H (!H|-000009b0:  41 b4 31 90 4a 51 09 c1  40 85 08 48 7d 15 51 a9  |A.1.JQI.@.HH}UQ.|-000009c0:  b5 2b 45 5d 09 c4 54 a4  62 23 45 84 a0 02 0a --  |.+E]I.T.b#E..BJ-|+00000980  -- -- 78 01 dd 57 7b 78  54 c5 15 3f 73 7f 77 36  |--xA.W{xT.U?s~w6|+00000990  af cd 3e 92 4d 48 48 80  5d d6 e5 95 2c 81 84 b7  |..>.MHH.]...,...|+000009a0  52 16 48 78 88 20 2f eb  2e 88 f2 48 20 28 21 08  |RVHx. /....H (!H|+000009b0  41 b4 31 90 4a 51 09 c1  40 85 08 48 7d 15 51 a9  |A.1.JQI.@.HH}UQ.|+000009c0  b5 2b 45 5d 09 c4 54 a4  62 23 45 84 a0 02 0a --  |.+E]I.T.b#E..BJ-| Hello.pdf:    61:  1:   2511:	-000009c0:  -- -- -- -- -- -- -- --  -- -- -- -- -- -- -- f8  |---------------.|-000009d0:  a2 68 8a 14 21 d8 00 43  cf bd 1b fd 3e ed d7 ef  |.h.T!.@C..[.>...|-000009e0:  eb bf ed dc 9d 33 e7 fc  e6 cc 79 dd bb f7 ce 94  |.....3....y.....|-000009f0:  2d 5c 5c 44 56 aa 24 50  60 56 c9 8c 05 64 36 eb  |-\\DV.$P`V..Ed6.|-00000a00:  49 1e 8a 67 dd 53 e6 36  45 8a bd 97 48 cb 9d bd  |I^.g.S.6E...H...|-00000a10:  60 4e 49 54 8e 7f 91 e5  4e 73 e6 dd 37 3b 2a 27  |`NIT.~..Ns..7;*'|-00000a20:  4e 66 79 40 71 d1 8c c2  a8 4c 57 78 ec 57 cc 40  |Nfy@q....LWx.W.@|-00000a30:  54 16 7d 78 bc ae b8 a4  8c ed 18 cd fa 2e 13 d7  |TV}x......X...S.|-00000a40:  bc d2 59 6d f3 89 a3 0c  b0 64 c6 bd 6d fe e9 38  |..Ym...L.d..m..8|-00000a50:  cb ee f9 33 4a 8a 78 e4  66 8f 30 e9 b6 a0 74 51  |...3J.x.f.0...tQ|-00000a60:  99 29 92 bd 9a c7 ec 05  0b 8b da f4 45 90 28 a6  |.).....EK...E.(.|-00000a70:  53 74 ae 8d 1a 96 05 77  a9 59 29 8b ee 22 0b 69  |St..Z.Ew.Y).."Ki|-00000a80:  e4 a0 8d 94 c4 d0 ad ac  2b 79 d6 98 d7 62 b2 96  |........+y...b..|-00000a90:  3e 7d f6 8d 3b ec 37 5c  a4 4e b1 e6 e2 bd 65 e9  |>}..;.7\.N....e.|-00000aa0:  79 06 73 28 b8 a4 df e5  95 57 85 ac 8f bd 85 c5  |yFs(.....W......|-00000ab0:  e8 a4 31 c1 eb 62 4a 54  07 22 fd e0 e5 95 d7 92  |..1..bJTG"......|-00000ac0:  65 bd 69 c9 98 f9 be c9  08 c5 66 bd ae 55 8a 94  |e.i.....H.f..U..|-00000ad0:  ed eb a6 c9 a1 99 22 85  6a 09 4c 2b 49 17 2e 52  |......".jIL+IW.R|-00000ae0:  cc 27 9b 34 89 03 82 70  9a bc c3 a4 76 da c4 88  |.'.4.C.p....v...|-00000af0:  cd e4 13 b7 7f 3d 52 0e  f5 89 44 aa 60 cc 4a 3e  |..S.~=RN..D.`.J>|-00000b00:  a6 09 94 cb 34 de b4 17  67 6a c5 92 8d 91 18 93  |.I..4..Wgj....X.|-00000b10:  b7 98 3a d2 e4 75 13 87  89 68 26 22 02 21 05 a5  |..:..uS..h&"B!E.|-00000b20:  70 b5 02 57 14 2e 2b b4  e6 e2 9f 75 f8 ae 02 97  |p.BWT.+....u..B.|-00000b30:  5a aa e5 25 85 4b 0d 7a  cb c5 90 6c a9 46 4b a5  |Z..%.KMz...l.FK.|-00000b40:  7e f1 42 17 79 31 84 8b  01 fd 42 17 7c 7b 3e 47  |~.BWy1..A.BW|{>G|-00000b50:  7e db 8a f3 39 f8 87 c2  39 85 6f 72 71 d6 85 bf  |~...9...9.orq...|-00000b60:  d7 a2 99 43 6c 56 68 8e  5c 3b 18 b8 a6 7f 3d 12  |...ClVh.\;X..~=R|-00000b70:  5f 9d 29 94 5f d5 e2 4c  21 fe a6 70 fa cb 0c 79  |_.)._..L!..p..Ly|-00000b80:  5a e1 cb 0c 7c a1 f0 f9  5d f8 4c e1 d3 3a 9c 3a  |Z..L|...].L..:.:|-00000b90:  99 2e 4f b5 e2 64 3a 4e  d4 e2 13 85 8f 15 8e 1f  |..O..d:N..S..U._|-00000ba0:  4b 91 c7 15 8e a5 e0 68  2d 3e fa 30 45 7e a4 f0  |K..U...h->.0E~..|-00000bb0:  e1 ea 04 f9 61 0a -- --  -- -- -- -- -- -- -- --  |..D.aJ----------|+000009c0  -- -- -- -- -- -- -- --  -- -- -- -- -- -- -- f8  |---------------.|+000009d0  a2 68 8a 14 21 d8 00 43  cf bd 1b fd 3e ed d7 ef  |.h.T!.@C..[.>...|+000009e0  eb bf ed dc 9d 33 e7 fc  e6 cc 79 dd bb f7 ce 94  |.....3....y.....|+000009f0  2d 5c 5c 44 56 aa 24 50  60 56 c9 8c 05 64 36 eb  |-\\DV.$P`V..Ed6.|+00000a00  49 1e 8a 67 dd 53 e6 36  45 8a bd 97 48 cb 9d bd  |I^.g.S.6E...H...|+00000a10  60 4e 49 54 8e 7f 91 e5  4e 73 e6 dd 37 3b 2a 27  |`NIT.~..Ns..7;*'|+00000a20  4e 66 79 40 71 d1 8c c2  a8 4c 57 78 ec 57 cc 40  |Nfy@q....LWx.W.@|+00000a30  54 16 7d 78 bc ae b8 a4  8c ed 18 cd fa 2e 13 d7  |TV}x......X...S.|+00000a40  bc d2 59 6d f3 89 a3 0c  b0 64 c6 bd 6d fe e9 38  |..Ym...L.d..m..8|+00000a50  cb ee f9 33 4a 8a 78 e4  66 8f 30 e9 b6 a0 74 51  |...3J.x.f.0...tQ|+00000a60  99 29 92 bd 9a c7 ec 05  0b 8b da f4 45 90 28 a6  |.).....EK...E.(.|+00000a70  53 74 ae 8d 1a 96 05 77  a9 59 29 8b ee 22 0b 69  |St..Z.Ew.Y).."Ki|+00000a80  e4 a0 8d 94 c4 d0 ad ac  2b 79 d6 98 d7 62 b2 96  |........+y...b..|+00000a90  3e 7d f6 8d 3b ec 37 5c  a4 4e b1 e6 e2 bd 65 e9  |>}..;.7\.N....e.|+00000aa0  79 06 73 28 b8 a4 df e5  95 57 85 ac 8f bd 85 c5  |yFs(.....W......|+00000ab0  e8 a4 31 c1 eb 62 4a 54  07 22 fd e0 e5 95 d7 92  |..1..bJTG"......|+00000ac0  65 bd 69 c9 98 f9 be c9  08 c5 66 bd ae 55 8a 94  |e.i.....H.f..U..|+00000ad0  ed eb a6 c9 a1 99 22 85  6a 09 4c 2b 49 17 2e 52  |......".jIL+IW.R|+00000ae0  cc 27 9b 34 89 03 82 70  9a bc c3 a4 76 da c4 88  |.'.4.C.p....v...|+00000af0  cd e4 13 b7 7f 3d 52 0e  f5 89 44 aa 60 cc 4a 3e  |..S.~=RN..D.`.J>|+00000b00  a6 09 94 cb 34 de b4 17  67 6a c5 92 8d 91 18 93  |.I..4..Wgj....X.|+00000b10  b7 98 3a d2 e4 75 13 87  89 68 26 22 02 21 05 a5  |..:..uS..h&"B!E.|+00000b20  70 b5 02 57 14 2e 2b b4  e6 e2 9f 75 f8 ae 02 97  |p.BWT.+....u..B.|+00000b30  5a aa e5 25 85 4b 0d 7a  cb c5 90 6c a9 46 4b a5  |Z..%.KMz...l.FK.|+00000b40  7e f1 42 17 79 31 84 8b  01 fd 42 17 7c 7b 3e 47  |~.BWy1..A.BW|{>G|+00000b50  7e db 8a f3 39 f8 87 c2  39 85 6f 72 71 d6 85 bf  |~...9...9.orq...|+00000b60  d7 a2 99 43 6c 56 68 8e  5c 3b 18 b8 a6 7f 3d 12  |...ClVh.\;X..~=R|+00000b70  5f 9d 29 94 5f d5 e2 4c  21 fe a6 70 fa cb 0c 79  |_.)._..L!..p..Ly|+00000b80  5a e1 cb 0c 7c a1 f0 f9  5d f8 4c e1 d3 3a 9c 3a  |Z..L|...].L..:.:|+00000b90  99 2e 4f b5 e2 64 3a 4e  d4 e2 13 85 8f 15 8e 1f  |..O..d:N..S..U._|+00000ba0  4b 91 c7 15 8e a5 e0 68  2d 3e fa 30 45 7e a4 f0  |K..U...h->.0E~..|+00000bb0  e1 ea 04 f9 61 0a -- --  -- -- -- -- -- -- -- --  |..D.aJ----------| Hello.pdf:    62:  1:   2998:	-00000bb0:  -- -- -- -- -- -- 3e a8  c0 91 41 68 62 a1 69 10  |------>...Ahb.iP|-00000bc0:  0e 2b 1c 7a 3f 5e 1e 52  78 3f 1e 07 15 de 53 38  |N+\z?^^Rx?^GU.S8|-00000bd0:  50 e5 94 07 32 f1 d7 54  ec 57 78 b7 16 8d ab 7c  |P..G2..T.Wx.V..||-00000be0:  b2 51 e1 2f 0a -- -- --  -- -- -- -- -- -- -- --  |.Q./J-----------|+00000bb0  -- -- -- -- -- -- 3e a8  c0 91 41 68 62 a1 69 10  |------>...Ahb.iP|+00000bc0  0e 2b 1c 7a 3f 5e 1e 52  78 3f 1e 07 15 de 53 38  |N+\z?^^Rx?^GU.S8|+00000bd0  50 e5 94 07 32 f1 d7 54  ec 57 78 b7 16 8d ab 7c  |P..G2..T.Wx.V..||+00000be0  b2 51 e1 2f 0a -- -- --  -- -- -- -- -- -- -- --  |.Q./J-----------| Hello.pdf:    63:  1:   3045:	-00000be0:  -- -- -- -- -- ef 54 60  9f c2 db 0a -- -- -- --  |-----.T`...J----|+00000be0  -- -- -- -- -- ef 54 60  9f c2 db 0a -- -- -- --  |-----.T`...J----| Hello.pdf:    64:  1:   3052:	-00000be0:  -- -- -- -- -- -- -- --  -- -- -- -- 7f 56 d8 bb  |------------~V..|-00000bf0:  29 51 be a5 b0 47 e1 4d  85 3f 29 34 b0 bd 06 17  |)Q...G.M.?)4..FW|-00000c00:  de b0 a2 7e 77 9d ac 57  d8 bd 6b 9a dc 5d 87 dd  |...~w..W..k..]..|-00000c10:  95 fa ae 3a 9f dc 35 0d  bb 02 7a 9d 0f 3b 15 5e  |...:..5M.Bz.O;U^|-00000c20:  af 45 a4 66 a8 7c 4d e1  55 1e 5e 6d c5 2b 6c 6b  |.E.f.|M.U^^m.+lk|-00000c30:  87 c2 1f 0b b1 bd 10 2f  db 10 4e c2 1f 14 5e 52  |.._K..P/.PN._T^R|-00000c40:  81 ab f8 bd c2 8b 0a --  -- -- -- -- -- -- -- --  |......J---------|+00000be0  -- -- -- -- -- -- -- --  -- -- -- -- 7f 56 d8 bb  |------------~V..|+00000bf0  29 51 be a5 b0 47 e1 4d  85 3f 29 34 b0 bd 06 17  |)Q...G.M.?)4..FW|+00000c00  de b0 a2 7e 77 9d ac 57  d8 bd 6b 9a dc 5d 87 dd  |...~w..W..k..]..|+00000c10  95 fa ae 3a 9f dc 35 0d  bb 02 7a 9d 0f 3b 15 5e  |...:..5M.Bz.O;U^|+00000c20  af 45 a4 66 a8 7c 4d e1  55 1e 5e 6d c5 2b 6c 6b  |.E.f.|M.U^^m.+lk|+00000c30  87 c2 1f 0b b1 bd 10 2f  db 10 4e c2 1f 14 5e 52  |.._K..P/.PN._T^R|+00000c40  81 ab f8 bd c2 8b 0a --  -- -- -- -- -- -- -- --  |......J---------| Hello.pdf:    65:  1:   3143:	-00000c40:  -- -- -- -- -- -- -- bf  4b c2 36 85 17 9e b7 c9  |-------.K.6.W...|-00000c50:  17 72 f1 bc 0d cf 6d 75  ca e7 ba 61 ab 13 cf 6e  |Wr..M.mu...a.S.n|-00000c60:  f1 cb 67 2b b0 c5 8f df  2a 3c a3 f0 b4 c2 53 4f  |..g+....*<....SO|-00000c70:  a6 cb a7 0a -- -- -- --  -- -- -- -- -- -- -- --  |...J------------|+00000c40  -- -- -- -- -- -- -- bf  4b c2 36 85 17 9e b7 c9  |-------.K.6.W...|+00000c50  17 72 f1 bc 0d cf 6d 75  ca e7 ba 61 ab 13 cf 6e  |Wr..M.mu...a.S.n|+00000c60  f1 cb 67 2b b0 c5 8f df  2a 3c a3 f0 b4 c2 53 4f  |..g+....*<....SO|+00000c70  a6 cb a7 0a -- -- -- --  -- -- -- -- -- -- -- --  |...J------------| Hello.pdf:    66:  1:   3188:	-00000c70:  -- -- -- -- f1 e4 13 0e  f9 64 3a 9e 70 e0 37 f1  |----..SN.d:.p.7.|-00000c80:  d8 ac f0 38 3b 79 5c 61  53 22 36 6e e8 29 37 2a  |...8;y\aS"6n.)7*|-00000c90:  6c e8 89 c7 d8 ff 63 b5  a8 5d 5f 27 6b 15 d6 f3  |l.....c..]_'kU..|-00000ca0:  b3 b5 be 0e eb 2b f5 75  6b 7c 72 dd 34 ac 0b e8  |...N.+.uk|r.4.K.|-00000cb0:  8f 2a fc 5a 61 2d cb 6b  eb b0 c6 87 1a 2e 46 cd  |.*.Za-.k....Z.F.|-00000cc0:  50 3c c2 d9 3e e2 c2 ea  04 54 33 50 5d 88 55 5c  |P<..>...DT3P].U\|-00000cd0:  b4 55 3e 54 39 b1 52 e1  61 85 87 14 1e 5c e1 94  |.U>T9.R.a..T^\..|-00000ce0:  0f 2a ac 70 e2 57 0a --  -- -- -- -- -- -- -- --  |O*.p.WJ---------|+00000c70  -- -- -- -- f1 e4 13 0e  f9 64 3a 9e 70 e0 37 f1  |----..SN.d:.p.7.|+00000c80  d8 ac f0 38 3b 79 5c 61  53 22 36 6e e8 29 37 2a  |...8;y\aS"6n.)7*|+00000c90  6c e8 89 c7 d8 ff 63 b5  a8 5d 5f 27 6b 15 d6 f3  |l.....c..]_'kU..|+00000ca0  b3 b5 be 0e eb 2b f5 75  6b 7c 72 dd 34 ac 0b e8  |...N.+.uk|r.4.K.|+00000cb0  8f 2a fc 5a 61 2d cb 6b  eb b0 c6 87 1a 2e 46 cd  |.*.Za-.k....Z.F.|+00000cc0  50 3c c2 d9 3e e2 c2 ea  04 54 33 50 5d 88 55 5c  |P<..>...DT3P].U\|+00000cd0  b4 55 3e 54 39 b1 52 e1  61 85 87 14 1e 5c e1 94  |.U>T9.R.a..T^\..|+00000ce0  0f 2a ac 70 e2 57 0a --  -- -- -- -- -- -- -- --  |O*.p.WJ---------| Hello.pdf:    67:  1:   3303:	-00000ce0:  -- -- -- -- -- -- -- cb  15 1e 70 0e 93 0f 4c c2  |-------.U^pN.OL.|-00000cf0:  2f 15 2a ef c5 b2 a5 15  72 99 c2 d2 0a -- -- --  |/U*....Ur...J---|+00000ce0  -- -- -- -- -- -- -- cb  15 1e 70 0e 93 0f 4c c2  |-------.U^pN.OL.|+00000cf0  2f 15 2a ef c5 b2 a5 15  72 99 c2 d2 0a -- -- --  |/U*....Ur...J---| Hello.pdf:    68:  1:   3325:	-00000cf0:  -- -- -- -- -- -- -- --  -- -- -- -- -- 54 74 c4  |-------------Tt.|-00000d00:  fd 0a -- -- -- -- -- --  -- -- -- -- -- -- -- --  |.J--------------|+00000cf0  -- -- -- -- -- -- -- --  -- -- -- -- -- 54 74 c4  |-------------Tt.|+00000d00  fd 0a -- -- -- -- -- --  -- -- -- -- -- -- -- --  |.J--------------| Hello.pdf:    69:  1:   3330:	-00000d00:  -- -- e5 36 fc 42 61 89  c2 3d 0a -- -- -- -- --  |--.6.Ba..=J-----|+00000d00  -- -- e5 36 fc 42 61 89  c2 3d 0a -- -- -- -- --  |--.6.Ba..=J-----| Hello.pdf:    70:  1:   3339:	-00000d00:  -- -- -- -- -- -- -- --  -- -- -- 8b cb ac 72 b1  |-----------...r.|-00000d10:  1d 8b 23 82 02 47 f5 32  2b ca 1a f4 45 49 58 14  |].#.BG.2+.Z.EIXT|-00000d20:  d0 17 2a dc ad b0 40 a1  74 fe 24 59 5a 8b f9 25  |.W*...@.t.$YZ..%|-00000d30:  dd e4 fc 49 28 e9 86 79  0a -- -- -- -- -- -- --  |...I(..yJ-------|+00000d00  -- -- -- -- -- -- -- --  -- -- -- 8b cb ac 72 b1  |-----------...r.|+00000d10  1d 8b 23 82 02 47 f5 32  2b ca 1a f4 45 49 58 14  |].#.BG.2+.Z.EIXT|+00000d20  d0 17 2a dc ad b0 40 a1  74 fe 24 59 5a 8b f9 25  |.W*...@.t.$YZ..%|+00000d30  dd e4 fc 49 28 e9 86 79  0a -- -- -- -- -- -- --  |...I(..yJ-------| Hello.pdf:    71:  1:   3385:	-00000d30:  -- -- -- -- -- -- -- --  -- 77 e5 e2 4e 85 b9 b9  |---------w..N...|-00000d40:  28 6e c5 9c 3a cc 56 28  52 28 54 98 35 b3 a3 9c  |(n..:.V(R(T.5...|-00000d50:  a5 30 93 1c 72 66 47 cc  50 98 ae 70 87 c2 ed 53  |.0.\rfG.P..p...S|-00000d60:  12 e4 ed 36 4c 2b c4 6d  fb 30 95 85 a9 2e 4c 49  |R..6L+.m.0....LI|-00000d70:  00 3f d1 41 17 6e 55 f8  b9 c2 2d 19 e9 f2 96 5c  |@?.AWnU...-Y...\|-00000d80:  4c 56 98 a4 30 51 61 42  05 c6 2b dc ec c2 38 85  |LV..0QaBE.+...8.|-00000d90:  b1 c2 2f c7 2a dc 54 87  31 dd 70 e3 e8 34 79 63  |../.*.T.1.p..4yc|-00000da0:  7f 8c 1e 9e 24 47 a7 61  54 41 9a 1c a5 30 92 a5  |~.^.$G.aTA.\.0..|-00000db0:  91 85 18 c1 d2 88 3a 14  a4 21 9f 81 fc fe 18 3e  |..X...:T.!....X>|-00000dc0:  cc 29 87 27 61 78 44 0b  04 e2 f4 61 43 ed 72 98  |.).'axDKD..aC.r.|-00000dd0:  13 c3 22 1a b1 34 34 60  93 43 ed 18 1a 11 0d 2c  |S."Z.44`.C.XZQM,|-00000de0:  05 86 58 65 c0 86 40 44  54 b2 34 c4 1a 27 87 58  |E.Xe..@DT.4.Z'.X|-00000df0:  31 24 22 02 81 42 fd 67  0a -- -- -- -- -- -- --  |1$"B.B.gJ-------|+00000d30  -- -- -- -- -- -- -- --  -- 77 e5 e2 4e 85 b9 b9  |---------w..N...|+00000d40  28 6e c5 9c 3a cc 56 28  52 28 54 98 35 b3 a3 9c  |(n..:.V(R(T.5...|+00000d50  a5 30 93 1c 72 66 47 cc  50 98 ae 70 87 c2 ed 53  |.0.\rfG.P..p...S|+00000d60  12 e4 ed 36 4c 2b c4 6d  fb 30 95 85 a9 2e 4c 49  |R..6L+.m.0....LI|+00000d70  00 3f d1 41 17 6e 55 f8  b9 c2 2d 19 e9 f2 96 5c  |@?.AWnU...-Y...\|+00000d80  4c 56 98 a4 30 51 61 42  05 c6 2b dc ec c2 38 85  |LV..0QaBE.+...8.|+00000d90  b1 c2 2f c7 2a dc 54 87  31 dd 70 e3 e8 34 79 63  |../.*.T.1.p..4yc|+00000da0  7f 8c 1e 9e 24 47 a7 61  54 41 9a 1c a5 30 92 a5  |~.^.$G.aTA.\.0..|+00000db0  91 85 18 c1 d2 88 3a 14  a4 21 9f 81 fc fe 18 3e  |..X...:T.!....X>|+00000dc0  cc 29 87 27 61 78 44 0b  04 e2 f4 61 43 ed 72 98  |.).'axDKD..aC.r.|+00000dd0  13 c3 22 1a b1 34 34 60  93 43 ed 18 1a 11 0d 2c  |S."Z.44`.C.XZQM,|+00000de0  05 86 58 65 c0 86 40 44  54 b2 34 c4 1a 27 87 58  |E.Xe..@DT.4.Z'.X|+00000df0  31 24 22 02 81 42 fd 67  0a -- -- -- -- -- -- --  |1$"B.B.gJ-------| Hello.pdf:    72:  1:   3577:	-00000df0:  -- -- -- -- -- -- -- --  -- 83 39 84 c1 ad b8 41  |---------.9....A|-00000e00:  e1 fa 6e 18 a4 30 90 0b  3c b0 10 03 7a b7 97 03  |..nX.0.K<.PCz..C|-00000e10:  c6 a0 bf 42 3f bf 4b f6  53 e8 3b 06 7d 7a b5 97  |...B?.K.S.;F}z..|-00000e20:  7d c6 20 8f 87 3c 85 5c  56 cc 55 e8 cd d3 bd db  |}. ..<.\V.U.....|-00000e30:  a3 57 7b e4 30 97 93 86  9e 71 a9 b2 67 1d fc d9  |.W{.0....q..g]..|-00000e40:  c9 d2 ef 82 3f a2 19 6e  b3 1d 4e 99 9d 8c 6c 23  |....?.Yn.]N...l#|-00000e50:  dc 5a 3d ab 87 4f 66 29  f4 60 cd 1e 3e 74 d7 06  |.Z=..Of).`.^>t.F|-00000e60:  c9 ee 0a -- -- -- -- --  -- -- -- -- -- -- -- --  |..J-------------|+00000df0  -- -- -- -- -- -- -- --  -- 83 39 84 c1 ad b8 41  |---------.9....A|+00000e00  e1 fa 6e 18 a4 30 90 0b  3c b0 10 03 7a b7 97 03  |..nX.0.K<.PCz..C|+00000e10  c6 a0 bf 42 3f bf 4b f6  53 e8 3b 06 7d 7a b5 97  |...B?.K.S.;F}z..|+00000e20  7d c6 20 8f 87 3c 85 5c  56 cc 55 e8 cd d3 bd db  |}. ..<.\V.U.....|+00000e30  a3 57 7b e4 30 97 93 86  9e 71 a9 b2 67 1d fc d9  |.W{.0....q..g]..|+00000e40  c9 d2 ef 82 3f a2 19 6e  b3 1d 4e 99 9d 8c 6c 23  |....?.Yn.]N...l#|+00000e50  dc 5a 3d ab 87 4f 66 29  f4 60 cd 1e 3e 74 d7 06  |.Z=..Of).`.^>t.F|+00000e60  c9 ee 0a -- -- -- -- --  -- -- -- -- -- -- -- --  |..J-------------| Hello.pdf:    73:  1:   3683:	-00000e60:  -- -- -- dd 14 ba 2a 74  b1 c3 97 3a 4c fa 0a --  |---.T.*t...:L.J-|+00000e60  -- -- -- dd 14 ba 2a 74  b1 c3 97 3a 4c fa 0a --  |---.T.*t...:L.J-| Hello.pdf:    74:  1:   3695:	-00000e60:  -- -- -- -- -- -- -- --  -- -- -- -- -- -- -- 70  |---------------p|-00000e70:  9d 1d 5e 85 ce 76 bb ec  ac e0 71 fb a5 a7 02 6e  |.]^..v....q...Bn|-00000e80:  3f 3a 8d 41 47 f6 dc 51  a1 83 42 26 d7 36 53 21  |?:.AG..Q..B&.6S!|-00000e90:  83 ef 4a 46 3a da 2b a4  2b a4 29 b4 63 0b ed 46  |..JF:.+.+.).cK.F|-00000ea0:  20 35 c5 2f 53 87 21 c5  e5 90 29 7e b8 1c 48 66  | 5./S.!...)~.\Hf|-00000eb0:  bd 64 17 92 78 7d 92 82  93 33 77 0e 83 83 3d 38  |.dW.x}...3wN..=8|-00000ec0:  9c 70 44 6b 67 b7 59 a5  dd 0e 7b b4 76 b6 c4 78  |.pDkg.Y..N{.v..x|-00000ed0:  69 b3 c2 16 ad 5d 22 d7  2e 31 1e 89 5c bb 1d ba  |i..V.]"..1^.\.].|-00000ee0:  35 0e 56 e3 d9 ea af 27  28 c4 73 26 f1 0a -- --  |5NV....'(.s&.J--|+00000e60  -- -- -- -- -- -- -- --  -- -- -- -- -- -- -- 70  |---------------p|+00000e70  9d 1d 5e 85 ce 76 bb ec  ac e0 71 fb a5 a7 02 6e  |.]^..v....q...Bn|+00000e80  3f 3a 8d 41 47 f6 dc 51  a1 83 42 26 d7 36 53 21  |?:.AG..Q..B&.6S!|+00000e90  83 ef 4a 46 3a da 2b a4  2b a4 29 b4 63 0b ed 46  |..JF:.+.+.).cK.F|+00000ea0  20 35 c5 2f 53 87 21 c5  e5 90 29 7e b8 1c 48 66  | 5./S.!...)~.\Hf|+00000eb0  bd 64 17 92 78 7d 92 82  93 33 77 0e 83 83 3d 38  |.dW.x}...3wN..=8|+00000ec0  9c 70 44 6b 67 b7 59 a5  dd 0e 7b b4 76 b6 c4 78  |.pDkg.Y..N{.v..x|+00000ed0  69 b3 c2 16 ad 5d 22 d7  2e 31 1e 89 5c bb 1d ba  |i..V.]"..1^.\.].|+00000ee0  35 0e 56 e3 d9 ea af 27  28 c4 73 26 f1 0a -- --  |5NV....'(.s&.J--| Hello.pdf:    75:  1:   3822:	-00000ee0:  -- -- -- -- -- -- -- --  -- -- -- -- -- -- 71 a9  |--------------q.|-00000ef0:  88 75 20 46 c1 c2 a6 2d  0a -- -- -- -- -- -- --  |.u F...-J-------|+00000ee0  -- -- -- -- -- -- -- --  -- -- -- -- -- -- 71 a9  |--------------q.|+00000ef0  88 75 20 46 c1 c2 a6 2d  0a -- -- -- -- -- -- --  |.u F...-J-------| Hello.pdf:    76:  1:   3833:	-00000ef0:  -- -- -- -- -- -- -- --  -- d2 05 70 72 68 85 c6  |---------.Eprh..|-00000f00:  80 36 08 82 03 10 7e 90  03 22 22 0a -- -- -- --  |.6H.CP~.C""J----|+00000ef0  -- -- -- -- -- -- -- --  -- d2 05 70 72 68 85 c6  |---------.Eprh..|+00000f00  80 36 08 82 03 10 7e 90  03 22 22 0a -- -- -- --  |.6H.CP~.C""J----| Hello.pdf:    77:  1:   3852:	-00000f00:  -- -- -- -- -- -- -- --  -- -- -- -- 57 ac 16 59  |------------W.VY|-00000f10:  ff 3f 8d fe c7 53 e1 4f  67 84 1a cd be 4d ac e5  |.?...S.Og.Z..M..|-00000f20:  d1 d8 47 44 e8 21 6d 19  7f a5 bf bf 22 b4 87 75  |..GD.!mY~..."..u|-00000f30:  34 53 2f 22 1a c5 4a b1  93 f9 ad bc b7 68 a4 e5  |4S/"Z.J......h..|-00000f40:  74 5e c4 e3 6d d1 9f b9  7a 5e 1b d4 3d 8c d6 d0  |t^..m...z^[.=...|-00000f50:  66 73 75 0d 4e d3 62 ec  a2 43 f4 0e 1d 63 ee b4  |fsuMN.b..C.N]c..|-00000f60:  18 08 5e 2b 0e 91 47 9c  60 3f 2b 7f f0 a1 a1 9e  |XH^+N.G.`?+~....|-00000f70:  a5 3d 4c cb 51 8f a0 e8  24 4a 68 8b 78 89 2d 96  |.=L.Q...$Jh.x.-.|-00000f80:  53 44 94 d2 32 8d 47 6d  22 5b de af 1f 64 74 3f  |SD..2.Gm"[.._dt?|-00000f90:  3d c4 d7 a3 b4 85 4a 99  37 32 58 ce f1 7f 4c 3b  |=.....J.72X..~L;|-00000fa0:  68 15 5d a0 0d da 19 9a  c2 fc 4e da cb f1 28 fe  |hU].M.Y...N...(.|-00000fb0:  fc 9a b9 88 26 6a 61 4b  db b4 c1 da 6c d6 db cb  |....&jaK....l...|-00000fc0:  d6 36 d1 26 b1 9c 9a 68  91 4e fc 29 57 74 4a 36  |.6.&...h.N.)WtJ6|-00000fd0:  69 59 6c 75 07 67 40 34  93 36 cb 26 b9 c1 a8 07  |iYluGg@4.6.&...G|-00000fe0:  8f 4d f2 1c cf 10 75 b0  44 2c ae 18 2f 67 61 d4  |.M.\.Pu.D,.X/ga.|-00000ff0:  6e ab d8 25 7a 6b e3 e8  10 af 2f a7 c9 b8 0d 77  |n..%zk..P./...Mw|-00001000:  e3 98 58 a1 7b f5 25 38  43 35 1a 61 3a dd 49 07  |..X.{.%8C5Za:.IG|-00001010:  64 93 c5 45 35 31 5e aa  b1 cc 16 f7 e9 d3 cd ab  |d..E51^...V.....|-00001020:  9c ad 95 6b 4b f4 e9 62  1b 9d 61 9b 33 f1 1d cb  |...kK..b[.a.3.].|-00001030:  1e 8e 6c b3 99 31 d1 0e  6d a2 1c 27 c7 71 ce b3  |^.l..1.Nm.\'.q..|-00001040:  19 db 6c d2 9a 28 b5 38  68 3f 5a b9 ee 6b 35 25  |Y.l..(.8h?Z..k5%|-00001050:  46 e9 23 30 84 f3 29 d7  6f a2 0d f4 0c db ed ca  |F.#0..).o.M.L...|-00001060:  95 21 2a 45 5f f6 5e 4a  e5 72 75 f4 a2 6d 7c f9  |.!*E_.^J.ru..m|.|-00001070:  e5 6a d4 72 45 cd 6a 88  3c 6d 30 6d d6 66 8b 55  |.j.rE.j.<m0m.f.U|-00001080:  1c 6d 0b 57 b3 14 f9 d4  9f 7d 74 90 67 69 85 d8  |\mKW.T...}t.gi..|-00001090:  c1 71 53 4c 05 2d 92 4d  bc 55 24 ea 41 f4 5a 8c  |.qSLE-.M.U$.A.Z.|-000010a0:  45 ea fc f7 a6 6c b7 23  ac f9 46 17 86 03 13 82  |E....l.#..FW.CS.|-000010b0:  ee 7d 21 8f 3f fb 27 a2  db 11 e3 0e d3 f8 70 e2  |.}!.?.'..Q.N..p.|-000010c0:  7d ee c8 b5 6b e3 83 7a  86 0c 85 65 66 18 be d8  |}...k..z.L.efX..|-000010d0:  b0 ee f3 9e fa 4f 93 a7  fc d9 63 c6 07 dd 11 d1  |.....O....c.G.Q.|-000010e0:  ae 20 bf cd 6c c1 f4 7c  06 27 05 d9 03 ff 0c 98  |. ..l..|F'E.C.L.|-000010f0:  dd 15 30 16 05 46 87 a5  8f 7f a3 a7 87 dd b3 8a  |.U0VEF...~......|-00001100:  dd 55 8e 2a ef a0 2a 47  d1 20 3f ef ff b2 c7 30  |.U.*..*G. ?....0|-00001110:  19 1f 7c 59 88 47 42 11  71 6d 45 84 f2 3b bc ce  |Y_|Y.GBQqmE..;..|-00001120:  bb 48 dc 71 3b 4f c7 65  bb dd 05 73 f3 c3 62 3a  |.H.q;O.e..Es..b:|-00001130:  0b f1 d9 0c f4 f0 30 97  90 ed 1e c1 61 8e 98 18  |K..L..0...^.a..X|-00001140:  f4 86 dc 55 ee aa d1 85  55 ee 11 ee e2 19 85 1c  |...U....U.Q..Y.\|-00001150:  b7 39 f2 44 51 55 28 87  33 98 14 9c cb 74 72 d0  |.9.DQU(.3.T..tr.|-00001160:  13 0e 84 32 7e 60 8b 42  21 c3 bb d5 b0 c3 4b 58  |SN.2~`.B!.....KX|-00001170:  bd 2a c4 16 ee 6c b3 c0  a3 09 e5 5c 65 a5 c4 ec  |.*.V.l...I.\e...|-00001180:  31 ee 30 ba 8c 0f 4e 08  86 2b f3 33 c2 81 fc 50  |1.0..ONH.+.3...P|-00001190:  86 c7 e3 2e 08 37 8c 0f  86 1b f2 33 3c a1 10 6b  |....H7.O.[.3<.Pk|-000011a0:  d9 7e 88 94 23 ae 98 9b  d6 16 b3 9d 63 b6 f5 e0  |.~..#....V..c...|-000011b0:  79 47 d4 0a -- -- -- --  -- -- -- -- -- -- -- --  |yG.J------------|+00000f00  -- -- -- -- -- -- -- --  -- -- -- -- 57 ac 16 59  |------------W.VY|+00000f10  ff 3f 8d fe c7 53 e1 4f  67 84 1a cd be 4d ac e5  |.?...S.Og.Z..M..|+00000f20  d1 d8 47 44 e8 21 6d 19  7f a5 bf bf 22 b4 87 75  |..GD.!mY~..."..u|+00000f30  34 53 2f 22 1a c5 4a b1  93 f9 ad bc b7 68 a4 e5  |4S/"Z.J......h..|+00000f40  74 5e c4 e3 6d d1 9f b9  7a 5e 1b d4 3d 8c d6 d0  |t^..m...z^[.=...|+00000f50  66 73 75 0d 4e d3 62 ec  a2 43 f4 0e 1d 63 ee b4  |fsuMN.b..C.N]c..|+00000f60  18 08 5e 2b 0e 91 47 9c  60 3f 2b 7f f0 a1 a1 9e  |XH^+N.G.`?+~....|+00000f70  a5 3d 4c cb 51 8f a0 e8  24 4a 68 8b 78 89 2d 96  |.=L.Q...$Jh.x.-.|+00000f80  53 44 94 d2 32 8d 47 6d  22 5b de af 1f 64 74 3f  |SD..2.Gm"[.._dt?|+00000f90  3d c4 d7 a3 b4 85 4a 99  37 32 58 ce f1 7f 4c 3b  |=.....J.72X..~L;|+00000fa0  68 15 5d a0 0d da 19 9a  c2 fc 4e da cb f1 28 fe  |hU].M.Y...N...(.|+00000fb0  fc 9a b9 88 26 6a 61 4b  db b4 c1 da 6c d6 db cb  |....&jaK....l...|+00000fc0  d6 36 d1 26 b1 9c 9a 68  91 4e fc 29 57 74 4a 36  |.6.&...h.N.)WtJ6|+00000fd0  69 59 6c 75 07 67 40 34  93 36 cb 26 b9 c1 a8 07  |iYluGg@4.6.&...G|+00000fe0  8f 4d f2 1c cf 10 75 b0  44 2c ae 18 2f 67 61 d4  |.M.\.Pu.D,.X/ga.|+00000ff0  6e ab d8 25 7a 6b e3 e8  10 af 2f a7 c9 b8 0d 77  |n..%zk..P./...Mw|+00001000  e3 98 58 a1 7b f5 25 38  43 35 1a 61 3a dd 49 07  |..X.{.%8C5Za:.IG|+00001010  64 93 c5 45 35 31 5e aa  b1 cc 16 f7 e9 d3 cd ab  |d..E51^...V.....|+00001020  9c ad 95 6b 4b f4 e9 62  1b 9d 61 9b 33 f1 1d cb  |...kK..b[.a.3.].|+00001030  1e 8e 6c b3 99 31 d1 0e  6d a2 1c 27 c7 71 ce b3  |^.l..1.Nm.\'.q..|+00001040  19 db 6c d2 9a 28 b5 38  68 3f 5a b9 ee 6b 35 25  |Y.l..(.8h?Z..k5%|+00001050  46 e9 23 30 84 f3 29 d7  6f a2 0d f4 0c db ed ca  |F.#0..).o.M.L...|+00001060  95 21 2a 45 5f f6 5e 4a  e5 72 75 f4 a2 6d 7c f9  |.!*E_.^J.ru..m|.|+00001070  e5 6a d4 72 45 cd 6a 88  3c 6d 30 6d d6 66 8b 55  |.j.rE.j.<m0m.f.U|+00001080  1c 6d 0b 57 b3 14 f9 d4  9f 7d 74 90 67 69 85 d8  |\mKW.T...}t.gi..|+00001090  c1 71 53 4c 05 2d 92 4d  bc 55 24 ea 41 f4 5a 8c  |.qSLE-.M.U$.A.Z.|+000010a0  45 ea fc f7 a6 6c b7 23  ac f9 46 17 86 03 13 82  |E....l.#..FW.CS.|+000010b0  ee 7d 21 8f 3f fb 27 a2  db 11 e3 0e d3 f8 70 e2  |.}!.?.'..Q.N..p.|+000010c0  7d ee c8 b5 6b e3 83 7a  86 0c 85 65 66 18 be d8  |}...k..z.L.efX..|+000010d0  b0 ee f3 9e fa 4f 93 a7  fc d9 63 c6 07 dd 11 d1  |.....O....c.G.Q.|+000010e0  ae 20 bf cd 6c c1 f4 7c  06 27 05 d9 03 ff 0c 98  |. ..l..|F'E.C.L.|+000010f0  dd 15 30 16 05 46 87 a5  8f 7f a3 a7 87 dd b3 8a  |.U0VEF...~......|+00001100  dd 55 8e 2a ef a0 2a 47  d1 20 3f ef ff b2 c7 30  |.U.*..*G. ?....0|+00001110  19 1f 7c 59 88 47 42 11  71 6d 45 84 f2 3b bc ce  |Y_|Y.GBQqmE..;..|+00001120  bb 48 dc 71 3b 4f c7 65  bb dd 05 73 f3 c3 62 3a  |.H.q;O.e..Es..b:|+00001130  0b f1 d9 0c f4 f0 30 97  90 ed 1e c1 61 8e 98 18  |K..L..0...^.a..X|+00001140  f4 86 dc 55 ee aa d1 85  55 ee 11 ee e2 19 85 1c  |...U....U.Q..Y.\|+00001150  b7 39 f2 44 51 55 28 87  33 98 14 9c cb 74 72 d0  |.9.DQU(.3.T..tr.|+00001160  13 0e 84 32 7e 60 8b 42  21 c3 bb d5 b0 c3 4b 58  |SN.2~`.B!.....KX|+00001170  bd 2a c4 16 ee 6c b3 c0  a3 09 e5 5c 65 a5 c4 ec  |.*.V.l...I.\e...|+00001180  31 ee 30 ba 8c 0f 4e 08  86 2b f3 33 c2 81 fc 50  |1.0..ONH.+.3...P|+00001190  86 c7 e3 2e 08 37 8c 0f  86 1b f2 33 3c a1 10 6b  |....H7.O.[.3<.Pk|+000011a0  d9 7e 88 94 23 ae 98 9b  d6 16 b3 9d 63 b6 f5 e0  |.~..#....V..c...|+000011b0  79 47 d4 0a -- -- -- --  -- -- -- -- -- -- -- --  |yG.J------------| Hello.pdf:    78:  1:   4532:	-000011b0:  -- -- -- -- 97 28 90 11  a6 50 55 95 61 73 52 d0  |----.(.Q.PU.asR.|-000011c0:  eb 09 57 56 55 65 54 71  1e 6d 72 84 1a 7e 02 08  |.IWVUeTq^mr.Z~BH|-000011d0:  fa 29 10 68 03 22 64 d8  e0 4a 14 f0 f7 60 3c 1b  |.)PhC"d..JT..`<[|-000011e0:  e3 c1 eb c9 30 00 af c7  eb e1 38 43 f9 ec db 69  |....0@....8C...i|-000011f0:  dc 9a 02 8e d4 13 f2 f3  6e 9c 8a b9 af e4 5e ce  |..B..S..n.....^.|-00001200:  fd 9c c1 f3 b3 18 dd e7  f3 f9 82 cf 00 53 58 1e  |.....X......@SX^|-00001210:  45 dd fe 6d bf ce f0 7f  d9 b4 1f e9 c1 94 74 93  |E..m...~.._...t.|-00001220:  76 e1 67 77 3b 9d 14 99  fc af 2f 56 b5 7a b1 dc  |v.gw;.T.../V.z..|-00001230:  c2 a7 aa 18 ea b4 cb dc  f3 13 59 84 eb 55 11 2b  |...X.....SY..UQ+|-00001240:  97 6b 3a e5 bc 75 b8 b9  37 39 0e 37 1f 6e ee 95  |.k:..u..79N7_n..|-00001250:  ec f4 38 7d 1e a7 a7 58  a7 2b 8b 90 71 e5 0b 55  |..8}^..X.+..q.KU|-00001260:  1b 63 fb ee fc 42 4b 77  c3 ac 30 72 d0 47 f1 bf  |[c...BKw..0r.G..|-00001270:  20 81 6e 36 4e 15 7c 6f  73 f8 d6 71 b7 3a f8 58  | .n6NU|os..q.:.X|-00001280:  f4 1e 77 e6 c5 71 c6 58  96 3c ea dc 63 18 17 2c  |.^w..q.X.<..cXW,|-00001290:  c7 bd c7 6f 0b 43 41 e7  6e e1 1e 9f b3 93 a3 8a  |...oKCA.n.^.....|-000012a0:  a5 84 ac 5e bd 93 f3 d8  75 9e d3 cb d4 bb b2 51  |...^....u......Q|-000012b0:  eb de d8 78 f5 83 46 d9  74 f5 2d ed 86 d6 2c ed  |...x..F.t.-...,.|-000012c0:  9b ab 4e f6 af 51 f9 b5  cf f8 ad 51 4e 29 94 49  |..N..Q.....QN).I|-000012d0:  79 46 04 3b 19 74 b0 81  08 69 ec 21 93 3d 65 e6  |yFD;Yt..Hi.!.=e.|-000012e0:  f0 3b cf 42 89 0c ee a4  64 4a 37 47 a3 0e 86 17  |.;.B.L..dJ7G.N.W|-000012f0:  91 e2 49 b1 a4 e6 e5 f6  eb 9f 62 13 5e 37 39 1d  |..I.......bS^79]|-00001300:  94 97 9b 14 d3 53 78 3b  5b 62 f4 e9 57 3e 8b 7d  |...T.Sx;[b..W>.}|-00001310:  e3 a5 60 43 c9 dc 3d 53  d5 65 75 54 b8 cf 1d b9  |..`C..=S.euT..].|-00001320:  14 b6 ae 7d 78 c5 8b b1  5a f5 14 cb 17 fb 06 0c  |T..}x...Z.T.W.FL|-00001330:  7c 2d 2b 4b 0c 14 c9 c2  2a 02 ea 93 c7 ca 5e 08  ||-+KLT..*B....^H|-00001340:  cf 37 ea 72 8e eb 32 c5  d2 9e bd 76 8d 46 95 c8  |.7.r..2....v.F..|-00001350:  b7 d8 88 ca a8 43 dc 71  8e 48 e7 53 9e 11 51 22  |.....C.q.H.S.QQ"|-00001360:  c5 47 23 71 a5 5e 2f 52  bc 9d bb f4 75 7a fa 7a  |.G#q.^/R....uz.z|-00001370:  b4 03 53 43 1f 9c 79 f6  15 f5 91 38 21 d6 df bf  |.CSC_.y.U..8!...|-00001380:  f4 f1 43 6f e2 e2 1a a3  e6 1a ad e4 9c 47 71 ce  |..Co..Z..Z...Gq.|-00001390:  09 d4 8e bc 81 64 4b 75  12 55 5b eb 93 36 a6 c5  |I....dKuRU[..6..|-000013a0:  25 d9 f3 91 94 f2 b3 34  c7 85 e6 2b c6 2d fc fc  |%......4...+.-..|-000013b0:  42 b3 e3 6c 2f d1 d9 92  e2 32 72 ec db a7 4b d7  |B..l/....2r...K.|-000013c0:  dc 24 a7 43 f3 76 d6 9c  8e 24 ad b8 7a cd 9a ea  |.$.C.v...$..z...|-000013d0:  d5 6b d6 ac 3e 73 a9 e5  ab 33 2d 2d 38 71 f4 48  |.k..>s...3--8q.H|-000013e0:  d3 b1 63 4d 47 8e 6e 56  ef ab 4f d5 29 75 48 f8  |..cMG.nV..O.)uH.|-000013f0:  f9 b3 d3 51 f4 34 fc 9a  ed da 52 f3 39 35 4e a7  |...Q.4....R.95N.|-00001400:  3f 6e 92 c5 2c 7e 7e 6f  a6 89 cc 09 3e 3a 46 75  |?n..,~~o...I>:Fu|-00001410:  2c c6 0b 72 e4 84 c9 63  a7 8c c8 1a 5b 34 7f 5e  |,.Kr...c...Z[4~^|-00001420:  a9 7f 62 d1 9c c5 f3 66  2c 24 fa 17 20 2d 06 e4  |.~b....f,$.W -F.|-00001430:  0a -- -- -- -- -- -- --  -- -- -- -- -- -- -- --  |J---------------|-Hello.pdf:    79:  1:   5169:	endstream-Hello.pdf:    80:  1:   5179:	endobj-Hello.pdf:    81:  1:   5186:	14 0 obj-Hello.pdf:    82:  1:   5195:	2734-Hello.pdf:    83:  1:   5200:	endobj-Hello.pdf:    84:  1:   5207:	15 0 obj-Hello.pdf:    85:  1:   5216:	(Hello)-Hello.pdf:    86:  1:   5224:	endobj-Hello.pdf:    87:  1:   5231:	16 0 obj-Hello.pdf:    88:  1:   5240:	(Mac OS X 10.12.6 Quartz PDFContext)-Hello.pdf:    89:  1:   5277:	endobj-Hello.pdf:    90:  1:   5284:	17 0 obj-Hello.pdf:    91:  1:   5293:	(TextEdit)-Hello.pdf:    92:  1:   5304:	endobj-Hello.pdf:    93:  1:   5311:	18 0 obj-Hello.pdf:    94:  1:   5320:	(D:20200124010711Z00'00')-Hello.pdf:    95:  1:   5346:	endobj-Hello.pdf:    96:  1:   5353:	19 0 obj-Hello.pdf:    97:  1:   5362:	()-Hello.pdf:    98:  1:   5365:	endobj-Hello.pdf:    99:  1:   5372:	20 0 obj-Hello.pdf:   100:  1:   5381:	[ ]-Hello.pdf:   101:  1:   5385:	endobj-Hello.pdf:   102:  1:   5392:	1 0 obj-Hello.pdf:   103:  1:   5400:	<< /Title 15 0 R /Producer 16 0 R /Creator 17 0 R /CreationDate 18 0 R /ModDate-Hello.pdf:   104:  1:   5480:	18 0 R /Keywords 19 0 R /AAPL:Keywords 20 0 R >>-Hello.pdf:   105:  1:   5529:	endobj-Hello.pdf:   106:  1:   5536:	xref-Hello.pdf:   107:  1:   5541:	0 21-Hello.pdf:   108:  1:   5546:	0000000000 65535 f -Hello.pdf:   109:  1:   5566:	0000005392 00000 n -Hello.pdf:   110:  1:   5586:	0000000238 00000 n -Hello.pdf:   111:  1:   5606:	0000001714 00000 n -Hello.pdf:   112:  1:   5626:	0000000022 00000 n -Hello.pdf:   113:  1:   5646:	0000000219 00000 n -Hello.pdf:   114:  1:   5666:	0000000342 00000 n -Hello.pdf:   115:  1:   5686:	0000001679 00000 n -Hello.pdf:   116:  1:   5706:	0000001847 00000 n -Hello.pdf:   117:  1:   5726:	0000000439 00000 n -Hello.pdf:   118:  1:   5746:	0000001658 00000 n -Hello.pdf:   119:  1:   5766:	0000001797 00000 n -Hello.pdf:   120:  1:   5786:	0000002110 00000 n -Hello.pdf:   121:  1:   5806:	0000002362 00000 n -Hello.pdf:   122:  1:   5826:	0000005186 00000 n -Hello.pdf:   123:  1:   5846:	0000005207 00000 n -Hello.pdf:   124:  1:   5866:	0000005231 00000 n -Hello.pdf:   125:  1:   5886:	0000005284 00000 n -Hello.pdf:   126:  1:   5906:	0000005311 00000 n -Hello.pdf:   127:  1:   5926:	0000005353 00000 n -Hello.pdf:   128:  1:   5946:	0000005372 00000 n -Hello.pdf:   129:  1:   5966:	trailer-Hello.pdf:   130:  1:   5974:	<< /Size 21 /Root 11 0 R /Info 1 0 R /ID [ <8db88d3335070bd9583341583cf769a3>-Hello.pdf:   131:  1:   6052:	<8db88d3335070bd9583341583cf769a3> ] >>-Hello.pdf:   132:  1:   6092:	startxref-Hello.pdf:   133:  1:   6102:	5536-Hello.pdf:   134:  1:   6107:	%%EOF-Hello.sh:     1:  1:      0:	#!/bin/sh-Hello.sh:     2:  1:     10:	echo "Hello World!"+000011b0  -- -- -- -- 97 28 90 11  a6 50 55 95 61 73 52 d0  |----.(.Q.PU.asR.|+000011c0  eb 09 57 56 55 65 54 71  1e 6d 72 84 1a 7e 02 08  |.IWVUeTq^mr.Z~BH|+000011d0  fa 29 10 68 03 22 64 d8  e0 4a 14 f0 f7 60 3c 1b  |.)PhC"d..JT..`<[|+000011e0  e3 c1 eb c9 30 00 af c7  eb e1 38 43 f9 ec db 69  |....0@....8C...i|+000011f0  dc 9a 02 8e d4 13 f2 f3  6e 9c 8a b9 af e4 5e ce  |..B..S..n.....^.|+00001200  fd 9c c1 f3 b3 18 dd e7  f3 f9 82 cf 00 53 58 1e  |.....X......@SX^|+00001210  45 dd fe 6d bf ce f0 7f  d9 b4 1f e9 c1 94 74 93  |E..m...~.._...t.|+00001220  76 e1 67 77 3b 9d 14 99  fc af 2f 56 b5 7a b1 dc  |v.gw;.T.../V.z..|+00001230  c2 a7 aa 18 ea b4 cb dc  f3 13 59 84 eb 55 11 2b  |...X.....SY..UQ+|+00001240  97 6b 3a e5 bc 75 b8 b9  37 39 0e 37 1f 6e ee 95  |.k:..u..79N7_n..|+00001250  ec f4 38 7d 1e a7 a7 58  a7 2b 8b 90 71 e5 0b 55  |..8}^..X.+..q.KU|+00001260  1b 63 fb ee fc 42 4b 77  c3 ac 30 72 d0 47 f1 bf  |[c...BKw..0r.G..|+00001270  20 81 6e 36 4e 15 7c 6f  73 f8 d6 71 b7 3a f8 58  | .n6NU|os..q.:.X|+00001280  f4 1e 77 e6 c5 71 c6 58  96 3c ea dc 63 18 17 2c  |.^w..q.X.<..cXW,|+00001290  c7 bd c7 6f 0b 43 41 e7  6e e1 1e 9f b3 93 a3 8a  |...oKCA.n.^.....|+000012a0  a5 84 ac 5e bd 93 f3 d8  75 9e d3 cb d4 bb b2 51  |...^....u......Q|+000012b0  eb de d8 78 f5 83 46 d9  74 f5 2d ed 86 d6 2c ed  |...x..F.t.-...,.|+000012c0  9b ab 4e f6 af 51 f9 b5  cf f8 ad 51 4e 29 94 49  |..N..Q.....QN).I|+000012d0  79 46 04 3b 19 74 b0 81  08 69 ec 21 93 3d 65 e6  |yFD;Yt..Hi.!.=e.|+000012e0  f0 3b cf 42 89 0c ee a4  64 4a 37 47 a3 0e 86 17  |.;.B.L..dJ7G.N.W|+000012f0  91 e2 49 b1 a4 e6 e5 f6  eb 9f 62 13 5e 37 39 1d  |..I.......bS^79]|+00001300  94 97 9b 14 d3 53 78 3b  5b 62 f4 e9 57 3e 8b 7d  |...T.Sx;[b..W>.}|+00001310  e3 a5 60 43 c9 dc 3d 53  d5 65 75 54 b8 cf 1d b9  |..`C..=S.euT..].|+00001320  14 b6 ae 7d 78 c5 8b b1  5a f5 14 cb 17 fb 06 0c  |T..}x...Z.T.W.FL|+00001330  7c 2d 2b 4b 0c 14 c9 c2  2a 02 ea 93 c7 ca 5e 08  ||-+KLT..*B....^H|+00001340  cf 37 ea 72 8e eb 32 c5  d2 9e bd 76 8d 46 95 c8  |.7.r..2....v.F..|+00001350  b7 d8 88 ca a8 43 dc 71  8e 48 e7 53 9e 11 51 22  |.....C.q.H.S.QQ"|+00001360  c5 47 23 71 a5 5e 2f 52  bc 9d bb f4 75 7a fa 7a  |.G#q.^/R....uz.z|+00001370  b4 03 53 43 1f 9c 79 f6  15 f5 91 38 21 d6 df bf  |.CSC_.y.U..8!...|+00001380  f4 f1 43 6f e2 e2 1a a3  e6 1a ad e4 9c 47 71 ce  |..Co..Z..Z...Gq.|+00001390  09 d4 8e bc 81 64 4b 75  12 55 5b eb 93 36 a6 c5  |I....dKuRU[..6..|+000013a0  25 d9 f3 91 94 f2 b3 34  c7 85 e6 2b c6 2d fc fc  |%......4...+.-..|+000013b0  42 b3 e3 6c 2f d1 d9 92  e2 32 72 ec db a7 4b d7  |B..l/....2r...K.|+000013c0  dc 24 a7 43 f3 76 d6 9c  8e 24 ad b8 7a cd 9a ea  |.$.C.v...$..z...|+000013d0  d5 6b d6 ac 3e 73 a9 e5  ab 33 2d 2d 38 71 f4 48  |.k..>s...3--8q.H|+000013e0  d3 b1 63 4d 47 8e 6e 56  ef ab 4f d5 29 75 48 f8  |..cMG.nV..O.)uH.|+000013f0  f9 b3 d3 51 f4 34 fc 9a  ed da 52 f3 39 35 4e a7  |...Q.4....R.95N.|+00001400  3f 6e 92 c5 2c 7e 7e 6f  a6 89 cc 09 3e 3a 46 75  |?n..,~~o...I>:Fu|+00001410  2c c6 0b 72 e4 84 c9 63  a7 8c c8 1a 5b 34 7f 5e  |,.Kr...c...Z[4~^|+00001420  a9 7f 62 d1 9c c5 f3 66  2c 24 fa 17 20 2d 06 e4  |.~b....f,$.W -F.|+00001430  0a -- -- -- -- -- -- --  -- -- -- -- -- -- -- --  |J---------------|+Hello.pdf:    79:  1:   5169:	endstream+Hello.pdf:    80:  1:   5179:	endobj+Hello.pdf:    81:  1:   5186:	14 0 obj+Hello.pdf:    82:  1:   5195:	2734+Hello.pdf:    83:  1:   5200:	endobj+Hello.pdf:    84:  1:   5207:	15 0 obj+Hello.pdf:    85:  1:   5216:	(Hello)+Hello.pdf:    86:  1:   5224:	endobj+Hello.pdf:    87:  1:   5231:	16 0 obj+Hello.pdf:    88:  1:   5240:	(Mac OS X 10.12.6 Quartz PDFContext)+Hello.pdf:    89:  1:   5277:	endobj+Hello.pdf:    90:  1:   5284:	17 0 obj+Hello.pdf:    91:  1:   5293:	(TextEdit)+Hello.pdf:    92:  1:   5304:	endobj+Hello.pdf:    93:  1:   5311:	18 0 obj+Hello.pdf:    94:  1:   5320:	(D:20200124010711Z00'00')+Hello.pdf:    95:  1:   5346:	endobj+Hello.pdf:    96:  1:   5353:	19 0 obj+Hello.pdf:    97:  1:   5362:	()+Hello.pdf:    98:  1:   5365:	endobj+Hello.pdf:    99:  1:   5372:	20 0 obj+Hello.pdf:   100:  1:   5381:	[ ]+Hello.pdf:   101:  1:   5385:	endobj+Hello.pdf:   102:  1:   5392:	1 0 obj+Hello.pdf:   103:  1:   5400:	<< /Title 15 0 R /Producer 16 0 R /Creator 17 0 R /CreationDate 18 0 R /ModDate+Hello.pdf:   104:  1:   5480:	18 0 R /Keywords 19 0 R /AAPL:Keywords 20 0 R >>+Hello.pdf:   105:  1:   5529:	endobj+Hello.pdf:   106:  1:   5536:	xref+Hello.pdf:   107:  1:   5541:	0 21+Hello.pdf:   108:  1:   5546:	0000000000 65535 f +Hello.pdf:   109:  1:   5566:	0000005392 00000 n +Hello.pdf:   110:  1:   5586:	0000000238 00000 n +Hello.pdf:   111:  1:   5606:	0000001714 00000 n +Hello.pdf:   112:  1:   5626:	0000000022 00000 n +Hello.pdf:   113:  1:   5646:	0000000219 00000 n +Hello.pdf:   114:  1:   5666:	0000000342 00000 n +Hello.pdf:   115:  1:   5686:	0000001679 00000 n +Hello.pdf:   116:  1:   5706:	0000001847 00000 n +Hello.pdf:   117:  1:   5726:	0000000439 00000 n +Hello.pdf:   118:  1:   5746:	0000001658 00000 n +Hello.pdf:   119:  1:   5766:	0000001797 00000 n +Hello.pdf:   120:  1:   5786:	0000002110 00000 n +Hello.pdf:   121:  1:   5806:	0000002362 00000 n +Hello.pdf:   122:  1:   5826:	0000005186 00000 n +Hello.pdf:   123:  1:   5846:	0000005207 00000 n +Hello.pdf:   124:  1:   5866:	0000005231 00000 n +Hello.pdf:   125:  1:   5886:	0000005284 00000 n +Hello.pdf:   126:  1:   5906:	0000005311 00000 n +Hello.pdf:   127:  1:   5926:	0000005353 00000 n +Hello.pdf:   128:  1:   5946:	0000005372 00000 n +Hello.pdf:   129:  1:   5966:	trailer+Hello.pdf:   130:  1:   5974:	<< /Size 21 /Root 11 0 R /Info 1 0 R /ID [ <8db88d3335070bd9583341583cf769a3>+Hello.pdf:   131:  1:   6052:	<8db88d3335070bd9583341583cf769a3> ] >>+Hello.pdf:   132:  1:   6092:	startxref+Hello.pdf:   133:  1:   6102:	5536+Hello.pdf:   134:  1:   6107:	%%EOF+Hello.sh:     1:  1:      0:	#!/bin/sh+Hello.sh:     2:  1:     10:	echo "Hello World!" Hello.txt:     1:  1:      0:	Hello

tests/out/Hello_-W-nvC1.out

deleted file mode 100644

tests/out/Hello_-W-nvC2.out

new file mode 100644

tests/out/Hello_-W-nvy.out

@@ -1,434 +1,466 @@-Hello.bat-1-#!/bin/sh-Hello.bat-2-echo "Hello World!"+Hello.bat-1-#!/bin/sh+Hello.bat-2-echo "Hello World!" Hello.class-1-+00000000  ca fe ba be 00 00 00 34  00 1d 0a -- -- -- -- --  |....@@@4@]J-----| Hello.class-2--00000000-  ca fe ba be 00 00 00 34  00 1d 0a 00 06 00 0f 09  |....@@@4@]J@F@OI|+00000000  -- -- -- -- -- -- -- --  -- -- -- 00 06 00 0f 09  |-----------@F@OI|+00000010  00 10 00 11 08 00 12 0a  -- -- -- -- -- -- -- --  |@P@QH@RJ--------| Hello.class-3--00000010-  00 10 00 11 08 00 12 0a  00 13 00 14 07 00 15 07  |@P@QH@RJ@S@TG@UG|-00000020-  00 16 01 00 06 3c 69 6e  69 74 3e 01 00 03 28 29  |@VA@F<init>A@C()|-00000030-  56 01 00 04 43 6f 64 65  01 00 0f 4c 69 6e 65 4e  |VA@DCodeA@OLineN|-00000040-  75 6d 62 65 72 54 61 62  6c 65 01 00 04 6d 61 69  |umberTableA@Dmai|-00000050-  6e 01 00 16 28 5b 4c 6a  61 76 61 2f 6c 61 6e 67  |nA@V([Ljava/lang|+00000010  -- -- -- -- -- -- -- --  00 13 00 14 07 00 15 07  |--------@S@TG@UG|+00000020  00 16 01 00 06 3c 69 6e  69 74 3e 01 00 03 28 29  |@VA@F<init>A@C()|+00000030  56 01 00 04 43 6f 64 65  01 00 0f 4c 69 6e 65 4e  |VA@DCodeA@OLineN|+00000040  75 6d 62 65 72 54 61 62  6c 65 01 00 04 6d 61 69  |umberTableA@Dmai|+00000050  6e 01 00 16 28 5b 4c 6a  61 76 61 2f 6c 61 6e 67  |nA@V([Ljava/lang|+00000060  2f 53 74 72 69 6e 67 3b  29 56 01 00 0a -- -- --  |/String;)VA@J---| Hello.class-4--00000060-  2f 53 74 72 69 6e 67 3b  29 56 01 00 0a 53 6f 75  |/String;)VA@JSou|+00000060  -- -- -- -- -- -- -- --  -- -- -- -- -- 53 6f 75  |-------------Sou|+00000070  72 63 65 46 69 6c 65 01  00 0a -- -- -- -- -- --  |rceFileA@J------| Hello.class-5--00000070-  72 63 65 46 69 6c 65 01  00 0a 48 65 6c 6c 6f 2e  |rceFileA@JHello.|-00000080-  6a 61 76 61 0c 00 07 00  08 07 00 17 0c 00 18 00  |javaL@G@HG@WL@X@|-00000090-  19 01 00 0c 48 65 6c 6c  6f 20 57 6f 72 6c 64 21  |YA@LHello World!|-000000a0-  07 00 1a 0c 00 1b 00 1c  01 00 05 48 65 6c 6c 6f  |G@ZL@[@\A@EHello|-000000b0-  01 00 10 6a 61 76 61 2f  6c 61 6e 67 2f 4f 62 6a  |A@Pjava/lang/Obj|-000000c0-  65 63 74 01 00 10 6a 61  76 61 2f 6c 61 6e 67 2f  |ectA@Pjava/lang/|-000000d0-  53 79 73 74 65 6d 01 00  03 6f 75 74 01 00 15 4c  |SystemA@CoutA@UL|-000000e0-  6a 61 76 61 2f 69 6f 2f  50 72 69 6e 74 53 74 72  |java/io/PrintStr|-000000f0-  65 61 6d 3b 01 00 13 6a  61 76 61 2f 69 6f 2f 50  |eam;A@Sjava/io/P|-00000100-  72 69 6e 74 53 74 72 65  61 6d 01 00 07 70 72 69  |rintStreamA@Gpri|-00000110-  6e 74 6c 6e 01 00 15 28  4c 6a 61 76 61 2f 6c 61  |ntlnA@U(Ljava/la|-00000120-  6e 67 2f 53 74 72 69 6e  67 3b 29 56 00 21 00 05  |ng/String;)V@!@E|-00000130-  00 06 00 00 00 00 00 02  00 01 00 07 00 08 00 01  |@F@@@@@B@A@G@H@A|-00000140-  00 09 00 00 00 1d 00 01  00 01 00 00 00 05 2a b7  |@I@@@]@A@A@@@E*.|+00000070  -- -- -- -- -- -- -- --  -- -- 48 65 6c 6c 6f 2e  |----------Hello.|+00000080  6a 61 76 61 0c 00 07 00  08 07 00 17 0c 00 18 00  |javaL@G@HG@WL@X@|+00000090  19 01 00 0c 48 65 6c 6c  6f 20 57 6f 72 6c 64 21  |YA@LHello World!|+000000a0  07 00 1a 0c 00 1b 00 1c  01 00 05 48 65 6c 6c 6f  |G@ZL@[@\A@EHello|+000000b0  01 00 10 6a 61 76 61 2f  6c 61 6e 67 2f 4f 62 6a  |A@Pjava/lang/Obj|+000000c0  65 63 74 01 00 10 6a 61  76 61 2f 6c 61 6e 67 2f  |ectA@Pjava/lang/|+000000d0  53 79 73 74 65 6d 01 00  03 6f 75 74 01 00 15 4c  |SystemA@CoutA@UL|+000000e0  6a 61 76 61 2f 69 6f 2f  50 72 69 6e 74 53 74 72  |java/io/PrintStr|+000000f0  65 61 6d 3b 01 00 13 6a  61 76 61 2f 69 6f 2f 50  |eam;A@Sjava/io/P|+00000100  72 69 6e 74 53 74 72 65  61 6d 01 00 07 70 72 69  |rintStreamA@Gpri|+00000110  6e 74 6c 6e 01 00 15 28  4c 6a 61 76 61 2f 6c 61  |ntlnA@U(Ljava/la|+00000120  6e 67 2f 53 74 72 69 6e  67 3b 29 56 00 21 00 05  |ng/String;)V@!@E|+00000130  00 06 00 00 00 00 00 02  00 01 00 07 00 08 00 01  |@F@@@@@B@A@G@H@A|+00000140  00 09 00 00 00 1d 00 01  00 01 00 00 00 05 2a b7  |@I@@@]@A@A@@@E*.|+00000150  00 01 b1 00 00 00 01 00  0a -- -- -- -- -- -- --  |@A.@@@A@J-------| Hello.class-6--00000150-  00 01 b1 00 00 00 01 00  0a 00 00 00 06 00 01 00  |@A.@@@A@J@@@F@A@|-00000160-  00 00 02 00 09 00 0b 00  0c 00 01 00 09 00 00 00  |@@B@I@K@L@A@I@@@|-00000170-  25 00 02 00 01 00 00 00  09 b2 00 02 12 03 b6 00  |%@B@A@@@I.@BRC.@|+00000150  -- -- -- -- -- -- -- --  -- 00 00 00 06 00 01 00  |---------@@@F@A@|+00000160  00 00 02 00 09 00 0b 00  0c 00 01 00 09 00 00 00  |@@B@I@K@L@A@I@@@|+00000170  25 00 02 00 01 00 00 00  09 b2 00 02 12 03 b6 00  |%@B@A@@@I.@BRC.@|+00000180  04 b1 00 00 00 01 00 0a  -- -- -- -- -- -- -- --  |D.@@@A@J--------| Hello.class-7-+00000180  -- -- -- -- -- -- -- --  00 00 00 0a -- -- -- --  |--------@@@J----| Hello.class-8--00000180-  04 b1 00 00 00 01 00 0a  00 00 00 0a 00 02 00 00  |D.@@@A@J@@@J@B@@|-00000190-  00 04 00 08 00 05 00 01  00 0d 00 00 00 02 00 0e  |@D@H@E@A@M@@@B@N|-Hello.java-1-import java.lang.*;+00000180  -- -- -- -- -- -- -- --  -- -- -- -- 00 02 00 00  |------------@B@@|+00000190  00 04 00 08 00 05 00 01  00 0d 00 00 00 02 00 0e  |@D@H@E@A@M@@@B@N|+Hello.java-1-import java.lang.*; Hello.java-2--Hello.java-3-public class Hello // prints a Hello World! greeting-Hello.java-4-{ public static void main(String[] arg)-Hello.java-5-  { System.out.println("Hello World!");-Hello.java-6-  }-Hello.java-7-}-Hello.pdf-1-%PDF-1.3+Hello.java-3-public class Hello // prints a Hello World! greeting+Hello.java-4-{ public static void main(String[] arg)+Hello.java-5-  { System.out.println("Hello World!");+Hello.java-6-  }+Hello.java-7-}+Hello.pdf-1-%PDF-1.3 Hello.pdf-2--00000000-  -- -- -- -- -- -- -- --  -- 25 c4 e5 f2 e5 eb a7  |---------%......|-00000010-  f3 a0 d0 c4 c6 0a -- --  -- -- -- -- -- -- -- --  |.....J----------|-Hello.pdf-3-4 0 obj-Hello.pdf-4-<< /Length 5 0 R /Filter /FlateDecode >>-Hello.pdf-5-stream+00000000  -- -- -- -- -- -- -- --  -- 25 c4 e5 f2 e5 eb a7  |---------%......|+00000010  f3 a0 d0 c4 c6 0a -- --  -- -- -- -- -- -- -- --  |.....J----------|+Hello.pdf-3-4 0 obj+Hello.pdf-4-<< /Length 5 0 R /Filter /FlateDecode >>+Hello.pdf-5-stream Hello.pdf-6--00000040-  -- -- -- -- -- -- -- --  -- -- -- -- -- -- 78 01  |--------------xA|+00000040  -- -- -- -- -- -- -- --  -- -- -- -- -- -- 78 01  |--------------xA|+00000050  45 8e bb 0a -- -- -- --  -- -- -- -- -- -- -- --  |E..J------------| Hello.pdf-7--00000050-  45 8e bb 0a 02 31 14 44  7b bf e2 94 5a 98 bd 89  |E..JB1TD{...Z...|-00000060-  79 98 56 11 6c 17 2e f8  01 61 2d 64 d7 65 cd ff  |y.VQlW..Aa-d.e..|-00000070-  83 17 2c ac 86 99 39 0c  b3 31 b2 51 02 b9 46 97  |.W,...9L.1.QB.F.|+00000050  -- -- -- -- 02 31 14 44  7b bf e2 94 5a 98 bd 89  |----B1TD{...Z...|+00000060  79 98 56 11 6c 17 2e f8  01 61 2d 64 d7 65 cd ff  |y.VQlW..Aa-d.e..|+00000070  83 17 2c ac 86 99 39 0c  b3 31 b2 51 02 b9 46 97  |.W,...9L.1.QB.F.|+00000080  e2 a9 12 f3 99 90 5c 4c  59 0a -- -- -- -- -- --  |..R...\LYJ------| Hello.pdf-8--00000080-  e2 a9 12 f3 99 90 5c 4c  59 0a 9f 89 07 6f 86 6b  |..R...\LYJ..Go.k|-00000090-  f7 b4 8e d0 9b e1 e2 6a  a9 52 6a b2 40 38 fe ad  |.......j.Rj.@8..|-000000a0-  ed 94 20 bb b6 70 51 a3  44 c4 a3 0d ef 7f a0 69  |.. ..pQ.D..M.~.i|-000000b0-  c2 0b ba 30 a8 7a ac 7c  b2 bf 4f f3 bc 1e d0 17  |.K.0.z.|..O..^.W|-000000c0-  37 b5 37 e3 17 4e ff 20  a5 0a -- -- -- -- -- --  |7.7.WN. .J------|-Hello.pdf-9-endstream-Hello.pdf-10-endobj-Hello.pdf-11-5 0 obj-Hello.pdf-12-123-Hello.pdf-13-endobj-Hello.pdf-14-2 0 obj-Hello.pdf-15-<< /Type /Page /Parent 3 0 R /Resources 6 0 R /Contents 4 0 R /MediaBox [0 0 612 792]-Hello.pdf-16->>-Hello.pdf-17-endobj-Hello.pdf-18-6 0 obj-Hello.pdf-19-<< /ProcSet [ /PDF /Text ] /ColorSpace << /Cs1 7 0 R >> /Font << /TT1 8 0 R-Hello.pdf-20->> >>-Hello.pdf-21-endobj-Hello.pdf-22-9 0 obj-Hello.pdf-23-<< /Length 10 0 R /N 1 /Alternate /DeviceGray /Filter /FlateDecode >>-Hello.pdf-24-stream+00000080  -- -- -- -- -- -- -- --  -- -- 9f 89 07 6f 86 6b  |----------..Go.k|+00000090  f7 b4 8e d0 9b e1 e2 6a  a9 52 6a b2 40 38 fe ad  |.......j.Rj.@8..|+000000a0  ed 94 20 bb b6 70 51 a3  44 c4 a3 0d ef 7f a0 69  |.. ..pQ.D..M.~.i|+000000b0  c2 0b ba 30 a8 7a ac 7c  b2 bf 4f f3 bc 1e d0 17  |.K.0.z.|..O..^.W|+000000c0  37 b5 37 e3 17 4e ff 20  a5 0a -- -- -- -- -- --  |7.7.WN. .J------|+Hello.pdf-9-endstream+Hello.pdf-10-endobj+Hello.pdf-11-5 0 obj+Hello.pdf-12-123+Hello.pdf-13-endobj+Hello.pdf-14-2 0 obj+Hello.pdf-15-<< /Type /Page /Parent 3 0 R /Resources 6 0 R /Contents 4 0 R /MediaBox [0 0 612 792]+Hello.pdf-16->>+Hello.pdf-17-endobj+Hello.pdf-18-6 0 obj+Hello.pdf-19-<< /ProcSet [ /PDF /Text ] /ColorSpace << /Cs1 7 0 R >> /Font << /TT1 8 0 R+Hello.pdf-20->> >>+Hello.pdf-21-endobj+Hello.pdf-22-9 0 obj+Hello.pdf-23-<< /Length 10 0 R /N 1 /Alternate /DeviceGray /Filter /FlateDecode >>+Hello.pdf-24-stream Hello.pdf-25--00000200-  -- -- -- -- -- -- -- --  -- -- -- -- 78 01 85 55  |------------xA.U|-00000210-  5d 68 1c 55 14 3e bb 73  67 03 12 07 1f b4 0d 2d  |]h\UT>.sgCRG_.M-|-00000220-  b4 83 3f 6d 09 e9 32 89  56 13 8b b5 db 4d ba 49  |..?mI.2.VS...M.I|-00000230-  13 b7 eb 66 53 9b 2a ca  74 76 36 3b cd 64 66 9c  |S..fS.*.tv6;.df.|-00000240-  99 dd 26 a1 4f a5 e0 9b  16 04 e9 ab a0 3e c6 82  |..&.O...VD...>..|+00000200  -- -- -- -- -- -- -- --  -- -- -- -- 78 01 85 55  |------------xA.U|+00000210  5d 68 1c 55 14 3e bb 73  67 03 12 07 1f b4 0d 2d  |]h\UT>.sgCRG_.M-|+00000220  b4 83 3f 6d 09 e9 32 89  56 13 8b b5 db 4d ba 49  |..?mI.2.VS...M.I|+00000230  13 b7 eb 66 53 9b 2a ca  74 76 36 3b cd 64 66 9c  |S..fS.*.tv6;.df.|+00000240  99 dd 26 a1 4f a5 e0 9b  16 04 e9 ab a0 3e c6 82  |..&.O...VD...>..|+00000250  08 b6 2a 36 2f f6 a5 a5  c5 92 4a 35 0f 0a -- --  |H.*6/.....J5OJ--| Hello.pdf-26--00000250-  08 b6 2a 36 2f f6 a5 a5  c5 92 4a 35 0f 0a 11 5a  |H.*6/.....J5OJQZ|-00000260-  8c 20 28 7d 52 f0 3b 33  db 64 76 41 32 c3 9d f9  |. (}R.;3.dvA2...|-00000270-  ee b9 e7 9e 7b ce 77 ee  b9 97 a8 eb 6f dd f3 ec  |....{.w.....o...|-00000280-  b4 4a 34 e7 84 7e a1 9c  9b 3e 39 7d 4a ed ba 4d  |.J4..~...>9}J..M|-00000290-  69 52 a8 9b f0 e8 46 e0  e5 4a a5 09 c6 8e eb 98  |iR....F..J.I....|-000002a0-  fc 6f 7f 1e de a5 14 4b  ee ec 67 5b ed 63 5b f6  |.o~^..TK..g[.c[.|-000002b0-  e4 aa 19 18 d0 ba 86 e6  56 03 63 8e 28 a5 11 65  |..YX....VCc.(.Qe|-000002c0-  6a 86 e7 87 44 5d 97 20  1f 3c 1b 7a 8c 6f 03 3f  |j...D]. _<[z.oC?|-000002d0-  39 5b 29 e7 81 d7 80 95  d6 5c 40 7a aa 60 3a a6  |9[)......\@z.`:.|-000002e0-  6f 19 6a c1 d7 17 d4 92  ef d6 2c 3b e9 eb 56 e3  |oYj..W....,;..V.|-000002f0-  6c 63 cb 67 ce 6e b0 af  fc ec 46 eb 0e 66 27 c7  |lc.g.n....F.Nf'.|-00000300-  f1 ef 85 cf 17 4c 67 6a  12 78 1f f0 92 a1 8f 30  |....WLgjRx_....0|-00000310-  ee 03 be db b4 4e 14 63  9c 4e 7b e1 91 72 ac 9f  |.C...NTc.N{..r..|-00000320-  ce 36 66 a7 72 2d f9 c9  9a 7f 74 aa 25 bf 50 6f  |.6f.r-...~t.%.Po|-00000330-  8c 32 ce 12 a5 97 16 eb  95 37 80 9f 00 5e 75 4e  |.2.R..V..7..@^uN|-00000340-  17 8f b7 f4 d7 67 dd 71  b6 d3 43 24 f5 18 41 fe  |W....g.q..C$.XA.|-00000350-  14 f0 b3 c0 5a dd 1c e3  3c a9 c0 15 df 2d b3 3e  |T...Z.\.<..U.-.>|-00000360-  cb c3 aa 39 3c 02 fc 32  f0 25 2b 1c ab 00 c3 be  |...9<B.2.%+\.@..|-00000370-  f4 43 d0 9c 64 39 b0 a0  c5 7a 9e fd c4 5a 22 7b  |.C..d9...z...Z"{|-00000380-  46 3f 56 02 de 06 7c c8  b4 0b bc 16 ec 88 8a 17  |F?VB.F|..K.V...W|-00000390-  96 d8 e6 20 f0 bc 63 17  79 2d c4 2e 2e 9b 41 14  |... ..cWy-....AT|-000003a0-  2f 62 17 3f 85 f5 ca 68  ac 2f a7 43 bf c2 73 9f  |/bW?...h./.C..s.|-000003b0-  26 92 f7 d4 ac a3 63 c0  e0 44 1e ad fb a3 2c 87  |&.....c..D^...,.|-000003c0-  3f 72 e8 d9 d1 de 7a 11  78 c9 6f 94 39 f6 3d c0  |?r....zQx.o.9.=.|-000003d0-  6b ba 3f 52 00 86 cd cc  63 55 7d 98 79 7e 01 78  |k.?R@...cU}.y~Ax|-000003e0-  80 4e a4 74 32 c9 a5 d3  f8 1a e4 d0 bf 88 37 20  |.N.t2....Z....7 |+00000250  -- -- -- -- -- -- -- --  -- -- -- -- -- -- 11 5a  |--------------QZ|+00000260  8c 20 28 7d 52 f0 3b 33  db 64 76 41 32 c3 9d f9  |. (}R.;3.dvA2...|+00000270  ee b9 e7 9e 7b ce 77 ee  b9 97 a8 eb 6f dd f3 ec  |....{.w.....o...|+00000280  b4 4a 34 e7 84 7e a1 9c  9b 3e 39 7d 4a ed ba 4d  |.J4..~...>9}J..M|+00000290  69 52 a8 9b f0 e8 46 e0  e5 4a a5 09 c6 8e eb 98  |iR....F..J.I....|+000002a0  fc 6f 7f 1e de a5 14 4b  ee ec 67 5b ed 63 5b f6  |.o~^..TK..g[.c[.|+000002b0  e4 aa 19 18 d0 ba 86 e6  56 03 63 8e 28 a5 11 65  |..YX....VCc.(.Qe|+000002c0  6a 86 e7 87 44 5d 97 20  1f 3c 1b 7a 8c 6f 03 3f  |j...D]. _<[z.oC?|+000002d0  39 5b 29 e7 81 d7 80 95  d6 5c 40 7a aa 60 3a a6  |9[)......\@z.`:.|+000002e0  6f 19 6a c1 d7 17 d4 92  ef d6 2c 3b e9 eb 56 e3  |oYj..W....,;..V.|+000002f0  6c 63 cb 67 ce 6e b0 af  fc ec 46 eb 0e 66 27 c7  |lc.g.n....F.Nf'.|+00000300  f1 ef 85 cf 17 4c 67 6a  12 78 1f f0 92 a1 8f 30  |....WLgjRx_....0|+00000310  ee 03 be db b4 4e 14 63  9c 4e 7b e1 91 72 ac 9f  |.C...NTc.N{..r..|+00000320  ce 36 66 a7 72 2d f9 c9  9a 7f 74 aa 25 bf 50 6f  |.6f.r-...~t.%.Po|+00000330  8c 32 ce 12 a5 97 16 eb  95 37 80 9f 00 5e 75 4e  |.2.R..V..7..@^uN|+00000340  17 8f b7 f4 d7 67 dd 71  b6 d3 43 24 f5 18 41 fe  |W....g.q..C$.XA.|+00000350  14 f0 b3 c0 5a dd 1c e3  3c a9 c0 15 df 2d b3 3e  |T...Z.\.<..U.-.>|+00000360  cb c3 aa 39 3c 02 fc 32  f0 25 2b 1c ab 00 c3 be  |...9<B.2.%+\.@..|+00000370  f4 43 d0 9c 64 39 b0 a0  c5 7a 9e fd c4 5a 22 7b  |.C..d9...z...Z"{|+00000380  46 3f 56 02 de 06 7c c8  b4 0b bc 16 ec 88 8a 17  |F?VB.F|..K.V...W|+00000390  96 d8 e6 20 f0 bc 63 17  79 2d c4 2e 2e 9b 41 14  |... ..cWy-....AT|+000003a0  2f 62 17 3f 85 f5 ca 68  ac 2f a7 43 bf c2 73 9f  |/bW?...h./.C..s.|+000003b0  26 92 f7 d4 ac a3 63 c0  e0 44 1e ad fb a3 2c 87  |&.....c..D^...,.|+000003c0  3f 72 e8 d9 d1 de 7a 11  78 c9 6f 94 39 f6 3d c0  |?r....zQx.o.9.=.|+000003d0  6b ba 3f 52 00 86 cd cc  63 55 7d 98 79 7e 01 78  |k.?R@...cU}.y~Ax|+000003e0  80 4e a4 74 32 c9 a5 d3  f8 1a e4 d0 bf 88 37 20  |.N.t2....Z....7 |+000003f0  8b 9a 11 f2 c8 c7 58 0d  7d 9b 0a -- -- -- -- --  |..Q...XM}.J-----| Hello.pdf-27--000003f0-  8b 9a 11 f2 c8 c7 58 0d  7d 9b 0a d0 70 d0 7c f4  |..Q...XM}.J.p.|.|-00000400-  0c 68 15 80 74 5a 00 2a  25 b4 4c f4 58 27 9e a3  |LhU.tZ@*%.L.X'..|-00000410-  52 15 3d 95 66 a2 59 41  84 d8 ca fd a8 6f 50 7e  |RU=.f.YA.....oP~|-00000420-  d7 a7 d4 80 b4 4e eb 90  d6 81 5e a3 5f 22 c9 3c  |.....N....^._".<|-00000430-  fd 4a 73 e8 e7 21 6d 60  6c a6 c3 6e 1e 5e 38 b4  |.Js..!m`l..n^^8.|-00000440-  08 0f d8 13 b6 f9 a0 65  d3 15 db 85 26 9e 47 3b  |HO.S...e.U..&.G;|-00000450-  28 26 c4 2b 62 50 0c 91  2a 5e 15 87 c5 21 31 0c  |(&.+bPL.*^U..!1L|-00000460-  e9 90 38 18 cd 89 bd 4f  fa ce 7e 3e d8 b0 f4 2e  |..8X...O..~>....|-00000470-  d6 4d fa be 0c 0e 42 ac  67 c3 33 07 ac 70 34 01  |.M..LNB.g.3G.p4A|-00000480-  3c f8 07 eb ce 46 9a 09  b6 2e ee 68 ec f3 bc 8f  |<.G..F.I...h....|-00000490-  de 3f ef bf 63 19 b7 3e  f8 b3 8d bd 00 fa 31 27  |.?..cY.>....@.1'|-000004a0-  bf c1 a2 0b 6b 26 25 e6  5e 3f f7 4d 4f c2 43 75  |...Kk&%.^?.MO.Cu|-000004b0-  45 7c f5 d6 9d ee eb e7  e8 78 32 4b 51 de aa 9d  |E|.......x2KQ...|+000003f0  -- -- -- -- -- -- -- --  -- -- -- d0 70 d0 7c f4  |-----------.p.|.|+00000400  0c 68 15 80 74 5a 00 2a  25 b4 4c f4 58 27 9e a3  |LhU.tZ@*%.L.X'..|+00000410  52 15 3d 95 66 a2 59 41  84 d8 ca fd a8 6f 50 7e  |RU=.f.YA.....oP~|+00000420  d7 a7 d4 80 b4 4e eb 90  d6 81 5e a3 5f 22 c9 3c  |.....N....^._".<|+00000430  fd 4a 73 e8 e7 21 6d 60  6c a6 c3 6e 1e 5e 38 b4  |.Js..!m`l..n^^8.|+00000440  08 0f d8 13 b6 f9 a0 65  d3 15 db 85 26 9e 47 3b  |HO.S...e.U..&.G;|+00000450  28 26 c4 2b 62 50 0c 91  2a 5e 15 87 c5 21 31 0c  |(&.+bPL.*^U..!1L|+00000460  e9 90 38 18 cd 89 bd 4f  fa ce 7e 3e d8 b0 f4 2e  |..8X...O..~>....|+00000470  d6 4d fa be 0c 0e 42 ac  67 c3 33 07 ac 70 34 01  |.M..LNB.g.3G.p4A|+00000480  3c f8 07 eb ce 46 9a 09  b6 2e ee 68 ec f3 bc 8f  |<.G..F.I...h....|+00000490  de 3f ef bf 63 19 b7 3e  f8 b3 8d bd 00 fa 31 27  |.?..cY.>....@.1'|+000004a0  bf c1 a2 0b 6b 26 25 e6  5e 3f f7 4d 4f c2 43 75  |...Kk&%.^?.MO.Cu|+000004b0  45 7c f5 d6 9d ee eb e7  e8 78 32 4b 51 de aa 9d  |E|.......x2KQ...|+000004c0  59 92 d7 e4 fb f2 0a --  -- -- -- -- -- -- -- --  |Y.....J---------| Hello.pdf-28--000004c0-  59 92 d7 e4 fb f2 0a be  f7 e4 d5 a4 0d f9 67 79  |Y.....J.....M.gy|-000004d0-  15 ef bd b6 5c 3d ca 0b  ff 93 b9 cd 21 46 3b 92  |U...\=.K....!F;.|-000004e0-  cd 41 ce 3c 9b 51 b4 71  c6 1b c0 21 b8 a9 45 73  |.A.<.Q.q.[.!..Es|-000004f0-  f6 b7 59 4c b2 e9 b6 62  b4 60 c9 42 94 9d ab b8  |..YL...b.`.B....|-00000500-  ff cb 09 f3 c3 3c b7 b1  52 73 2e ee f0 bc b7 3f  |..I..<..Rs.....?|-00000510-  63 36 cd f7 8a 0f 8b 74  be 4f bb ac ad 6b 9f 68  |c6...O.t.O...k.h|-00000520-  3f 6a 7f 68 2b da c7 40  bf 4b 1f 4a 5f 4a df 4a  |?j~h+..@.K_J_J.J|-00000530-  57 a4 ab d2 0d 52 a5 6b  d2 b2 f4 9d f4 bd f4 b9  |W...MR.k........|-00000540-  f4 35 7a 5f 40 ba 2c 5d  e9 d8 49 71 ec 1b bb 07  |.5z_@.,]..Iq.[.G|-00000550-  7e c6 7b d6 68 ed 30 66  86 b3 14 10 f3 c2 da cc  |~.{.h.0f..TP....|+000004c0  -- -- -- -- -- -- -- be  f7 e4 d5 a4 0d f9 67 79  |-------.....M.gy|+000004d0  15 ef bd b6 5c 3d ca 0b  ff 93 b9 cd 21 46 3b 92  |U...\=.K....!F;.|+000004e0  cd 41 ce 3c 9b 51 b4 71  c6 1b c0 21 b8 a9 45 73  |.A.<.Q.q.[.!..Es|+000004f0  f6 b7 59 4c b2 e9 b6 62  b4 60 c9 42 94 9d ab b8  |..YL...b.`.B....|+00000500  ff cb 09 f3 c3 3c b7 b1  52 73 2e ee f0 bc b7 3f  |..I..<..Rs.....?|+00000510  63 36 cd f7 8a 0f 8b 74  be 4f bb ac ad 6b 9f 68  |c6...O.t.O...k.h|+00000520  3f 6a 7f 68 2b da c7 40  bf 4b 1f 4a 5f 4a df 4a  |?j~h+..@.K_J_J.J|+00000530  57 a4 ab d2 0d 52 a5 6b  d2 b2 f4 9d f4 bd f4 b9  |W...MR.k........|+00000540  f4 35 7a 5f 40 ba 2c 5d  e9 d8 49 71 ec 1b bb 07  |.5z_@.,]..Iq.[.G|+00000550  7e c6 7b d6 68 ed 30 66  86 b3 14 10 f3 c2 da cc  |~.{.h.0f..TP....|+00000560  0a -- -- -- -- -- -- --  -- -- -- -- -- -- -- --  |J---------------| Hello.pdf-29--00000560-  0a 4b 1f f1 77 06 63 9b  f9 33 a1 d5 5e 03 9d bb  |JK_.wFc..3..^C..|-00000570-  7f 63 2d e5 88 b2 53 79  46 19 56 76 2b cf 29 13  |~c-...SyFYVv+.)S|-00000580-  4a af 72 40 39 ac 6c 57  06 d0 fa 95 51 65 2f 46  |J.r@9.lWF...Qe/F|-00000590-  76 6e b0 64 63 3d ce 80  85 7f 92 67 8b a6 23 ae  |vn.dc=...~.g..#.|-000005a0-  e2 3c b1 57 75 b0 e7 c3  4b 1d ef a6 5f 5c c3 d6  |.<.Wu...K].._\..|-000005b0-  86 35 d8 49 3d 0e 9e d9  da a6 0e af 11 57 bf 15  |.5.I=N....N.QW.U|-000005c0-  55 63 bc 3b 5d 9c 06 3a  4d 21 62 8b ce 22 72 1f  |Uc.;].F:M!b.."r_|-000005d0-  3a 9c 1f 27 aa fe ce d9  5c 93 38 35 52 6f e2 94  |:._'....\.85Ro..|-000005e0-  b0 c4 2e d1 2f c6 5a 35  98 13 07 50 85 e3 6d f5  |..../.Z5.SGP..m.|-000005f0-  38 c8 55 9a 19 c9 0c 67  72 a4 66 7a 33 43 99 fe  |8.U.Y.Lgr.fz3C..|-00000600-  cc 31 c6 51 ac d1 f9 92  d9 8b d1 21 7c 47 12 de  |.1.Q.......!|GR.|-00000610-  33 cb 31 ff 9b 35 c4 67  18 ef 1d e6 a8 09 6c a3  |3.1..5.gX.]..Il.|-00000620-  87 5b 2b 34 e7 71 df 11  e5 5d 6f c1 b7 66 ea a1  |.[+4.q.Q.]o..f..|-00000630-  3a a0 69 2f a9 39 5c af  a6 3a e6 18 d9 3e 55 b7  |:.i/.9\..:.X.>U.|+00000560  -- 4b 1f f1 77 06 63 9b  f9 33 a1 d5 5e 03 9d bb  |-K_.wFc..3..^C..|+00000570  7f 63 2d e5 88 b2 53 79  46 19 56 76 2b cf 29 13  |~c-...SyFYVv+.)S|+00000580  4a af 72 40 39 ac 6c 57  06 d0 fa 95 51 65 2f 46  |J.r@9.lWF...Qe/F|+00000590  76 6e b0 64 63 3d ce 80  85 7f 92 67 8b a6 23 ae  |vn.dc=...~.g..#.|+000005a0  e2 3c b1 57 75 b0 e7 c3  4b 1d ef a6 5f 5c c3 d6  |.<.Wu...K].._\..|+000005b0  86 35 d8 49 3d 0e 9e d9  da a6 0e af 11 57 bf 15  |.5.I=N....N.QW.U|+000005c0  55 63 bc 3b 5d 9c 06 3a  4d 21 62 8b ce 22 72 1f  |Uc.;].F:M!b.."r_|+000005d0  3a 9c 1f 27 aa fe ce d9  5c 93 38 35 52 6f e2 94  |:._'....\.85Ro..|+000005e0  b0 c4 2e d1 2f c6 5a 35  98 13 07 50 85 e3 6d f5  |..../.Z5.SGP..m.|+000005f0  38 c8 55 9a 19 c9 0c 67  72 a4 66 7a 33 43 99 fe  |8.U.Y.Lgr.fz3C..|+00000600  cc 31 c6 51 ac d1 f9 92  d9 8b d1 21 7c 47 12 de  |.1.Q.......!|GR.|+00000610  33 cb 31 ff 9b 35 c4 67  18 ef 1d e6 a8 09 6c a3  |3.1..5.gX.]..Il.|+00000620  87 5b 2b 34 e7 71 df 11  e5 5d 6f c1 b7 66 ea a1  |.[+4.q.Q.]o..f..|+00000630  3a a0 69 2f a9 39 5c af  a6 3a e6 18 d9 3e 55 b7  |:.i/.9\..:.X.>U.|+00000640  6d 35 1a 0a -- -- -- --  -- -- -- -- -- -- -- --  |m5ZJ------------| Hello.pdf-30--00000640-  6d 35 1a 0a 54 df 0c 4c  bf 69 56 b3 c4 77 37 cf  |m5ZJT.LL.iV..w7.|-00000650-  23 fa eb f5 e8 4e 4e 6d  bb 61 34 fc 66 2c a3 54  |#....NNm.a4.f,.T|-00000660-  ea 26 d1 7f b7 8f 93 34  0a -- -- -- -- -- -- --  |.&.~...4J-------|-Hello.pdf-31-endstream-Hello.pdf-32-endobj-Hello.pdf-33-10 0 obj-Hello.pdf-34-1116-Hello.pdf-35-endobj-Hello.pdf-36-7 0 obj-Hello.pdf-37-[ /ICCBased 9 0 R ]-Hello.pdf-38-endobj-Hello.pdf-39-3 0 obj-Hello.pdf-40-<< /Type /Pages /MediaBox [0 0 612 792] /Count 1 /Kids [ 2 0 R ] >>-Hello.pdf-41-endobj-Hello.pdf-42-11 0 obj-Hello.pdf-43-<< /Type /Catalog /Pages 3 0 R >>-Hello.pdf-44-endobj-Hello.pdf-45-8 0 obj-Hello.pdf-46-<< /Type /Font /Subtype /TrueType /BaseFont /GQTMZF+Menlo-Regular /FontDescriptor-Hello.pdf-47-12 0 R /Encoding /MacRomanEncoding /FirstChar 72 /LastChar 111 /Widths [ 602-Hello.pdf-48-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 602 0 0 0 0 0 0 602-Hello.pdf-49-0 0 602 ] >>-Hello.pdf-50-endobj-Hello.pdf-51-12 0 obj-Hello.pdf-52-<< /Type /FontDescriptor /FontName /GQTMZF+Menlo-Regular /Flags 33 /FontBBox-Hello.pdf-53-[-558 -375 718 1041] /ItalicAngle 0 /Ascent 928 /Descent -236 /CapHeight 729-Hello.pdf-54-/StemV 99 /XHeight 547 /StemH 83 /AvgWidth 602 /MaxWidth 602 /FontFile2 13 0 R-Hello.pdf-55->>-Hello.pdf-56-endobj-Hello.pdf-57-13 0 obj-Hello.pdf-58-<< /Length 14 0 R /Length1 4064 /Filter /FlateDecode >>-Hello.pdf-59-stream+00000640  -- -- -- -- 54 df 0c 4c  bf 69 56 b3 c4 77 37 cf  |----T.LL.iV..w7.|+00000650  23 fa eb f5 e8 4e 4e 6d  bb 61 34 fc 66 2c a3 54  |#....NNm.a4.f,.T|+00000660  ea 26 d1 7f b7 8f 93 34  0a -- -- -- -- -- -- --  |.&.~...4J-------|+Hello.pdf-31-endstream+Hello.pdf-32-endobj+Hello.pdf-33-10 0 obj+Hello.pdf-34-1116+Hello.pdf-35-endobj+Hello.pdf-36-7 0 obj+Hello.pdf-37-[ /ICCBased 9 0 R ]+Hello.pdf-38-endobj+Hello.pdf-39-3 0 obj+Hello.pdf-40-<< /Type /Pages /MediaBox [0 0 612 792] /Count 1 /Kids [ 2 0 R ] >>+Hello.pdf-41-endobj+Hello.pdf-42-11 0 obj+Hello.pdf-43-<< /Type /Catalog /Pages 3 0 R >>+Hello.pdf-44-endobj+Hello.pdf-45-8 0 obj+Hello.pdf-46-<< /Type /Font /Subtype /TrueType /BaseFont /GQTMZF+Menlo-Regular /FontDescriptor+Hello.pdf-47-12 0 R /Encoding /MacRomanEncoding /FirstChar 72 /LastChar 111 /Widths [ 602+Hello.pdf-48-0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 602 0 0 0 0 0 0 602+Hello.pdf-49-0 0 602 ] >>+Hello.pdf-50-endobj+Hello.pdf-51-12 0 obj+Hello.pdf-52-<< /Type /FontDescriptor /FontName /GQTMZF+Menlo-Regular /Flags 33 /FontBBox+Hello.pdf-53-[-558 -375 718 1041] /ItalicAngle 0 /Ascent 928 /Descent -236 /CapHeight 729+Hello.pdf-54-/StemV 99 /XHeight 547 /StemH 83 /AvgWidth 602 /MaxWidth 602 /FontFile2 13 0 R+Hello.pdf-55->>+Hello.pdf-56-endobj+Hello.pdf-57-13 0 obj+Hello.pdf-58-<< /Length 14 0 R /Length1 4064 /Filter /FlateDecode >>+Hello.pdf-59-stream Hello.pdf-60--00000980-  -- -- 78 01 dd 57 7b 78  54 c5 15 3f 73 7f 77 36  |--xA.W{xT.U?s~w6|-00000990-  af cd 3e 92 4d 48 48 80  5d d6 e5 95 2c 81 84 b7  |..>.MHH.]...,...|-000009a0-  52 16 48 78 88 20 2f eb  2e 88 f2 48 20 28 21 08  |RVHx. /....H (!H|-000009b0-  41 b4 31 90 4a 51 09 c1  40 85 08 48 7d 15 51 a9  |A.1.JQI.@.HH}UQ.|+00000980  -- -- 78 01 dd 57 7b 78  54 c5 15 3f 73 7f 77 36  |--xA.W{xT.U?s~w6|+00000990  af cd 3e 92 4d 48 48 80  5d d6 e5 95 2c 81 84 b7  |..>.MHH.]...,...|+000009a0  52 16 48 78 88 20 2f eb  2e 88 f2 48 20 28 21 08  |RVHx. /....H (!H|+000009b0  41 b4 31 90 4a 51 09 c1  40 85 08 48 7d 15 51 a9  |A.1.JQI.@.HH}UQ.|+000009c0  b5 2b 45 5d 09 c4 54 a4  62 23 45 84 a0 02 0a --  |.+E]I.T.b#E..BJ-| Hello.pdf-61--000009c0-  b5 2b 45 5d 09 c4 54 a4  62 23 45 84 a0 02 0a f8  |.+E]I.T.b#E..BJ.|-000009d0-  a2 68 8a 14 21 d8 00 43  cf bd 1b fd 3e ed d7 ef  |.h.T!.@C..[.>...|-000009e0-  eb bf ed dc 9d 33 e7 fc  e6 cc 79 dd bb f7 ce 94  |.....3....y.....|-000009f0-  2d 5c 5c 44 56 aa 24 50  60 56 c9 8c 05 64 36 eb  |-\\DV.$P`V..Ed6.|-00000a00-  49 1e 8a 67 dd 53 e6 36  45 8a bd 97 48 cb 9d bd  |I^.g.S.6E...H...|-00000a10-  60 4e 49 54 8e 7f 91 e5  4e 73 e6 dd 37 3b 2a 27  |`NIT.~..Ns..7;*'|-00000a20-  4e 66 79 40 71 d1 8c c2  a8 4c 57 78 ec 57 cc 40  |Nfy@q....LWx.W.@|-00000a30-  54 16 7d 78 bc ae b8 a4  8c ed 18 cd fa 2e 13 d7  |TV}x......X...S.|-00000a40-  bc d2 59 6d f3 89 a3 0c  b0 64 c6 bd 6d fe e9 38  |..Ym...L.d..m..8|-00000a50-  cb ee f9 33 4a 8a 78 e4  66 8f 30 e9 b6 a0 74 51  |...3J.x.f.0...tQ|-00000a60-  99 29 92 bd 9a c7 ec 05  0b 8b da f4 45 90 28 a6  |.).....EK...E.(.|-00000a70-  53 74 ae 8d 1a 96 05 77  a9 59 29 8b ee 22 0b 69  |St..Z.Ew.Y).."Ki|-00000a80-  e4 a0 8d 94 c4 d0 ad ac  2b 79 d6 98 d7 62 b2 96  |........+y...b..|-00000a90-  3e 7d f6 8d 3b ec 37 5c  a4 4e b1 e6 e2 bd 65 e9  |>}..;.7\.N....e.|-00000aa0-  79 06 73 28 b8 a4 df e5  95 57 85 ac 8f bd 85 c5  |yFs(.....W......|-00000ab0-  e8 a4 31 c1 eb 62 4a 54  07 22 fd e0 e5 95 d7 92  |..1..bJTG"......|-00000ac0-  65 bd 69 c9 98 f9 be c9  08 c5 66 bd ae 55 8a 94  |e.i.....H.f..U..|-00000ad0-  ed eb a6 c9 a1 99 22 85  6a 09 4c 2b 49 17 2e 52  |......".jIL+IW.R|-00000ae0-  cc 27 9b 34 89 03 82 70  9a bc c3 a4 76 da c4 88  |.'.4.C.p....v...|-00000af0-  cd e4 13 b7 7f 3d 52 0e  f5 89 44 aa 60 cc 4a 3e  |..S.~=RN..D.`.J>|-00000b00-  a6 09 94 cb 34 de b4 17  67 6a c5 92 8d 91 18 93  |.I..4..Wgj....X.|-00000b10-  b7 98 3a d2 e4 75 13 87  89 68 26 22 02 21 05 a5  |..:..uS..h&"B!E.|-00000b20-  70 b5 02 57 14 2e 2b b4  e6 e2 9f 75 f8 ae 02 97  |p.BWT.+....u..B.|-00000b30-  5a aa e5 25 85 4b 0d 7a  cb c5 90 6c a9 46 4b a5  |Z..%.KMz...l.FK.|-00000b40-  7e f1 42 17 79 31 84 8b  01 fd 42 17 7c 7b 3e 47  |~.BWy1..A.BW|{>G|-00000b50-  7e db 8a f3 39 f8 87 c2  39 85 6f 72 71 d6 85 bf  |~...9...9.orq...|-00000b60-  d7 a2 99 43 6c 56 68 8e  5c 3b 18 b8 a6 7f 3d 12  |...ClVh.\;X..~=R|-00000b70-  5f 9d 29 94 5f d5 e2 4c  21 fe a6 70 fa cb 0c 79  |_.)._..L!..p..Ly|-00000b80-  5a e1 cb 0c 7c a1 f0 f9  5d f8 4c e1 d3 3a 9c 3a  |Z..L|...].L..:.:|-00000b90-  99 2e 4f b5 e2 64 3a 4e  d4 e2 13 85 8f 15 8e 1f  |..O..d:N..S..U._|-00000ba0-  4b 91 c7 15 8e a5 e0 68  2d 3e fa 30 45 7e a4 f0  |K..U...h->.0E~..|+000009c0  -- -- -- -- -- -- -- --  -- -- -- -- -- -- -- f8  |---------------.|+000009d0  a2 68 8a 14 21 d8 00 43  cf bd 1b fd 3e ed d7 ef  |.h.T!.@C..[.>...|+000009e0  eb bf ed dc 9d 33 e7 fc  e6 cc 79 dd bb f7 ce 94  |.....3....y.....|+000009f0  2d 5c 5c 44 56 aa 24 50  60 56 c9 8c 05 64 36 eb  |-\\DV.$P`V..Ed6.|+00000a00  49 1e 8a 67 dd 53 e6 36  45 8a bd 97 48 cb 9d bd  |I^.g.S.6E...H...|+00000a10  60 4e 49 54 8e 7f 91 e5  4e 73 e6 dd 37 3b 2a 27  |`NIT.~..Ns..7;*'|+00000a20  4e 66 79 40 71 d1 8c c2  a8 4c 57 78 ec 57 cc 40  |Nfy@q....LWx.W.@|+00000a30  54 16 7d 78 bc ae b8 a4  8c ed 18 cd fa 2e 13 d7  |TV}x......X...S.|+00000a40  bc d2 59 6d f3 89 a3 0c  b0 64 c6 bd 6d fe e9 38  |..Ym...L.d..m..8|+00000a50  cb ee f9 33 4a 8a 78 e4  66 8f 30 e9 b6 a0 74 51  |...3J.x.f.0...tQ|+00000a60  99 29 92 bd 9a c7 ec 05  0b 8b da f4 45 90 28 a6  |.).....EK...E.(.|+00000a70  53 74 ae 8d 1a 96 05 77  a9 59 29 8b ee 22 0b 69  |St..Z.Ew.Y).."Ki|+00000a80  e4 a0 8d 94 c4 d0 ad ac  2b 79 d6 98 d7 62 b2 96  |........+y...b..|+00000a90  3e 7d f6 8d 3b ec 37 5c  a4 4e b1 e6 e2 bd 65 e9  |>}..;.7\.N....e.|+00000aa0  79 06 73 28 b8 a4 df e5  95 57 85 ac 8f bd 85 c5  |yFs(.....W......|+00000ab0  e8 a4 31 c1 eb 62 4a 54  07 22 fd e0 e5 95 d7 92  |..1..bJTG"......|+00000ac0  65 bd 69 c9 98 f9 be c9  08 c5 66 bd ae 55 8a 94  |e.i.....H.f..U..|+00000ad0  ed eb a6 c9 a1 99 22 85  6a 09 4c 2b 49 17 2e 52  |......".jIL+IW.R|+00000ae0  cc 27 9b 34 89 03 82 70  9a bc c3 a4 76 da c4 88  |.'.4.C.p....v...|+00000af0  cd e4 13 b7 7f 3d 52 0e  f5 89 44 aa 60 cc 4a 3e  |..S.~=RN..D.`.J>|+00000b00  a6 09 94 cb 34 de b4 17  67 6a c5 92 8d 91 18 93  |.I..4..Wgj....X.|+00000b10  b7 98 3a d2 e4 75 13 87  89 68 26 22 02 21 05 a5  |..:..uS..h&"B!E.|+00000b20  70 b5 02 57 14 2e 2b b4  e6 e2 9f 75 f8 ae 02 97  |p.BWT.+....u..B.|+00000b30  5a aa e5 25 85 4b 0d 7a  cb c5 90 6c a9 46 4b a5  |Z..%.KMz...l.FK.|+00000b40  7e f1 42 17 79 31 84 8b  01 fd 42 17 7c 7b 3e 47  |~.BWy1..A.BW|{>G|+00000b50  7e db 8a f3 39 f8 87 c2  39 85 6f 72 71 d6 85 bf  |~...9...9.orq...|+00000b60  d7 a2 99 43 6c 56 68 8e  5c 3b 18 b8 a6 7f 3d 12  |...ClVh.\;X..~=R|+00000b70  5f 9d 29 94 5f d5 e2 4c  21 fe a6 70 fa cb 0c 79  |_.)._..L!..p..Ly|+00000b80  5a e1 cb 0c 7c a1 f0 f9  5d f8 4c e1 d3 3a 9c 3a  |Z..L|...].L..:.:|+00000b90  99 2e 4f b5 e2 64 3a 4e  d4 e2 13 85 8f 15 8e 1f  |..O..d:N..S..U._|+00000ba0  4b 91 c7 15 8e a5 e0 68  2d 3e fa 30 45 7e a4 f0  |K..U...h->.0E~..|+00000bb0  e1 ea 04 f9 61 0a -- --  -- -- -- -- -- -- -- --  |..D.aJ----------| Hello.pdf-62--00000bb0-  e1 ea 04 f9 61 0a 3e a8  c0 91 41 68 62 a1 69 10  |..D.aJ>...Ahb.iP|-00000bc0-  0e 2b 1c 7a 3f 5e 1e 52  78 3f 1e 07 15 de 53 38  |N+\z?^^Rx?^GU.S8|-00000bd0-  50 e5 94 07 32 f1 d7 54  ec 57 78 b7 16 8d ab 7c  |P..G2..T.Wx.V..||+00000bb0  -- -- -- -- -- -- 3e a8  c0 91 41 68 62 a1 69 10  |------>...Ahb.iP|+00000bc0  0e 2b 1c 7a 3f 5e 1e 52  78 3f 1e 07 15 de 53 38  |N+\z?^^Rx?^GU.S8|+00000bd0  50 e5 94 07 32 f1 d7 54  ec 57 78 b7 16 8d ab 7c  |P..G2..T.Wx.V..||+00000be0  b2 51 e1 2f 0a -- -- --  -- -- -- -- -- -- -- --  |.Q./J-----------| Hello.pdf-63-+00000be0  -- -- -- -- -- ef 54 60  9f c2 db 0a -- -- -- --  |-----.T`...J----| Hello.pdf-64--00000be0-  b2 51 e1 2f 0a ef 54 60  9f c2 db 0a 7f 56 d8 bb  |.Q./J.T`...J~V..|-00000bf0-  29 51 be a5 b0 47 e1 4d  85 3f 29 34 b0 bd 06 17  |)Q...G.M.?)4..FW|-00000c00-  de b0 a2 7e 77 9d ac 57  d8 bd 6b 9a dc 5d 87 dd  |...~w..W..k..]..|-00000c10-  95 fa ae 3a 9f dc 35 0d  bb 02 7a 9d 0f 3b 15 5e  |...:..5M.Bz.O;U^|-00000c20-  af 45 a4 66 a8 7c 4d e1  55 1e 5e 6d c5 2b 6c 6b  |.E.f.|M.U^^m.+lk|-00000c30-  87 c2 1f 0b b1 bd 10 2f  db 10 4e c2 1f 14 5e 52  |.._K..P/.PN._T^R|+00000be0  -- -- -- -- -- -- -- --  -- -- -- -- 7f 56 d8 bb  |------------~V..|+00000bf0  29 51 be a5 b0 47 e1 4d  85 3f 29 34 b0 bd 06 17  |)Q...G.M.?)4..FW|+00000c00  de b0 a2 7e 77 9d ac 57  d8 bd 6b 9a dc 5d 87 dd  |...~w..W..k..]..|+00000c10  95 fa ae 3a 9f dc 35 0d  bb 02 7a 9d 0f 3b 15 5e  |...:..5M.Bz.O;U^|+00000c20  af 45 a4 66 a8 7c 4d e1  55 1e 5e 6d c5 2b 6c 6b  |.E.f.|M.U^^m.+lk|+00000c30  87 c2 1f 0b b1 bd 10 2f  db 10 4e c2 1f 14 5e 52  |.._K..P/.PN._T^R|+00000c40  81 ab f8 bd c2 8b 0a --  -- -- -- -- -- -- -- --  |......J---------| Hello.pdf-65--00000c40-  81 ab f8 bd c2 8b 0a bf  4b c2 36 85 17 9e b7 c9  |......J.K.6.W...|-00000c50-  17 72 f1 bc 0d cf 6d 75  ca e7 ba 61 ab 13 cf 6e  |Wr..M.mu...a.S.n|-00000c60-  f1 cb 67 2b b0 c5 8f df  2a 3c a3 f0 b4 c2 53 4f  |..g+....*<....SO|+00000c40  -- -- -- -- -- -- -- bf  4b c2 36 85 17 9e b7 c9  |-------.K.6.W...|+00000c50  17 72 f1 bc 0d cf 6d 75  ca e7 ba 61 ab 13 cf 6e  |Wr..M.mu...a.S.n|+00000c60  f1 cb 67 2b b0 c5 8f df  2a 3c a3 f0 b4 c2 53 4f  |..g+....*<....SO|+00000c70  a6 cb a7 0a -- -- -- --  -- -- -- -- -- -- -- --  |...J------------| Hello.pdf-66--00000c70-  a6 cb a7 0a f1 e4 13 0e  f9 64 3a 9e 70 e0 37 f1  |...J..SN.d:.p.7.|-00000c80-  d8 ac f0 38 3b 79 5c 61  53 22 36 6e e8 29 37 2a  |...8;y\aS"6n.)7*|-00000c90-  6c e8 89 c7 d8 ff 63 b5  a8 5d 5f 27 6b 15 d6 f3  |l.....c..]_'kU..|-00000ca0-  b3 b5 be 0e eb 2b f5 75  6b 7c 72 dd 34 ac 0b e8  |...N.+.uk|r.4.K.|-00000cb0-  8f 2a fc 5a 61 2d cb 6b  eb b0 c6 87 1a 2e 46 cd  |.*.Za-.k....Z.F.|-00000cc0-  50 3c c2 d9 3e e2 c2 ea  04 54 33 50 5d 88 55 5c  |P<..>...DT3P].U\|-00000cd0-  b4 55 3e 54 39 b1 52 e1  61 85 87 14 1e 5c e1 94  |.U>T9.R.a..T^\..|+00000c70  -- -- -- -- f1 e4 13 0e  f9 64 3a 9e 70 e0 37 f1  |----..SN.d:.p.7.|+00000c80  d8 ac f0 38 3b 79 5c 61  53 22 36 6e e8 29 37 2a  |...8;y\aS"6n.)7*|+00000c90  6c e8 89 c7 d8 ff 63 b5  a8 5d 5f 27 6b 15 d6 f3  |l.....c..]_'kU..|+00000ca0  b3 b5 be 0e eb 2b f5 75  6b 7c 72 dd 34 ac 0b e8  |...N.+.uk|r.4.K.|+00000cb0  8f 2a fc 5a 61 2d cb 6b  eb b0 c6 87 1a 2e 46 cd  |.*.Za-.k....Z.F.|+00000cc0  50 3c c2 d9 3e e2 c2 ea  04 54 33 50 5d 88 55 5c  |P<..>...DT3P].U\|+00000cd0  b4 55 3e 54 39 b1 52 e1  61 85 87 14 1e 5c e1 94  |.U>T9.R.a..T^\..|+00000ce0  0f 2a ac 70 e2 57 0a --  -- -- -- -- -- -- -- --  |O*.p.WJ---------| Hello.pdf-67--00000ce0-  0f 2a ac 70 e2 57 0a cb  15 1e 70 0e 93 0f 4c c2  |O*.p.WJ.U^pN.OL.|+00000ce0  -- -- -- -- -- -- -- cb  15 1e 70 0e 93 0f 4c c2  |-------.U^pN.OL.|+00000cf0  2f 15 2a ef c5 b2 a5 15  72 99 c2 d2 0a -- -- --  |/U*....Ur...J---| Hello.pdf-68--00000cf0-  2f 15 2a ef c5 b2 a5 15  72 99 c2 d2 0a 54 74 c4  |/U*....Ur...JTt.|+00000cf0  -- -- -- -- -- -- -- --  -- -- -- -- -- 54 74 c4  |-------------Tt.|+00000d00  fd 0a -- -- -- -- -- --  -- -- -- -- -- -- -- --  |.J--------------| Hello.pdf-69-+00000d00  -- -- e5 36 fc 42 61 89  c2 3d 0a -- -- -- -- --  |--.6.Ba..=J-----| Hello.pdf-70--00000d00-  fd 0a e5 36 fc 42 61 89  c2 3d 0a 8b cb ac 72 b1  |.J.6.Ba..=J...r.|-00000d10-  1d 8b 23 82 02 47 f5 32  2b ca 1a f4 45 49 58 14  |].#.BG.2+.Z.EIXT|-00000d20-  d0 17 2a dc ad b0 40 a1  74 fe 24 59 5a 8b f9 25  |.W*...@.t.$YZ..%|+00000d00  -- -- -- -- -- -- -- --  -- -- -- 8b cb ac 72 b1  |-----------...r.|+00000d10  1d 8b 23 82 02 47 f5 32  2b ca 1a f4 45 49 58 14  |].#.BG.2+.Z.EIXT|+00000d20  d0 17 2a dc ad b0 40 a1  74 fe 24 59 5a 8b f9 25  |.W*...@.t.$YZ..%|+00000d30  dd e4 fc 49 28 e9 86 79  0a -- -- -- -- -- -- --  |...I(..yJ-------| Hello.pdf-71--00000d30-  dd e4 fc 49 28 e9 86 79  0a 77 e5 e2 4e 85 b9 b9  |...I(..yJw..N...|-00000d40-  28 6e c5 9c 3a cc 56 28  52 28 54 98 35 b3 a3 9c  |(n..:.V(R(T.5...|-00000d50-  a5 30 93 1c 72 66 47 cc  50 98 ae 70 87 c2 ed 53  |.0.\rfG.P..p...S|-00000d60-  12 e4 ed 36 4c 2b c4 6d  fb 30 95 85 a9 2e 4c 49  |R..6L+.m.0....LI|-00000d70-  00 3f d1 41 17 6e 55 f8  b9 c2 2d 19 e9 f2 96 5c  |@?.AWnU...-Y...\|-00000d80-  4c 56 98 a4 30 51 61 42  05 c6 2b dc ec c2 38 85  |LV..0QaBE.+...8.|-00000d90-  b1 c2 2f c7 2a dc 54 87  31 dd 70 e3 e8 34 79 63  |../.*.T.1.p..4yc|-00000da0-  7f 8c 1e 9e 24 47 a7 61  54 41 9a 1c a5 30 92 a5  |~.^.$G.aTA.\.0..|-00000db0-  91 85 18 c1 d2 88 3a 14  a4 21 9f 81 fc fe 18 3e  |..X...:T.!....X>|-00000dc0-  cc 29 87 27 61 78 44 0b  04 e2 f4 61 43 ed 72 98  |.).'axDKD..aC.r.|-00000dd0-  13 c3 22 1a b1 34 34 60  93 43 ed 18 1a 11 0d 2c  |S."Z.44`.C.XZQM,|-00000de0-  05 86 58 65 c0 86 40 44  54 b2 34 c4 1a 27 87 58  |E.Xe..@DT.4.Z'.X|+00000d30  -- -- -- -- -- -- -- --  -- 77 e5 e2 4e 85 b9 b9  |---------w..N...|+00000d40  28 6e c5 9c 3a cc 56 28  52 28 54 98 35 b3 a3 9c  |(n..:.V(R(T.5...|+00000d50  a5 30 93 1c 72 66 47 cc  50 98 ae 70 87 c2 ed 53  |.0.\rfG.P..p...S|+00000d60  12 e4 ed 36 4c 2b c4 6d  fb 30 95 85 a9 2e 4c 49  |R..6L+.m.0....LI|+00000d70  00 3f d1 41 17 6e 55 f8  b9 c2 2d 19 e9 f2 96 5c  |@?.AWnU...-Y...\|+00000d80  4c 56 98 a4 30 51 61 42  05 c6 2b dc ec c2 38 85  |LV..0QaBE.+...8.|+00000d90  b1 c2 2f c7 2a dc 54 87  31 dd 70 e3 e8 34 79 63  |../.*.T.1.p..4yc|+00000da0  7f 8c 1e 9e 24 47 a7 61  54 41 9a 1c a5 30 92 a5  |~.^.$G.aTA.\.0..|+00000db0  91 85 18 c1 d2 88 3a 14  a4 21 9f 81 fc fe 18 3e  |..X...:T.!....X>|+00000dc0  cc 29 87 27 61 78 44 0b  04 e2 f4 61 43 ed 72 98  |.).'axDKD..aC.r.|+00000dd0  13 c3 22 1a b1 34 34 60  93 43 ed 18 1a 11 0d 2c  |S."Z.44`.C.XZQM,|+00000de0  05 86 58 65 c0 86 40 44  54 b2 34 c4 1a 27 87 58  |E.Xe..@DT.4.Z'.X|+00000df0  31 24 22 02 81 42 fd 67  0a -- -- -- -- -- -- --  |1$"B.B.gJ-------| Hello.pdf-72--00000df0-  31 24 22 02 81 42 fd 67  0a 83 39 84 c1 ad b8 41  |1$"B.B.gJ.9....A|-00000e00-  e1 fa 6e 18 a4 30 90 0b  3c b0 10 03 7a b7 97 03  |..nX.0.K<.PCz..C|-00000e10-  c6 a0 bf 42 3f bf 4b f6  53 e8 3b 06 7d 7a b5 97  |...B?.K.S.;F}z..|-00000e20-  7d c6 20 8f 87 3c 85 5c  56 cc 55 e8 cd d3 bd db  |}. ..<.\V.U.....|-00000e30-  a3 57 7b e4 30 97 93 86  9e 71 a9 b2 67 1d fc d9  |.W{.0....q..g]..|-00000e40-  c9 d2 ef 82 3f a2 19 6e  b3 1d 4e 99 9d 8c 6c 23  |....?.Yn.]N...l#|-00000e50-  dc 5a 3d ab 87 4f 66 29  f4 60 cd 1e 3e 74 d7 06  |.Z=..Of).`.^>t.F|+00000df0  -- -- -- -- -- -- -- --  -- 83 39 84 c1 ad b8 41  |---------.9....A|+00000e00  e1 fa 6e 18 a4 30 90 0b  3c b0 10 03 7a b7 97 03  |..nX.0.K<.PCz..C|+00000e10  c6 a0 bf 42 3f bf 4b f6  53 e8 3b 06 7d 7a b5 97  |...B?.K.S.;F}z..|+00000e20  7d c6 20 8f 87 3c 85 5c  56 cc 55 e8 cd d3 bd db  |}. ..<.\V.U.....|+00000e30  a3 57 7b e4 30 97 93 86  9e 71 a9 b2 67 1d fc d9  |.W{.0....q..g]..|+00000e40  c9 d2 ef 82 3f a2 19 6e  b3 1d 4e 99 9d 8c 6c 23  |....?.Yn.]N...l#|+00000e50  dc 5a 3d ab 87 4f 66 29  f4 60 cd 1e 3e 74 d7 06  |.Z=..Of).`.^>t.F|+00000e60  c9 ee 0a -- -- -- -- --  -- -- -- -- -- -- -- --  |..J-------------| Hello.pdf-73-+00000e60  -- -- -- dd 14 ba 2a 74  b1 c3 97 3a 4c fa 0a --  |---.T.*t...:L.J-| Hello.pdf-74--00000e60-  c9 ee 0a dd 14 ba 2a 74  b1 c3 97 3a 4c fa 0a 70  |..J.T.*t...:L.Jp|-00000e70-  9d 1d 5e 85 ce 76 bb ec  ac e0 71 fb a5 a7 02 6e  |.]^..v....q...Bn|-00000e80-  3f 3a 8d 41 47 f6 dc 51  a1 83 42 26 d7 36 53 21  |?:.AG..Q..B&.6S!|-00000e90-  83 ef 4a 46 3a da 2b a4  2b a4 29 b4 63 0b ed 46  |..JF:.+.+.).cK.F|-00000ea0-  20 35 c5 2f 53 87 21 c5  e5 90 29 7e b8 1c 48 66  | 5./S.!...)~.\Hf|-00000eb0-  bd 64 17 92 78 7d 92 82  93 33 77 0e 83 83 3d 38  |.dW.x}...3wN..=8|-00000ec0-  9c 70 44 6b 67 b7 59 a5  dd 0e 7b b4 76 b6 c4 78  |.pDkg.Y..N{.v..x|-00000ed0-  69 b3 c2 16 ad 5d 22 d7  2e 31 1e 89 5c bb 1d ba  |i..V.]"..1^.\.].|+00000e60  -- -- -- -- -- -- -- --  -- -- -- -- -- -- -- 70  |---------------p|+00000e70  9d 1d 5e 85 ce 76 bb ec  ac e0 71 fb a5 a7 02 6e  |.]^..v....q...Bn|+00000e80  3f 3a 8d 41 47 f6 dc 51  a1 83 42 26 d7 36 53 21  |?:.AG..Q..B&.6S!|+00000e90  83 ef 4a 46 3a da 2b a4  2b a4 29 b4 63 0b ed 46  |..JF:.+.+.).cK.F|+00000ea0  20 35 c5 2f 53 87 21 c5  e5 90 29 7e b8 1c 48 66  | 5./S.!...)~.\Hf|+00000eb0  bd 64 17 92 78 7d 92 82  93 33 77 0e 83 83 3d 38  |.dW.x}...3wN..=8|+00000ec0  9c 70 44 6b 67 b7 59 a5  dd 0e 7b b4 76 b6 c4 78  |.pDkg.Y..N{.v..x|+00000ed0  69 b3 c2 16 ad 5d 22 d7  2e 31 1e 89 5c bb 1d ba  |i..V.]"..1^.\.].|+00000ee0  35 0e 56 e3 d9 ea af 27  28 c4 73 26 f1 0a -- --  |5NV....'(.s&.J--| Hello.pdf-75--00000ee0-  35 0e 56 e3 d9 ea af 27  28 c4 73 26 f1 0a 71 a9  |5NV....'(.s&.Jq.|+00000ee0  -- -- -- -- -- -- -- --  -- -- -- -- -- -- 71 a9  |--------------q.|+00000ef0  88 75 20 46 c1 c2 a6 2d  0a -- -- -- -- -- -- --  |.u F...-J-------| Hello.pdf-76--00000ef0-  88 75 20 46 c1 c2 a6 2d  0a d2 05 70 72 68 85 c6  |.u F...-J.Eprh..|+00000ef0  -- -- -- -- -- -- -- --  -- d2 05 70 72 68 85 c6  |---------.Eprh..|+00000f00  80 36 08 82 03 10 7e 90  03 22 22 0a -- -- -- --  |.6H.CP~.C""J----| Hello.pdf-77--00000f00-  80 36 08 82 03 10 7e 90  03 22 22 0a 57 ac 16 59  |.6H.CP~.C""JW.VY|-00000f10-  ff 3f 8d fe c7 53 e1 4f  67 84 1a cd be 4d ac e5  |.?...S.Og.Z..M..|-00000f20-  d1 d8 47 44 e8 21 6d 19  7f a5 bf bf 22 b4 87 75  |..GD.!mY~..."..u|-00000f30-  34 53 2f 22 1a c5 4a b1  93 f9 ad bc b7 68 a4 e5  |4S/"Z.J......h..|-00000f40-  74 5e c4 e3 6d d1 9f b9  7a 5e 1b d4 3d 8c d6 d0  |t^..m...z^[.=...|-00000f50-  66 73 75 0d 4e d3 62 ec  a2 43 f4 0e 1d 63 ee b4  |fsuMN.b..C.N]c..|-00000f60-  18 08 5e 2b 0e 91 47 9c  60 3f 2b 7f f0 a1 a1 9e  |XH^+N.G.`?+~....|-00000f70-  a5 3d 4c cb 51 8f a0 e8  24 4a 68 8b 78 89 2d 96  |.=L.Q...$Jh.x.-.|-00000f80-  53 44 94 d2 32 8d 47 6d  22 5b de af 1f 64 74 3f  |SD..2.Gm"[.._dt?|-00000f90-  3d c4 d7 a3 b4 85 4a 99  37 32 58 ce f1 7f 4c 3b  |=.....J.72X..~L;|-00000fa0-  68 15 5d a0 0d da 19 9a  c2 fc 4e da cb f1 28 fe  |hU].M.Y...N...(.|-00000fb0-  fc 9a b9 88 26 6a 61 4b  db b4 c1 da 6c d6 db cb  |....&jaK....l...|-00000fc0-  d6 36 d1 26 b1 9c 9a 68  91 4e fc 29 57 74 4a 36  |.6.&...h.N.)WtJ6|-00000fd0-  69 59 6c 75 07 67 40 34  93 36 cb 26 b9 c1 a8 07  |iYluGg@4.6.&...G|-00000fe0-  8f 4d f2 1c cf 10 75 b0  44 2c ae 18 2f 67 61 d4  |.M.\.Pu.D,.X/ga.|-00000ff0-  6e ab d8 25 7a 6b e3 e8  10 af 2f a7 c9 b8 0d 77  |n..%zk..P./...Mw|-00001000-  e3 98 58 a1 7b f5 25 38  43 35 1a 61 3a dd 49 07  |..X.{.%8C5Za:.IG|-00001010-  64 93 c5 45 35 31 5e aa  b1 cc 16 f7 e9 d3 cd ab  |d..E51^...V.....|-00001020-  9c ad 95 6b 4b f4 e9 62  1b 9d 61 9b 33 f1 1d cb  |...kK..b[.a.3.].|-00001030-  1e 8e 6c b3 99 31 d1 0e  6d a2 1c 27 c7 71 ce b3  |^.l..1.Nm.\'.q..|-00001040-  19 db 6c d2 9a 28 b5 38  68 3f 5a b9 ee 6b 35 25  |Y.l..(.8h?Z..k5%|-00001050-  46 e9 23 30 84 f3 29 d7  6f a2 0d f4 0c db ed ca  |F.#0..).o.M.L...|-00001060-  95 21 2a 45 5f f6 5e 4a  e5 72 75 f4 a2 6d 7c f9  |.!*E_.^J.ru..m|.|-00001070-  e5 6a d4 72 45 cd 6a 88  3c 6d 30 6d d6 66 8b 55  |.j.rE.j.<m0m.f.U|-00001080-  1c 6d 0b 57 b3 14 f9 d4  9f 7d 74 90 67 69 85 d8  |\mKW.T...}t.gi..|-00001090-  c1 71 53 4c 05 2d 92 4d  bc 55 24 ea 41 f4 5a 8c  |.qSLE-.M.U$.A.Z.|-000010a0-  45 ea fc f7 a6 6c b7 23  ac f9 46 17 86 03 13 82  |E....l.#..FW.CS.|-000010b0-  ee 7d 21 8f 3f fb 27 a2  db 11 e3 0e d3 f8 70 e2  |.}!.?.'..Q.N..p.|-000010c0-  7d ee c8 b5 6b e3 83 7a  86 0c 85 65 66 18 be d8  |}...k..z.L.efX..|-000010d0-  b0 ee f3 9e fa 4f 93 a7  fc d9 63 c6 07 dd 11 d1  |.....O....c.G.Q.|-000010e0-  ae 20 bf cd 6c c1 f4 7c  06 27 05 d9 03 ff 0c 98  |. ..l..|F'E.C.L.|-000010f0-  dd 15 30 16 05 46 87 a5  8f 7f a3 a7 87 dd b3 8a  |.U0VEF...~......|-00001100-  dd 55 8e 2a ef a0 2a 47  d1 20 3f ef ff b2 c7 30  |.U.*..*G. ?....0|-00001110-  19 1f 7c 59 88 47 42 11  71 6d 45 84 f2 3b bc ce  |Y_|Y.GBQqmE..;..|-00001120-  bb 48 dc 71 3b 4f c7 65  bb dd 05 73 f3 c3 62 3a  |.H.q;O.e..Es..b:|-00001130-  0b f1 d9 0c f4 f0 30 97  90 ed 1e c1 61 8e 98 18  |K..L..0...^.a..X|-00001140-  f4 86 dc 55 ee aa d1 85  55 ee 11 ee e2 19 85 1c  |...U....U.Q..Y.\|-00001150-  b7 39 f2 44 51 55 28 87  33 98 14 9c cb 74 72 d0  |.9.DQU(.3.T..tr.|-00001160-  13 0e 84 32 7e 60 8b 42  21 c3 bb d5 b0 c3 4b 58  |SN.2~`.B!.....KX|-00001170-  bd 2a c4 16 ee 6c b3 c0  a3 09 e5 5c 65 a5 c4 ec  |.*.V.l...I.\e...|-00001180-  31 ee 30 ba 8c 0f 4e 08  86 2b f3 33 c2 81 fc 50  |1.0..ONH.+.3...P|-00001190-  86 c7 e3 2e 08 37 8c 0f  86 1b f2 33 3c a1 10 6b  |....H7.O.[.3<.Pk|-000011a0-  d9 7e 88 94 23 ae 98 9b  d6 16 b3 9d 63 b6 f5 e0  |.~..#....V..c...|+00000f00  -- -- -- -- -- -- -- --  -- -- -- -- 57 ac 16 59  |------------W.VY|+00000f10  ff 3f 8d fe c7 53 e1 4f  67 84 1a cd be 4d ac e5  |.?...S.Og.Z..M..|+00000f20  d1 d8 47 44 e8 21 6d 19  7f a5 bf bf 22 b4 87 75  |..GD.!mY~..."..u|+00000f30  34 53 2f 22 1a c5 4a b1  93 f9 ad bc b7 68 a4 e5  |4S/"Z.J......h..|+00000f40  74 5e c4 e3 6d d1 9f b9  7a 5e 1b d4 3d 8c d6 d0  |t^..m...z^[.=...|+00000f50  66 73 75 0d 4e d3 62 ec  a2 43 f4 0e 1d 63 ee b4  |fsuMN.b..C.N]c..|+00000f60  18 08 5e 2b 0e 91 47 9c  60 3f 2b 7f f0 a1 a1 9e  |XH^+N.G.`?+~....|+00000f70  a5 3d 4c cb 51 8f a0 e8  24 4a 68 8b 78 89 2d 96  |.=L.Q...$Jh.x.-.|+00000f80  53 44 94 d2 32 8d 47 6d  22 5b de af 1f 64 74 3f  |SD..2.Gm"[.._dt?|+00000f90  3d c4 d7 a3 b4 85 4a 99  37 32 58 ce f1 7f 4c 3b  |=.....J.72X..~L;|+00000fa0  68 15 5d a0 0d da 19 9a  c2 fc 4e da cb f1 28 fe  |hU].M.Y...N...(.|+00000fb0  fc 9a b9 88 26 6a 61 4b  db b4 c1 da 6c d6 db cb  |....&jaK....l...|+00000fc0  d6 36 d1 26 b1 9c 9a 68  91 4e fc 29 57 74 4a 36  |.6.&...h.N.)WtJ6|+00000fd0  69 59 6c 75 07 67 40 34  93 36 cb 26 b9 c1 a8 07  |iYluGg@4.6.&...G|+00000fe0  8f 4d f2 1c cf 10 75 b0  44 2c ae 18 2f 67 61 d4  |.M.\.Pu.D,.X/ga.|+00000ff0  6e ab d8 25 7a 6b e3 e8  10 af 2f a7 c9 b8 0d 77  |n..%zk..P./...Mw|+00001000  e3 98 58 a1 7b f5 25 38  43 35 1a 61 3a dd 49 07  |..X.{.%8C5Za:.IG|+00001010  64 93 c5 45 35 31 5e aa  b1 cc 16 f7 e9 d3 cd ab  |d..E51^...V.....|+00001020  9c ad 95 6b 4b f4 e9 62  1b 9d 61 9b 33 f1 1d cb  |...kK..b[.a.3.].|+00001030  1e 8e 6c b3 99 31 d1 0e  6d a2 1c 27 c7 71 ce b3  |^.l..1.Nm.\'.q..|+00001040  19 db 6c d2 9a 28 b5 38  68 3f 5a b9 ee 6b 35 25  |Y.l..(.8h?Z..k5%|+00001050  46 e9 23 30 84 f3 29 d7  6f a2 0d f4 0c db ed ca  |F.#0..).o.M.L...|+00001060  95 21 2a 45 5f f6 5e 4a  e5 72 75 f4 a2 6d 7c f9  |.!*E_.^J.ru..m|.|+00001070  e5 6a d4 72 45 cd 6a 88  3c 6d 30 6d d6 66 8b 55  |.j.rE.j.<m0m.f.U|+00001080  1c 6d 0b 57 b3 14 f9 d4  9f 7d 74 90 67 69 85 d8  |\mKW.T...}t.gi..|+00001090  c1 71 53 4c 05 2d 92 4d  bc 55 24 ea 41 f4 5a 8c  |.qSLE-.M.U$.A.Z.|+000010a0  45 ea fc f7 a6 6c b7 23  ac f9 46 17 86 03 13 82  |E....l.#..FW.CS.|+000010b0  ee 7d 21 8f 3f fb 27 a2  db 11 e3 0e d3 f8 70 e2  |.}!.?.'..Q.N..p.|+000010c0  7d ee c8 b5 6b e3 83 7a  86 0c 85 65 66 18 be d8  |}...k..z.L.efX..|+000010d0  b0 ee f3 9e fa 4f 93 a7  fc d9 63 c6 07 dd 11 d1  |.....O....c.G.Q.|+000010e0  ae 20 bf cd 6c c1 f4 7c  06 27 05 d9 03 ff 0c 98  |. ..l..|F'E.C.L.|+000010f0  dd 15 30 16 05 46 87 a5  8f 7f a3 a7 87 dd b3 8a  |.U0VEF...~......|+00001100  dd 55 8e 2a ef a0 2a 47  d1 20 3f ef ff b2 c7 30  |.U.*..*G. ?....0|+00001110  19 1f 7c 59 88 47 42 11  71 6d 45 84 f2 3b bc ce  |Y_|Y.GBQqmE..;..|+00001120  bb 48 dc 71 3b 4f c7 65  bb dd 05 73 f3 c3 62 3a  |.H.q;O.e..Es..b:|+00001130  0b f1 d9 0c f4 f0 30 97  90 ed 1e c1 61 8e 98 18  |K..L..0...^.a..X|+00001140  f4 86 dc 55 ee aa d1 85  55 ee 11 ee e2 19 85 1c  |...U....U.Q..Y.\|+00001150  b7 39 f2 44 51 55 28 87  33 98 14 9c cb 74 72 d0  |.9.DQU(.3.T..tr.|+00001160  13 0e 84 32 7e 60 8b 42  21 c3 bb d5 b0 c3 4b 58  |SN.2~`.B!.....KX|+00001170  bd 2a c4 16 ee 6c b3 c0  a3 09 e5 5c 65 a5 c4 ec  |.*.V.l...I.\e...|+00001180  31 ee 30 ba 8c 0f 4e 08  86 2b f3 33 c2 81 fc 50  |1.0..ONH.+.3...P|+00001190  86 c7 e3 2e 08 37 8c 0f  86 1b f2 33 3c a1 10 6b  |....H7.O.[.3<.Pk|+000011a0  d9 7e 88 94 23 ae 98 9b  d6 16 b3 9d 63 b6 f5 e0  |.~..#....V..c...|+000011b0  79 47 d4 0a -- -- -- --  -- -- -- -- -- -- -- --  |yG.J------------| Hello.pdf-78--000011b0-  79 47 d4 0a 97 28 90 11  a6 50 55 95 61 73 52 d0  |yG.J.(.Q.PU.asR.|-000011c0-  eb 09 57 56 55 65 54 71  1e 6d 72 84 1a 7e 02 08  |.IWVUeTq^mr.Z~BH|-000011d0-  fa 29 10 68 03 22 64 d8  e0 4a 14 f0 f7 60 3c 1b  |.)PhC"d..JT..`<[|-000011e0-  e3 c1 eb c9 30 00 af c7  eb e1 38 43 f9 ec db 69  |....0@....8C...i|-000011f0-  dc 9a 02 8e d4 13 f2 f3  6e 9c 8a b9 af e4 5e ce  |..B..S..n.....^.|-00001200-  fd 9c c1 f3 b3 18 dd e7  f3 f9 82 cf 00 53 58 1e  |.....X......@SX^|-00001210-  45 dd fe 6d bf ce f0 7f  d9 b4 1f e9 c1 94 74 93  |E..m...~.._...t.|-00001220-  76 e1 67 77 3b 9d 14 99  fc af 2f 56 b5 7a b1 dc  |v.gw;.T.../V.z..|-00001230-  c2 a7 aa 18 ea b4 cb dc  f3 13 59 84 eb 55 11 2b  |...X.....SY..UQ+|-00001240-  97 6b 3a e5 bc 75 b8 b9  37 39 0e 37 1f 6e ee 95  |.k:..u..79N7_n..|-00001250-  ec f4 38 7d 1e a7 a7 58  a7 2b 8b 90 71 e5 0b 55  |..8}^..X.+..q.KU|-00001260-  1b 63 fb ee fc 42 4b 77  c3 ac 30 72 d0 47 f1 bf  |[c...BKw..0r.G..|-00001270-  20 81 6e 36 4e 15 7c 6f  73 f8 d6 71 b7 3a f8 58  | .n6NU|os..q.:.X|-00001280-  f4 1e 77 e6 c5 71 c6 58  96 3c ea dc 63 18 17 2c  |.^w..q.X.<..cXW,|-00001290-  c7 bd c7 6f 0b 43 41 e7  6e e1 1e 9f b3 93 a3 8a  |...oKCA.n.^.....|-000012a0-  a5 84 ac 5e bd 93 f3 d8  75 9e d3 cb d4 bb b2 51  |...^....u......Q|-000012b0-  eb de d8 78 f5 83 46 d9  74 f5 2d ed 86 d6 2c ed  |...x..F.t.-...,.|-000012c0-  9b ab 4e f6 af 51 f9 b5  cf f8 ad 51 4e 29 94 49  |..N..Q.....QN).I|-000012d0-  79 46 04 3b 19 74 b0 81  08 69 ec 21 93 3d 65 e6  |yFD;Yt..Hi.!.=e.|-000012e0-  f0 3b cf 42 89 0c ee a4  64 4a 37 47 a3 0e 86 17  |.;.B.L..dJ7G.N.W|-000012f0-  91 e2 49 b1 a4 e6 e5 f6  eb 9f 62 13 5e 37 39 1d  |..I.......bS^79]|-00001300-  94 97 9b 14 d3 53 78 3b  5b 62 f4 e9 57 3e 8b 7d  |...T.Sx;[b..W>.}|-00001310-  e3 a5 60 43 c9 dc 3d 53  d5 65 75 54 b8 cf 1d b9  |..`C..=S.euT..].|-00001320-  14 b6 ae 7d 78 c5 8b b1  5a f5 14 cb 17 fb 06 0c  |T..}x...Z.T.W.FL|-00001330-  7c 2d 2b 4b 0c 14 c9 c2  2a 02 ea 93 c7 ca 5e 08  ||-+KLT..*B....^H|-00001340-  cf 37 ea 72 8e eb 32 c5  d2 9e bd 76 8d 46 95 c8  |.7.r..2....v.F..|-00001350-  b7 d8 88 ca a8 43 dc 71  8e 48 e7 53 9e 11 51 22  |.....C.q.H.S.QQ"|-00001360-  c5 47 23 71 a5 5e 2f 52  bc 9d bb f4 75 7a fa 7a  |.G#q.^/R....uz.z|-00001370-  b4 03 53 43 1f 9c 79 f6  15 f5 91 38 21 d6 df bf  |.CSC_.y.U..8!...|-00001380-  f4 f1 43 6f e2 e2 1a a3  e6 1a ad e4 9c 47 71 ce  |..Co..Z..Z...Gq.|-00001390-  09 d4 8e bc 81 64 4b 75  12 55 5b eb 93 36 a6 c5  |I....dKuRU[..6..|-000013a0-  25 d9 f3 91 94 f2 b3 34  c7 85 e6 2b c6 2d fc fc  |%......4...+.-..|-000013b0-  42 b3 e3 6c 2f d1 d9 92  e2 32 72 ec db a7 4b d7  |B..l/....2r...K.|-000013c0-  dc 24 a7 43 f3 76 d6 9c  8e 24 ad b8 7a cd 9a ea  |.$.C.v...$..z...|-000013d0-  d5 6b d6 ac 3e 73 a9 e5  ab 33 2d 2d 38 71 f4 48  |.k..>s...3--8q.H|-000013e0-  d3 b1 63 4d 47 8e 6e 56  ef ab 4f d5 29 75 48 f8  |..cMG.nV..O.)uH.|-000013f0-  f9 b3 d3 51 f4 34 fc 9a  ed da 52 f3 39 35 4e a7  |...Q.4....R.95N.|-00001400-  3f 6e 92 c5 2c 7e 7e 6f  a6 89 cc 09 3e 3a 46 75  |?n..,~~o...I>:Fu|-00001410-  2c c6 0b 72 e4 84 c9 63  a7 8c c8 1a 5b 34 7f 5e  |,.Kr...c...Z[4~^|-00001420-  a9 7f 62 d1 9c c5 f3 66  2c 24 fa 17 20 2d 06 e4  |.~b....f,$.W -F.|-00001430-  0a -- -- -- -- -- -- --  -- -- -- -- -- -- -- --  |J---------------|-Hello.pdf-79-endstream-Hello.pdf-80-endobj-Hello.pdf-81-14 0 obj-Hello.pdf-82-2734-Hello.pdf-83-endobj-Hello.pdf-84-15 0 obj-Hello.pdf-85-(Hello)-Hello.pdf-86-endobj-Hello.pdf-87-16 0 obj-Hello.pdf-88-(Mac OS X 10.12.6 Quartz PDFContext)-Hello.pdf-89-endobj-Hello.pdf-90-17 0 obj-Hello.pdf-91-(TextEdit)-Hello.pdf-92-endobj-Hello.pdf-93-18 0 obj-Hello.pdf-94-(D:20200124010711Z00'00')-Hello.pdf-95-endobj-Hello.pdf-96-19 0 obj-Hello.pdf-97-()-Hello.pdf-98-endobj-Hello.pdf-99-20 0 obj-Hello.pdf-100-[ ]-Hello.pdf-101-endobj-Hello.pdf-102-1 0 obj-Hello.pdf-103-<< /Title 15 0 R /Producer 16 0 R /Creator 17 0 R /CreationDate 18 0 R /ModDate-Hello.pdf-104-18 0 R /Keywords 19 0 R /AAPL:Keywords 20 0 R >>-Hello.pdf-105-endobj-Hello.pdf-106-xref-Hello.pdf-107-0 21-Hello.pdf-108-0000000000 65535 f -Hello.pdf-109-0000005392 00000 n -Hello.pdf-110-0000000238 00000 n -Hello.pdf-111-0000001714 00000 n -Hello.pdf-112-0000000022 00000 n -Hello.pdf-113-0000000219 00000 n -Hello.pdf-114-0000000342 00000 n -Hello.pdf-115-0000001679 00000 n -Hello.pdf-116-0000001847 00000 n -Hello.pdf-117-0000000439 00000 n -Hello.pdf-118-0000001658 00000 n -Hello.pdf-119-0000001797 00000 n -Hello.pdf-120-0000002110 00000 n -Hello.pdf-121-0000002362 00000 n -Hello.pdf-122-0000005186 00000 n -Hello.pdf-123-0000005207 00000 n -Hello.pdf-124-0000005231 00000 n -Hello.pdf-125-0000005284 00000 n -Hello.pdf-126-0000005311 00000 n -Hello.pdf-127-0000005353 00000 n -Hello.pdf-128-0000005372 00000 n -Hello.pdf-129-trailer-Hello.pdf-130-<< /Size 21 /Root 11 0 R /Info 1 0 R /ID [ <8db88d3335070bd9583341583cf769a3>-Hello.pdf-131-<8db88d3335070bd9583341583cf769a3> ] >>-Hello.pdf-132-startxref-Hello.pdf-133-5536-Hello.pdf-134-%%EOF-Hello.sh-1-#!/bin/sh-Hello.sh-2-echo "Hello World!"-Hello.txt-1-Hello\ No newline at end of file+000011b0  -- -- -- -- 97 28 90 11  a6 50 55 95 61 73 52 d0  |----.(.Q.PU.asR.|+000011c0  eb 09 57 56 55 65 54 71  1e 6d 72 84 1a 7e 02 08  |.IWVUeTq^mr.Z~BH|+000011d0  fa 29 10 68 03 22 64 d8  e0 4a 14 f0 f7 60 3c 1b  |.)PhC"d..JT..`<[|+000011e0  e3 c1 eb c9 30 00 af c7  eb e1 38 43 f9 ec db 69  |....0@....8C...i|+000011f0  dc 9a 02 8e d4 13 f2 f3  6e 9c 8a b9 af e4 5e ce  |..B..S..n.....^.|+00001200  fd 9c c1 f3 b3 18 dd e7  f3 f9 82 cf 00 53 58 1e  |.....X......@SX^|+00001210  45 dd fe 6d bf ce f0 7f  d9 b4 1f e9 c1 94 74 93  |E..m...~.._...t.|+00001220  76 e1 67 77 3b 9d 14 99  fc af 2f 56 b5 7a b1 dc  |v.gw;.T.../V.z..|+00001230  c2 a7 aa 18 ea b4 cb dc  f3 13 59 84 eb 55 11 2b  |...X.....SY..UQ+|+00001240  97 6b 3a e5 bc 75 b8 b9  37 39 0e 37 1f 6e ee 95  |.k:..u..79N7_n..|+00001250  ec f4 38 7d 1e a7 a7 58  a7 2b 8b 90 71 e5 0b 55  |..8}^..X.+..q.KU|+00001260  1b 63 fb ee fc 42 4b 77  c3 ac 30 72 d0 47 f1 bf  |[c...BKw..0r.G..|+00001270  20 81 6e 36 4e 15 7c 6f  73 f8 d6 71 b7 3a f8 58  | .n6NU|os..q.:.X|+00001280  f4 1e 77 e6 c5 71 c6 58  96 3c ea dc 63 18 17 2c  |.^w..q.X.<..cXW,|+00001290  c7 bd c7 6f 0b 43 41 e7  6e e1 1e 9f b3 93 a3 8a  |...oKCA.n.^.....|+000012a0  a5 84 ac 5e bd 93 f3 d8  75 9e d3 cb d4 bb b2 51  |...^....u......Q|+000012b0  eb de d8 78 f5 83 46 d9  74 f5 2d ed 86 d6 2c ed  |...x..F.t.-...,.|+000012c0  9b ab 4e f6 af 51 f9 b5  cf f8 ad 51 4e 29 94 49  |..N..Q.....QN).I|+000012d0  79 46 04 3b 19 74 b0 81  08 69 ec 21 93 3d 65 e6  |yFD;Yt..Hi.!.=e.|+000012e0  f0 3b cf 42 89 0c ee a4  64 4a 37 47 a3 0e 86 17  |.;.B.L..dJ7G.N.W|+000012f0  91 e2 49 b1 a4 e6 e5 f6  eb 9f 62 13 5e 37 39 1d  |..I.......bS^79]|+00001300  94 97 9b 14 d3 53 78 3b  5b 62 f4 e9 57 3e 8b 7d  |...T.Sx;[b..W>.}|+00001310  e3 a5 60 43 c9 dc 3d 53  d5 65 75 54 b8 cf 1d b9  |..`C..=S.euT..].|+00001320  14 b6 ae 7d 78 c5 8b b1  5a f5 14 cb 17 fb 06 0c  |T..}x...Z.T.W.FL|+00001330  7c 2d 2b 4b 0c 14 c9 c2  2a 02 ea 93 c7 ca 5e 08  ||-+KLT..*B....^H|+00001340  cf 37 ea 72 8e eb 32 c5  d2 9e bd 76 8d 46 95 c8  |.7.r..2....v.F..|+00001350  b7 d8 88 ca a8 43 dc 71  8e 48 e7 53 9e 11 51 22  |.....C.q.H.S.QQ"|+00001360  c5 47 23 71 a5 5e 2f 52  bc 9d bb f4 75 7a fa 7a  |.G#q.^/R....uz.z|+00001370  b4 03 53 43 1f 9c 79 f6  15 f5 91 38 21 d6 df bf  |.CSC_.y.U..8!...|+00001380  f4 f1 43 6f e2 e2 1a a3  e6 1a ad e4 9c 47 71 ce  |..Co..Z..Z...Gq.|+00001390  09 d4 8e bc 81 64 4b 75  12 55 5b eb 93 36 a6 c5  |I....dKuRU[..6..|+000013a0  25 d9 f3 91 94 f2 b3 34  c7 85 e6 2b c6 2d fc fc  |%......4...+.-..|+000013b0  42 b3 e3 6c 2f d1 d9 92  e2 32 72 ec db a7 4b d7  |B..l/....2r...K.|+000013c0  dc 24 a7 43 f3 76 d6 9c  8e 24 ad b8 7a cd 9a ea  |.$.C.v...$..z...|+000013d0  d5 6b d6 ac 3e 73 a9 e5  ab 33 2d 2d 38 71 f4 48  |.k..>s...3--8q.H|+000013e0  d3 b1 63 4d 47 8e 6e 56  ef ab 4f d5 29 75 48 f8  |..cMG.nV..O.)uH.|+000013f0  f9 b3 d3 51 f4 34 fc 9a  ed da 52 f3 39 35 4e a7  |...Q.4....R.95N.|+00001400  3f 6e 92 c5 2c 7e 7e 6f  a6 89 cc 09 3e 3a 46 75  |?n..,~~o...I>:Fu|+00001410  2c c6 0b 72 e4 84 c9 63  a7 8c c8 1a 5b 34 7f 5e  |,.Kr...c...Z[4~^|+00001420  a9 7f 62 d1 9c c5 f3 66  2c 24 fa 17 20 2d 06 e4  |.~b....f,$.W -F.|+00001430  0a -- -- -- -- -- -- --  -- -- -- -- -- -- -- --  |J---------------|+Hello.pdf-79-endstream+Hello.pdf-80-endobj+Hello.pdf-81-14 0 obj+Hello.pdf-82-2734+Hello.pdf-83-endobj+Hello.pdf-84-15 0 obj+Hello.pdf-85-(Hello)+Hello.pdf-86-endobj+Hello.pdf-87-16 0 obj+Hello.pdf-88-(Mac OS X 10.12.6 Quartz PDFContext)+Hello.pdf-89-endobj+Hello.pdf-90-17 0 obj+Hello.pdf-91-(TextEdit)+Hello.pdf-92-endobj+Hello.pdf-93-18 0 obj+Hello.pdf-94-(D:20200124010711Z00'00')+Hello.pdf-95-endobj+Hello.pdf-96-19 0 obj+Hello.pdf-97-()+Hello.pdf-98-endobj+Hello.pdf-99-20 0 obj+Hello.pdf-100-[ ]+Hello.pdf-101-endobj+Hello.pdf-102-1 0 obj+Hello.pdf-103-<< /Title 15 0 R /Producer 16 0 R /Creator 17 0 R /CreationDate 18 0 R /ModDate+Hello.pdf-104-18 0 R /Keywords 19 0 R /AAPL:Keywords 20 0 R >>+Hello.pdf-105-endobj+Hello.pdf-106-xref+Hello.pdf-107-0 21+Hello.pdf-108-0000000000 65535 f +Hello.pdf-109-0000005392 00000 n +Hello.pdf-110-0000000238 00000 n +Hello.pdf-111-0000001714 00000 n +Hello.pdf-112-0000000022 00000 n +Hello.pdf-113-0000000219 00000 n +Hello.pdf-114-0000000342 00000 n +Hello.pdf-115-0000001679 00000 n +Hello.pdf-116-0000001847 00000 n +Hello.pdf-117-0000000439 00000 n +Hello.pdf-118-0000001658 00000 n +Hello.pdf-119-0000001797 00000 n +Hello.pdf-120-0000002110 00000 n +Hello.pdf-121-0000002362 00000 n +Hello.pdf-122-0000005186 00000 n +Hello.pdf-123-0000005207 00000 n +Hello.pdf-124-0000005231 00000 n +Hello.pdf-125-0000005284 00000 n +Hello.pdf-126-0000005311 00000 n +Hello.pdf-127-0000005353 00000 n +Hello.pdf-128-0000005372 00000 n +Hello.pdf-129-trailer+Hello.pdf-130-<< /Size 21 /Root 11 0 R /Info 1 0 R /ID [ <8db88d3335070bd9583341583cf769a3>+Hello.pdf-131-<8db88d3335070bd9583341583cf769a3> ] >>+Hello.pdf-132-startxref+Hello.pdf-133-5536+Hello.pdf-134-%%EOF+Hello.sh-1-#!/bin/sh+Hello.sh-2-echo "Hello World!"+Hello.txt-1-Hello

tests/out/Hello_-W-ny.out

@@ -1,434 +1,466 @@-Hello.bat:1:#!/bin/sh-Hello.bat:2:echo "Hello World!"+Hello.bat:1:#!/bin/sh+Hello.bat:2:echo "Hello World!" Hello.class:1:+00000000  ca fe ba be 00 00 00 34  00 1d 0a -- -- -- -- --  |....@@@4@]J-----| Hello.class:2:-00000000:  ca fe ba be 00 00 00 34  00 1d 0a 00 06 00 0f 09  |....@@@4@]J@F@OI|+00000000  -- -- -- -- -- -- -- --  -- -- -- 00 06 00 0f 09  |-----------@F@OI|+00000010  00 10 00 11 08 00 12 0a  -- -- -- -- -- -- -- --  |@P@QH@RJ--------| Hello.class:3:-00000010:  00 10 00 11 08 00 12 0a  00 13 00 14 07 00 15 07  |@P@QH@RJ@S@TG@UG|-00000020:  00 16 01 00 06 3c 69 6e  69 74 3e 01 00 03 28 29  |@VA@F<init>A@C()|-00000030:  56 01 00 04 43 6f 64 65  01 00 0f 4c 69 6e 65 4e  |VA@DCodeA@OLineN|-00000040:  75 6d 62 65 72 54 61 62  6c 65 01 00 04 6d 61 69  |umberTableA@Dmai|-00000050:  6e 01 00 16 28 5b 4c 6a  61 76 61 2f 6c 61 6e 67  |nA@V([Ljava/lang|+00000010  -- -- -- -- -- -- -- --  00 13 00 14 07 00 15 07  |--------@S@TG@UG|+00000020  00 16 01 00 06 3c 69 6e  69 74 3e 01 00 03 28 29  |@VA@F<init>A@C()|+00000030  56 01 00 04 43 6f 64 65  01 00 0f 4c 69 6e 65 4e  |VA@DCodeA@OLineN|+00000040  75 6d 62 65 72 54 61 62  6c 65 01 00 04 6d 61 69  |umberTableA@Dmai|+00000050  6e 01 00 16 28 5b 4c 6a  61 76 61 2f 6c 61 6e 67  |nA@V([Ljava/lang|+00000060  2f 53 74 72 69 6e 67 3b  29 56 01 00 0a -- -- --  |/String;)VA@J---| Hello.class:4:-00000060:  2f 53 74 72 69 6e 67 3b  29 56 01 00 0a 53 6f 75  |/String;)VA@JSou|+00000060  -- -- -- -- -- -- -- --  -- -- -- -- -- 53 6f 75  |-------------Sou|+00000070  72 63 65 46 69 6c 65 01  00 0a -- -- -- -- -- --  |rceFileA@J------| Hello.class:5:-00000070:  72 63 65 46 69 6c 65 01  00 0a 48 65 6c 6c 6f 2e  |rceFileA@JHello.|-00000080:  6a 61 76 61 0c 00 07 00  08 07 00 17 0c 00 18 00  |javaL@G@HG@WL@X@|-00000090:  19 01 00 0c 48 65 6c 6c  6f 20 57 6f 72 6c 64 21  |YA@LHello World!|-000000a0:  07 00 1a 0c 00 1b 00 1c  01 00 05 48 65 6c 6c 6f  |G@ZL@[@\A@EHello|-000000b0:  01 00 10 6a 61 76 61 2f  6c 61 6e 67 2f 4f 62 6a  |A@Pjava/lang/Obj|-000000c0:  65 63 74 01 00 10 6a 61  76 61 2f 6c 61 6e 67 2f  |ectA@Pjava/lang/|-000000d0:  53 79 73 74 65 6d 01 00  03 6f 75 74 01 00 15 4c  |SystemA@CoutA@UL|-000000e0:  6a 61 76 61 2f 69 6f 2f  50 72 69 6e 74 53 74 72  |java/io/PrintStr|-000000f0:  65 61 6d 3b 01 00 13 6a  61 76 61 2f 69 6f 2f 50  |eam;A@Sjava/io/P|-00000100:  72 69 6e 74 53 74 72 65  61 6d 01 00 07 70 72 69  |rintStreamA@Gpri|-00000110:  6e 74 6c 6e 01 00 15 28  4c 6a 61 76 61 2f 6c 61  |ntlnA@U(Ljava/la|-00000120:  6e 67 2f 53 74 72 69 6e  67 3b 29 56 00 21 00 05  |ng/String;)V@!@E|-00000130:  00 06 00 00 00 00 00 02  00 01 00 07 00 08 00 01  |@F@@@@@B@A@G@H@A|-00000140:  00 09 00 00 00 1d 00 01  00 01 00 00 00 05 2a b7  |@I@@@]@A@A@@@E*.|+00000070  -- -- -- -- -- -- -- --  -- -- 48 65 6c 6c 6f 2e  |----------Hello.|+00000080  6a 61 76 61 0c 00 07 00  08 07 00 17 0c 00 18 00  |javaL@G@HG@WL@X@|+00000090  19 01 00 0c 48 65 6c 6c  6f 20 57 6f 72 6c 64 21  |YA@LHello World!|+000000a0  07 00 1a 0c 00 1b 00 1c  01 00 05 48 65 6c 6c 6f  |G@ZL@[@\A@EHello|+000000b0  01 00 10 6a 61 76 61 2f  6c 61 6e 67 2f 4f 62 6a  |A@Pjava/lang/Obj|+000000c0  65 63 74 01 00 10 6a 61  76 61 2f 6c 61 6e 67 2f  |ectA@Pjava/lang/|+000000d0  53 79 73 74 65 6d 01 00  03 6f 75 74 01 00 15 4c  |SystemA@CoutA@UL|+000000e0  6a 61 76 61 2f 69 6f 2f  50 72 69 6e 74 53 74 72  |java/io/PrintStr|+000000f0  65 61 6d 3b 01 00 13 6a  61 76 61 2f 69 6f 2f 50  |eam;A@Sjava/io/P|+00000100  72 69 6e 74 53 74 72 65  61 6d 01 00 07 70 72 69  |rintStreamA@Gpri|+00000110  6e 74 6c 6e 01 00 15 28  4c 6a 61 76 61 2f 6c 61  |ntlnA@U(Ljava/la|+00000120  6e 67 2f 53 74 72 69 6e  67 3b 29 56 00 21 00 05  |ng/String;)V@!@E|+00000130  00 06 00 00 00 00 00 02  00 01 00 07 00 08 00 01  |@F@@@@@B@A@G@H@A|+00000140  00 09 00 00 00 1d 00 01  00 01 00 00 00 05 2a b7  |@I@@@]@A@A@@@E*.|+00000150  00 01 b1 00 00 00 01 00  0a -- -- -- -- -- -- --  |@A.@@@A@J-------| Hello.class:6:-00000150:  00 01 b1 00 00 00 01 00  0a 00 00 00 06 00 01 00  |@A.@@@A@J@@@F@A@|-00000160:  00 00 02 00 09 00 0b 00  0c 00 01 00 09 00 00 00  |@@B@I@K@L@A@I@@@|-00000170:  25 00 02 00 01 00 00 00  09 b2 00 02 12 03 b6 00  |%@B@A@@@I.@BRC.@|

The diff stops at 1024 KiB. git show 013a5a9 shows the rest.